Update charted to 0.4.8 and roll

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org//2989763002 .
diff --git a/codereview.settings b/codereview.settings
index 883ba75..518cc06 100644
--- a/codereview.settings
+++ b/codereview.settings
@@ -1,3 +1,3 @@
 CODE_REVIEW_SERVER: http://codereview.chromium.org/
 VIEW_VC: https://github.com/dart-lang/observatory_pub_packages/commit/
-CC_LIST: johnmccutchan@google.com, turnidge@google.com, rmacnak@google.com
+CC_LIST: turnidge@google.com, rmacnak@google.com
diff --git a/packages/args/.analysis_options b/packages/args/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/args/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/args/.gitignore b/packages/args/.gitignore
index 388eff0..7dbf035 100644
--- a/packages/args/.gitignore
+++ b/packages/args/.gitignore
@@ -3,6 +3,7 @@
 .pub/
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/packages/args/.status b/packages/args/.status
deleted file mode 100644
index ff095a2..0000000
--- a/packages/args/.status
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Skip non-test files ending with "_test".
-packages/*: Skip
-*/packages/*: Skip
-*/*/packages/*: Skip
-*/*/*/packages/*: Skip
-*/*/*/*packages/*: Skip
-*/*/*/*/*packages/*: Skip
-
-# Only run tests from the build directory, since we don't care about the
-# difference between transformed an untransformed code.
-test/*: Skip
diff --git a/packages/args/.test_config b/packages/args/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/packages/args/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/packages/args/CHANGELOG.md b/packages/args/CHANGELOG.md
index 123c564..5f5c8c6 100644
--- a/packages/args/CHANGELOG.md
+++ b/packages/args/CHANGELOG.md
@@ -1,3 +1,74 @@
+## 0.13.7
+
+* Add explicit support for forwarding the value returned by `Command.run()` to
+  `CommandRunner.run()`. This worked unintentionally prior to 0.13.6+1.
+
+* Add type arguments to `CommandRunner` and `Command` to indicate the return
+  values of the `run()` functions.
+
+## 0.13.6+1
+
+* When a `CommandRunner` is passed `--help` before any commands, it now prints
+  the usage of the chosen command.
+
+## 0.13.6
+
+* `ArgParser.parse()` now throws an `ArgParserException`, which implements
+  `FormatException` and has a field that lists the commands that were parsed.
+
+* If `CommandRunner.run()` encounters a parse error for a subcommand, it now
+  prints the subcommand's usage rather than the global usage.
+
+## 0.13.5
+
+* Allow `CommandRunner.argParser` and `Command.argParser` to be overridden in
+  strong mode.
+
+## 0.13.4+2
+
+* Fix a minor documentation error.
+
+## 0.13.4+1
+
+* Ensure that multiple-value arguments produce reified `List<String>`s.
+
+## 0.13.4
+
+* By default, only the first line of a command's description is included in its
+  parent runner's usage string. This returns to the default behavior from
+  before 0.13.3+1.
+
+* A `Command.summary` getter has been added to explicitly control the summary
+  that appears in the parent runner's usage string. This getter defaults to the
+  first line of the description, but can be overridden if the user wants a
+  multi-line summary.
+
+## 0.13.3+6
+
+* README fixes.
+
+## 0.13.3+5
+
+* Make strong mode clean.
+
+## 0.13.3+4
+
+* Use the proper `usage` getter in the README.
+
+## 0.13.3+3
+
+* Add an explicit default value for the `allowTrailingOptions` parameter to `new
+  ArgParser()`. This doesn't change the behavior at all; the option already
+  defaulted to `false`, and passing in `null` still works.
+
+## 0.13.3+2
+
+* Documentation fixes.
+
+## 0.13.3+1
+
+* Print all lines of multi-line command descriptions.
+
 ## 0.13.2
 
 * Allow option values that look like options. This more closely matches the
@@ -69,13 +140,13 @@
 ## 0.12.0
 
 * Removed public constructors for `ArgResults` and `Option`.
- 
+
 * `ArgResults.wasParsed()` can be used to determine if an option was actually
   parsed or the default value is being returned.
 
 * Replaced `isFlag` and `allowMultiple` fields in the `Option` class with a
   three-value `OptionType` enum.
-  
+
 * Options may define `valueHelp` which will then be shown in the usage.
 
 ## 0.11.0
diff --git a/packages/args/README.md b/packages/args/README.md
index 96df5e6..36e931c 100644
--- a/packages/args/README.md
+++ b/packages/args/README.md
@@ -51,9 +51,11 @@
 be a `bool`.
 
 To validate a non-flag option, you can use the `allowed` parameter to provide an
-allowed set of values. When you do, the parser throws a [FormatException] if the
-value for an option is not in the allowed set. Here's an example of specifying
-allowed values:
+allowed set of values. When you do, the parser throws an
+[`ArgParserException`][ArgParserException] if the value for an option is not in
+the allowed set. Here's an example of specifying allowed values:
+
+[ArgParserException]: https://www.dartdocs.org/documentation/args/latest/args/ArgParserException-class.html
 
 ```dart
 parser.addOption('mode', allowed: ['debug', 'release']);
@@ -294,9 +296,9 @@
 
   // [run] may also return a Future.
   void run() {
-    // [options] is set before [run()] is called and contains the options
+    // [argResults] is set before [run()] is called and contains the options
     // passed to this command.
-    print(options['all']);
+    print(argResults['all']);
   }
 }
 ```
@@ -320,12 +322,12 @@
 [CommandRunner][] automatically adds a `help` command that displays usage
 information for commands, as well as support for the `--help` flag for all
 commands. If it encounters an error parsing the arguments or processing a
-command, it throws a [UsageError][]; your `main()` method should catch these and
+command, it throws a [UsageException][]; your `main()` method should catch these and
 print them appropriately. For example:
 
 ```dart
 runner.run(arguments).catchError((error) {
-  if (error is! UsageError) throw error;
+  if (error is! UsageException) throw error;
   print(error);
   exit(64); // Exit code 64 indicates a usage error.
 });
@@ -363,10 +365,10 @@
     });
 ```
 
-To display the help, use the [getUsage()][getUsage] method:
+To display the help, use the [usage][usage] getter:
 
 ```dart
-print(parser.getUsage());
+print(parser.usage);
 ```
 
 The resulting string looks something like this:
@@ -386,14 +388,14 @@
 [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
 [ArgParser]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser
 [ArgResults]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgResults
-[CommandRunner]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.CommandRunner
-[Command]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command
-[UsageError]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.UsageError
+[CommandRunner]: http://www.dartdocs.org/documentation/args/latest/index.html#args/command_runner.CommandRunner
+[Command]: http://www.dartdocs.org/documentation/args/latest/index.html#args/command_runner.Command
+[UsageException]: http://www.dartdocs.org/documentation/args/latest/index.html#args/command_runner.UsageException
 [addOption]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addOption
 [addFlag]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addFlag
 [parse]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_parse
 [rest]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgResults@id_rest
 [addCommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addCommand
 [getUsage]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_getUsage
-[addSubcommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command@id_addSubcommand
-[run]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command@id_run
+[addSubcommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/command_runner.Command@id_addSubcommand
+[run]: http://www.dartdocs.org/documentation/args/latest/index.html#args/command_runner.Command@id_run
diff --git a/packages/args/lib/args.dart b/packages/args/lib/args.dart
index 562df44..97b47b5 100644
--- a/packages/args/lib/args.dart
+++ b/packages/args/lib/args.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args;
-
 export 'src/arg_parser.dart';
+export 'src/arg_parser_exception.dart';
 export 'src/arg_results.dart' hide newArgResults;
 export 'src/option.dart' hide newOption;
diff --git a/packages/args/lib/command_runner.dart b/packages/args/lib/command_runner.dart
index d728cb0..6a6d282 100644
--- a/packages/args/lib/command_runner.dart
+++ b/packages/args/lib/command_runner.dart
@@ -2,13 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.command_runner;
-
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math' as math;
 
 import 'src/arg_parser.dart';
+import 'src/arg_parser_exception.dart';
 import 'src/arg_results.dart';
 import 'src/help_command.dart';
 import 'src/usage_exception.dart';
@@ -17,7 +16,11 @@
 export 'src/usage_exception.dart';
 
 /// A class for invoking [Commands] based on raw command-line arguments.
-class CommandRunner {
+///
+/// The type argument `T` represents the type returned by [Command.run] and
+/// [CommandRunner.run]; it can be ommitted if you're not using the return
+/// values.
+class CommandRunner<T> {
   /// The name of the executable being run.
   ///
   /// Used for error reporting and [usage].
@@ -42,7 +45,7 @@
   ///
   /// If a subclass overrides this to return a string, it will automatically be
   /// added to the end of [usage].
-  final String usageFooter = null;
+  String get usageFooter => null;
 
   /// Returns [usage] with [description] removed from the beginning.
   String get _usageWithoutDescription {
@@ -61,20 +64,21 @@
   }
 
   /// An unmodifiable view of all top-level commands defined for this runner.
-  Map<String, Command> get commands => new UnmodifiableMapView(_commands);
-  final _commands = new Map<String, Command>();
+  Map<String, Command<T>> get commands => new UnmodifiableMapView(_commands);
+  final _commands = <String, Command<T>>{};
 
   /// The top-level argument parser.
   ///
   /// Global options should be registered with this parser; they'll end up
   /// available via [Command.globalResults]. Commands should be registered with
   /// [addCommand] rather than directly on the parser.
-  final argParser = new ArgParser();
+  ArgParser get argParser => _argParser;
+  final _argParser = new ArgParser();
 
   CommandRunner(this.executableName, this.description) {
     argParser.addFlag('help',
         abbr: 'h', negatable: false, help: 'Print this usage information.');
-    addCommand(new HelpCommand());
+    addCommand(new HelpCommand<T>());
   }
 
   /// Prints the usage information for this runner.
@@ -88,7 +92,7 @@
       throw new UsageException(message, _usageWithoutDescription);
 
   /// Adds [Command] as a top-level command to this runner.
-  void addCommand(Command command) {
+  void addCommand(Command<T> command) {
     var names = [command.name]..addAll(command.aliases);
     for (var name in names) {
       _commands[name] = command;
@@ -100,22 +104,28 @@
   /// Parses [args] and invokes [Command.run] on the chosen command.
   ///
   /// This always returns a [Future] in case the command is asynchronous. The
-  /// [Future] will throw a [UsageError] if [args] was invalid.
-  Future run(Iterable<String> args) =>
+  /// [Future] will throw a [UsageException] if [args] was invalid.
+  Future<T> run(Iterable<String> args) =>
       new Future.sync(() => runCommand(parse(args)));
 
-  /// Parses [args] and returns the result, converting a [FormatException] to a
-  /// [UsageException].
+  /// Parses [args] and returns the result, converting an [ArgParserException]
+  /// to a [UsageException].
   ///
   /// This is notionally a protected method. It may be overridden or called from
   /// subclasses, but it shouldn't be called externally.
   ArgResults parse(Iterable<String> args) {
     try {
-      // TODO(nweiz): if arg parsing fails for a command, print that command's
-      // usage, not the global usage.
       return argParser.parse(args);
-    } on FormatException catch (error) {
-      usageException(error.message);
+    } on ArgParserException catch (error) {
+      if (error.commands.isEmpty) usageException(error.message);
+
+      var command = commands[error.commands.first];
+      for (var commandName in error.commands.skip(1)) {
+        command = command.subcommands[commandName];
+      }
+
+      command.usageException(error.message);
+      return null;
     }
   }
 
@@ -127,56 +137,61 @@
   /// It's useful to override this to handle global flags and/or wrap the entire
   /// command in a block. For example, you might handle the `--verbose` flag
   /// here to enable verbose logging before running the command.
-  Future runCommand(ArgResults topLevelResults) {
-    return new Future.sync(() {
-      var argResults = topLevelResults;
-      var commands = _commands;
-      var command;
-      var commandString = executableName;
+  ///
+  /// This returns the return value of [Command.run]. 
+  Future<T> runCommand(ArgResults topLevelResults) async {
+    var argResults = topLevelResults;
+    var commands = _commands;
+    Command command;
+    var commandString = executableName;
 
-      while (commands.isNotEmpty) {
-        if (argResults.command == null) {
-          if (argResults.rest.isEmpty) {
-            if (command == null) {
-              // No top-level command was chosen.
-              printUsage();
-              return new Future.value();
-            }
-
-            command.usageException('Missing subcommand for "$commandString".');
-          } else {
-            if (command == null) {
-              usageException(
-                  'Could not find a command named "${argResults.rest[0]}".');
-            }
-
-            command.usageException('Could not find a subcommand named '
-                '"${argResults.rest[0]}" for "$commandString".');
+    while (commands.isNotEmpty) {
+      if (argResults.command == null) {
+        if (argResults.rest.isEmpty) {
+          if (command == null) {
+            // No top-level command was chosen.
+            printUsage();
+            return null;
           }
-        }
 
-        // Step into the command.
-        argResults = argResults.command;
-        command = commands[argResults.name];
-        command._globalResults = topLevelResults;
-        command._argResults = argResults;
-        commands = command._subcommands;
-        commandString += " ${argResults.name}";
+          command.usageException('Missing subcommand for "$commandString".');
+        } else {
+          if (command == null) {
+            usageException(
+                'Could not find a command named "${argResults.rest[0]}".');
+          }
 
-        if (argResults['help']) {
-          command.printUsage();
-          return new Future.value();
+          command.usageException('Could not find a subcommand named '
+              '"${argResults.rest[0]}" for "$commandString".');
         }
       }
 
-      // Make sure there aren't unexpected arguments.
-      if (!command.takesArguments && argResults.rest.isNotEmpty) {
-        command.usageException(
-            'Command "${argResults.name}" does not take any arguments.');
-      }
+      // Step into the command.
+      argResults = argResults.command;
+      command = commands[argResults.name];
+      command._globalResults = topLevelResults;
+      command._argResults = argResults;
+      commands = command._subcommands;
+      commandString += " ${argResults.name}";
 
-      return command.run();
-    });
+      if (argResults['help']) {
+        command.printUsage();
+        return null;
+      }
+    }
+
+    if (topLevelResults['help']) {
+      command.printUsage();
+      return null;
+    }
+
+    // Make sure there aren't unexpected arguments.
+    if (!command.takesArguments && argResults.rest.isNotEmpty) {
+      command.usageException(
+          'Command "${argResults.name}" does not take any arguments.');
+    }
+
+    return (await command.run()) as T;
   }
 }
 
@@ -188,13 +203,19 @@
 /// A command with subcommands is known as a "branch command" and cannot be run
 /// itself. It should call [addSubcommand] (often from the constructor) to
 /// register subcommands.
-abstract class Command {
+abstract class Command<T> {
   /// The name of this command.
   String get name;
 
-  /// A short description of this command.
+  /// A description of this command, included in [usage].
   String get description;
 
+  /// A short description of this command, included in [parent]'s
+  /// [CommandRunner.usage].
+  ///
+  /// This defaults to the first line of [description].
+  String get summary => description.split("\n").first;
+
   /// A single-line template for how to invoke this command (e.g. `"pub get
   /// [package]"`).
   String get invocation {
@@ -214,18 +235,18 @@
   ///
   /// This will be `null` until [Command.addSubcommmand] has been called with
   /// this command.
-  Command get parent => _parent;
-  Command _parent;
+  Command<T> get parent => _parent;
+  Command<T> _parent;
 
   /// The command runner for this command.
   ///
   /// This will be `null` until [CommandRunner.addCommand] has been called with
   /// this command or one of its parents.
-  CommandRunner get runner {
+  CommandRunner<T> get runner {
     if (parent == null) return _runner;
     return parent.runner;
   }
-  CommandRunner _runner;
+  CommandRunner<T> _runner;
 
   /// The parsed global argument results.
   ///
@@ -245,7 +266,8 @@
   /// the constructor); they'll end up available via [argResults]. Subcommands
   /// should be registered with [addSubcommand] rather than directly on the
   /// parser.
-  final argParser = new ArgParser();
+  ArgParser get argParser => _argParser;
+  final _argParser = new ArgParser();
 
   /// Generates a string displaying usage information for this command.
   ///
@@ -257,13 +279,13 @@
   ///
   /// If a subclass overrides this to return a string, it will automatically be
   /// added to the end of [usage].
-  final String usageFooter = null;
+  String get usageFooter => null;
 
   /// Returns [usage] with [description] removed from the beginning.
   String get _usageWithoutDescription {
     var buffer = new StringBuffer()
-      ..writeln('Usage: $invocation')
-      ..writeln(argParser.usage);
+    ..writeln('Usage: $invocation')
+    ..writeln(argParser.usage);
 
     if (_subcommands.isNotEmpty) {
       buffer.writeln();
@@ -282,8 +304,9 @@
   }
 
   /// An unmodifiable view of all sublevel commands of this command.
-  Map<String, Command> get subcommands => new UnmodifiableMapView(_subcommands);
-  final _subcommands = new Map<String, Command>();
+  Map<String, Command<T>> get subcommands =>
+      new UnmodifiableMapView(_subcommands);
+  final _subcommands = <String, Command<T>>{};
 
   /// Whether or not this command should be hidden from help listings.
   ///
@@ -308,7 +331,7 @@
   ///
   /// This is intended to be overridden by commands that don't want to receive
   /// arguments. It has no effect for branch commands.
-  final takesArguments = true;
+  bool get takesArguments => true;
 
   /// Alternate names for this command.
   ///
@@ -316,7 +339,7 @@
   /// invoked on the command line.
   ///
   /// This is intended to be overridden.
-  final aliases = const <String>[];
+  List<String> get aliases => const [];
 
   Command() {
     argParser.addFlag('help',
@@ -325,14 +348,15 @@
 
   /// Runs this command.
   ///
-  /// If this returns a [Future], [CommandRunner.run] won't complete until the
-  /// returned [Future] does. Otherwise, the return value is ignored.
+  /// This must return a `T`, a `Future<T>`, or `null`. The value is returned by
+  /// [CommandRunner.runCommand]. Subclasses must explicitly declare a return
+  /// type for `run()`, and may not use `void` if `T` is defined.
   run() {
     throw new UnimplementedError("Leaf command $this must implement run().");
   }
 
   /// Adds [Command] as a subcommand of this.
-  void addSubcommand(Command command) {
+  void addSubcommand(Command<T> command) {
     var names = [command.name]..addAll(command.aliases);
     for (var name in names) {
       _subcommands[name] = command;
@@ -349,7 +373,7 @@
 
   /// Throws a [UsageException] with [message].
   void usageException(String message) =>
-      throw new UsageException(message, _usageWithoutDescription);
+    throw new UsageException(message, _usageWithoutDescription);
 }
 
 /// Returns a string representation of [commands] fit for use in a usage string.
@@ -360,7 +384,7 @@
     {bool isSubcommand: false}) {
   // Don't include aliases.
   var names =
-      commands.keys.where((name) => !commands[name].aliases.contains(name));
+    commands.keys.where((name) => !commands[name].aliases.contains(name));
 
   // Filter out hidden ones, unless they are all hidden.
   var visible = names.where((name) => !commands[name].hidden);
@@ -371,11 +395,17 @@
   var length = names.map((name) => name.length).reduce(math.max);
 
   var buffer =
-      new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:');
+    new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:');
   for (var name in names) {
+    var lines = commands[name].summary.split("\n");
     buffer.writeln();
-    buffer.write('  ${padRight(name, length)}   '
-        '${commands[name].description.split("\n").first}');
+    buffer.write('  ${padRight(name, length)}   ${lines.first}');
+
+    for (var line in lines.skip(1)) {
+      buffer.writeln();
+      buffer.write(' ' * (length + 5));
+      buffer.write(line);
+    }
   }
 
   return buffer.toString();
diff --git a/packages/args/lib/src/arg_parser.dart b/packages/args/lib/src/arg_parser.dart
index c32741d..fa80031 100644
--- a/packages/args/lib/src/arg_parser.dart
+++ b/packages/args/lib/src/arg_parser.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.src.arg_parser;
-
 import 'dart:collection';
 
 import 'arg_results.dart';
@@ -37,12 +35,12 @@
   /// after it finds an argument that is neither an option nor a command.
   /// This allows options to be specified after regular arguments. Defaults to
   /// `false`.
-  factory ArgParser({bool allowTrailingOptions}) => new ArgParser._(
+  factory ArgParser({bool allowTrailingOptions: false}) => new ArgParser._(
       <String, Option>{}, <String, ArgParser>{},
       allowTrailingOptions: allowTrailingOptions);
 
   ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
-      {bool allowTrailingOptions})
+      {bool allowTrailingOptions: false})
       : this._options = options,
         this.options = new UnmodifiableMapView(options),
         this._commands = commands,
@@ -132,7 +130,7 @@
   /// Parses [args], a list of command-line arguments, matches them against the
   /// flags and options defined by this parser, and returns the result.
   ArgResults parse(List<String> args) =>
-      new Parser(null, this, args.toList(), null, null).parse();
+      new Parser(null, this, args.toList()).parse();
 
   /// Generates a string displaying usage information for the defined options.
   ///
diff --git a/packages/args/lib/src/arg_parser_exception.dart b/packages/args/lib/src/arg_parser_exception.dart
new file mode 100644
index 0000000..20eddb9
--- /dev/null
+++ b/packages/args/lib/src/arg_parser_exception.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// An exception thrown by [ArgParser].
+class ArgParserException extends FormatException {
+  /// The command(s) that were parsed before discovering the error.
+  ///
+  /// This will be empty if the error was on the root parser.
+  final List<String> commands;
+
+  ArgParserException(String message, [Iterable<String> commands])
+      : commands = commands == null
+            ? const []
+            : new List.unmodifiable(commands),
+        super(message);
+}
diff --git a/packages/args/lib/src/arg_results.dart b/packages/args/lib/src/arg_results.dart
index 6be2de4..50e85fa 100644
--- a/packages/args/lib/src/arg_results.dart
+++ b/packages/args/lib/src/arg_results.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.src.arg_results;
-
 import 'dart:collection';
 
 import 'arg_parser.dart';
diff --git a/packages/args/lib/src/help_command.dart b/packages/args/lib/src/help_command.dart
index f477b47..104327c 100644
--- a/packages/args/lib/src/help_command.dart
+++ b/packages/args/lib/src/help_command.dart
@@ -2,30 +2,28 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.help_command;
-
 import '../command_runner.dart';
 
 /// The built-in help command that's added to every [CommandRunner].
 ///
 /// This command displays help information for the various subcommands.
-class HelpCommand extends Command {
+class HelpCommand<T> extends Command<T> {
   final name = "help";
   String get description =>
       "Display help information for ${runner.executableName}.";
   String get invocation => "${runner.executableName} help [command]";
 
-  void run() {
+  T run() {
     // Show the default help if no command was specified.
     if (argResults.rest.isEmpty) {
       runner.printUsage();
-      return;
+      return null;
     }
 
     // Walk the command tree to show help for the selected command or
     // subcommand.
     var commands = runner.commands;
-    var command = null;
+    Command command;
     var commandString = runner.executableName;
 
     for (var name in argResults.rest) {
@@ -49,5 +47,6 @@
     }
 
     command.printUsage();
+    return null;
   }
 }
diff --git a/packages/args/lib/src/option.dart b/packages/args/lib/src/option.dart
index 07e87f6..a37193f 100644
--- a/packages/args/lib/src/option.dart
+++ b/packages/args/lib/src/option.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.src.option;
-
 import 'dart:collection';
 
 /// Creates a new [Option].
diff --git a/packages/args/lib/src/parser.dart b/packages/args/lib/src/parser.dart
index a10692d..64374fc 100644
--- a/packages/args/lib/src/parser.dart
+++ b/packages/args/lib/src/parser.dart
@@ -2,9 +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.
 
-library args.src.parser;
-
 import 'arg_parser.dart';
+import 'arg_parser_exception.dart';
 import 'arg_results.dart';
 import 'option.dart';
 
@@ -37,7 +36,8 @@
   /// The accumulated parsed options.
   final Map<String, dynamic> results = <String, dynamic>{};
 
-  Parser(this.commandName, this.grammar, this.args, this.parent, rest) {
+  Parser(this.commandName, this.grammar, this.args,
+      [this.parent, List<String> rest]) {
     if (rest != null) this.rest.addAll(rest);
   }
 
@@ -64,7 +64,15 @@
         validate(rest.isEmpty, 'Cannot specify arguments before a command.');
         var commandName = args.removeAt(0);
         var commandParser = new Parser(commandName, command, args, this, rest);
-        commandResults = commandParser.parse();
+
+        try {
+          commandResults = commandParser.parse();
+        } on ArgParserException catch (error) {
+          if (commandName == null) rethrow;
+          throw new ArgParserException(
+              error.message,
+              [commandName]..addAll(error.commands));
+        }
 
         // All remaining arguments were passed to command so clear them here.
         rest.clear();
@@ -243,9 +251,9 @@
 
   /// Called during parsing to validate the arguments.
   ///
-  /// Throws a [FormatException] if [condition] is `false`.
+  /// Throws an [ArgParserException] if [condition] is `false`.
   void validate(bool condition, String message) {
-    if (!condition) throw new FormatException(message);
+    if (!condition) throw new ArgParserException(message);
   }
 
   /// Validates and stores [value] as the value for [option], which must not be
@@ -259,7 +267,7 @@
       return;
     }
 
-    var list = results.putIfAbsent(option.name, () => []);
+    var list = results.putIfAbsent(option.name, () => <String>[]);
 
     if (option.splitCommas) {
       for (var element in value.split(",")) {
diff --git a/packages/args/lib/src/usage.dart b/packages/args/lib/src/usage.dart
index 177a810..2b40332 100644
--- a/packages/args/lib/src/usage.dart
+++ b/packages/args/lib/src/usage.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.src.usage;
-
 import 'dart:math';
 
 import '../args.dart';
diff --git a/packages/args/lib/src/usage_exception.dart b/packages/args/lib/src/usage_exception.dart
index 35cc744..2d8e112 100644
--- a/packages/args/lib/src/usage_exception.dart
+++ b/packages/args/lib/src/usage_exception.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.usage_exception;
-
 class UsageException implements Exception {
   final String message;
   final String usage;
diff --git a/packages/args/lib/src/utils.dart b/packages/args/lib/src/utils.dart
index dc355df..2469fac 100644
--- a/packages/args/lib/src/utils.dart
+++ b/packages/args/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args.utils;
-
 /// Pads [source] to [length] by adding spaces at the end.
 String padRight(String source, int length) =>
     source + ' ' * (length - source.length);
diff --git a/packages/args/pubspec.yaml b/packages/args/pubspec.yaml
index 3ea1a11..e1a6b05 100644
--- a/packages/args/pubspec.yaml
+++ b/packages/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.13.2
+version: 0.13.7
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/args
 description: >
diff --git a/packages/args/test/args_test.dart b/packages/args/test/args_test.dart
index ee37b45..4553b30 100644
--- a/packages/args/test/args_test.dart
+++ b/packages/args/test/args_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library args_test;
-
 import 'package:test/test.dart';
 import 'package:args/args.dart';
 import 'utils.dart';
diff --git a/packages/args/test/command_parse_test.dart b/packages/args/test/command_parse_test.dart
index 54b3032..269ed01 100644
--- a/packages/args/test/command_parse_test.dart
+++ b/packages/args/test/command_parse_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library command_parse_test;
-
 import 'package:test/test.dart';
 import 'package:args/args.dart';
 import 'utils.dart';
diff --git a/packages/args/test/command_runner_test.dart b/packages/args/test/command_runner_test.dart
index 3a796f1..9b0713a 100644
--- a/packages/args/test/command_runner_test.dart
+++ b/packages/args/test/command_runner_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library command_runner_test;
-
 import 'package:args/command_runner.dart';
 import 'package:test/test.dart';
 
@@ -56,6 +54,43 @@
 Run "test help <command>" for more information about a command."""));
     });
 
+    test("truncates newlines in command descriptions by default", () {
+      runner.addCommand(new MultilineCommand());
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  help        Display help information for test.
+  multiline   Multi
+
+Run "test help <command>" for more information about a command."""));
+    });
+
+    test("supports newlines in command summaries", () {
+      runner.addCommand(new MultilineSummaryCommand());
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  help        Display help information for test.
+  multiline   Multi
+              line.
+
+Run "test help <command>" for more information about a command."""));
+    });
+
     test("contains custom options", () {
       runner.argParser.addFlag("foo", help: "Do something.");
 
@@ -104,7 +139,7 @@
 
   test("usageException splits up the message and usage", () {
     expect(() => runner.usageException("message"),
-        throwsUsageError("message", _DEFAULT_USAGE));
+        throwsUsageException("message", _DEFAULT_USAGE));
   });
 
   group("run()", () {
@@ -126,6 +161,22 @@
       }), completes);
     });
 
+    test("runs a command with a return value", () {
+      var runner = new CommandRunner<int>("test", "");
+      var command = new ValueCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["foo"]), completion(equals(12)));
+    });
+
+    test("runs a command with an asynchronous return value", () {
+      var runner = new CommandRunner<String>("test", "");
+      var command = new AsyncValueCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["foo"]), completion(equals("hi")));
+    });
+
     test("runs a hidden comand", () {
       var command = new HiddenCommand();
       runner.addCommand(command);
@@ -162,7 +213,7 @@
 """));
       });
 
-      test("with a command prints the usage for that command", () {
+      test("with a preceding command prints the usage for that command", () {
         var command = new FooCommand();
         runner.addCommand(command);
 
@@ -175,6 +226,20 @@
 Run "test help" to see global options.
 """));
       });
+
+      test("with a following command prints the usage for that command", () {
+        var command = new FooCommand();
+        runner.addCommand(command);
+
+        expect(() => runner.run(["--help", "foo"]), prints("""
+Set a value.
+
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options.
+"""));
+      });
     });
 
     group("with help command", () {
@@ -211,6 +276,27 @@
 """));
       });
     });
+
+    group("with an invalid argument", () {
+      test("at the root throws the root usage", () {
+        expect(runner.run(["--asdf"]), throwsUsageException(
+            'Could not find an option named "asdf".',
+            '$_DEFAULT_USAGE'));
+      });
+
+      test("for a command throws the command usage", () {
+        var command = new FooCommand();
+        runner.addCommand(command);
+
+        expect(runner.run(["foo", "--asdf"]), throwsUsageException(
+            'Could not find an option named "asdf".',
+            """
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options."""));
+      });
+    });
   });
 
   group("with a footer", () {
@@ -227,7 +313,7 @@
     });
 
     test("includes the footer in usage errors", () {
-      expect(runner.run(["--bad"]), throwsUsageError(
+      expect(runner.run(["--bad"]), throwsUsageException(
           'Could not find an option named "bad".',
           "$_DEFAULT_USAGE\nAlso, footer!"));
     });
@@ -235,19 +321,19 @@
 
   group("throws a useful error when", () {
     test("arg parsing fails", () {
-      expect(runner.run(["--bad"]), throwsUsageError(
+      expect(runner.run(["--bad"]), throwsUsageException(
           'Could not find an option named "bad".', _DEFAULT_USAGE));
     });
 
     test("a top-level command doesn't exist", () {
-      expect(runner.run(["bad"]), throwsUsageError(
+      expect(runner.run(["bad"]), throwsUsageException(
           'Could not find a command named "bad".', _DEFAULT_USAGE));
     });
 
     test("a subcommand doesn't exist", () {
       runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
 
-      expect(runner.run(["foo bad"]), throwsUsageError(
+      expect(runner.run(["foo bad"]), throwsUsageException(
           'Could not find a command named "foo bad".', """
 Usage: test <command> [arguments]
 
@@ -264,7 +350,7 @@
     test("a subcommand wasn't passed", () {
       runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
 
-      expect(runner.run(["foo"]), throwsUsageError(
+      expect(runner.run(["foo"]), throwsUsageException(
           'Missing subcommand for "test foo".', """
 Usage: test foo <subcommand> [arguments]
 -h, --help    Print this usage information.
@@ -278,7 +364,7 @@
     test("a command that doesn't take arguments was given them", () {
       runner.addCommand(new FooCommand());
 
-      expect(runner.run(["foo", "bar"]), throwsUsageError(
+      expect(runner.run(["foo", "bar"]), throwsUsageException(
           'Command "foo" does not take any arguments.', """
 Usage: test foo [arguments]
 -h, --help    Print this usage information.
diff --git a/packages/args/test/command_test.dart b/packages/args/test/command_test.dart
index 888016a..cd32c63 100644
--- a/packages/args/test/command_test.dart
+++ b/packages/args/test/command_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library command_test;
-
 import 'package:args/command_runner.dart';
 import 'package:test/test.dart';
 import 'utils.dart';
@@ -92,7 +90,8 @@
   });
 
   test("usageException splits up the message and usage", () {
-    expect(() => foo.usageException("message"), throwsUsageError("message", """
+    expect(() => foo.usageException("message"),
+        throwsUsageException("message", """
 Usage: test foo [arguments]
 -h, --help    Print this usage information.
 
diff --git a/packages/args/test/parse_test.dart b/packages/args/test/parse_test.dart
index 39027c2..6ce8a19 100644
--- a/packages/args/test/parse_test.dart
+++ b/packages/args/test/parse_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library parse_test;
-
 import 'package:test/test.dart';
 import 'package:args/args.dart';
 import 'utils.dart';
@@ -119,7 +117,7 @@
       });
 
       test('are invoked even if the flag is not present', () {
-        var a = 'not called';
+        var a = true;
         var parser = new ArgParser();
         parser.addFlag('a', callback: (value) => a = value);
 
@@ -163,6 +161,10 @@
 
         parser.parse(['--a=v', '--a=x']);
         expect(a, equals(['v', 'x']));
+
+        // This reified type is important in strong mode so that people can
+        // safely write "as List<String>".
+        expect(a, new isInstanceOf<List<String>>());
       });
 
       test('for single present, allowMultiple, options are invoked with '
diff --git a/packages/args/test/trailing_options_test.dart b/packages/args/test/trailing_options_test.dart
index efc53b2..cdc4227 100644
--- a/packages/args/test/trailing_options_test.dart
+++ b/packages/args/test/trailing_options_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library trailing_options_test;
-
 import 'package:test/test.dart';
 import 'package:args/args.dart';
 
diff --git a/packages/args/test/usage_test.dart b/packages/args/test/usage_test.dart
index 492c517..31c19d2 100644
--- a/packages/args/test/usage_test.dart
+++ b/packages/args/test/usage_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library usage_test;
-
 import 'package:test/test.dart';
 import 'package:args/args.dart';
 
diff --git a/packages/args/test/utils.dart b/packages/args/test/utils.dart
index 1cdd803..a874eee 100644
--- a/packages/args/test/utils.dart
+++ b/packages/args/test/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library utils;
-
 import 'dart:async';
 
 import 'package:args/args.dart';
@@ -11,7 +9,7 @@
 import 'package:test/test.dart';
 
 class CommandRunnerWithFooter extends CommandRunner {
-  final usageFooter = "Also, footer!";
+  String get usageFooter => "Also, footer!";
 
   CommandRunnerWithFooter(String executableName, String description)
       : super(executableName, description);
@@ -29,6 +27,38 @@
   }
 }
 
+class ValueCommand extends Command<int> {
+  final name = "foo";
+  final description = "Return a value.";
+  final takesArguments = false;
+
+  int run() => 12;
+}
+
+class AsyncValueCommand extends Command<String> {
+  final name = "foo";
+  final description = "Return a future.";
+  final takesArguments = false;
+
+  Future<String> run() async => "hi";
+}
+
+class MultilineCommand extends Command {
+  var hasRun = false;
+
+  final name = "multiline";
+  final description = "Multi\nline.";
+  final takesArguments = false;
+
+  void run() {
+    hasRun = true;
+  }
+}
+
+class MultilineSummaryCommand extends MultilineCommand {
+  String get summary => description;
+}
+
 class HiddenCommand extends Command {
   var hasRun = false;
 
@@ -73,7 +103,7 @@
   expect(() => parser.parse(args), throwsFormatException);
 }
 
-Matcher throwsUsageError(message, usage) {
+Matcher throwsUsageException(message, usage) {
   return throwsA(predicate((error) {
     expect(error, new isInstanceOf<UsageException>());
     expect(error.message, message);
diff --git a/packages/async/.analysis_options b/packages/async/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/async/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/async/.travis.yml b/packages/async/.travis.yml
new file mode 100644
index 0000000..662d2fe
--- /dev/null
+++ b/packages/async/.travis.yml
@@ -0,0 +1,23 @@
+language: dart
+sudo: false
+dart:
+  - dev
+  - stable
+  - 1.23.0
+  - 1.22.1
+cache:
+  directories:
+    - $HOME/.pub-cache
+dart_task:
+  - test: --platform vm
+  # No parallelism on Firefox (-j 1)
+  # Causes flakiness – need to investigate
+  - test: --platform firefox -j 1
+  - test: --platform dartium
+    install_dartium: true
+  - dartanalyzer
+  - dartfmt
+matrix:
+  exclude:
+    - dart: 1.22.1
+      dart_task: dartfmt
diff --git a/packages/async/CHANGELOG.md b/packages/async/CHANGELOG.md
index 5801872..e4a8696 100644
--- a/packages/async/CHANGELOG.md
+++ b/packages/async/CHANGELOG.md
@@ -1,8 +1,144 @@
+## 1.13.3
+
+* Make `TypeSafeStream` extend `Stream` instead of implementing it. This ensures
+  that new methods on `Stream` are automatically picked up, they will go through
+  the `listen` method which type-checks every event.
+  
+## 1.13.2
+
+* Fix a type-warning.
+
+## 1.13.1
+
+* Use `FutureOr` for various APIs that had previously used `dynamic`.
+
+## 1.13.0
+
+* Add `collectBytes` and `collectBytesCancelable` functions which collects
+  list-of-byte events into a single byte list.
+
+* Fix a bug where rejecting a `StreamQueueTransaction` would throw a
+  `StateError` if `StreamQueue.rest` had been called on one of its child queues.
+
+* `StreamQueue.withTransaction()` now properly returns whether or not the
+  transaction was committed.
+
+## 1.12.0
+
+* Add an `AsyncCache` class that caches asynchronous operations for a period of
+  time.
+
+* Add `StreamQueue.peek` and `StreamQueue.lookAheead`.
+  These allow users to look at events without consuming them.
+
+* Add `StreamQueue.startTransaction()` and `StreamQueue.withTransaction()`.
+  These allow users to conditionally consume events based on their values.
+
+* Add `StreamQueue.cancelable()`, which allows users to easily make a
+  `CancelableOperation` that can be canceled without affecting the queue.
+
+* Add `StreamQueue.eventsDispatched` which counts the number of events that have
+  been dispatched by a given queue.
+
+* Add a `subscriptionTransformer()` function to create `StreamTransformer`s that
+  modify the behavior of subscriptions to a stream.
+
+## 1.11.3
+
+* Fix strong-mode warning against the signature of Future.then
+
+## 1.11.1
+
+* Fix new strong-mode warnings introduced in Dart 1.17.0.
+
+## 1.11.0
+
+* Add a `typedStreamTransformer()` function. This wraps an untyped
+  `StreamTransformer` with the correct type parameters, and asserts the types of
+  events as they're emitted from the transformed stream.
+
+* Add a `StreamSinkTransformer.typed()` static method. This wraps an untyped
+  `StreamSinkTransformer` with the correct type parameters, and asserts the
+  types of arguments passed in to the resulting sink.
+
+## 1.10.0
+
+* Add `DelegatingFuture.typed()`, `DelegatingStreamSubscription.typed()`,
+  `DelegatingStreamConsumer.typed()`, `DelegatingSink.typed()`,
+  `DelegatingEventSink.typed()`, and `DelegatingStreamSink.typed()` static
+  methods. These wrap untyped instances of these classes with the correct type
+  parameter, and assert the types of values as they're accessed.
+
+* Add a `DelegatingStream` class. This is behaviorally identical to `StreamView`
+  from `dart:async`, but it follows this package's naming conventions and
+  provides a `DelegatingStream.typed()` static method.
+
+* Fix all strong mode warnings and add generic method annotations.
+
+* `new StreamQueue()`, `new SubscriptionStream()`, `new
+  DelegatingStreamSubscription()`, `new DelegatingStreamConsumer()`, `new
+  DelegatingSink()`, `new DelegatingEventSink()`, and `new
+  DelegatingStreamSink()` now take arguments with generic type arguments (for
+  example `Stream<T>`) rather than without (for example `Stream<dynamic>`).
+  Passing a type that wasn't `is`-compatible with the fully-specified generic
+  would already throw an error under some circumstances, so this is not
+  considered a breaking change.
+
+* `ErrorResult` now takes a type parameter.
+
+* `Result.asError` now returns a `Result<T>`.
+
+## 1.9.0
+
+* Deprecate top-level libraries other than `package:async/async.dart`, which
+  exports these libraries' interfaces.
+
+* Add `Result.captureStreamTransformer`, `Result.releaseStreamTransformer`,
+  `Result.captureSinkTransformer`, and `Result.releaseSinkTransformer`.
+
+* Deprecate `CaptureStreamTransformer`, `ReleaseStreamTransformer`,
+  `CaptureSink`, and `ReleaseSink`. `Result.captureStreamTransformer`,
+  `Result.releaseStreamTransformer`, `Result.captureSinkTransformer`, and
+  `Result.releaseSinkTransformer` should be used instead.
+
+## 1.8.0
+
+- Added `StreamSinkCompleter`, for creating a `StreamSink` now and providing its
+  destination later as another sink.
+
+- Added `StreamCompleter.setError`, a shortcut for emitting a single error event
+  on the resulting stream.
+
+- Added `NullStreamSink`, an implementation of `StreamSink` that discards all
+  events.
+
+## 1.7.0
+
+- Added `SingleSubscriptionTransformer`, a `StreamTransformer` that converts a
+  broadcast stream into a single-subscription stream.
+
+## 1.6.0
+
+- Added `CancelableOperation.valueOrCancellation()`, which allows users to be
+  notified when an operation is canceled elsewhere.
+
+- Added `StreamSinkTransformer` which transforms events before they're passed to
+  a `StreamSink`, similarly to how `StreamTransformer` transforms events after
+  they're emitted by a stream.
+
+## 1.5.0
+
+- Added `LazyStream`, which forwards to the return value of a callback that's
+  only called when the stream is listened to.
+
 ## 1.4.0
 
 - Added `AsyncMemoizer.future`, which allows the result to be accessed before
   `runOnce()` is called.
 
+- Added `CancelableOperation`, an asynchronous operation that can be canceled.
+  It can be created using a `CancelableCompleter`.
+
 - Added `RestartableTimer`, a non-periodic timer that can be reset over and
   over.
 
@@ -42,6 +178,9 @@
 - Added a `StreamGroup` class for merging the events of a group of streams,
   potentially of unknown size.
 
+- Added a `StreamSplitter` class for splitting a stream into multiple new
+  streams.
+
 ## 1.1.1
 
 - Updated SDK version constraint to at least 1.9.0.
diff --git a/packages/async/README.md b/packages/async/README.md
index 3820f06..60e7b0b 100644
--- a/packages/async/README.md
+++ b/packages/async/README.md
@@ -1,28 +1,93 @@
-# Async utilities package
+Contains utility classes in the style of `dart:async` to work with asynchronous
+computations.
 
-Contains tools to work with asynchronous computations.
+* The [`AsyncCache`][AsyncCache] class allows expensive asynchronous
+  computations values to be cached for a period of time.
 
-The package contains `Stream` and `Future` related functionality,
-as well as sub-libraries with different utilities.
+* The [`AsyncMemoizer`][AsyncMemoizer] class makes it easy to only run an
+  asynchronous operation once on demand.
 
-### Zipping streams
+* The [`CancelableOperation`][CancelableOperation] class defines an operation
+  that can be canceled by its consumer. The producer can then listen for this
+  cancellation and stop producing the future when it's received. It can be
+  created using a [`CancelableCompleter`][CancelableCompleter].
 
-The "stream_zip.dart" sub-library contains functionality
-to combine several streams of events into a single stream of tuples of events.
+* The delegating wrapper classes allow users to easily add functionality on top
+  of existing instances of core types from `dart:async`. These include
+  [`DelegatingFuture`][DelegatingFuture],
+  [`DelegatingStream`][DelegatingStream],
+  [`DelegatingStreamSubscription`][DelegatingStreamSubscription],
+  [`DelegatingStreamConsumer`][DelegatingStreamConsumer],
+  [`DelegatingSink`][DelegatingSink],
+  [`DelegatingEventSink`][DelegatingEventSink], and
+  [`DelegatingStreamSink`][DelegatingStreamSink].
 
-### Results
-The "result.dart" sub-library introduces a `Result` class that can hold either
-a value or an error.
-It allows capturing an asynchronous computation which can give either a value
-or an error, into an asynchronous computation that always gives a `Result`
-value, where errors can be treated as data.
-It also allows releasing the `Result` back into an asynchronous computation.
+  The delegating classes all have `.typed()` constructors which allow users to
+  cast the generic type parameters in a way that's safe for strong mode. For
+  example, if `future` is a `Future<dynamic>` and you know it actually contains an
+  `int`, you can write `DelegatingFuture.typed<int>(future)`.
 
-### History.
-This package is unrelated to the discontinued `async` package with version 0.1.7.
+* The [`FutureGroup`][FutureGroup] class makes it easy to wait until a group of
+  features that may change over time completes.
 
-## Features and bugs
+* The [`LazyStream`][LazyStream] class allows a stream to be initialized lazily
+  when `.listen()` is first called.
 
-Please file feature requests and bugs at the [issue tracker][tracker].
+* The [`NullStreamSink`][NullStreamSink] class is an implementation of
+  `StreamSink` that discards all events.
 
-[tracker]: https://github.com/dart-lang/async/issues
+* The [`RestartableTimer`][RestartableTimer] class extends `Timer` with a
+  `reset()` method.
+
+* The [`Result`][Result] class that can hold either a value or an error. It
+  provides various utilities for converting to and from `Future`s and `Stream`s.
+
+* The [`StreamGroup`][StreamGroup] class merges a collection of streams into a
+  single output stream.
+
+* The [`StreamQueue`][StreamQueue] class allows a stream to be consumed
+  event-by-event rather than being pushed whichever events as soon as they
+  arrive.
+
+* The [`StreamSplitter`][StreamSplitter] class allows a stream to be duplicated
+  into multiple identical streams.
+
+* The [`StreamZip`][StreamZip] class combines multiple streams into a single
+  stream of lists of events.
+
+* This package contains a number of [`StreamTransformer`][StreamTransformer]s.
+  [`SingleSubscriptionTransformer`][SingleSubscriptionTransformer] converts a
+  broadcast stream to a single-subscription stream, and
+  [`typedStreamTransformer`][typedStreamTransformer] casts the type of a
+  `Stream`. It also defines a transformer type for [`StreamSink`][StreamSink]s,
+  [`StreamSinkTransformer`][StreamSinkTransformer].
+
+* The [`SubscriptionStream`][SubscriptionStream] class wraps a
+  `StreamSubscription` so it can be re-used as a `Stream`.
+
+[AsyncCache]: https://www.dartdocs.org/documentation/async/latest/async/AsyncCache-class.html
+[AsyncMemoizer]: https://www.dartdocs.org/documentation/async/latest/async/AsyncMemoizer-class.html
+[CancelableCompleter]: https://www.dartdocs.org/documentation/async/latest/async/CancelableCompleter-class.html
+[CancelableOperation]: https://www.dartdocs.org/documentation/async/latest/async/CancelableOperation-class.html
+[DelegatingEventSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingEventSink-class.html
+[DelegatingFuture]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingFuture-class.html
+[DelegatingSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingSink-class.html
+[DelegatingStreamConsumer]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamConsumer-class.html
+[DelegatingStreamSink]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamSink-class.html
+[DelegatingStreamSubscription]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStreamSubscription-class.html
+[DelegatingStream]: https://www.dartdocs.org/documentation/async/latest/async/DelegatingStream-class.html
+[FutureGroup]: https://www.dartdocs.org/documentation/async/latest/async/FutureGroup-class.html
+[LazyStream]: https://www.dartdocs.org/documentation/async/latest/async/LazyStream-class.html
+[NullStreamSink]: https://www.dartdocs.org/documentation/async/latest/async/NullStreamSink-class.html
+[RestartableTimer]: https://www.dartdocs.org/documentation/async/latest/async/RestartableTimer-class.html
+[Result]: https://www.dartdocs.org/documentation/async/latest/async/Result-class.html
+[SingleSubscriptionTransformer]: https://www.dartdocs.org/documentation/async/latest/async/SingleSubscriptionTransformer-class.html
+[StreamGroup]: https://www.dartdocs.org/documentation/async/latest/async/StreamGroup-class.html
+[StreamQueue]: https://www.dartdocs.org/documentation/async/latest/async/StreamQueue-class.html
+[StreamSinkTransformer]: https://www.dartdocs.org/documentation/async/latest/async/StreamSinkTransformer-class.html
+[StreamSink]: https://api.dartlang.org/stable/latest/dart-async/StreamSink-class.html
+[StreamSplitter]: https://www.dartdocs.org/documentation/async/latest/async/StreamSplitter-class.html
+[StreamTransformer]: https://api.dartlang.org/stable/latest/dart-async/StreamTransformer-class.html
+[StreamZip]: https://www.dartdocs.org/documentation/async/latest/async/StreamZip-class.html
+[SubscriptionStream]: https://www.dartdocs.org/documentation/async/latest/async/SubscriptionStream-class.html
+[typedStreamTransformer]: https://www.dartdocs.org/documentation/async/latest/async/typedStreamTransformer.html
diff --git a/packages/async/lib/async.dart b/packages/async/lib/async.dart
index 9da3552..e090032 100644
--- a/packages/async/lib/async.dart
+++ b/packages/async/lib/async.dart
@@ -2,23 +2,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library dart.pkg.async;
-
-export "result.dart";
+export "src/async_cache.dart";
 export "src/async_memoizer.dart";
+export "src/byte_collector.dart";
 export "src/cancelable_operation.dart";
 export "src/delegate/event_sink.dart";
 export "src/delegate/future.dart";
 export "src/delegate/sink.dart";
+export "src/delegate/stream.dart";
 export "src/delegate/stream_consumer.dart";
 export "src/delegate/stream_sink.dart";
 export "src/delegate/stream_subscription.dart";
 export "src/future_group.dart";
+export "src/lazy_stream.dart";
+export "src/null_stream_sink.dart";
 export "src/restartable_timer.dart";
-export "src/result_future.dart";
+export "src/result.dart";
+export "src/result/capture_transformer.dart";
+export "src/result/error.dart";
+export "src/result/future.dart";
+export "src/result/release_transformer.dart";
+export "src/result/value.dart";
+export "src/single_subscription_transformer.dart";
 export "src/stream_completer.dart";
 export "src/stream_group.dart";
 export "src/stream_queue.dart";
+export "src/stream_sink_completer.dart";
+export "src/stream_sink_transformer.dart";
 export "src/stream_splitter.dart";
+export "src/stream_subscription_transformer.dart";
+export "src/stream_zip.dart";
 export "src/subscription_stream.dart";
-export "stream_zip.dart";
+export "src/typed_stream_transformer.dart";
diff --git a/packages/async/lib/result.dart b/packages/async/lib/result.dart
index 13e3dd9..627f200 100644
--- a/packages/async/lib/result.dart
+++ b/packages/async/lib/result.dart
@@ -2,255 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Capture asynchronous results into synchronous values.
-///
-/// Capturing a result (either a returned value or a thrown error)
-/// means converting it into a [Result] -
-/// either a [ValueResult] or an [ErrorResult].
-///
-/// This value can release itself by writing itself either to a
-/// [EventSink] or a [Completer], or by becoming a [Future].
+/// Import `async.dart` instead.
+@Deprecated("Will be removed in async 2.0.0.")
 library dart.pkg.async.results;
 
-import "dart:async";
-
-/// The result of a computation.
-abstract class Result<T> {
-  /// Create a `Result` with the result of calling [computation].
-  ///
-  /// This generates either a [ValueResult] with the value returned by
-  /// calling `computation`, or an [ErrorResult] with an error thrown by
-  /// the call.
-  factory Result(T computation()) {
-    try {
-      return new ValueResult(computation());
-    } catch (e, s) {
-      return new ErrorResult(e, s);
-    }
-  }
-
-  /// Create a `Result` holding a value.
-  ///
-  /// Alias for [ValueResult.ValueResult].
-  factory Result.value(T value) = ValueResult<T>;
-
-  /// Create a `Result` holding an error.
-  ///
-  /// Alias for [ErrorResult.ErrorResult].
-  factory Result.error(Object error, [StackTrace stackTrace]) =>
-      new ErrorResult(error, stackTrace);
-
-  // Helper functions.
-  static _captureValue(value) => new ValueResult(value);
-  static _captureError(error, stack) => new ErrorResult(error, stack);
-  static _release(Result v) {
-    if (v.isValue) return v.asValue.value;  // Avoid wrapping in future.
-    return v.asFuture;
-  }
-
-  /// Capture the result of a future into a `Result` future.
-  ///
-  /// The resulting future will never have an error.
-  /// Errors have been converted to an [ErrorResult] value.
-  static Future<Result> capture(Future future) {
-    return future.then(_captureValue, onError: _captureError);
-  }
-
-  /// Release the result of a captured future.
-  ///
-  /// Converts the [Result] value of the given [future] to a value or error
-  /// completion of the returned future.
-  ///
-  /// If [future] completes with an error, the returned future completes with
-  /// the same error.
-  static Future release(Future<Result> future) {
-    return future.then(_release);
-  }
-
-  /// Capture the results of a stream into a stream of [Result] values.
-  ///
-  /// The returned stream will not have any error events.
-  /// Errors from the source stream have been converted to [ErrorResult]s.
-  ///
-  /// Shorthand for transforming the stream using [CaptureStreamTransformer].
-  static Stream<Result> captureStream(Stream source) {
-    return source.transform(const CaptureStreamTransformer());
-  }
-
-  /// Release a stream of [result] values into a stream of the results.
-  ///
-  /// `Result` values of the source stream become value or error events in
-  /// the returned stream as appropriate.
-  /// Errors from the source stream become errors in the returned stream.
-  ///
-  /// Shorthand for transforming the stream using [ReleaseStreamTransformer].
-  static Stream releaseStream(Stream<Result> source) {
-    return source.transform(const ReleaseStreamTransformer());
-  }
-
-  /// Converts a result of a result to a single result.
-  ///
-  /// If the result is an error, or it is a `Result` value
-  /// which is then an error, then a result with that error is returned.
-  /// Otherwise both levels of results are value results, and a single
-  /// result with the value is returned.
-  static Result flatten(Result<Result> result) {
-    if (result.isError) return result;
-    return result.asValue.value;
-  }
-
-  /// Whether this result is a value result.
-  ///
-  /// Always the opposite of [isError].
-  bool get isValue;
-
-  /// Whether this result is an error result.
-  ///
-  /// Always the opposite of [isValue].
-  bool get isError;
-
-  /// If this is a value result, return itself.
-  ///
-  /// Otherwise return `null`.
-  ValueResult<T> get asValue;
-
-  /// If this is an error result, return itself.
-  ///
-  /// Otherwise return `null`.
-  ErrorResult get asError;
-
-  /// Complete a completer with this result.
-  void complete(Completer<T> completer);
-
-  /// Add this result to an [EventSink].
-  ///
-  /// Calls the sink's `add` or `addError` method as appropriate.
-  void addTo(EventSink<T> sink);
-
-  /// Creates a future completed with this result as a value or an error.
-  Future<T> get asFuture;
-}
-
-/// A result representing a returned value.
-class ValueResult<T> implements Result<T> {
-  final T value;
-  ValueResult(this.value);
-  bool get isValue => true;
-  bool get isError => false;
-  ValueResult<T> get asValue => this;
-  ErrorResult get asError => null;
-  void complete(Completer<T> completer) {
-    completer.complete(value);
-  }
-  void addTo(EventSink<T> sink) {
-    sink.add(value);
-  }
-  Future<T> get asFuture => new Future.value(value);
-}
-
-/// A result representing a thrown error.
-class ErrorResult implements Result {
-  final error;
-  final StackTrace stackTrace;
-  ErrorResult(this.error, this.stackTrace);
-  bool get isValue => false;
-  bool get isError => true;
-  ValueResult get asValue => null;
-  ErrorResult get asError => this;
-  void complete(Completer completer) {
-    completer.completeError(error, stackTrace);
-  }
-  void addTo(EventSink sink) {
-    sink.addError(error, stackTrace);
-  }
-  Future get asFuture => new Future.error(error, stackTrace);
-
-  /// Calls an error handler with the error and stacktrace.
-  ///
-  /// An async error handler function is either a function expecting two
-  /// arguments, which will be called with the error and the stack trace,
-  /// or it has to be a function expecting only one argument,
-  /// which will be called with only the error.
-  void handle(Function errorHandler) {
-    if (errorHandler is ZoneBinaryCallback) {
-      errorHandler(error, stackTrace);
-    } else {
-      errorHandler(error);
-    }
-  }
-}
-
-/// A stream transformer that captures a stream of events into [Result]s.
-///
-/// The result of the transformation is a stream of [Result] values and
-/// no error events.
-class CaptureStreamTransformer<T> implements StreamTransformer<T, Result<T>> {
-  const CaptureStreamTransformer();
-
-  Stream<Result<T>> bind(Stream<T> source) {
-    return new Stream<Result<T>>.eventTransformed(source, _createSink);
-  }
-
-  static EventSink _createSink(EventSink<Result> sink) {
-    return new CaptureSink(sink);
-  }
-}
-
-/// A stream transformer that releases a stream of result events.
-///
-/// The result of the transformation is a stream of values and
-/// error events.
-class ReleaseStreamTransformer<T> implements StreamTransformer<Result<T>, T> {
-  const ReleaseStreamTransformer();
-
-  Stream<T> bind(Stream<Result<T>> source) {
-    return new Stream<T>.eventTransformed(source, _createSink);
-  }
-
-  static EventSink<Result> _createSink(EventSink sink) {
-    return new ReleaseSink(sink);
-  }
-}
-
-/// An event sink wrapper that captures the incoming events.
-///
-/// Wraps an [EventSink] that expects [Result] values.
-/// Accepts any value and error result,
-/// and passes them to the wrapped sink as [Result] values.
-///
-/// The wrapped sink will never receive an error event.
-class CaptureSink<T> implements EventSink<T> {
-  final EventSink _sink;
-
-  CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
-  void add(T value) { _sink.add(new ValueResult(value)); }
-  void addError(Object error, [StackTrace stackTrace]) {
-    _sink.add(new ErrorResult(error, stackTrace));
-  }
-  void close() { _sink.close(); }
-}
-
-/// An event sink wrapper that releases the incoming result events.
-///
-/// Wraps an output [EventSink] that expects any result.
-/// Accepts [Result] values, and puts the result value or error into the
-/// corresponding output sink add method.
-class ReleaseSink<T> implements EventSink<Result<T>> {
-  final EventSink _sink;
-  ReleaseSink(EventSink<T> sink) : _sink = sink;
-  void add(Result<T> result) {
-    if (result.isValue) {
-      _sink.add(result.asValue.value);
-    } else {
-      ErrorResult error = result.asError;
-      _sink.addError(error.error, error.stackTrace);
-    }
-  }
-  void addError(Object error, [StackTrace stackTrace]) {
-    // Errors may be added by intermediate processing, even if it is never
-    // added by CaptureSink.
-    _sink.addError(error, stackTrace);
-  }
-
-  void close() { _sink.close(); }
-}
+export "src/result.dart";
+export "src/result/capture_transformer.dart";
+export "src/result/error.dart";
+export "src/result/release_transformer.dart";
+export "src/result/value.dart";
diff --git a/packages/async/lib/src/async_cache.dart b/packages/async/lib/src/async_cache.dart
new file mode 100644
index 0000000..af52cd0
--- /dev/null
+++ b/packages/async/lib/src/async_cache.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+
+/// Runs asynchronous functions and caches the result for a period of time.
+///
+/// This class exists to cover the pattern of having potentially expensive code
+/// such as file I/O, network access, or isolate computation that's unlikely to
+/// change quickly run fewer times. For example:
+///
+/// ```dart
+/// final _usersCache = new AsyncCache<List<String>>(const Duration(hours: 1));
+///
+/// /// Uses the cache if it exists, otherwise calls the closure:
+/// Future<List<String>> get onlineUsers => _usersCache.fetch(() {
+///   // Actually fetch online users here.
+/// });
+/// ```
+///
+/// This class's timing can be mocked using [`fake_async`][fake_async].
+///
+/// [fake_async]: https://pub.dartlang.org/packages/fake_async
+class AsyncCache<T> {
+  /// How long cached values stay fresh.
+  final Duration _duration;
+
+  /// Cached results of a previous [fetchStream] call.
+  StreamSplitter<T> _cachedStreamSplitter;
+
+  /// Cached results of a previous [fetch] call.
+  Future<T> _cachedValueFuture;
+
+  /// Fires when the cache should be considered stale.
+  Timer _stale;
+
+  /// Creates a cache that invalidates after an in-flight request is complete.
+  ///
+  /// An ephemeral cache guarantees that a callback function will only be
+  /// executed at most once concurrently. This is useful for requests for which
+  /// data is updated frequently but stale data is acceptable.
+  factory AsyncCache.ephemeral() => new AsyncCache(Duration.ZERO);
+
+  /// Creates a cache that invalidates its contents after [duration] has passed.
+  ///
+  /// The [duration] starts counting after the Future returned by [fetch]
+  /// completes, or after the Stream returned by [fetchStream] emits a done
+  /// event.
+  AsyncCache(this._duration);
+
+  /// Returns a cached value from a previous call to [fetch], or runs [callback]
+  /// to compute a new one.
+  ///
+  /// If [fetch] has been called recently enough, returns its previous return
+  /// value. Otherwise, runs [callback] and returns its new return value.
+  Future<T> fetch(Future<T> callback()) async {
+    if (_cachedStreamSplitter != null) {
+      throw new StateError('Previously used to cache via `fetchStream`');
+    }
+    if (_cachedValueFuture == null) {
+      _cachedValueFuture = callback();
+      await _cachedValueFuture;
+      _startStaleTimer();
+    }
+    return _cachedValueFuture;
+  }
+
+  /// Returns a cached stream from a previous call to [fetchStream], or runs
+  /// [callback] to compute a new stream.
+  ///
+  /// If [fetchStream] has been called recently enough, returns a copy of its
+  /// previous return value. Otherwise, runs [callback] and returns its new
+  /// return value.
+  Stream<T> fetchStream(Stream<T> callback()) {
+    if (_cachedValueFuture != null) {
+      throw new StateError('Previously used to cache via `fetch`');
+    }
+    if (_cachedStreamSplitter == null) {
+      _cachedStreamSplitter = new StreamSplitter(callback()
+          .transform(new StreamTransformer.fromHandlers(handleDone: (sink) {
+        _startStaleTimer();
+        sink.close();
+      })));
+    }
+    return _cachedStreamSplitter.split();
+  }
+
+  /// Removes any cached value.
+  void invalidate() {
+    _cachedValueFuture = null;
+    _cachedStreamSplitter?.close();
+    _cachedStreamSplitter = null;
+    _stale?.cancel();
+    _stale = null;
+  }
+
+  void _startStaleTimer() {
+    _stale = new Timer(_duration, invalidate);
+  }
+}
diff --git a/packages/async/lib/src/async_memoizer.dart b/packages/async/lib/src/async_memoizer.dart
index 41c3dae..d1c0f32 100644
--- a/packages/async/lib/src/async_memoizer.dart
+++ b/packages/async/lib/src/async_memoizer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.async_memoizer;
-
 import 'dart:async';
 
 /// A class for running an asynchronous function exactly once and caching its
@@ -33,15 +31,15 @@
   ///
   /// This can be accessed at any time, and will fire once [runOnce] is called.
   Future<T> get future => _completer.future;
-  final _completer = new Completer();
+  final _completer = new Completer<T>();
 
-  /// Whether [run] has been called yet.
+  /// Whether [runOnce] has been called yet.
   bool get hasRun => _completer.isCompleted;
 
   /// Runs the function, [computation], if it hasn't been run before.
   ///
-  /// If [run] has already been called, this returns the original result.
-  Future<T> runOnce(computation()) {
+  /// If [runOnce] has already been called, this returns the original result.
+  Future<T> runOnce(FutureOr<T> computation()) {
     if (!hasRun) _completer.complete(new Future.sync(computation));
     return future;
   }
diff --git a/packages/async/lib/src/byte_collector.dart b/packages/async/lib/src/byte_collector.dart
new file mode 100644
index 0000000..3c1d49d
--- /dev/null
+++ b/packages/async/lib/src/byte_collector.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:typed_data";
+import "cancelable_operation.dart";
+
+/// Collects an asynchronous sequence of byte lists into a single list of bytes.
+///
+/// If the [source] stream emits an error event,
+/// the collection fails and the returned future completes with the same error.
+///
+/// If any of the input data are not valid bytes, they will be truncated to
+/// an eight-bit unsigned value in the resulting list.
+Future<Uint8List> collectBytes(Stream<List<int>> source) {
+  return _collectBytes(source, (_, result) => result);
+}
+
+/// Collects an asynchronous sequence of byte lists into a single list of bytes.
+///
+/// Returns a [CancelableOperation] that provides the result future and a way
+/// to cancel the collection early.
+///
+/// If the [source] stream emits an error event,
+/// the collection fails and the returned future completes with the same error.
+///
+/// If any of the input data are not valid bytes, they will be truncated to
+/// an eight-bit unsigned value in the resulting list.
+CancelableOperation<Uint8List> collectBytesCancelable(
+    Stream<List<int>> source) {
+  return _collectBytes(
+      source,
+      (subscription, result) => new CancelableOperation.fromFuture(result,
+          onCancel: subscription.cancel));
+}
+
+/// Generalization over [collectBytes] and [collectBytesCancelable].
+///
+/// Performs all the same operations, but the final result is created
+/// by the [result] function, which has access to the stream subscription
+/// so it can cancel the operation.
+T _collectBytes<T>(
+    Stream<List<int>> source,
+    T result(
+        StreamSubscription<List<int>> subscription, Future<Uint8List> result)) {
+  var byteLists = <List<int>>[];
+  var length = 0;
+  var completer = new Completer<Uint8List>.sync();
+  var subscription = source.listen(
+      (bytes) {
+        byteLists.add(bytes);
+        length += bytes.length;
+      },
+      onError: completer.completeError,
+      onDone: () {
+        completer.complete(_collect(length, byteLists));
+      },
+      cancelOnError: true);
+  return result(subscription, completer.future);
+}
+
+// Join a lists of bytes with a known total length into a single [Uint8List].
+Uint8List _collect(int length, List<List<int>> byteLists) {
+  var result = new Uint8List(length);
+  int i = 0;
+  for (var byteList in byteLists) {
+    var end = i + byteList.length;
+    result.setRange(i, end, byteList);
+    i = end;
+  }
+  return result;
+}
diff --git a/packages/async/lib/src/cancelable_operation.dart b/packages/async/lib/src/cancelable_operation.dart
index a7fe6a8..2bf0f3b 100644
--- a/packages/async/lib/src/cancelable_operation.dart
+++ b/packages/async/lib/src/cancelable_operation.dart
@@ -2,13 +2,13 @@
 // for 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 async.cancelable_operation;
-
 import 'dart:async';
 
 import 'package:async/async.dart';
 
-/// An asynchronuos operation that can be cancelled.
+import 'utils.dart';
+
+/// An asynchronous operation that can be cancelled.
 ///
 /// The value of this operation is exposed as [value]. When this operation is
 /// cancelled, [value] won't complete either successfully or with an error. If
@@ -24,13 +24,13 @@
   /// Creates a [CancelableOperation] wrapping [inner].
   ///
   /// When this operation is canceled, [onCancel] will be called and any value
-  /// or error produced by [inner] will be discarded. The callback may return a
-  /// Future to indicate that asynchronous work has to be done to cancel the
-  /// future; this Future will be returned by [cancel].
+  /// or error produced by [inner] will be discarded. If [onCancel] returns a
+  /// [Future], it will be forwarded to [cancel].
   ///
   /// [onCancel] will be called synchronously when the operation is canceled.
   /// It's guaranteed to only be called once.
-  factory CancelableOperation.fromFuture(Future<T> inner, {onCancel()}) {
+  factory CancelableOperation.fromFuture(Future<T> inner,
+      {FutureOr onCancel()}) {
     var completer = new CancelableCompleter<T>(onCancel: onCancel);
     completer.complete(inner);
     return completer.operation;
@@ -44,8 +44,8 @@
   /// This is like `value.asStream()`, but if a subscription to the stream is
   /// canceled, this is as well.
   Stream<T> asStream() {
-    var controller = new StreamController<T>(
-        sync: true, onCancel: _completer._cancel);
+    var controller =
+        new StreamController<T>(sync: true, onCancel: _completer._cancel);
 
     value.then((value) {
       controller.add(value);
@@ -57,6 +57,24 @@
     return controller.stream;
   }
 
+  /// Creates a [Future] that completes when this operation completes *or* when
+  /// it's cancelled.
+  ///
+  /// If this operation completes, this completes to the same result as [value].
+  /// If this operation is cancelled, the returned future waits for the future
+  /// returned by [cancel], then completes to [cancellationValue].
+  Future valueOrCancellation([T cancellationValue]) {
+    var completer = new Completer<T>.sync();
+    value.then((result) => completer.complete(result),
+        onError: completer.completeError);
+
+    _completer._cancelMemo.future.then((_) {
+      completer.complete(cancellationValue);
+    }, onError: completer.completeError);
+
+    return completer.future;
+  }
+
   /// Cancels this operation.
   ///
   /// This returns the [Future] returned by the [CancelableCompleter]'s
@@ -70,17 +88,17 @@
   final Completer<T> _inner;
 
   /// The callback to call if the future is canceled.
-  final ZoneCallback _onCancel;
+  final FutureOrCallback _onCancel;
 
   /// Creates a new completer for a [CancelableOperation].
   ///
   /// When the future operation canceled, as long as the completer hasn't yet
-  /// completed, [onCancel] is called. The callback may return a [Future]; if
-  /// so, that [Future] is returned by [CancelableOperation.cancel].
+  /// completed, [onCancel] is called. If [onCancel] returns a [Future], it's
+  /// forwarded to [CancelableOperation.cancel].
   ///
   /// [onCancel] will be called synchronously when the operation is canceled.
   /// It's guaranteed to only be called once.
-  CancelableCompleter({onCancel()})
+  CancelableCompleter({FutureOr onCancel()})
       : _onCancel = onCancel,
         _inner = new Completer<T>() {
     _operation = new CancelableOperation<T>._(this);
@@ -140,9 +158,12 @@
   }
 
   /// Cancel the completer.
-  Future _cancel() => _cancelMemo.runOnce(() {
-    if (_inner.isCompleted) return null;
-    _isCanceled = true;
-    if (_onCancel != null) return _onCancel();
-  });
+  Future _cancel() {
+    if (_inner.isCompleted) return new Future.value();
+
+    return _cancelMemo.runOnce(() {
+      _isCanceled = true;
+      if (_onCancel != null) return _onCancel();
+    });
+  }
 }
diff --git a/packages/async/lib/src/delegate/event_sink.dart b/packages/async/lib/src/delegate/event_sink.dart
index 337e7a8..54c3e52 100644
--- a/packages/async/lib/src/delegate/event_sink.dart
+++ b/packages/async/lib/src/delegate/event_sink.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.delegate.event_sink;
-
 import 'dart:async';
 
 /// Simple delegating wrapper around an [EventSink].
@@ -14,7 +12,18 @@
   final EventSink _sink;
 
   /// Create a delegating sink forwarding calls to [sink].
-  DelegatingEventSink(EventSink sink) : _sink = sink;
+  DelegatingEventSink(EventSink<T> sink) : _sink = sink;
+
+  DelegatingEventSink._(this._sink);
+
+  /// Creates a wrapper that coerces the type of [sink].
+  ///
+  /// Unlike [new DelegatingEventSink], this only requires its argument to be an
+  /// instance of `EventSink`, not `EventSink<T>`. This means that calls to
+  /// [add] may throw a [CastError] if the argument type doesn't match the
+  /// reified type of [sink].
+  static EventSink<T> typed<T>(EventSink sink) =>
+      sink is EventSink<T> ? sink : new DelegatingEventSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/packages/async/lib/src/delegate/future.dart b/packages/async/lib/src/delegate/future.dart
index 34f6158..129ad49 100644
--- a/packages/async/lib/src/delegate/future.dart
+++ b/packages/async/lib/src/delegate/future.dart
@@ -2,27 +2,36 @@
 // for 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 async.delegate.future;
-
 import 'dart:async';
 
+import '../typed/future.dart';
+
 /// A wrapper that forwards calls to a [Future].
 class DelegatingFuture<T> implements Future<T> {
   /// The wrapped [Future].
-  final Future _future;
+  final Future<T> _future;
 
   DelegatingFuture(this._future);
 
+  /// Creates a wrapper which throws if [future]'s value isn't an instance of
+  /// `T`.
+  ///
+  /// This soundly converts a [Future] to a `Future<T>`, regardless of its
+  /// original generic type, by asserting that its value is an instance of `T`
+  /// whenever it's provided. If it's not, the future throws a [CastError].
+  static Future<T> typed<T>(Future future) =>
+      future is Future<T> ? future : new TypeSafeFuture<T>(future);
+
   Stream<T> asStream() => _future.asStream();
 
-  Future catchError(Function onError, {bool test(error)}) =>
-    _future.catchError(onError, test: test);
+  Future<T> catchError(Function onError, {bool test(Object error)}) =>
+      _future.catchError(onError, test: test);
 
-  Future then(onValue(T value), {Function onError}) =>
-    _future.then(onValue, onError: onError);
+  Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) =>
+      _future.then(onValue, onError: onError);
 
   Future<T> whenComplete(action()) => _future.whenComplete(action);
 
-  Future timeout(Duration timeLimit, {void onTimeout()}) =>
-    _future.timeout(timeLimit, onTimeout: onTimeout);
+  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
+      _future.timeout(timeLimit, onTimeout: onTimeout);
 }
diff --git a/packages/async/lib/src/delegate/sink.dart b/packages/async/lib/src/delegate/sink.dart
index bb50da3..7c68a0f 100644
--- a/packages/async/lib/src/delegate/sink.dart
+++ b/packages/async/lib/src/delegate/sink.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.delegate.sink;
-
 /// Simple delegating wrapper around a [Sink].
 ///
 /// Subclasses can override individual methods, or use this to expose only the
@@ -12,8 +10,18 @@
   final Sink _sink;
 
   /// Create a delegating sink forwarding calls to [sink].
-  DelegatingSink(Sink sink)
-      : _sink = sink;
+  DelegatingSink(Sink<T> sink) : _sink = sink;
+
+  DelegatingSink._(this._sink);
+
+  /// Creates a wrapper that coerces the type of [sink].
+  ///
+  /// Unlike [new DelegatingSink], this only requires its argument to be an
+  /// instance of `Sink`, not `Sink<T>`. This means that calls to [add] may
+  /// throw a [CastError] if the argument type doesn't match the reified type of
+  /// [sink].
+  static Sink<T> typed<T>(Sink sink) =>
+      sink is Sink<T> ? sink : new DelegatingSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/packages/async/lib/src/delegate/stream.dart b/packages/async/lib/src/delegate/stream.dart
new file mode 100644
index 0000000..d08b4ab
--- /dev/null
+++ b/packages/async/lib/src/delegate/stream.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../typed/stream.dart';
+
+/// Simple delegating wrapper around a [Stream].
+///
+/// Subclasses can override individual methods, or use this to expose only the
+/// [Stream] methods of a subclass.
+///
+/// Note that this is identical to [StreamView] in `dart:async`. It's provided
+/// under this name for consistency with other `Delegating*` classes.
+class DelegatingStream<T> extends StreamView<T> {
+  DelegatingStream(Stream<T> stream) : super(stream);
+
+  /// Creates a wrapper which throws if [stream]'s events aren't instances of
+  /// `T`.
+  ///
+  /// This soundly converts a [Stream] to a `Stream<T>`, regardless of its
+  /// original generic type, by asserting that its events are instances of `T`
+  /// whenever they're provided. If they're not, the stream throws a
+  /// [CastError].
+  static Stream<T> typed<T>(Stream stream) =>
+      stream is Stream<T> ? stream : new TypeSafeStream<T>(stream);
+}
diff --git a/packages/async/lib/src/delegate/stream_consumer.dart b/packages/async/lib/src/delegate/stream_consumer.dart
index 8162db6..ba83040 100644
--- a/packages/async/lib/src/delegate/stream_consumer.dart
+++ b/packages/async/lib/src/delegate/stream_consumer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.delegate.stream_consumer;
-
 import 'dart:async';
 
 /// Simple delegating wrapper around a [StreamConsumer].
@@ -14,8 +12,20 @@
   final StreamConsumer _consumer;
 
   /// Create a delegating consumer forwarding calls to [consumer].
-  DelegatingStreamConsumer(StreamConsumer consumer)
-      : _consumer = consumer;
+  DelegatingStreamConsumer(StreamConsumer<T> consumer) : _consumer = consumer;
+
+  DelegatingStreamConsumer._(this._consumer);
+
+  /// Creates a wrapper that coerces the type of [consumer].
+  ///
+  /// Unlike [new StreamConsumer], this only requires its argument to be an
+  /// instance of `StreamConsumer`, not `StreamConsumer<T>`. This means that
+  /// calls to [addStream] may throw a [CastError] if the argument type doesn't
+  /// match the reified type of [consumer].
+  static StreamConsumer<T> typed<T>(StreamConsumer consumer) =>
+      consumer is StreamConsumer<T>
+          ? consumer
+          : new DelegatingStreamConsumer._(consumer);
 
   Future addStream(Stream<T> stream) => _consumer.addStream(stream);
 
diff --git a/packages/async/lib/src/delegate/stream_sink.dart b/packages/async/lib/src/delegate/stream_sink.dart
index b6ace65..198df8a 100644
--- a/packages/async/lib/src/delegate/stream_sink.dart
+++ b/packages/async/lib/src/delegate/stream_sink.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.delegate.stream_sink;
-
 import 'dart:async';
 
 /// Simple delegating wrapper around a [StreamSink].
@@ -16,8 +14,18 @@
   Future get done => _sink.done;
 
   /// Create delegating sink forwarding calls to [sink].
-  DelegatingStreamSink(StreamSink sink)
-      : _sink = sink;
+  DelegatingStreamSink(StreamSink<T> sink) : _sink = sink;
+
+  DelegatingStreamSink._(this._sink);
+
+  /// Creates a wrapper that coerces the type of [sink].
+  ///
+  /// Unlike [new StreamSink], this only requires its argument to be an instance
+  /// of `StreamSink`, not `StreamSink<T>`. This means that calls to [add] may
+  /// throw a [CastError] if the argument type doesn't match the reified type of
+  /// [sink].
+  static StreamSink<T> typed<T>(StreamSink sink) =>
+      sink is StreamSink<T> ? sink : new DelegatingStreamSink._(sink);
 
   void add(T data) {
     _sink.add(data);
diff --git a/packages/async/lib/src/delegate/stream_subscription.dart b/packages/async/lib/src/delegate/stream_subscription.dart
index ff9b665..e7575d8 100644
--- a/packages/async/lib/src/delegate/stream_subscription.dart
+++ b/packages/async/lib/src/delegate/stream_subscription.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.delegate.stream_subscription;
-
 import 'dart:async';
 
+import '../typed/stream_subscription.dart';
+
 /// Simple delegating wrapper around a [StreamSubscription].
 ///
 /// Subclasses can override individual methods.
@@ -13,9 +13,21 @@
   final StreamSubscription _source;
 
   /// Create delegating subscription forwarding calls to [sourceSubscription].
-  DelegatingStreamSubscription(StreamSubscription sourceSubscription)
+  DelegatingStreamSubscription(StreamSubscription<T> sourceSubscription)
       : _source = sourceSubscription;
 
+  /// Creates a wrapper which throws if [subscription]'s events aren't instances
+  /// of `T`.
+  ///
+  /// This soundly converts a [StreamSubscription] to a `StreamSubscription<T>`,
+  /// regardless of its original generic type, by asserting that its events are
+  /// instances of `T` whenever they're provided. If they're not, the
+  /// subscription throws a [CastError].
+  static StreamSubscription<T> typed<T>(StreamSubscription subscription) =>
+      subscription is StreamSubscription<T>
+          ? subscription
+          : new TypeSafeStreamSubscription<T>(subscription);
+
   void onData(void handleData(T data)) {
     _source.onData(handleData);
   }
@@ -38,7 +50,7 @@
 
   Future cancel() => _source.cancel();
 
-  Future asFuture([futureValue]) => _source.asFuture(futureValue);
+  Future<E> asFuture<E>([E futureValue]) => _source.asFuture(futureValue);
 
   bool get isPaused => _source.isPaused;
 }
diff --git a/packages/async/lib/src/future_group.dart b/packages/async/lib/src/future_group.dart
index 02ff185..0bf3158 100644
--- a/packages/async/lib/src/future_group.dart
+++ b/packages/async/lib/src/future_group.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.future_group;
-
 import 'dart:async';
 
 /// A collection of futures waits until all added [Future]s complete.
@@ -35,7 +33,7 @@
   Future<List<T>> get future => _completer.future;
   final _completer = new Completer<List<T>>();
 
-  /// Whether this group is waiting on any futures.
+  /// Whether this group has no pending futures.
   bool get isIdle => _pending == 0;
 
   /// A broadcast stream that emits a `null` event whenever the last pending
@@ -49,6 +47,7 @@
     }
     return _onIdleController.stream;
   }
+
   StreamController _onIdleController;
 
   /// The values emitted by the futures that have been added to the group, in
@@ -69,19 +68,19 @@
 
     _pending++;
     task.then((value) {
-      if (_completer.isCompleted) return;
+      if (_completer.isCompleted) return null;
 
       _pending--;
       _values[index] = value;
 
-      if (_pending != 0) return;
+      if (_pending != 0) return null;
       if (_onIdleController != null) _onIdleController.add(null);
 
-      if (!_closed) return;
+      if (!_closed) return null;
       if (_onIdleController != null) _onIdleController.close();
       _completer.complete(_values);
     }).catchError((error, stackTrace) {
-      if (_completer.isCompleted) return;
+      if (_completer.isCompleted) return null;
       _completer.completeError(error, stackTrace);
     });
   }
@@ -95,4 +94,3 @@
     _completer.complete(_values);
   }
 }
-
diff --git a/packages/async/lib/src/lazy_stream.dart b/packages/async/lib/src/lazy_stream.dart
new file mode 100644
index 0000000..f07c387
--- /dev/null
+++ b/packages/async/lib/src/lazy_stream.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "delegate/stream.dart";
+import "stream_completer.dart";
+import "utils.dart";
+
+/// A [Stream] wrapper that forwards to another [Stream] that's initialized
+/// lazily.
+///
+/// This class allows a concrete `Stream` to be created only once it has a
+/// listener. It's useful to wrapping APIs that do expensive computation to
+/// produce a `Stream`.
+class LazyStream<T> extends Stream<T> {
+  /// The callback that's called to create the inner stream.
+  FutureOrCallback<Stream<T>> _callback;
+
+  /// Creates a single-subscription `Stream` that calls [callback] when it gets
+  /// a listener and forwards to the returned stream.
+  LazyStream(FutureOr<Stream<T>> callback()) : _callback = callback {
+    // Explicitly check for null because we null out [_callback] internally.
+    if (_callback == null) throw new ArgumentError.notNull('callback');
+  }
+
+  StreamSubscription<T> listen(void onData(T event),
+      {Function onError, void onDone(), bool cancelOnError}) {
+    if (_callback == null) {
+      throw new StateError("Stream has already been listened to.");
+    }
+
+    // Null out the callback before we invoke it to ensure that even while
+    // running it, this can't be called twice.
+    var callback = _callback;
+    _callback = null;
+    var result = callback();
+
+    Stream<T> stream;
+    if (result is Future<Stream<T>>) {
+      stream = StreamCompleter.fromFuture(result.then((stream) {
+        return DelegatingStream.typed<T>(stream);
+      }));
+    } else {
+      stream = DelegatingStream.typed<T>(result as Stream);
+    }
+
+    return stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
+  }
+}
diff --git a/packages/async/lib/src/null_stream_sink.dart b/packages/async/lib/src/null_stream_sink.dart
new file mode 100644
index 0000000..c83790c
--- /dev/null
+++ b/packages/async/lib/src/null_stream_sink.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+/// A [StreamSink] that discards all events.
+///
+/// The sink silently drops events until [close] is called, at which point it
+/// throws [StateError]s when events are added. This is the same behavior as a
+/// sink whose remote end has closed, such as when a [WebSocket] connection has
+/// been closed.
+///
+/// This can be used when a sink is needed but no events are actually intended
+/// to be added. The [new NullStreamSink.error] constructor can be used to
+/// represent errors when creating a sink, since [StreamSink.done] exposes sink
+/// errors. For example:
+///
+/// ```dart
+/// StreamSink<List<int>> openForWrite(String filename) {
+///   try {
+///     return new RandomAccessSink(new File(filename).openSync());
+///   } on IOException catch (error, stackTrace) {
+///     return new NullStreamSink.error(error, stackTrace);
+///   }
+/// }
+/// ```
+class NullStreamSink<T> implements StreamSink<T> {
+  final Future done;
+
+  /// Whether the sink has been closed.
+  var _closed = false;
+
+  /// Whether an [addStream] call is pending.
+  ///
+  /// We don't actually add any events from streams, but it does return the
+  /// [StreamSubscription.cancel] future so to be [StreamSink]-complaint we
+  /// reject events until that completes.
+  var _addingStream = false;
+
+  /// Creates a null sink.
+  ///
+  /// If [done] is passed, it's used as the [Sink.done] future. Otherwise, a
+  /// completed future is used.
+  NullStreamSink({Future done}) : done = done ?? new Future.value();
+
+  /// Creates a null sink whose [done] future emits [error].
+  ///
+  /// Note that this error will not be considered uncaught.
+  NullStreamSink.error(error, [StackTrace stackTrace])
+      : done = new Future.error(error, stackTrace)
+          // Don't top-level the error. This gives the user a change to call
+          // [close] or [done], and matches the behavior of a remote endpoint
+          // experiencing an error.
+          ..catchError((_) {});
+
+  void add(T data) {
+    _checkEventAllowed();
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _checkEventAllowed();
+  }
+
+  Future addStream(Stream<T> stream) {
+    _checkEventAllowed();
+
+    _addingStream = true;
+    var future = stream.listen(null).cancel() ?? new Future.value();
+    return future.whenComplete(() {
+      _addingStream = false;
+    });
+  }
+
+  /// Throws a [StateError] if [close] has been called or an [addStream] call is
+  /// pending.
+  void _checkEventAllowed() {
+    if (_closed) throw new StateError("Cannot add to a closed sink.");
+    if (_addingStream) {
+      throw new StateError("Cannot add to a sink while adding a stream.");
+    }
+  }
+
+  Future close() {
+    _closed = true;
+    return done;
+  }
+}
diff --git a/packages/async/lib/src/restartable_timer.dart b/packages/async/lib/src/restartable_timer.dart
index 05196d2..eed51e6 100644
--- a/packages/async/lib/src/restartable_timer.dart
+++ b/packages/async/lib/src/restartable_timer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.restartable_timer;
-
 import 'dart:async';
 
 /// A non-periodic timer that can be restarted any number of times.
diff --git a/packages/async/lib/src/result.dart b/packages/async/lib/src/result.dart
new file mode 100644
index 0000000..49457c3
--- /dev/null
+++ b/packages/async/lib/src/result.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'result/capture_transformer.dart';
+import 'result/error.dart';
+import 'result/release_transformer.dart';
+import 'result/value.dart';
+import 'stream_sink_transformer.dart';
+
+/// The result of a computation.
+///
+/// Capturing a result (either a returned value or a thrown error) means
+/// converting it into a [Result] - either a [ValueResult] or an [ErrorResult].
+///
+/// This value can release itself by writing itself either to a [EventSink] or a
+/// [Completer], or by becoming a [Future].
+abstract class Result<T> {
+  /// A stream transformer that captures a stream of events into [Result]s.
+  ///
+  /// The result of the transformation is a stream of [Result] values and no
+  /// error events. This is the transformer used by [captureStream].
+  static const StreamTransformer<Object, Result> captureStreamTransformer =
+      const CaptureStreamTransformer();
+
+  /// A stream transformer that releases a stream of result events.
+  ///
+  /// The result of the transformation is a stream of values and error events.
+  /// This is the transformer used by [releaseStream].
+  static const StreamTransformer<Object, Result> releaseStreamTransformer =
+      const ReleaseStreamTransformer();
+
+  /// A sink transformer that captures events into [Result]s.
+  ///
+  /// The result of the transformation is a sink that only forwards [Result]
+  /// values and no error events.
+  static const StreamSinkTransformer<Object, Result> captureSinkTransformer =
+      const StreamSinkTransformer.fromStreamTransformer(
+          const CaptureStreamTransformer());
+
+  /// A sink transformer that releases result events.
+  ///
+  /// The result of the transformation is a sink that forwards of values and
+  /// error events.
+  static const StreamSinkTransformer<Object, Result> releaseSinkTransformer =
+      const StreamSinkTransformer.fromStreamTransformer(
+          const ReleaseStreamTransformer());
+
+  /// Create a `Result` with the result of calling [computation].
+  ///
+  /// This generates either a [ValueResult] with the value returned by
+  /// calling `computation`, or an [ErrorResult] with an error thrown by
+  /// the call.
+  factory Result(T computation()) {
+    try {
+      return new ValueResult(computation());
+    } catch (e, s) {
+      return new ErrorResult(e, s);
+    }
+  }
+
+  /// Create a `Result` holding a value.
+  ///
+  /// Alias for [ValueResult.ValueResult].
+  factory Result.value(T value) = ValueResult<T>;
+
+  /// Create a `Result` holding an error.
+  ///
+  /// Alias for [ErrorResult.ErrorResult].
+  factory Result.error(Object error, [StackTrace stackTrace]) =>
+      new ErrorResult(error, stackTrace);
+
+  /// Capture the result of a future into a `Result` future.
+  ///
+  /// The resulting future will never have an error.
+  /// Errors have been converted to an [ErrorResult] value.
+  static Future<Result<T>> capture<T>(Future<T> future) {
+    return future.then((value) => new ValueResult(value),
+        onError: (error, stackTrace) => new ErrorResult<T>(error, stackTrace));
+  }
+
+  /// Release the result of a captured future.
+  ///
+  /// Converts the [Result] value of the given [future] to a value or error
+  /// completion of the returned future.
+  ///
+  /// If [future] completes with an error, the returned future completes with
+  /// the same error.
+  static Future<T> release<T>(Future<Result<T>> future) =>
+      future.then<T>((result) => result.asFuture);
+
+  /// Capture the results of a stream into a stream of [Result] values.
+  ///
+  /// The returned stream will not have any error events.
+  /// Errors from the source stream have been converted to [ErrorResult]s.
+  static Stream<Result<T>> captureStream<T>(Stream<T> source) =>
+      source.transform(new CaptureStreamTransformer<T>());
+
+  /// Release a stream of [result] values into a stream of the results.
+  ///
+  /// `Result` values of the source stream become value or error events in
+  /// the returned stream as appropriate.
+  /// Errors from the source stream become errors in the returned stream.
+  static Stream<T> releaseStream<T>(Stream<Result<T>> source) =>
+      source.transform(new ReleaseStreamTransformer<T>());
+
+  /// Converts a result of a result to a single result.
+  ///
+  /// If the result is an error, or it is a `Result` value
+  /// which is then an error, then a result with that error is returned.
+  /// Otherwise both levels of results are value results, and a single
+  /// result with the value is returned.
+  static Result<T> flatten<T>(Result<Result<T>> result) {
+    if (result.isValue) return result.asValue.value;
+    return new ErrorResult<T>(result.asError.error, result.asError.stackTrace);
+  }
+
+  /// Whether this result is a value result.
+  ///
+  /// Always the opposite of [isError].
+  bool get isValue;
+
+  /// Whether this result is an error result.
+  ///
+  /// Always the opposite of [isValue].
+  bool get isError;
+
+  /// If this is a value result, return itself.
+  ///
+  /// Otherwise return `null`.
+  ValueResult<T> get asValue;
+
+  /// If this is an error result, return itself.
+  ///
+  /// Otherwise return `null`.
+  ErrorResult<T> get asError;
+
+  /// Complete a completer with this result.
+  void complete(Completer<T> completer);
+
+  /// Add this result to an [EventSink].
+  ///
+  /// Calls the sink's `add` or `addError` method as appropriate.
+  void addTo(EventSink<T> sink);
+
+  /// Creates a future completed with this result as a value or an error.
+  Future<T> get asFuture;
+}
diff --git a/packages/async/lib/src/result/capture_sink.dart b/packages/async/lib/src/result/capture_sink.dart
new file mode 100644
index 0000000..7474525
--- /dev/null
+++ b/packages/async/lib/src/result/capture_sink.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+
+/// Use [Result.captureSinkTransformer].
+@Deprecated("Will be removed in async 2.0.0.")
+class CaptureSink<T> implements EventSink<T> {
+  final EventSink _sink;
+
+  CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
+
+  void add(T value) {
+    _sink.add(new Result.value(value));
+  }
+
+  void addError(Object error, [StackTrace stackTrace]) {
+    _sink.add(new Result.error(error, stackTrace));
+  }
+
+  void close() {
+    _sink.close();
+  }
+}
diff --git a/packages/async/lib/src/result/capture_transformer.dart b/packages/async/lib/src/result/capture_transformer.dart
new file mode 100644
index 0000000..6b1bbf2
--- /dev/null
+++ b/packages/async/lib/src/result/capture_transformer.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+import 'capture_sink.dart';
+
+/// A stream transformer that captures a stream of events into [Result]s.
+///
+/// The result of the transformation is a stream of [Result] values and no
+/// error events. This is the transformer used by [captureStream].
+@Deprecated("Will be removed in async 2.0.0.")
+class CaptureStreamTransformer<T> implements StreamTransformer<T, Result<T>> {
+  const CaptureStreamTransformer();
+
+  Stream<Result<T>> bind(Stream<T> source) {
+    return new Stream<Result<T>>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink _createSink(EventSink<Result> sink) {
+    return new CaptureSink(sink);
+  }
+}
diff --git a/packages/async/lib/src/result/error.dart b/packages/async/lib/src/result/error.dart
new file mode 100644
index 0000000..b6d5859
--- /dev/null
+++ b/packages/async/lib/src/result/error.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+import 'value.dart';
+
+/// A result representing a thrown error.
+class ErrorResult<T> implements Result<T> {
+  final error;
+  final StackTrace stackTrace;
+
+  bool get isValue => false;
+  bool get isError => true;
+  ValueResult<T> get asValue => null;
+  ErrorResult<T> get asError => this;
+
+  ErrorResult(this.error, this.stackTrace);
+
+  void complete(Completer completer) {
+    completer.completeError(error, stackTrace);
+  }
+
+  void addTo(EventSink sink) {
+    sink.addError(error, stackTrace);
+  }
+
+  Future<T> get asFuture => new Future.error(error, stackTrace);
+
+  /// Calls an error handler with the error and stacktrace.
+  ///
+  /// An async error handler function is either a function expecting two
+  /// arguments, which will be called with the error and the stack trace, or it
+  /// has to be a function expecting only one argument, which will be called
+  /// with only the error.
+  void handle(Function errorHandler) {
+    if (errorHandler is ZoneBinaryCallback) {
+      errorHandler(error, stackTrace);
+    } else {
+      errorHandler(error);
+    }
+  }
+}
diff --git a/packages/async/lib/src/result_future.dart b/packages/async/lib/src/result/future.dart
similarity index 75%
rename from packages/async/lib/src/result_future.dart
rename to packages/async/lib/src/result/future.dart
index 311e83f..749b101 100644
--- a/packages/async/lib/src/result_future.dart
+++ b/packages/async/lib/src/result/future.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.result_future;
-
 import 'dart:async';
 
+import '../delegate/future.dart';
 import '../result.dart';
-import 'delegate/future.dart';
 
 /// A [Future] wrapper that provides synchronous access to the result of the
 /// wrapped [Future] once it's completed.
@@ -22,14 +20,14 @@
   Result<T> _result;
 
   factory ResultFuture(Future<T> future) {
-    var resultFuture;
-    resultFuture = new ResultFuture._(Result.capture(future).then((result) {
+    ResultFuture<T> resultFuture;
+    resultFuture = new ResultFuture._(() async {
+      var result = await Result.capture(future);
       resultFuture._result = result;
-      return result.asFuture;
-    }));
+      return await result.asFuture;
+    }());
     return resultFuture;
   }
 
-  ResultFuture._(Future<T> future)
-      : super(future);
+  ResultFuture._(Future<T> future) : super(future);
 }
diff --git a/packages/async/lib/src/result/release_sink.dart b/packages/async/lib/src/result/release_sink.dart
new file mode 100644
index 0000000..114981b
--- /dev/null
+++ b/packages/async/lib/src/result/release_sink.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+
+/// Use [Result.captureSinkTransformer].
+@Deprecated("Will be removed in async 2.0.0.")
+class ReleaseSink<T> implements EventSink<Result<T>> {
+  final EventSink _sink;
+
+  ReleaseSink(EventSink<T> sink) : _sink = sink;
+
+  void add(Result<T> result) {
+    if (result.isValue) {
+      _sink.add(result.asValue.value);
+    } else {
+      var error = result.asError;
+      _sink.addError(error.error, error.stackTrace);
+    }
+  }
+
+  void addError(Object error, [StackTrace stackTrace]) {
+    // Errors may be added by intermediate processing, even if it is never
+    // added by CaptureSink.
+    _sink.addError(error, stackTrace);
+  }
+
+  void close() {
+    _sink.close();
+  }
+}
diff --git a/packages/async/lib/src/result/release_transformer.dart b/packages/async/lib/src/result/release_transformer.dart
new file mode 100644
index 0000000..456ed0a
--- /dev/null
+++ b/packages/async/lib/src/result/release_transformer.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+import 'release_sink.dart';
+
+/// Use [Result.releaseTransformer] instead.
+@Deprecated("Will be removed in async 2.0.0.")
+class ReleaseStreamTransformer<T> implements StreamTransformer<Result<T>, T> {
+  const ReleaseStreamTransformer();
+
+  Stream<T> bind(Stream<Result<T>> source) {
+    return new Stream<T>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink<Result> _createSink(EventSink sink) {
+    return new ReleaseSink(sink);
+  }
+}
diff --git a/packages/async/lib/src/result/value.dart b/packages/async/lib/src/result/value.dart
new file mode 100644
index 0000000..39fa048
--- /dev/null
+++ b/packages/async/lib/src/result/value.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../result.dart';
+import 'error.dart';
+
+/// A result representing a returned value.
+class ValueResult<T> implements Result<T> {
+  final T value;
+
+  bool get isValue => true;
+  bool get isError => false;
+  ValueResult<T> get asValue => this;
+  ErrorResult<T> get asError => null;
+
+  ValueResult(this.value);
+
+  void complete(Completer<T> completer) {
+    completer.complete(value);
+  }
+
+  void addTo(EventSink<T> sink) {
+    sink.add(value);
+  }
+
+  Future<T> get asFuture => new Future.value(value);
+}
diff --git a/packages/async/lib/src/single_subscription_transformer.dart b/packages/async/lib/src/single_subscription_transformer.dart
new file mode 100644
index 0000000..fcd6b06
--- /dev/null
+++ b/packages/async/lib/src/single_subscription_transformer.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+/// A transformer that converts a broadcast stream into a single-subscription
+/// stream.
+///
+/// This buffers the broadcast stream's events, which means that it starts
+/// listening to a stream as soon as it's bound.
+///
+/// This also casts the source stream's events to type `T`. If the cast fails,
+/// the result stream will emit a [CastError]. This behavior is deprecated, and
+/// should not be relied upon.
+class SingleSubscriptionTransformer<S, T> implements StreamTransformer<S, T> {
+  const SingleSubscriptionTransformer();
+
+  Stream<T> bind(Stream<S> stream) {
+    var subscription;
+    var controller = new StreamController<T>(
+        sync: true, onCancel: () => subscription.cancel());
+    subscription = stream.listen((value) {
+      // TODO(nweiz): When we release a new major version, get rid of the second
+      // type parameter and avoid this conversion.
+      try {
+        controller.add(value as T);
+      } on CastError catch (error, stackTrace) {
+        controller.addError(error, stackTrace);
+      }
+    }, onError: controller.addError, onDone: controller.close);
+    return controller.stream;
+  }
+}
diff --git a/packages/async/lib/src/stream_completer.dart b/packages/async/lib/src/stream_completer.dart
index c343e6e..4311de5 100644
--- a/packages/async/lib/src/stream_completer.dart
+++ b/packages/async/lib/src/stream_completer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.stream_completer;
-
 import "dart:async";
 
 /// A single-subscription [stream] where the contents are provided later.
@@ -26,7 +24,7 @@
 /// the listen is performed directly on the source stream.
 class StreamCompleter<T> {
   /// The stream doing the actual work, is returned by [stream].
-  final _CompleterStream _stream = new _CompleterStream<T>();
+  final _stream = new _CompleterStream<T>();
 
   /// Convert a `Future<Stream>` to a `Stream`.
   ///
@@ -36,12 +34,9 @@
   ///
   /// If the future completes with an error, the returned stream will
   /// instead contain just that error.
-  static Stream fromFuture(Future<Stream> streamFuture) {
-    var completer = new StreamCompleter();
-    streamFuture.then(completer.setSourceStream,
-                      onError: (e, s) {
-                        completer.setSourceStream(streamFuture.asStream());
-                      });
+  static Stream<T> fromFuture<T>(Future<Stream<T>> streamFuture) {
+    var completer = new StreamCompleter<T>();
+    streamFuture.then(completer.setSourceStream, onError: completer.setError);
     return completer.stream;
   }
 
@@ -76,8 +71,8 @@
   /// it is immediately listened to, and its events are forwarded to the
   /// existing subscription.
   ///
-  /// Either [setSourceStream] or [setEmpty] may be called at most once.
-  /// Trying to call either of them again will fail.
+  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
+  /// most once. Trying to call any of them again will fail.
   void setSourceStream(Stream<T> sourceStream) {
     if (_stream._isSourceStreamSet) {
       throw new StateError("Source stream already set");
@@ -87,14 +82,24 @@
 
   /// Equivalent to setting an empty stream using [setSourceStream].
   ///
-  /// Either [setSourceStream] or [setEmpty] may be called at most once.
-  /// Trying to call either of them again will fail.
+  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
+  /// most once. Trying to call any of them again will fail.
   void setEmpty() {
     if (_stream._isSourceStreamSet) {
       throw new StateError("Source stream already set");
     }
     _stream._setEmpty();
   }
+
+  /// Completes this to a stream that emits [error] and then closes.
+  ///
+  /// This is useful when the process of creating the data for the stream fails.
+  ///
+  /// Any one of [setSourceStream], [setEmpty], and [setError] may be called at
+  /// most once. Trying to call any of them again will fail.
+  void setError(error, [StackTrace stackTrace]) {
+    setSourceStream(new Stream.fromFuture(new Future.error(error, stackTrace)));
+  }
 }
 
 /// Stream completed by [StreamCompleter].
@@ -103,32 +108,30 @@
   ///
   /// Created if the user listens on this stream before the source stream
   /// is set, or if using [_setEmpty] so there is no source stream.
-  StreamController _controller;
+  StreamController<T> _controller;
 
   /// Source stream for the events provided by this stream.
   ///
   /// Set when the completer sets the source stream using [_setSourceStream]
   /// or [_setEmpty].
-  Stream _sourceStream;
+  Stream<T> _sourceStream;
 
   StreamSubscription<T> listen(onData(T data),
-                               {Function onError,
-                                void onDone(),
-                                bool cancelOnError}) {
+      {Function onError, void onDone(), bool cancelOnError}) {
     if (_controller == null) {
       if (_sourceStream != null && !_sourceStream.isBroadcast) {
         // If the source stream is itself single subscription,
         // just listen to it directly instead of creating a controller.
-        return _sourceStream.listen(onData, onError: onError, onDone: onDone,
-                                    cancelOnError: cancelOnError);
+        return _sourceStream.listen(onData,
+            onError: onError, onDone: onDone, cancelOnError: cancelOnError);
       }
       _createController();
       if (_sourceStream != null) {
         _linkStreamToController();
       }
     }
-    return _controller.stream.listen(onData, onError: onError, onDone: onDone,
-                                     cancelOnError: cancelOnError);
+    return _controller.stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
   /// Whether a source stream has been set.
@@ -155,8 +158,9 @@
   void _linkStreamToController() {
     assert(_controller != null);
     assert(_sourceStream != null);
-    _controller.addStream(_sourceStream, cancelOnError: false)
-               .whenComplete(_controller.close);
+    _controller
+        .addStream(_sourceStream, cancelOnError: false)
+        .whenComplete(_controller.close);
   }
 
   /// Sets an empty source stream.
@@ -168,7 +172,7 @@
     if (_controller == null) {
       _createController();
     }
-    _sourceStream = _controller.stream;  // Mark stream as set.
+    _sourceStream = _controller.stream; // Mark stream as set.
     _controller.close();
   }
 
diff --git a/packages/async/lib/src/stream_group.dart b/packages/async/lib/src/stream_group.dart
index d99f515..6361a5c 100644
--- a/packages/async/lib/src/stream_group.dart
+++ b/packages/async/lib/src/stream_group.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.stream_group;
-
 import 'dart:async';
 
 /// A collection of streams whose events are unified and sent through a central
@@ -14,8 +12,8 @@
 /// this means that events emitted by broadcast streams will be dropped until
 /// [stream] has a listener.**
 ///
-/// If the `StreamGroup` is constructed using [new StreamGroup], [stream] will be
-/// single-subscription. In this case, if [stream] is paused or canceled, all
+/// If the `StreamGroup` is constructed using [new StreamGroup], [stream] will
+/// be single-subscription. In this case, if [stream] is paused or canceled, all
 /// streams in the group will likewise be paused or canceled, respectively.
 ///
 /// If the `StreamGroup` is constructed using [new StreamGroup.broadcast],
@@ -55,8 +53,8 @@
   ///
   /// This is equivalent to adding [streams] to a group, closing that group, and
   /// returning its stream.
-  static Stream merge(Iterable<Stream> streams) {
-    var group = new StreamGroup();
+  static Stream<T> merge<T>(Iterable<Stream<T>> streams) {
+    var group = new StreamGroup<T>();
     streams.forEach(group.add);
     group.close();
     return group.stream;
@@ -75,9 +73,7 @@
   /// Creates a new stream group where [stream] is a broadcast stream.
   StreamGroup.broadcast() {
     _controller = new StreamController<T>.broadcast(
-        onListen: _onListen,
-        onCancel: _onCancelBroadcast,
-        sync: true);
+        onListen: _onListen, onCancel: _onCancelBroadcast, sync: true);
   }
 
   /// Adds [stream] as a member of this group.
@@ -194,11 +190,9 @@
   /// Starts actively forwarding events from [stream] to [_controller].
   ///
   /// This will pause the resulting subscription if [this] is paused.
-  StreamSubscription _listenToStream(Stream stream) {
-    var subscription = stream.listen(
-        _controller.add,
-        onError: _controller.addError,
-        onDone: () => remove(stream));
+  StreamSubscription<T> _listenToStream(Stream<T> stream) {
+    var subscription = stream.listen(_controller.add,
+        onError: _controller.addError, onDone: () => remove(stream));
     if (_state == _StreamGroupState.paused) subscription.pause();
     return subscription;
   }
diff --git a/packages/async/lib/src/stream_queue.dart b/packages/async/lib/src/stream_queue.dart
index 09b3a75..b9023ab 100644
--- a/packages/async/lib/src/stream_queue.dart
+++ b/packages/async/lib/src/stream_queue.dart
@@ -2,14 +2,16 @@
 // for 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 async.stream_events;
-
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:collection/collection.dart';
+
+import "cancelable_operation.dart";
+import "result.dart";
 import "subscription_stream.dart";
 import "stream_completer.dart";
-import "../result.dart";
+import "stream_splitter.dart";
 
 /// An asynchronous pull-based interface for accessing stream events.
 ///
@@ -87,8 +89,17 @@
   /// Closing operations are [cancel] and [rest].
   bool _isClosed = false;
 
+  /// The number of events dispatched by this queue.
+  ///
+  /// This counts error events. It doesn't count done events, or events
+  /// dispatched to a stream returned by [rest].
+  int get eventsDispatched => _eventsReceived - _eventQueue.length;
+
+  /// The number of events received by this queue.
+  var _eventsReceived = 0;
+
   /// Queue of events not used by a request yet.
-  final Queue<Result> _eventQueue = new Queue();
+  final QueueList<Result> _eventQueue = new QueueList();
 
   /// Queue of pending requests.
   ///
@@ -96,7 +107,7 @@
   final Queue<_EventRequest> _requestQueue = new Queue();
 
   /// Create a `StreamQueue` of the events of [source].
-  factory StreamQueue(Stream source) = _StreamQueue<T>;
+  factory StreamQueue(Stream<T> source) = _StreamQueue<T>;
 
   StreamQueue._();
 
@@ -120,6 +131,21 @@
     throw _failClosed();
   }
 
+  /// Look at the next [count] data events without consuming them.
+  ///
+  /// Works like [take] except that the events are left in the queue.
+  /// If one of the next [count] events is an error, the returned future
+  /// completes with this error, and the error is still left in the queue.
+  Future<List<T>> lookAhead(int count) {
+    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (!_isClosed) {
+      var request = new _LookAheadRequest<T>(count);
+      _addRequest(request);
+      return request.future;
+    }
+    throw _failClosed();
+  }
+
   /// Requests the next (yet unrequested) event from the stream.
   ///
   /// When the requested event arrives, the returned future is completed with
@@ -143,6 +169,19 @@
     throw _failClosed();
   }
 
+  /// Looks at the next (yet unrequested) event from the stream.
+  ///
+  /// Like [next] except that the event is not consumed.
+  /// If the next event is an error event, it stays in the queue.
+  Future<T> get peek {
+    if (!_isClosed) {
+      var nextRequest = new _PeekRequest<T>();
+      _addRequest(nextRequest);
+      return nextRequest.future;
+    }
+    throw _failClosed();
+  }
+
   /// Returns a stream of all the remaning events of the source stream.
   ///
   /// All requested [next], [skip] or [take] operations are completed
@@ -212,6 +251,123 @@
     throw _failClosed();
   }
 
+  /// Requests a transaction that can conditionally consume events.
+  ///
+  /// The transaction can create copies of this queue at the current position
+  /// using [StreamQueueTransaction.newQueue]. Each of these queues is
+  /// independent of one another and of the parent queue. The transaction
+  /// finishes when one of two methods is called:
+  ///
+  /// * [StreamQueueTransaction.commit] updates the parent queue's position to
+  ///   match that of one of the copies.
+  ///
+  /// * [StreamQueueTransaction.reject] causes the parent queue to continue as
+  ///   though [startTransaction] hadn't been called.
+  ///
+  /// Until the transaction finishes, this queue won't emit any events.
+  ///
+  /// See also [withTransaction] and [cancelable].
+  ///
+  /// ```dart
+  /// /// Consumes all empty lines from the beginning of [lines].
+  /// Future consumeEmptyLines(StreamQueue<String> lines) async {
+  ///   while (await lines.hasNext) {
+  ///     var transaction = lines.startTransaction();
+  ///     var queue = transaction.newQueue();
+  ///     if ((await queue.next).isNotEmpty) {
+  ///       transaction.reject();
+  ///       return;
+  ///     } else {
+  ///       transaction.commit(queue);
+  ///     }
+  ///   }
+  /// }
+  /// ```
+  StreamQueueTransaction<T> startTransaction() {
+    if (_isClosed) throw _failClosed();
+
+    var request = new _TransactionRequest(this);
+    _addRequest(request);
+    return request.transaction;
+  }
+
+  /// Passes a copy of this queue to [callback], and updates this queue to match
+  /// the copy's position if [callback] returns `true`.
+  ///
+  /// This queue won't emit any events until [callback] returns. If it returns
+  /// `false`, this queue continues as though [withTransaction] hadn't been
+  /// called. If it throws an error, this updates this queue to match the copy's
+  /// position and throws the error from the returned `Future`.
+  ///
+  /// Returns the same value as [callback].
+  ///
+  /// See also [startTransaction] and [cancelable].
+  ///
+  /// ```dart
+  /// /// Consumes all empty lines from the beginning of [lines].
+  /// Future consumeEmptyLines(StreamQueue<String> lines) async {
+  ///   while (await lines.hasNext) {
+  ///     // Consume a line if it's empty, otherwise return.
+  ///     if (!await lines.withTransaction(
+  ///         (queue) async => (await queue.next).isEmpty)) {
+  ///       return;
+  ///     }
+  ///   }
+  /// }
+  /// ```
+  Future<bool> withTransaction(Future<bool> callback(StreamQueue<T> queue)) {
+    var transaction = startTransaction();
+
+    /// Avoid async/await to ensure that [startTransaction] is called
+    /// synchronously and so ends up in the right place in the request queue.
+    var queue = transaction.newQueue();
+    return callback(queue).then((result) {
+      if (result) {
+        transaction.commit(queue);
+      } else {
+        transaction.reject();
+      }
+      return result;
+    }, onError: (error) {
+      transaction.commit(queue);
+      throw error;
+    });
+  }
+
+  /// Passes a copy of this queue to [callback], and updates this queue to match
+  /// the copy's position once [callback] completes.
+  ///
+  /// If the returned [CancelableOperation] is canceled, this queue instead
+  /// continues as though [cancelable] hadn't been called. Otherwise, it emits
+  /// the same value or error as [callback].
+  ///
+  /// See also [startTransaction] and [withTransaction].
+  ///
+  /// ```dart
+  /// final _stdinQueue = new StreamQueue(stdin);
+  ///
+  /// /// Returns an operation that completes when the user sends a line to
+  /// /// standard input.
+  /// ///
+  /// /// If the operation is canceled, stops waiting for user input.
+  /// CancelableOperation<String> nextStdinLine() =>
+  ///     _stdinQueue.cancelable((queue) => queue.next);
+  /// ```
+  CancelableOperation<S> cancelable<S>(
+      Future<S> callback(StreamQueue<T> queue)) {
+    var transaction = startTransaction();
+    var completer = new CancelableCompleter<S>(onCancel: () {
+      transaction.reject();
+    });
+
+    var queue = transaction.newQueue();
+    completer.complete(callback(queue).whenComplete(() {
+      if (!completer.isCanceled) transaction.commit(queue);
+    }));
+
+    return completer.operation;
+  }
+
   /// Cancels the underlying event source.
   ///
   /// If [immediate] is `false` (the default), the cancel operation waits until
@@ -226,8 +382,8 @@
   /// `cancel`.
   ///
   /// After calling `cancel`, no further events can be requested.
-  /// None of [next], [rest], [skip], [take] or [cancel] may be
-  /// called again.
+  /// None of [lookAhead], [next], [peek], [rest], [skip], [take] or [cancel]
+  /// may be called again.
   Future cancel({bool immediate: false}) {
     if (_isClosed) throw _failClosed();
     _isClosed = true;
@@ -276,7 +432,7 @@
   /// Can only be used by the very last request (the stream queue must
   /// be closed by that request).
   /// Only used by [rest].
-  Stream _extractStream();
+  Stream<T> _extractStream();
 
   /// Requests that the event source pauses events.
   ///
@@ -302,6 +458,7 @@
   /// Called when the event source adds a new data or error event.
   /// Always calls [_updateRequests] after adding.
   void _addResult(Result result) {
+    _eventsReceived++;
     _eventQueue.add(result);
     _updateRequests();
   }
@@ -337,20 +494,19 @@
   }
 }
 
-
 /// The default implementation of [StreamQueue].
 ///
 /// This queue gets its events from a stream which is listened
 /// to when a request needs events.
 class _StreamQueue<T> extends StreamQueue<T> {
   /// Source of events.
-  final Stream _sourceStream;
+  final Stream<T> _sourceStream;
 
   /// Subscription on [_sourceStream] while listening for events.
   ///
   /// Set to subscription when listening, and set to `null` when the
   /// subscription is done (and [_isDone] is set to true).
-  StreamSubscription _subscription;
+  StreamSubscription<T> _subscription;
 
   _StreamQueue(this._sourceStream) : super._();
 
@@ -363,20 +519,16 @@
   }
 
   void _ensureListening() {
-    assert(!_isDone);
+    if (_isDone) return;
     if (_subscription == null) {
-      _subscription =
-          _sourceStream.listen(
-              (data) {
-                _addResult(new Result.value(data));
-              },
-              onError: (error, StackTrace stackTrace) {
-                _addResult(new Result.error(error, stackTrace));
-              },
-              onDone: () {
-                _subscription = null;
-                this._close();
-              });
+      _subscription = _sourceStream.listen((data) {
+        _addResult(new Result.value(data));
+      }, onError: (error, StackTrace stackTrace) {
+        _addResult(new Result.error(error, stackTrace));
+      }, onDone: () {
+        _subscription = null;
+        this._close();
+      });
     } else {
       _subscription.resume();
     }
@@ -391,6 +543,7 @@
     if (_isDone) {
       return new Stream<T>.empty();
     }
+    _isDone = true;
 
     if (_subscription == null) {
       return _sourceStream;
@@ -398,7 +551,6 @@
 
     var subscription = _subscription;
     _subscription = null;
-    _isDone = true;
 
     var wasPaused = subscription.isPaused;
     var result = new SubscriptionStream<T>(subscription);
@@ -409,6 +561,104 @@
   }
 }
 
+/// A transaction on a [StreamQueue], created by [StreamQueue.startTransaction].
+///
+/// Copies of the parent queue may be created using [newQueue]. Calling [commit]
+/// moves the parent queue to a copy's position, and calling [reject] causes it
+/// to continue as though [StreamQueue.startTransaction] was never called.
+class StreamQueueTransaction<T> {
+  /// The parent queue on which this transaction is active.
+  final StreamQueue<T> _parent;
+
+  /// The splitter that produces copies of the parent queue's stream.
+  final StreamSplitter<T> _splitter;
+
+  /// Queues created using [newQueue].
+  final _queues = new Set<StreamQueue>();
+
+  /// Whether [commit] has been called.
+  var _committed = false;
+
+  /// Whether [reject] has been called.
+  var _rejected = false;
+
+  StreamQueueTransaction._(this._parent, Stream<T> source)
+      : _splitter = new StreamSplitter(source);
+
+  /// Creates a new copy of the parent queue.
+  ///
+  /// This copy starts at the parent queue's position when
+  /// [StreamQueue.startTransaction] was called. Its position can be committed
+  /// to the parent queue using [commit].
+  StreamQueue<T> newQueue() {
+    var queue = new StreamQueue(_splitter.split());
+    _queues.add(queue);
+    return queue;
+  }
+
+  /// Commits a queue created using [newQueue].
+  ///
+  /// The parent queue's position is updated to be the same as [queue]'s.
+  /// Further requests on all queues created by this transaction, including
+  /// [queue], will complete as though [cancel] were called with `immediate:
+  /// true`.
+  ///
+  /// Throws a [StateError] if [commit] or [reject] have already been called, or
+  /// if there are pending requests on [queue].
+  void commit(StreamQueue<T> queue) {
+    _assertActive();
+    if (!_queues.contains(queue)) {
+      throw new ArgumentError("Queue doesn't belong to this transaction.");
+    } else if (queue._requestQueue.isNotEmpty) {
+      throw new StateError("A queue with pending requests can't be committed.");
+    }
+    _committed = true;
+
+    // Remove all events from the parent queue that were consumed by the
+    // child queue.
+    for (var j = 0; j < queue.eventsDispatched; j++) {
+      _parent._eventQueue.removeFirst();
+    }
+
+    _done();
+  }
+
+  /// Rejects this transaction without updating the parent queue.
+  ///
+  /// The parent will continue as though [StreamQueue.startTransaction] hadn't
+  /// been called. Further requests on all queues created by this transaction
+  /// will complete as though [cancel] were called with `immediate: true`.
+  ///
+  /// Throws a [StateError] if [commit] or [reject] have already been called.
+  void reject() {
+    _assertActive();
+    _rejected = true;
+    _done();
+  }
+
+  // Cancels all [_queues], removes the [_TransactionRequest] from [_parent]'s
+  // request queue, and runs the next request.
+  void _done() {
+    _splitter.close();
+    for (var queue in _queues) {
+      queue._cancel();
+    }
+
+    assert((_parent._requestQueue.first as _TransactionRequest).transaction ==
+        this);
+    _parent._requestQueue.removeFirst();
+    _parent._updateRequests();
+  }
+
+  /// Throws a [StateError] if [accept] or [reject] has already been called.
+  void _assertActive() {
+    if (_committed) {
+      throw new StateError("This transaction has already been accepted.");
+    } else if (_rejected) {
+      throw new StateError("This transaction has already been rejected.");
+    }
+  }
+}
 
 /// Request object that receives events when they arrive, until fulfilled.
 ///
@@ -424,7 +674,7 @@
 ///
 /// The [close] method is also called immediately when the source stream
 /// is done.
-abstract class _EventRequest {
+abstract class _EventRequest<T> {
   /// Handle available events.
   ///
   /// The available events are provided as a queue. The `update` function
@@ -445,30 +695,55 @@
   /// If the function returns `false` when the stream has already closed
   /// ([isDone] is true), then the request must call
   /// [StreamQueue._updateRequests] itself when it's ready to continue.
-  bool update(Queue<Result> events, bool isDone);
+  bool update(QueueList<Result<T>> events, bool isDone);
 }
 
 /// Request for a [StreamQueue.next] call.
 ///
 /// Completes the returned future when receiving the first event,
 /// and is then complete.
-class _NextRequest<T> implements _EventRequest {
+class _NextRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by [StreamQueue.next].
-  final Completer _completer;
+  final _completer = new Completer<T>();
 
-  _NextRequest() : _completer = new Completer<T>();
+  _NextRequest();
 
   Future<T> get future => _completer.future;
 
-  bool update(Queue<Result> events, bool isDone) {
+  bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isNotEmpty) {
       events.removeFirst().complete(_completer);
       return true;
     }
     if (isDone) {
-      var errorFuture =
-          new Future.sync(() => throw new StateError("No elements"));
-      _completer.complete(errorFuture);
+      _completer.completeError(
+          new StateError("No elements"), StackTrace.current);
+      return true;
+    }
+    return false;
+  }
+}
+
+/// Request for a [StreamQueue.peek] call.
+///
+/// Completes the returned future when receiving the first event,
+/// and is then complete, but doesn't consume the event.
+class _PeekRequest<T> implements _EventRequest<T> {
+  /// Completer for the future returned by [StreamQueue.next].
+  final _completer = new Completer<T>();
+
+  _PeekRequest();
+
+  Future<T> get future => _completer.future;
+
+  bool update(QueueList<Result<T>> events, bool isDone) {
+    if (events.isNotEmpty) {
+      events.first.complete(_completer);
+      return true;
+    }
+    if (isDone) {
+      _completer.completeError(
+          new StateError("No elements"), StackTrace.current);
       return true;
     }
     return false;
@@ -476,9 +751,9 @@
 }
 
 /// Request for a [StreamQueue.skip] call.
-class _SkipRequest implements _EventRequest {
+class _SkipRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the skip call.
-  final Completer _completer = new Completer<int>();
+  final _completer = new Completer<int>();
 
   /// Number of remaining events to skip.
   ///
@@ -491,9 +766,9 @@
   _SkipRequest(this._eventsToSkip);
 
   /// The future completed when the correct number of events have been skipped.
-  Future get future => _completer.future;
+  Future<int> get future => _completer.future;
 
-  bool update(Queue<Result> events, bool isDone) {
+  bool update(QueueList<Result<T>> events, bool isDone) {
     while (_eventsToSkip > 0) {
       if (events.isEmpty) {
         if (isDone) break;
@@ -503,7 +778,7 @@
 
       var event = events.removeFirst();
       if (event.isError) {
-        event.complete(_completer);
+        _completer.completeError(event.asError.error, event.asError.stackTrace);
         return true;
       }
     }
@@ -512,13 +787,13 @@
   }
 }
 
-/// Request for a [StreamQueue.take] call.
-class _TakeRequest<T> implements _EventRequest {
+/// Common superclass for [_TakeRequest] and [_LookAheadRequest].
+abstract class _ListRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the take call.
-  final Completer _completer;
+  final _completer = new Completer<List<T>>();
 
   /// List collecting events until enough have been seen.
-  final List _list = <T>[];
+  final _list = <T>[];
 
   /// Number of events to capture.
   ///
@@ -526,24 +801,51 @@
   /// this value.
   final int _eventsToTake;
 
-  _TakeRequest(this._eventsToTake) : _completer = new Completer<List<T>>();
+  _ListRequest(this._eventsToTake);
 
   /// The future completed when the correct number of events have been captured.
-  Future get future => _completer.future;
+  Future<List<T>> get future => _completer.future;
+}
 
-  bool update(Queue<Result> events, bool isDone) {
+/// Request for a [StreamQueue.take] call.
+class _TakeRequest<T> extends _ListRequest<T> {
+  _TakeRequest(int eventsToTake) : super(eventsToTake);
+
+  bool update(QueueList<Result<T>> events, bool isDone) {
     while (_list.length < _eventsToTake) {
       if (events.isEmpty) {
         if (isDone) break;
         return false;
       }
 
-      var result = events.removeFirst();
-      if (result.isError) {
-        result.complete(_completer);
+      var event = events.removeFirst();
+      if (event.isError) {
+        event.asError.complete(_completer);
         return true;
       }
-      _list.add(result.asValue.value);
+      _list.add(event.asValue.value);
+    }
+    _completer.complete(_list);
+    return true;
+  }
+}
+
+/// Request for a [StreamQueue.lookAhead] call.
+class _LookAheadRequest<T> extends _ListRequest<T> {
+  _LookAheadRequest(int eventsToTake) : super(eventsToTake);
+
+  bool update(QueueList<Result<T>> events, bool isDone) {
+    while (_list.length < _eventsToTake) {
+      if (events.length == _list.length) {
+        if (isDone) break;
+        return false;
+      }
+      var event = events.elementAt(_list.length);
+      if (event.isError) {
+        event.asError.complete(_completer);
+        return true;
+      }
+      _list.add(event.asValue.value);
     }
     _completer.complete(_list);
     return true;
@@ -555,11 +857,10 @@
 /// The request needs no events, it just waits in the request queue
 /// until all previous events are fulfilled, then it cancels the stream queue
 /// source subscription.
-class _CancelRequest implements _EventRequest {
+class _CancelRequest<T> implements _EventRequest<T> {
   /// Completer for the future returned by the `cancel` call.
-  final Completer _completer = new Completer();
+  final _completer = new Completer();
 
-  /// The [StreamQueue] object that has this request queued.
   ///
   /// When the event is completed, it needs to cancel the active subscription
   /// of the `StreamQueue` object, if any.
@@ -570,7 +871,7 @@
   /// The future completed when the cancel request is completed.
   Future get future => _completer.future;
 
-  bool update(Queue<Result> events, bool isDone) {
+  bool update(QueueList<Result<T>> events, bool isDone) {
     if (_streamQueue._isDone) {
       _completer.complete();
     } else {
@@ -586,22 +887,22 @@
 /// The request is always complete, it just waits in the request queue
 /// until all previous events are fulfilled, then it takes over the
 /// stream events subscription and creates a stream from it.
-class _RestRequest<T> implements _EventRequest {
+class _RestRequest<T> implements _EventRequest<T> {
   /// Completer for the stream returned by the `rest` call.
-  final StreamCompleter _completer = new StreamCompleter<T>();
+  final _completer = new StreamCompleter<T>();
 
   /// The [StreamQueue] object that has this request queued.
   ///
   /// When the event is completed, it needs to cancel the active subscription
   /// of the `StreamQueue` object, if any.
-  final StreamQueue _streamQueue;
+  final StreamQueue<T> _streamQueue;
 
   _RestRequest(this._streamQueue);
 
   /// The stream which will contain the remaining events of [_streamQueue].
   Stream<T> get stream => _completer.stream;
 
-  bool update(Queue<Result> events, bool isDone) {
+  bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isEmpty) {
       if (_streamQueue._isDone) {
         _completer.setEmpty();
@@ -615,8 +916,9 @@
       for (var event in events) {
         event.addTo(controller);
       }
-      controller.addStream(_streamQueue._extractStream(), cancelOnError: false)
-                .whenComplete(controller.close);
+      controller
+          .addStream(_streamQueue._extractStream(), cancelOnError: false)
+          .whenComplete(controller.close);
       _completer.setSourceStream(controller.stream);
     }
     return true;
@@ -629,12 +931,12 @@
 /// but doesn't consume the event.
 /// If the request is closed without seeing an event, then
 /// the [future] is completed with `false`.
-class _HasNextRequest<T> implements _EventRequest {
-  final Completer _completer = new Completer<bool>();
+class _HasNextRequest<T> implements _EventRequest<T> {
+  final _completer = new Completer<bool>();
 
   Future<bool> get future => _completer.future;
 
-  bool update(Queue<Result> events, bool isDone) {
+  bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isNotEmpty) {
       _completer.complete(true);
       return true;
@@ -646,3 +948,33 @@
     return false;
   }
 }
+
+/// Request for a [StreamQueue.startTransaction] call.
+///
+/// This request isn't complete until the user calls
+/// [StreamQueueTransaction.commit] or [StreamQueueTransaction.reject], at which
+/// point it manually removes itself from the request queue and calls
+/// [StreamQueue._updateRequests].
+class _TransactionRequest<T> implements _EventRequest<T> {
+  /// The transaction created by this request.
+  StreamQueueTransaction<T> get transaction => _transaction;
+  StreamQueueTransaction<T> _transaction;
+
+  /// The controller that passes events to [transaction].
+  final _controller = new StreamController<T>(sync: true);
+
+  /// The number of events passed to [_controller] so far.
+  var _eventsSent = 0;
+
+  _TransactionRequest(StreamQueue<T> parent) {
+    _transaction = new StreamQueueTransaction._(parent, _controller.stream);
+  }
+
+  bool update(QueueList<Result<T>> events, bool isDone) {
+    while (_eventsSent < events.length) {
+      events[_eventsSent++].addTo(_controller);
+    }
+    if (isDone && !_controller.isClosed) _controller.close();
+    return false;
+  }
+}
diff --git a/packages/async/lib/src/stream_sink_completer.dart b/packages/async/lib/src/stream_sink_completer.dart
new file mode 100644
index 0000000..4219126
--- /dev/null
+++ b/packages/async/lib/src/stream_sink_completer.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'null_stream_sink.dart';
+
+/// A [sink] where the destination is provided later.
+///
+/// The [sink] is a normal sink that you can add events to to immediately, but
+/// until [setDestinationSink] is called, the events will be buffered.
+///
+/// The same effect can be achieved by using a [StreamController] and adding it
+/// to the sink using [Sink.addStream] when the destination sink is ready. This
+/// class attempts to shortcut some of the overhead when possible. For example,
+/// if the [sink] only has events added after the destination sink has been set,
+/// those events are added directly to the sink.
+class StreamSinkCompleter<T> {
+  /// The sink for this completer.
+  ///
+  /// When a destination sink is provided, events that have been passed to the
+  /// sink will be forwarded to the destination.
+  ///
+  /// Events can be added to the sink either before or after a destination sink
+  /// is set.
+  final StreamSink<T> sink = new _CompleterSink<T>();
+
+  /// Returns [sink] typed as a [_CompleterSink].
+  _CompleterSink<T> get _sink => sink;
+
+  /// Convert a `Future<StreamSink>` to a `StreamSink`.
+  ///
+  /// This creates a sink using a sink completer, and sets the destination sink
+  /// to the result of the future when the future completes.
+  ///
+  /// If the future completes with an error, the returned sink will instead
+  /// be closed. Its [Sink.done] future will contain the error.
+  static StreamSink<T> fromFuture<T>(Future<StreamSink<T>> sinkFuture) {
+    var completer = new StreamSinkCompleter<T>();
+    sinkFuture.then(completer.setDestinationSink, onError: completer.setError);
+    return completer.sink;
+  }
+
+  /// Sets a sink as the destination for events from the [StreamSinkCompleter]'s
+  /// [sink].
+  ///
+  /// The completer's [sink] will act exactly as [destinationSink].
+  ///
+  /// If the destination sink is set before events are added to [sink], further
+  /// events are forwarded directly to [destinationSink].
+  ///
+  /// If events are added to [sink] before setting the destination sink, they're
+  /// buffered until the destination is available.
+  ///
+  /// A destination sink may be set at most once.
+  ///
+  /// Either of [setDestinationSink] or [setError] may be called at most once.
+  /// Trying to call either of them again will fail.
+  void setDestinationSink(StreamSink<T> destinationSink) {
+    if (_sink._destinationSink != null) {
+      throw new StateError("Destination sink already set");
+    }
+    _sink._setDestinationSink(destinationSink);
+  }
+
+  /// Completes this to a closed sink whose [Sink.done] future emits [error].
+  ///
+  /// This is useful when the process of loading the sink fails.
+  ///
+  /// Either of [setDestinationSink] or [setError] may be called at most once.
+  /// Trying to call either of them again will fail.
+  void setError(error, [StackTrace stackTrace]) {
+    setDestinationSink(new NullStreamSink.error(error, stackTrace));
+  }
+}
+
+/// [StreamSink] completed by [StreamSinkCompleter].
+class _CompleterSink<T> implements StreamSink<T> {
+  /// Controller for an intermediate sink.
+  ///
+  /// Created if the user adds events to this sink before the destination sink
+  /// is set.
+  StreamController<T> _controller;
+
+  /// Completer for [done].
+  ///
+  /// Created if the user requests the [done] future before the destination sink
+  /// is set.
+  Completer _doneCompleter;
+
+  /// Destination sink for the events added to this sink.
+  ///
+  /// Set when [StreamSinkCompleter.setDestinationSink] is called.
+  StreamSink<T> _destinationSink;
+
+  /// Whether events should be sent directly to [_destinationSink], as opposed
+  /// to going through [_controller].
+  bool get _canSendDirectly => _controller == null && _destinationSink != null;
+
+  Future get done {
+    if (_doneCompleter != null) return _doneCompleter.future;
+    if (_destinationSink == null) {
+      _doneCompleter = new Completer.sync();
+      return _doneCompleter.future;
+    }
+    return _destinationSink.done;
+  }
+
+  void add(T event) {
+    if (_canSendDirectly) {
+      _destinationSink.add(event);
+    } else {
+      _ensureController();
+      _controller.add(event);
+    }
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    if (_canSendDirectly) {
+      _destinationSink.addError(error, stackTrace);
+    } else {
+      _ensureController();
+      _controller.addError(error, stackTrace);
+    }
+  }
+
+  Future addStream(Stream<T> stream) {
+    if (_canSendDirectly) return _destinationSink.addStream(stream);
+
+    _ensureController();
+    return _controller.addStream(stream, cancelOnError: false);
+  }
+
+  Future close() {
+    if (_canSendDirectly) {
+      _destinationSink.close();
+    } else {
+      _ensureController();
+      _controller.close();
+    }
+    return done;
+  }
+
+  /// Create [_controller] if it doesn't yet exist.
+  void _ensureController() {
+    if (_controller == null) _controller = new StreamController(sync: true);
+  }
+
+  /// Sets the destination sink to which events from this sink will be provided.
+  ///
+  /// If set before the user adds events, events will be added directly to the
+  /// destination sink. If the user adds events earlier, an intermediate sink is
+  /// created using a stream controller, and the destination sink is linked to
+  /// it later.
+  void _setDestinationSink(StreamSink<T> sink) {
+    assert(_destinationSink == null);
+    _destinationSink = sink;
+
+    // If the user has already added data, it's buffered in the controller, so
+    // we add it to the sink.
+    if (_controller != null) {
+      // Catch any error that may come from [addStream] or [sink.close]. They'll
+      // be reported through [done] anyway.
+      sink
+          .addStream(_controller.stream)
+          .whenComplete(sink.close)
+          .catchError((_) {});
+    }
+
+    // If the user has already asked when the sink is done, connect the sink's
+    // done callback to that completer.
+    if (_doneCompleter != null) {
+      _doneCompleter.complete(sink.done);
+    }
+  }
+}
diff --git a/packages/async/lib/src/stream_sink_transformer.dart b/packages/async/lib/src/stream_sink_transformer.dart
new file mode 100644
index 0000000..503d28a
--- /dev/null
+++ b/packages/async/lib/src/stream_sink_transformer.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'stream_sink_transformer/handler_transformer.dart';
+import 'stream_sink_transformer/stream_transformer_wrapper.dart';
+import 'stream_sink_transformer/typed.dart';
+
+/// A [StreamSinkTransformer] transforms the events being passed to a sink.
+///
+/// This works on the same principle as a [StreamTransformer]. Each transformer
+/// defines a [bind] method that takes in the original [StreamSink] and returns
+/// the transformed version. However, where a [StreamTransformer] transforms
+/// events after they leave the stream, this transforms them before they enter
+/// the sink.
+///
+/// Transformers must be able to have `bind` called used multiple times.
+abstract class StreamSinkTransformer<S, T> {
+  /// Creates a [StreamSinkTransformer] that transforms events and errors
+  /// using [transformer].
+  ///
+  /// This is equivalent to piping all events from the outer sink through a
+  /// stream transformed by [transformer] and from there into the inner sink.
+  const factory StreamSinkTransformer.fromStreamTransformer(
+      StreamTransformer<S, T> transformer) = StreamTransformerWrapper<S, T>;
+
+  /// Creates a [StreamSinkTransformer] that delegates events to the given
+  /// handlers.
+  ///
+  /// The handlers work exactly as they do for [StreamTransformer.fromHandlers].
+  /// They're called for each incoming event, and any actions on the sink
+  /// they're passed are forwarded to the inner sink. If a handler is omitted,
+  /// the event is passed through unaltered.
+  factory StreamSinkTransformer.fromHandlers(
+      {void handleData(S data, EventSink<T> sink),
+      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
+      void handleDone(EventSink<T> sink)}) {
+    return new HandlerTransformer<S, T>(handleData, handleError, handleDone);
+  }
+
+  /// Transforms the events passed to [sink].
+  ///
+  /// Creates a new sink. When events are passed to the returned sink, it will
+  /// transform them and pass the transformed versions to [sink].
+  StreamSink<S> bind(StreamSink<T> sink);
+
+  /// Creates a wrapper that coerces the type of [transformer].
+  ///
+  /// This soundly converts a [StreamSinkTransformer] to a
+  /// `StreamSinkTransformer<S, T>`, regardless of its original generic type.
+  /// This means that calls to [StreamSink.add] on the returned sink may throw a
+  /// [CastError] if the argument type doesn't match the reified type of the
+  /// sink.
+  static StreamSinkTransformer<S, T> typed<S, T>(
+          StreamSinkTransformer transformer) =>
+      transformer is StreamSinkTransformer<S, T>
+          ? transformer
+          : new TypeSafeStreamSinkTransformer(transformer);
+}
diff --git a/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart b/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart
new file mode 100644
index 0000000..dba8240
--- /dev/null
+++ b/packages/async/lib/src/stream_sink_transformer/handler_transformer.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../stream_sink_transformer.dart';
+import '../delegate/stream_sink.dart';
+
+/// The type of the callback for handling data events.
+typedef void HandleData<S, T>(S data, EventSink<T> sink);
+
+/// The type of the callback for handling error events.
+typedef void HandleError<T>(
+    Object error, StackTrace stackTrace, EventSink<T> sink);
+
+/// The type of the callback for handling done events.
+typedef void HandleDone<T>(EventSink<T> sink);
+
+/// A [StreamSinkTransformer] that delegates events to the given handlers.
+class HandlerTransformer<S, T> implements StreamSinkTransformer<S, T> {
+  /// The handler for data events.
+  final HandleData<S, T> _handleData;
+
+  /// The handler for error events.
+  final HandleError<T> _handleError;
+
+  /// The handler for done events.
+  final HandleDone<T> _handleDone;
+
+  HandlerTransformer(this._handleData, this._handleError, this._handleDone);
+
+  StreamSink<S> bind(StreamSink<T> sink) => new _HandlerSink<S, T>(this, sink);
+}
+
+/// A sink created by [HandlerTransformer].
+class _HandlerSink<S, T> implements StreamSink<S> {
+  /// The transformer that created this sink.
+  final HandlerTransformer<S, T> _transformer;
+
+  /// The original sink that's being transformed.
+  final StreamSink<T> _inner;
+
+  /// The wrapper for [_inner] whose [StreamSink.close] method can't emit
+  /// errors.
+  final StreamSink<T> _safeCloseInner;
+
+  Future get done => _inner.done;
+
+  _HandlerSink(this._transformer, StreamSink<T> inner)
+      : _inner = inner,
+        _safeCloseInner = new _SafeCloseSink<T>(inner);
+
+  void add(S event) {
+    if (_transformer._handleData == null) {
+      _inner.add(event as T);
+    } else {
+      _transformer._handleData(event, _safeCloseInner);
+    }
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    if (_transformer._handleError == null) {
+      _inner.addError(error, stackTrace);
+    } else {
+      _transformer._handleError(error, stackTrace, _safeCloseInner);
+    }
+  }
+
+  Future addStream(Stream<S> stream) {
+    return _inner.addStream(stream.transform(
+        new StreamTransformer<S, T>.fromHandlers(
+            handleData: _transformer._handleData,
+            handleError: _transformer._handleError,
+            handleDone: _closeSink)));
+  }
+
+  Future close() {
+    if (_transformer._handleDone == null) return _inner.close();
+
+    _transformer._handleDone(_safeCloseInner);
+    return _inner.done;
+  }
+}
+
+/// A wrapper for [StreamSink]s that swallows any errors returned by [close].
+///
+/// [HandlerTransformer] passes this to its handlers to ensure that when they
+/// call [close], they don't leave any dangling [Future]s behind that might emit
+/// unhandleable errors.
+class _SafeCloseSink<T> extends DelegatingStreamSink<T> {
+  _SafeCloseSink(StreamSink<T> inner) : super(inner);
+
+  Future close() => super.close().catchError((_) {});
+}
+
+/// A function to pass as a [StreamTransformer]'s `handleDone` callback.
+void _closeSink(EventSink sink) {
+  sink.close();
+}
diff --git a/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart b/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
new file mode 100644
index 0000000..32ac648
--- /dev/null
+++ b/packages/async/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../stream_sink_transformer.dart';
+
+/// A [StreamSinkTransformer] that wraps a pre-existing [StreamTransformer].
+class StreamTransformerWrapper<S, T> implements StreamSinkTransformer<S, T> {
+  /// The wrapped transformer.
+  final StreamTransformer<S, T> _transformer;
+
+  const StreamTransformerWrapper(this._transformer);
+
+  StreamSink<S> bind(StreamSink<T> sink) =>
+      new _StreamTransformerWrapperSink<S, T>(_transformer, sink);
+}
+
+/// A sink created by [StreamTransformerWrapper].
+class _StreamTransformerWrapperSink<S, T> implements StreamSink<S> {
+  /// The controller through which events are passed.
+  ///
+  /// This is used to create a stream that can be transformed by the wrapped
+  /// transformer.
+  final _controller = new StreamController<S>(sync: true);
+
+  /// The original sink that's being transformed.
+  final StreamSink<T> _inner;
+
+  Future get done => _inner.done;
+
+  _StreamTransformerWrapperSink(
+      StreamTransformer<S, T> transformer, this._inner) {
+    _controller.stream
+        .transform(transformer)
+        .listen(_inner.add, onError: _inner.addError, onDone: () {
+      // Ignore any errors that come from this call to [_inner.close]. The
+      // user can access them through [done] or the value returned from
+      // [this.close], and we don't want them to get top-leveled.
+      _inner.close().catchError((_) {});
+    });
+  }
+
+  void add(S event) {
+    _controller.add(event);
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _controller.addError(error, stackTrace);
+  }
+
+  Future addStream(Stream<S> stream) => _controller.addStream(stream);
+
+  Future close() {
+    _controller.close();
+    return _inner.done;
+  }
+}
diff --git a/packages/async/lib/src/stream_sink_transformer/typed.dart b/packages/async/lib/src/stream_sink_transformer/typed.dart
new file mode 100644
index 0000000..303bc08
--- /dev/null
+++ b/packages/async/lib/src/stream_sink_transformer/typed.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import '../delegate/stream_sink.dart';
+import '../stream_sink_transformer.dart';
+
+/// A wrapper that coerces the generic type of the sink returned by an inner
+/// transformer to `S`.
+class TypeSafeStreamSinkTransformer<S, T>
+    implements StreamSinkTransformer<S, T> {
+  final StreamSinkTransformer _inner;
+
+  TypeSafeStreamSinkTransformer(this._inner);
+
+  StreamSink<S> bind(StreamSink<T> sink) =>
+      DelegatingStreamSink.typed(_inner.bind(sink));
+}
diff --git a/packages/async/lib/src/stream_splitter.dart b/packages/async/lib/src/stream_splitter.dart
index 6ec440f..6cec98c 100644
--- a/packages/async/lib/src/stream_splitter.dart
+++ b/packages/async/lib/src/stream_splitter.dart
@@ -2,13 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.stream_splitter;
-
 import 'dart:async';
-import 'dart:collection';
 
-import '../result.dart';
 import 'future_group.dart';
+import 'result.dart';
 
 /// A class that splits a single source stream into an arbitrary number of
 /// (single-subscription) streams (called "branch") that emit the same events.
@@ -60,10 +57,10 @@
   ///
   /// [count] defaults to 2. This is the same as creating [count] branches and
   /// then closing the [StreamSplitter].
-  static List<Stream> splitFrom(Stream stream, [int count]) {
+  static List<Stream<T>> splitFrom<T>(Stream<T> stream, [int count]) {
     if (count == null) count = 2;
-    var splitter = new StreamSplitter(stream);
-    var streams = new List.generate(count, (_) => splitter.split());
+    var splitter = new StreamSplitter<T>(stream);
+    var streams = new List<Stream>.generate(count, (_) => splitter.split());
     splitter.close();
     return streams;
   }
@@ -78,12 +75,9 @@
       throw new StateError("Can't call split() on a closed StreamSplitter.");
     }
 
-    var controller;
-    controller = new StreamController<T>(
-        onListen: _onListen,
-        onPause: _onPause,
-        onResume: _onResume,
-        onCancel: () => _onCancel(controller));
+    var controller = new StreamController<T>(
+        onListen: _onListen, onPause: _onPause, onResume: _onResume);
+    controller.onCancel = () => _onCancel(controller);
 
     for (var result in _buffer) {
       result.addTo(controller);
@@ -150,8 +144,8 @@
       // wasn't paused, this will be a no-op.
       _subscription.resume();
     } else {
-      _subscription = _stream.listen(
-          _onData, onError: _onError, onDone: _onDone);
+      _subscription =
+          _stream.listen(_onData, onError: _onError, onDone: _onDone);
     }
   }
 
diff --git a/packages/async/lib/src/stream_subscription_transformer.dart b/packages/async/lib/src/stream_subscription_transformer.dart
new file mode 100644
index 0000000..1443b18
--- /dev/null
+++ b/packages/async/lib/src/stream_subscription_transformer.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'async_memoizer.dart';
+
+typedef Future _AsyncHandler<T>(StreamSubscription<T> inner);
+
+typedef void _VoidHandler<T>(StreamSubscription<T> inner);
+
+/// Creates a [StreamTransformer] that modifies the behavior of subscriptions to
+/// a stream.
+///
+/// When [StreamSubscription.cancel], [StreamSubscription.pause], or
+/// [StreamSubscription.resume] is called, the corresponding handler is invoked.
+/// By default, handlers just forward to the underlying subscription.
+///
+/// Guarantees that none of the [StreamSubscription] callbacks and none of the
+/// callbacks passed to `subscriptionTransformer()` will be invoked once the
+/// transformed [StreamSubscription] has been canceled and `handleCancel()` has
+/// run. The [handlePause] and [handleResume] are invoked regardless of whether
+/// the subscription is paused already or not.
+///
+/// In order to preserve [StreamSubscription] guarantees, **all callbacks must
+/// synchronously call the corresponding method** on the inner
+/// [StreamSubscription]: [handleCancel] must call `cancel()`, [handlePause]
+/// must call `pause()`, and [handleResume] must call `resume()`.
+StreamTransformer<T, T> subscriptionTransformer<T>(
+    {Future handleCancel(StreamSubscription<T> inner),
+    void handlePause(StreamSubscription<T> inner),
+    void handleResume(StreamSubscription<T> inner)}) {
+  return new StreamTransformer((stream, cancelOnError) {
+    return new _TransformedSubscription(
+        stream.listen(null, cancelOnError: cancelOnError),
+        handleCancel ?? (inner) => inner.cancel(),
+        handlePause ??
+            (inner) {
+              inner.pause();
+            },
+        handleResume ??
+            (inner) {
+              inner.resume();
+            });
+  });
+}
+
+/// A [StreamSubscription] wrapper that calls callbacks for subscription
+/// methods.
+class _TransformedSubscription<T> implements StreamSubscription<T> {
+  /// The wrapped subscription.
+  StreamSubscription<T> _inner;
+
+  /// The callback to run when [cancel] is called.
+  final _AsyncHandler<T> _handleCancel;
+
+  /// The callback to run when [pause] is called.
+  final _VoidHandler<T> _handlePause;
+
+  /// The callback to run when [resume] is called.
+  final _VoidHandler<T> _handleResume;
+
+  bool get isPaused => _inner?.isPaused ?? false;
+
+  _TransformedSubscription(
+      this._inner, this._handleCancel, this._handlePause, this._handleResume);
+
+  void onData(void handleData(T data)) {
+    _inner?.onData(handleData);
+  }
+
+  void onError(Function handleError) {
+    _inner?.onError(handleError);
+  }
+
+  void onDone(void handleDone()) {
+    _inner?.onDone(handleDone);
+  }
+
+  Future cancel() => _cancelMemoizer.runOnce(() {
+        var inner = _inner;
+        _inner.onData(null);
+        _inner.onDone(null);
+
+        // Setting onError to null will cause errors to be top-leveled.
+        _inner.onError((_, __) {});
+        _inner = null;
+        return _handleCancel(inner);
+      });
+  final _cancelMemoizer = new AsyncMemoizer();
+
+  void pause([Future resumeFuture]) {
+    if (_cancelMemoizer.hasRun) return;
+    if (resumeFuture != null) resumeFuture.whenComplete(resume);
+    _handlePause(_inner);
+  }
+
+  void resume() {
+    if (_cancelMemoizer.hasRun) return;
+    _handleResume(_inner);
+  }
+
+  Future<E> asFuture<E>([E futureValue]) =>
+      _inner?.asFuture(futureValue) ?? new Completer<E>().future;
+}
diff --git a/packages/async/lib/src/stream_zip.dart b/packages/async/lib/src/stream_zip.dart
new file mode 100644
index 0000000..3d5a811
--- /dev/null
+++ b/packages/async/lib/src/stream_zip.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+/// A stream that combines the values of other streams.
+///
+/// This emits lists of collected values from each input stream. The first list
+/// contains the first value emitted by each stream, the second contains the
+/// second value, and so on. The lists have the same ordering as the iterable
+/// passed to [new StreamZip].
+///
+/// Any errors from any of the streams are forwarded directly to this stream.
+class StreamZip<T> extends Stream<List<T>> {
+  final Iterable<Stream<T>> _streams;
+
+  StreamZip(Iterable<Stream<T>> streams) : _streams = streams;
+
+  StreamSubscription<List<T>> listen(void onData(List<T> data),
+      {Function onError, void onDone(), bool cancelOnError}) {
+    cancelOnError = identical(true, cancelOnError);
+    var subscriptions = <StreamSubscription<T>>[];
+    StreamController<List<T>> controller;
+    List<T> current;
+    int dataCount = 0;
+
+    /// Called for each data from a subscription in [subscriptions].
+    void handleData(int index, T data) {
+      current[index] = data;
+      dataCount++;
+      if (dataCount == subscriptions.length) {
+        var data = current;
+        current = new List(subscriptions.length);
+        dataCount = 0;
+        for (int i = 0; i < subscriptions.length; i++) {
+          if (i != index) subscriptions[i].resume();
+        }
+        controller.add(data);
+      } else {
+        subscriptions[index].pause();
+      }
+    }
+
+    /// Called for each error from a subscription in [subscriptions].
+    /// Except if [cancelOnError] is true, in which case the function below
+    /// is used instead.
+    void handleError(Object error, StackTrace stackTrace) {
+      controller.addError(error, stackTrace);
+    }
+
+    /// Called when a subscription has an error and [cancelOnError] is true.
+    ///
+    /// Prematurely cancels all subscriptions since we know that we won't
+    /// be needing any more values.
+    void handleErrorCancel(Object error, StackTrace stackTrace) {
+      for (int i = 0; i < subscriptions.length; i++) {
+        subscriptions[i].cancel();
+      }
+      controller.addError(error, stackTrace);
+    }
+
+    void handleDone() {
+      for (int i = 0; i < subscriptions.length; i++) {
+        subscriptions[i].cancel();
+      }
+      controller.close();
+    }
+
+    try {
+      for (var stream in _streams) {
+        int index = subscriptions.length;
+        subscriptions.add(stream.listen((data) {
+          handleData(index, data);
+        },
+            onError: cancelOnError ? handleError : handleErrorCancel,
+            onDone: handleDone,
+            cancelOnError: cancelOnError));
+      }
+    } catch (e) {
+      for (int i = subscriptions.length - 1; i >= 0; i--) {
+        subscriptions[i].cancel();
+      }
+      rethrow;
+    }
+
+    current = new List(subscriptions.length);
+
+    controller = new StreamController<List<T>>(onPause: () {
+      for (int i = 0; i < subscriptions.length; i++) {
+        // This may pause some subscriptions more than once.
+        // These will not be resumed by onResume below, but must wait for the
+        // next round.
+        subscriptions[i].pause();
+      }
+    }, onResume: () {
+      for (int i = 0; i < subscriptions.length; i++) {
+        subscriptions[i].resume();
+      }
+    }, onCancel: () {
+      for (int i = 0; i < subscriptions.length; i++) {
+        // Canceling more than once is safe.
+        subscriptions[i].cancel();
+      }
+    });
+
+    if (subscriptions.isEmpty) {
+      controller.close();
+    }
+    return controller.stream.listen(onData,
+        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
+  }
+}
diff --git a/packages/async/lib/src/subscription_stream.dart b/packages/async/lib/src/subscription_stream.dart
index e9e7d77..a235663 100644
--- a/packages/async/lib/src/subscription_stream.dart
+++ b/packages/async/lib/src/subscription_stream.dart
@@ -2,15 +2,13 @@
 // for 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 async.subscription_stream;
-
 import 'dart:async';
 
 import "delegate/stream_subscription.dart";
 
 /// A [Stream] adapter for a [StreamSubscription].
 ///
-/// This class allows as `StreamSubscription` to be treated as a `Stream`.
+/// This class allows a `StreamSubscription` to be treated as a `Stream`.
 ///
 /// The subscription is paused until the stream is listened to,
 /// then it is resumed and the events are passed on to the
@@ -20,7 +18,7 @@
 /// If other code is accessing the subscription, results may be unpredictable.
 class SubscriptionStream<T> extends Stream<T> {
   /// The subscription providing the events for this stream.
-  StreamSubscription _source;
+  StreamSubscription<T> _source;
 
   /// Create a single-subscription `Stream` from [subscription].
   ///
@@ -31,8 +29,8 @@
   /// If the `subscription` doesn't send any `done` events, neither will this
   /// stream. That may be an issue if `subscription` was made to cancel on
   /// an error.
-  SubscriptionStream(StreamSubscription subscription)
-       : _source = subscription {
+  SubscriptionStream(StreamSubscription<T> subscription)
+      : _source = subscription {
     _source.pause();
     // Clear callbacks to avoid keeping them alive unnecessarily.
     _source.onData(null);
@@ -41,22 +39,17 @@
   }
 
   StreamSubscription<T> listen(void onData(T event),
-                               {Function onError,
-                                void onDone(),
-                                bool cancelOnError}) {
+      {Function onError, void onDone(), bool cancelOnError}) {
     if (_source == null) {
       throw new StateError("Stream has already been listened to.");
     }
     cancelOnError = (true == cancelOnError);
     var subscription = _source;
     _source = null;
-    var result;
-    if (cancelOnError) {
-      result = new _CancelOnErrorSubscriptionWrapper<T>(subscription);
-    } else {
-      // Wrap the subscription to ensure correct type parameter.
-      result = new DelegatingStreamSubscription<T>(subscription);
-    }
+
+    var result = cancelOnError
+        ? new _CancelOnErrorSubscriptionWrapper<T>(subscription)
+        : subscription;
     result.onData(onData);
     result.onError(onError);
     result.onDone(onDone);
@@ -73,7 +66,7 @@
 /// source subscription on the first error.
 class _CancelOnErrorSubscriptionWrapper<T>
     extends DelegatingStreamSubscription<T> {
-  _CancelOnErrorSubscriptionWrapper(StreamSubscription subscription)
+  _CancelOnErrorSubscriptionWrapper(StreamSubscription<T> subscription)
       : super(subscription);
 
   void onError(Function handleError) {
diff --git a/packages/async/lib/src/typed/future.dart b/packages/async/lib/src/typed/future.dart
new file mode 100644
index 0000000..4630af7
--- /dev/null
+++ b/packages/async/lib/src/typed/future.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+class TypeSafeFuture<T> implements Future<T> {
+  final Future _future;
+
+  TypeSafeFuture(this._future);
+
+  Stream<T> asStream() => _future.then((value) => value as T).asStream();
+
+  Future<T> catchError(Function onError, {bool test(Object error)}) async =>
+      new TypeSafeFuture<T>(_future.catchError(onError, test: test));
+
+  Future<S> then<S>(dynamic onValue(T value), {Function onError}) =>
+      _future.then((value) => onValue(value as T), onError: onError);
+
+  Future<T> whenComplete(action()) =>
+      new TypeSafeFuture<T>(_future.whenComplete(action));
+
+  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
+      new TypeSafeFuture<T>(_future.timeout(timeLimit, onTimeout: onTimeout));
+}
diff --git a/packages/async/lib/src/typed/stream.dart b/packages/async/lib/src/typed/stream.dart
new file mode 100644
index 0000000..a467115
--- /dev/null
+++ b/packages/async/lib/src/typed/stream.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:collection/collection.dart';
+
+import '../utils.dart';
+import 'stream_subscription.dart';
+import '../delegate/event_sink.dart';
+
+class TypeSafeStream<T> extends Stream<T> {
+  final Stream _stream;
+
+  Future<T> get first async => (await _stream.first) as T;
+  Future<T> get last async => (await _stream.last) as T;
+  Future<T> get single async => (await _stream.single) as T;
+
+  bool get isBroadcast => _stream.isBroadcast;
+  Future<bool> get isEmpty => _stream.isEmpty;
+  Future<int> get length => _stream.length;
+
+  TypeSafeStream(this._stream);
+
+  Stream<T> asBroadcastStream(
+      {void onListen(StreamSubscription<T> subscription),
+      void onCancel(StreamSubscription<T> subscription)}) {
+    return new TypeSafeStream<T>(_stream.asBroadcastStream(
+        onListen: onListen == null
+            ? null
+            : (subscription) =>
+                onListen(new TypeSafeStreamSubscription<T>(subscription)),
+        onCancel: onCancel == null
+            ? null
+            : (subscription) =>
+                onCancel(new TypeSafeStreamSubscription<T>(subscription))));
+  }
+
+  Stream<E> asyncExpand<E>(Stream<E> convert(T event)) =>
+      _stream.asyncExpand(_validateType(convert));
+
+  Stream<E> asyncMap<E>(convert(T event)) =>
+      _stream.asyncMap(_validateType(convert));
+
+  Stream<T> distinct([bool equals(T previous, T next)]) =>
+      new TypeSafeStream<T>(_stream.distinct(equals == null
+          ? null
+          : (previous, next) => equals(previous as T, next as T)));
+
+  Future<E> drain<E>([E futureValue]) => _stream.drain(futureValue);
+
+  Stream<S> expand<S>(Iterable<S> convert(T value)) =>
+      _stream.expand(_validateType(convert));
+
+  Future firstWhere(bool test(T element), {Object defaultValue()}) =>
+      _stream.firstWhere(_validateType(test), defaultValue: defaultValue);
+
+  Future lastWhere(bool test(T element), {Object defaultValue()}) =>
+      _stream.lastWhere(_validateType(test), defaultValue: defaultValue);
+
+  Future<T> singleWhere(bool test(T element)) async =>
+      (await _stream.singleWhere(_validateType(test))) as T;
+
+  Future<S> fold<S>(S initialValue, S combine(S previous, T element)) =>
+      _stream.fold(
+          initialValue, (previous, element) => combine(previous, element as T));
+
+  Future forEach(void action(T element)) =>
+      _stream.forEach(_validateType(action));
+
+  Stream<T> handleError(Function onError, {bool test(error)}) =>
+      new TypeSafeStream<T>(_stream.handleError(onError, test: test));
+
+  StreamSubscription<T> listen(void onData(T value),
+          {Function onError, void onDone(), bool cancelOnError}) =>
+      new TypeSafeStreamSubscription<T>(_stream.listen(_validateType(onData),
+          onError: onError, onDone: onDone, cancelOnError: cancelOnError));
+
+  Stream<S> map<S>(S convert(T event)) => _stream.map(_validateType(convert));
+
+  // Don't forward to `_stream.pipe` because we want the consumer to see the
+  // type-asserted stream.
+  Future pipe(StreamConsumer<T> consumer) =>
+      consumer.addStream(this).then((_) => consumer.close());
+
+  Future<T> reduce(T combine(T previous, T element)) async {
+    var result = await _stream
+        .reduce((previous, element) => combine(previous as T, element as T));
+    return result as T;
+  }
+
+  Stream<T> skipWhile(bool test(T element)) =>
+      new TypeSafeStream<T>(_stream.skipWhile(_validateType(test)));
+
+  Stream<T> takeWhile(bool test(T element)) =>
+      new TypeSafeStream<T>(_stream.takeWhile(_validateType(test)));
+
+  Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)}) =>
+      new TypeSafeStream<T>(_stream.timeout(timeLimit,
+          onTimeout: (sink) => onTimeout(DelegatingEventSink.typed(sink))));
+
+  Future<List<T>> toList() async =>
+      DelegatingList.typed<T>(await _stream.toList());
+
+  Future<Set<T>> toSet() async => DelegatingSet.typed<T>(await _stream.toSet());
+
+  // Don't forward to `_stream.transform` because we want the transformer to see
+  // the type-asserted stream.
+  Stream<S> transform<S>(StreamTransformer<T, S> transformer) =>
+      transformer.bind(this);
+
+  Stream<T> where(bool test(T element)) =>
+      new TypeSafeStream<T>(_stream.where(_validateType(test)));
+
+  Future<bool> every(bool test(T element)) =>
+      _stream.every(_validateType(test));
+
+  Future<bool> any(bool test(T element)) => _stream.any(_validateType(test));
+  Stream<T> skip(int count) => new TypeSafeStream<T>(_stream.skip(count));
+  Stream<T> take(int count) => new TypeSafeStream<T>(_stream.take(count));
+  Future<T> elementAt(int index) async => (await _stream.elementAt(index)) as T;
+  Future<bool> contains(Object needle) => _stream.contains(needle);
+  Future<String> join([String separator = ""]) => _stream.join(separator);
+  String toString() => _stream.toString();
+
+  /// Returns a version of [function] that asserts that its argument is an
+  /// instance of `T`.
+  UnaryFunction<dynamic, S> _validateType<S>(S function(T value)) =>
+      function == null ? null : (value) => function(value as T);
+}
diff --git a/packages/async/lib/src/typed/stream_subscription.dart b/packages/async/lib/src/typed/stream_subscription.dart
new file mode 100644
index 0000000..0fab039
--- /dev/null
+++ b/packages/async/lib/src/typed/stream_subscription.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+class TypeSafeStreamSubscription<T> implements StreamSubscription<T> {
+  final StreamSubscription _subscription;
+
+  bool get isPaused => _subscription.isPaused;
+
+  TypeSafeStreamSubscription(this._subscription);
+
+  void onData(void handleData(T data)) {
+    _subscription.onData((data) => handleData(data as T));
+  }
+
+  void onError(Function handleError) {
+    _subscription.onError(handleError);
+  }
+
+  void onDone(void handleDone()) {
+    _subscription.onDone(handleDone);
+  }
+
+  void pause([Future resumeFuture]) {
+    _subscription.pause(resumeFuture);
+  }
+
+  void resume() {
+    _subscription.resume();
+  }
+
+  Future cancel() => _subscription.cancel();
+
+  Future<E> asFuture<E>([E futureValue]) => _subscription.asFuture(futureValue);
+}
diff --git a/packages/async/lib/src/typed_stream_transformer.dart b/packages/async/lib/src/typed_stream_transformer.dart
new file mode 100644
index 0000000..98d5e70
--- /dev/null
+++ b/packages/async/lib/src/typed_stream_transformer.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'delegate/stream.dart';
+
+/// Creates a wrapper that coerces the type of [transformer].
+///
+/// This soundly converts a [StreamTransformer] to a `StreamTransformer<S, T>`,
+/// regardless of its original generic type, by asserting that the events
+/// emitted by the transformed stream are instances of `T` whenever they're
+/// provided. If they're not, the stream throws a [CastError].
+StreamTransformer<S, T> typedStreamTransformer<S, T>(
+        StreamTransformer transformer) =>
+    transformer is StreamTransformer<S, T>
+        ? transformer
+        : new _TypeSafeStreamTransformer(transformer);
+
+/// A wrapper that coerces the type of the stream returned by an inner
+/// transformer.
+class _TypeSafeStreamTransformer<S, T> implements StreamTransformer<S, T> {
+  final StreamTransformer _inner;
+
+  _TypeSafeStreamTransformer(this._inner);
+
+  Stream<T> bind(Stream<S> stream) =>
+      DelegatingStream.typed(_inner.bind(stream));
+}
diff --git a/packages/async/lib/src/utils.dart b/packages/async/lib/src/utils.dart
new file mode 100644
index 0000000..2aab40e
--- /dev/null
+++ b/packages/async/lib/src/utils.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+/// A generic typedef for a function that takes one type and returns another.
+typedef F UnaryFunction<E, F>(E argument);
+
+/// A typedef for a function that takes no arguments and returns a Future or a
+/// value.
+typedef FutureOr<T> FutureOrCallback<T>();
diff --git a/packages/async/lib/stream_zip.dart b/packages/async/lib/stream_zip.dart
index 055489d..cdeb5c9 100644
--- a/packages/async/lib/stream_zip.dart
+++ b/packages/async/lib/stream_zip.dart
@@ -2,118 +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.
 
-/**
- * Help for combining multiple streams into a single stream.
- */
+/// Import `async.dart` instead.
+@Deprecated("Will be removed in async 2.0.0.")
 library dart.pkg.async.stream_zip;
 
-import "dart:async";
-
-/**
- * A stream that combines the values of other streams.
- */
-class StreamZip extends Stream<List> {
-  final Iterable<Stream> _streams;
-  StreamZip(Iterable<Stream> streams) : _streams = streams;
-
-  StreamSubscription<List> listen(void onData(List data), {
-                                  Function onError,
-                                  void onDone(),
-                                  bool cancelOnError}) {
-    cancelOnError = identical(true, cancelOnError);
-    List<StreamSubscription> subscriptions = <StreamSubscription>[];
-    StreamController controller;
-    List current;
-    int dataCount = 0;
-
-    /// Called for each data from a subscription in [subscriptions].
-    void handleData(int index, data) {
-      current[index] = data;
-      dataCount++;
-      if (dataCount == subscriptions.length) {
-        List data = current;
-        current = new List(subscriptions.length);
-        dataCount = 0;
-        for (int i = 0; i < subscriptions.length; i++) {
-          if (i != index) subscriptions[i].resume();
-        }
-        controller.add(data);
-      } else {
-        subscriptions[index].pause();
-      }
-    }
-
-    /// Called for each error from a subscription in [subscriptions].
-    /// Except if [cancelOnError] is true, in which case the function below
-    /// is used instead.
-    void handleError(Object error, StackTrace stackTrace) {
-      controller.addError(error, stackTrace);
-    }
-
-    /// Called when a subscription has an error and [cancelOnError] is true.
-    ///
-    /// Prematurely cancels all subscriptions since we know that we won't
-    /// be needing any more values.
-    void handleErrorCancel(Object error, StackTrace stackTrace) {
-      for (int i = 0; i < subscriptions.length; i++) {
-        subscriptions[i].cancel();
-      }
-      controller.addError(error, stackTrace);
-    }
-
-    void handleDone() {
-      for (int i = 0; i < subscriptions.length; i++) {
-        subscriptions[i].cancel();
-      }
-      controller.close();
-    }
-
-    try {
-      for (Stream stream in _streams) {
-        int index = subscriptions.length;
-        subscriptions.add(stream.listen(
-            (data) { handleData(index, data); },
-            onError: cancelOnError ? handleError : handleErrorCancel,
-            onDone: handleDone,
-            cancelOnError: cancelOnError));
-      }
-    } catch (e) {
-      for (int i = subscriptions.length - 1; i >= 0; i--) {
-        subscriptions[i].cancel();
-      }
-      rethrow;
-    }
-
-    current = new List(subscriptions.length);
-
-    controller = new StreamController<List>(
-      onPause: () {
-        for (int i = 0; i < subscriptions.length; i++) {
-          // This may pause some subscriptions more than once.
-          // These will not be resumed by onResume below, but must wait for the
-          // next round.
-          subscriptions[i].pause();
-        }
-      },
-      onResume: () {
-        for (int i = 0; i < subscriptions.length; i++) {
-          subscriptions[i].resume();
-        }
-      },
-      onCancel: () {
-        for (int i = 0; i < subscriptions.length; i++) {
-          // Canceling more than once is safe.
-          subscriptions[i].cancel();
-        }
-      }
-    );
-
-    if (subscriptions.isEmpty) {
-      controller.close();
-    }
-    return controller.stream.listen(onData,
-                                    onError: onError,
-                                    onDone: onDone,
-                                    cancelOnError: cancelOnError);
-  }
-}
+export "src/stream_zip.dart";
diff --git a/packages/async/pubspec.yaml b/packages/async/pubspec.yaml
index 91d752d..2ee2505 100644
--- a/packages/async/pubspec.yaml
+++ b/packages/async/pubspec.yaml
@@ -1,11 +1,13 @@
 name: async
-version: 1.4.0
+version: 1.13.3
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:async' library.
 homepage: https://www.github.com/dart-lang/async
+environment:
+  sdk: ">=1.22.0 <2.0.0"
+dependencies:
+  collection: "^1.5.0"
 dev_dependencies:
   fake_async: "^0.1.2"
   stack_trace: "^1.0.0"
   test: "^0.12.0"
-environment:
-  sdk: ">=1.9.0 <2.0.0"
diff --git a/packages/async/test/async_cache_test.dart b/packages/async/test/async_cache_test.dart
new file mode 100644
index 0000000..747835b
--- /dev/null
+++ b/packages/async/test/async_cache_test.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:fake_async/fake_async.dart';
+import 'package:test/test.dart';
+
+void main() {
+  AsyncCache<String> cache;
+
+  setUp(() {
+    // Create a cache that is fresh for an hour.
+    cache = new AsyncCache(const Duration(hours: 1));
+  });
+
+  test('should fetch via a callback when no cache exists', () async {
+    expect(await cache.fetch(() async => 'Expensive'), 'Expensive');
+  });
+
+  test('should not fetch via callback when a cache exists', () async {
+    await cache.fetch(() async => 'Expensive');
+    expect(await cache.fetch(expectAsync0(() {}, count: 0)), 'Expensive');
+  });
+
+  test('should not fetch via callback when a future is in-flight', () async {
+    // No actual caching is done, just avoid duplicate requests.
+    cache = new AsyncCache.ephemeral();
+
+    var completer = new Completer<String>();
+    expect(cache.fetch(() => completer.future), completion('Expensive'));
+    expect(cache.fetch(expectAsync0(() {}, count: 0)), completion('Expensive'));
+    await completer.complete('Expensive');
+  });
+
+  test('should fetch via a callback again when cache expires', () {
+    new FakeAsync().run((fakeAsync) async {
+      var timesCalled = 0;
+      call() async => 'Called ${++timesCalled}';
+      expect(await cache.fetch(call), 'Called 1');
+      expect(await cache.fetch(call), 'Called 1', reason: 'Cache still fresh');
+
+      fakeAsync.elapse(const Duration(hours: 1) - const Duration(seconds: 1));
+      expect(await cache.fetch(call), 'Called 1', reason: 'Cache still fresh');
+
+      fakeAsync.elapse(const Duration(seconds: 1));
+      expect(await cache.fetch(call), 'Called 2');
+      expect(await cache.fetch(call), 'Called 2', reason: 'Cache fresh again');
+
+      fakeAsync.elapse(const Duration(hours: 1));
+      expect(await cache.fetch(call), 'Called 3');
+    });
+  });
+
+  test('should fetch via a callback when manually invalidated', () async {
+    var timesCalled = 0;
+    call() async => 'Called ${++timesCalled}';
+    expect(await cache.fetch(call), 'Called 1');
+    await cache.invalidate();
+    expect(await cache.fetch(call), 'Called 2');
+    await cache.invalidate();
+    expect(await cache.fetch(call), 'Called 3');
+  });
+
+  test('should fetch a stream via a callback', () async {
+    expect(
+        await cache.fetchStream(expectAsync0(() {
+          return new Stream.fromIterable(['1', '2', '3']);
+        })).toList(),
+        ['1', '2', '3']);
+  });
+
+  test('should not fetch stream via callback when a cache exists', () async {
+    await cache.fetchStream(() async* {
+      yield '1';
+      yield '2';
+      yield '3';
+    }).toList();
+    expect(await cache.fetchStream(expectAsync0(() {}, count: 0)).toList(),
+        ['1', '2', '3']);
+  });
+
+  test('should not fetch stream via callback when request in flight', () async {
+    // Unlike the above test, we want to verify that we don't make multiple
+    // calls if a cache is being filled currently, and instead wait for that
+    // cache to be completed.
+    var controller = new StreamController<String>();
+    Stream<String> call() => controller.stream;
+    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
+    controller.add('1');
+    controller.add('2');
+    await new Future.value();
+    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
+    controller.add('3');
+    await controller.close();
+  });
+
+  test('should fetch stream via a callback again when cache expires', () {
+    new FakeAsync().run((fakeAsync) async {
+      var timesCalled = 0;
+      Stream<String> call() {
+        return new Stream.fromIterable(['Called ${++timesCalled}']);
+      }
+
+      expect(await cache.fetchStream(call).toList(), ['Called 1']);
+      expect(await cache.fetchStream(call).toList(), ['Called 1'],
+          reason: 'Cache still fresh');
+
+      fakeAsync.elapse(const Duration(hours: 1) - const Duration(seconds: 1));
+      expect(await cache.fetchStream(call).toList(), ['Called 1'],
+          reason: 'Cache still fresh');
+
+      fakeAsync.elapse(const Duration(seconds: 1));
+      expect(await cache.fetchStream(call).toList(), ['Called 2']);
+      expect(await cache.fetchStream(call).toList(), ['Called 2'],
+          reason: 'Cache fresh again');
+
+      fakeAsync.elapse(const Duration(hours: 1));
+      expect(await cache.fetchStream(call).toList(), ['Called 3']);
+    });
+  });
+
+  test('should fetch via a callback when manually invalidated', () async {
+    var timesCalled = 0;
+    Stream<String> call() {
+      return new Stream.fromIterable(['Called ${++timesCalled}']);
+    }
+
+    expect(await cache.fetchStream(call).toList(), ['Called 1']);
+    await cache.invalidate();
+    expect(await cache.fetchStream(call).toList(), ['Called 2']);
+    await cache.invalidate();
+    expect(await cache.fetchStream(call).toList(), ['Called 3']);
+  });
+
+  test('should cancel a cached stream without affecting others', () async {
+    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
+
+    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
+
+    // Listens to the stream for the initial value, then cancels subscription.
+    expect(await cache.fetchStream(call).first, '1');
+  });
+
+  test('should pause a cached stream without affecting others', () async {
+    Stream<String> call() => new Stream.fromIterable(['1', '2', '3']);
+
+    StreamSubscription sub;
+    sub = cache.fetchStream(call).listen(expectAsync1((event) {
+      if (event == '1') sub.pause();
+    }));
+    expect(cache.fetchStream(call).toList(), completion(['1', '2', '3']));
+  });
+}
diff --git a/packages/async/test/async_memoizer_test.dart b/packages/async/test/async_memoizer_test.dart
index b8ca38a..dc008f1 100644
--- a/packages/async/test/async_memoizer_test.dart
+++ b/packages/async/test/async_memoizer_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:async/async.dart';
 import 'package:test/test.dart';
 
diff --git a/packages/async/test/byte_collection_test.dart b/packages/async/test/byte_collection_test.dart
new file mode 100644
index 0000000..b87b074
--- /dev/null
+++ b/packages/async/test/byte_collection_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:test/test.dart";
+import "package:async/async.dart";
+
+void main() {
+  group("collectBytes", () {
+    test("simple list and overflow", () {
+      var result = collectBytes(new Stream.fromIterable([
+        [0],
+        [1],
+        [2],
+        [256]
+      ]));
+      expect(result, completion([0, 1, 2, 0]));
+    });
+
+    test("no events", () {
+      var result = collectBytes(new Stream.fromIterable([]));
+      expect(result, completion([]));
+    });
+
+    test("empty events", () {
+      var result = collectBytes(new Stream.fromIterable([[], []]));
+      expect(result, completion([]));
+    });
+
+    test("error event", () {
+      var result = collectBytes(new Stream.fromIterable(
+          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
+      expect(result, throwsA("badness"));
+    });
+  });
+
+  group("collectBytes", () {
+    test("simple list and overflow", () {
+      var result = collectBytesCancelable(new Stream.fromIterable([
+        [0],
+        [1],
+        [2],
+        [256]
+      ]));
+      expect(result.value, completion([0, 1, 2, 0]));
+    });
+
+    test("no events", () {
+      var result = collectBytesCancelable(new Stream.fromIterable([]));
+      expect(result.value, completion([]));
+    });
+
+    test("empty events", () {
+      var result = collectBytesCancelable(new Stream.fromIterable([[], []]));
+      expect(result.value, completion([]));
+    });
+
+    test("error event", () {
+      var result = collectBytesCancelable(new Stream.fromIterable(
+          new Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
+      expect(result.value, throwsA("badness"));
+    });
+
+    test("cancelled", () async {
+      var sc = new StreamController<List<int>>();
+      var result = collectBytesCancelable(sc.stream);
+      // Value never completes.
+      result.value.whenComplete(expectAsync0(() {}, count: 0));
+
+      expect(sc.hasListener, isTrue);
+      sc.add([1, 2]);
+      await nextTimerTick();
+      expect(sc.hasListener, isTrue);
+      sc.add([3, 4]);
+      await nextTimerTick();
+      expect(sc.hasListener, isTrue);
+      result.cancel();
+      expect(sc.hasListener, isFalse); // Cancelled immediately.
+      var replacement = await result.valueOrCancellation();
+      expect(replacement, isNull);
+      await nextTimerTick();
+      sc.close();
+      await nextTimerTick();
+    });
+  });
+}
+
+Future nextTimerTick() => new Future(() {});
diff --git a/packages/async/test/cancelable_operation_test.dart b/packages/async/test/cancelable_operation_test.dart
index 189c073..bded402 100644
--- a/packages/async/test/cancelable_operation_test.dart
+++ b/packages/async/test/cancelable_operation_test.dart
@@ -13,8 +13,8 @@
   group("without being canceled", () {
     var completer;
     setUp(() {
-      completer = new CancelableCompleter(
-          onCancel: expectAsync(() {}, count: 0));
+      completer =
+          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
     });
 
     test("sends values to the future", () {
@@ -45,6 +45,16 @@
       expect(completer.isCompleted, isTrue);
     });
 
+    test("sends values to valueOrCancellation", () {
+      expect(completer.operation.valueOrCancellation(), completion(equals(1)));
+      completer.complete(1);
+    });
+
+    test("sends errors to valueOrCancellation", () {
+      expect(completer.operation.valueOrCancellation(), throwsA("error"));
+      completer.completeError("error");
+    });
+
     group("throws a StateError if completed", () {
       test("successfully twice", () {
         completer.complete(1);
@@ -64,8 +74,8 @@
 
       test("successfully then with a future", () {
         completer.complete(1);
-        expect(() => completer.complete(new Completer().future),
-            throwsStateError);
+        expect(
+            () => completer.complete(new Completer().future), throwsStateError);
       });
 
       test("with a future then successfully", () {
@@ -75,8 +85,8 @@
 
       test("with a future twice", () {
         completer.complete(new Completer().future);
-        expect(() => completer.complete(new Completer().future),
-            throwsStateError);
+        expect(
+            () => completer.complete(new Completer().future), throwsStateError);
       });
     });
 
@@ -87,8 +97,8 @@
       });
 
       test("forwards errors", () {
-        var operation = new CancelableOperation.fromFuture(
-            new Future.error("error"));
+        var operation =
+            new CancelableOperation.fromFuture(new Future.error("error"));
         expect(operation.value, throwsA("error"));
       });
     });
@@ -97,7 +107,7 @@
   group("when canceled", () {
     test("causes the future never to fire", () async {
       var completer = new CancelableCompleter();
-      completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       completer.operation.cancel();
 
       // Give the future plenty of time to fire if it's going to.
@@ -109,7 +119,7 @@
     test("fires onCancel", () {
       var canceled = false;
       var completer;
-      completer = new CancelableCompleter(onCancel: expectAsync(() {
+      completer = new CancelableCompleter(onCancel: expectAsync0(() {
         expect(completer.isCanceled, isTrue);
         canceled = true;
       }));
@@ -124,7 +134,7 @@
     });
 
     test("returns the onCancel future each time cancel is called", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync(() {
+      var completer = new CancelableCompleter(onCancel: expectAsync0(() {
         return new Future.value(1);
       }));
       expect(completer.operation.cancel(), completion(equals(1)));
@@ -133,29 +143,31 @@
     });
 
     test("returns a future even if onCancel doesn't", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
+      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
       expect(completer.operation.cancel(), completes);
     });
 
     test("doesn't call onCancel if the completer has completed", () {
-      var completer = new CancelableCompleter(
-          onCancel: expectAsync(() {}, count: 0));
+      var completer =
+          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
       completer.complete(1);
       expect(completer.operation.value, completion(equals(1)));
       expect(completer.operation.cancel(), completes);
     });
 
-    test("does call onCancel if the completer has completed to an unfired "
+    test(
+        "does call onCancel if the completer has completed to an unfired "
         "Future", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
+      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
       completer.complete(new Completer().future);
       expect(completer.operation.cancel(), completes);
     });
 
-    test("doesn't call onCancel if the completer has completed to a fired "
+    test(
+        "doesn't call onCancel if the completer has completed to a fired "
         "Future", () async {
-      var completer = new CancelableCompleter(
-          onCancel: expectAsync(() {}, count: 0));
+      var completer =
+          new CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
       completer.complete(new Future.value(1));
       await completer.operation.value;
       expect(completer.operation.cancel(), completes);
@@ -163,11 +175,44 @@
 
     test("can be completed once after being canceled", () async {
       var completer = new CancelableCompleter();
-      completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       await completer.operation.cancel();
       completer.complete(1);
       expect(() => completer.complete(1), throwsStateError);
     });
+
+    test("fires valueOrCancellation with the given value", () {
+      var completer = new CancelableCompleter();
+      expect(completer.operation.valueOrCancellation(1), completion(equals(1)));
+      completer.operation.cancel();
+    });
+
+    test("pipes an error through valueOrCancellation", () {
+      var completer = new CancelableCompleter(onCancel: () {
+        throw "error";
+      });
+      expect(completer.operation.valueOrCancellation(1), throwsA("error"));
+      completer.operation.cancel();
+    });
+
+    test("valueOrCancellation waits on the onCancel future", () async {
+      var innerCompleter = new Completer();
+      var completer =
+          new CancelableCompleter(onCancel: () => innerCompleter.future);
+
+      var fired = false;
+      completer.operation.valueOrCancellation().then((_) {
+        fired = true;
+      });
+
+      completer.operation.cancel();
+      await flushMicrotasks();
+      expect(fired, isFalse);
+
+      innerCompleter.complete();
+      await flushMicrotasks();
+      expect(fired, isTrue);
+    });
   });
 
   group("asStream()", () {
@@ -186,10 +231,10 @@
     });
 
     test("cancels the completer when the subscription is canceled", () {
-      var completer = new CancelableCompleter(onCancel: expectAsync(() {}));
-      var sub = completer.operation.asStream()
-          .listen(expectAsync((_) {}, count: 0));
-      completer.operation.value.whenComplete(expectAsync(() {}, count: 0));
+      var completer = new CancelableCompleter(onCancel: expectAsync0(() {}));
+      var sub =
+          completer.operation.asStream().listen(expectAsync1((_) {}, count: 0));
+      completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       sub.cancel();
       expect(completer.isCanceled, isTrue);
     });
diff --git a/packages/async/test/future_group_test.dart b/packages/async/test/future_group_test.dart
index 09ea29a..af04799 100644
--- a/packages/async/test/future_group_test.dart
+++ b/packages/async/test/future_group_test.dart
@@ -187,16 +187,16 @@
       var onIdleDone = false;
       var futureFired = false;
 
-      futureGroup.onIdle.listen(expectAsync((_) {
+      futureGroup.onIdle.listen(expectAsync1((_) {
         expect(futureFired, isFalse);
         idle = true;
-      }), onDone: expectAsync(() {
+      }), onDone: expectAsync0(() {
         expect(idle, isTrue);
         expect(futureFired, isFalse);
         onIdleDone = true;
       }));
 
-      futureGroup.future.then(expectAsync((_) {
+      futureGroup.future.then(expectAsync1((_) {
         expect(idle, isTrue);
         expect(onIdleDone, isTrue);
         futureFired = true;
diff --git a/packages/async/test/lazy_stream_test.dart b/packages/async/test/lazy_stream_test.dart
new file mode 100644
index 0000000..8da1366
--- /dev/null
+++ b/packages/async/test/lazy_stream_test.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:async/async.dart";
+import "package:test/test.dart";
+
+import "utils.dart";
+
+main() {
+  test("disallows a null callback", () {
+    expect(() => new LazyStream(null), throwsArgumentError);
+  });
+
+  test("calls the callback when the stream is listened", () async {
+    var callbackCalled = false;
+    var stream = new LazyStream(expectAsync0(() {
+      callbackCalled = true;
+      return new Stream.empty();
+    }));
+
+    await flushMicrotasks();
+    expect(callbackCalled, isFalse);
+
+    stream.listen(null);
+    expect(callbackCalled, isTrue);
+  });
+
+  test("calls the callback when the stream is listened", () async {
+    var callbackCalled = false;
+    var stream = new LazyStream(expectAsync0(() {
+      callbackCalled = true;
+      return new Stream.empty();
+    }));
+
+    await flushMicrotasks();
+    expect(callbackCalled, isFalse);
+
+    stream.listen(null);
+    expect(callbackCalled, isTrue);
+  });
+
+  test("forwards to a synchronously-provided stream", () async {
+    var controller = new StreamController<int>();
+    var stream = new LazyStream(expectAsync0(() => controller.stream));
+
+    var events = [];
+    stream.listen(events.add);
+
+    controller.add(1);
+    await flushMicrotasks();
+    expect(events, equals([1]));
+
+    controller.add(2);
+    await flushMicrotasks();
+    expect(events, equals([1, 2]));
+
+    controller.add(3);
+    await flushMicrotasks();
+    expect(events, equals([1, 2, 3]));
+
+    controller.close();
+  });
+
+  test("forwards to an asynchronously-provided stream", () async {
+    var controller = new StreamController<int>();
+    var stream = new LazyStream(expectAsync0(() async => controller.stream));
+
+    var events = [];
+    stream.listen(events.add);
+
+    controller.add(1);
+    await flushMicrotasks();
+    expect(events, equals([1]));
+
+    controller.add(2);
+    await flushMicrotasks();
+    expect(events, equals([1, 2]));
+
+    controller.add(3);
+    await flushMicrotasks();
+    expect(events, equals([1, 2, 3]));
+
+    controller.close();
+  });
+
+  test("a lazy stream can't be listened to multiple times", () {
+    var stream = new LazyStream(expectAsync0(() => new Stream.empty()));
+    expect(stream.isBroadcast, isFalse);
+
+    stream.listen(null);
+    expect(() => stream.listen(null), throwsStateError);
+    expect(() => stream.listen(null), throwsStateError);
+  });
+
+  test("a lazy stream can't be listened to from within its callback", () {
+    var stream;
+    stream = new LazyStream(expectAsync0(() {
+      expect(() => stream.listen(null), throwsStateError);
+      return new Stream.empty();
+    }));
+    stream.listen(null);
+  });
+}
diff --git a/packages/async/test/null_stream_sink_test.dart b/packages/async/test/null_stream_sink_test.dart
new file mode 100644
index 0000000..244f99c
--- /dev/null
+++ b/packages/async/test/null_stream_sink_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:async/async.dart";
+import "package:test/test.dart";
+
+import "utils.dart";
+
+void main() {
+  group("constructors", () {
+    test("done defaults to a completed future", () {
+      var sink = new NullStreamSink();
+      expect(sink.done, completes);
+    });
+
+    test("a custom future may be passed to done", () async {
+      var completer = new Completer();
+      var sink = new NullStreamSink(done: completer.future);
+
+      var doneFired = false;
+      sink.done.then((_) {
+        doneFired = true;
+      });
+      await flushMicrotasks();
+      expect(doneFired, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(doneFired, isTrue);
+    });
+
+    test("NullStreamSink.error passes an error to done", () {
+      var sink = new NullStreamSink.error("oh no");
+      expect(sink.done, throwsA("oh no"));
+    });
+  });
+
+  group("events", () {
+    test("are silently dropped before close", () {
+      var sink = new NullStreamSink();
+      sink.add(1);
+      sink.addError("oh no");
+    });
+
+    test("throw StateErrors after close", () {
+      var sink = new NullStreamSink();
+      expect(sink.close(), completes);
+
+      expect(() => sink.add(1), throwsStateError);
+      expect(() => sink.addError("oh no"), throwsStateError);
+      expect(() => sink.addStream(new Stream.empty()), throwsStateError);
+    });
+
+    group("addStream", () {
+      test("listens to the stream then cancels immediately", () async {
+        var sink = new NullStreamSink();
+        var canceled = false;
+        var controller = new StreamController(onCancel: () {
+          canceled = true;
+        });
+
+        expect(sink.addStream(controller.stream), completes);
+        await flushMicrotasks();
+        expect(canceled, isTrue);
+      });
+
+      test("returns the cancel future", () async {
+        var completer = new Completer();
+        var sink = new NullStreamSink();
+        var controller = new StreamController(onCancel: () => completer.future);
+
+        var addStreamFired = false;
+        sink.addStream(controller.stream).then((_) {
+          addStreamFired = true;
+        });
+        await flushMicrotasks();
+        expect(addStreamFired, isFalse);
+
+        completer.complete();
+        await flushMicrotasks();
+        expect(addStreamFired, isTrue);
+      });
+
+      test("pipes errors from the cancel future through addStream", () async {
+        var sink = new NullStreamSink();
+        var controller = new StreamController(onCancel: () => throw "oh no");
+        expect(sink.addStream(controller.stream), throwsA("oh no"));
+      });
+
+      test("causes events to throw StateErrors until the future completes",
+          () async {
+        var sink = new NullStreamSink();
+        var future = sink.addStream(new Stream.empty());
+        expect(() => sink.add(1), throwsStateError);
+        expect(() => sink.addError("oh no"), throwsStateError);
+        expect(() => sink.addStream(new Stream.empty()), throwsStateError);
+
+        await future;
+        sink.add(1);
+        sink.addError("oh no");
+        expect(sink.addStream(new Stream.empty()), completes);
+      });
+    });
+  });
+
+  test("close returns the done future", () {
+    var sink = new NullStreamSink.error("oh no");
+    expect(sink.close(), throwsA("oh no"));
+  });
+}
diff --git a/packages/async/test/restartable_timer_test.dart b/packages/async/test/restartable_timer_test.dart
index 6732b81..4f59f62 100644
--- a/packages/async/test/restartable_timer_test.dart
+++ b/packages/async/test/restartable_timer_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:async/async.dart';
 import 'package:fake_async/fake_async.dart';
 import 'package:test/test.dart';
@@ -12,7 +10,7 @@
   test("runs the callback once the duration has elapsed", () {
     new FakeAsync().run((async) {
       var fired = false;
-      var timer = new RestartableTimer(new Duration(seconds: 5), () {
+      new RestartableTimer(new Duration(seconds: 5), () {
         fired = true;
       });
 
@@ -101,9 +99,8 @@
 
   test("only runs the callback once if the timer isn't reset", () {
     new FakeAsync().run((async) {
-      var timer = new RestartableTimer(
-          new Duration(seconds: 5),
-          expectAsync(() {}, count: 1));
+      new RestartableTimer(
+          new Duration(seconds: 5), expectAsync0(() {}, count: 1));
       async.elapse(new Duration(seconds: 10));
     });
   });
diff --git a/packages/async/test/result_test.dart b/packages/async/test/result_test.dart
index 848c455..210ae3f 100644
--- a/packages/async/test/result_test.dart
+++ b/packages/async/test/result_test.dart
@@ -5,7 +5,7 @@
 import "dart:async";
 import "dart:collection";
 
-import "package:async/result.dart";
+import "package:async/async.dart";
 import "package:stack_trace/stack_trace.dart";
 import "package:test/test.dart";
 
@@ -57,60 +57,66 @@
 
   test("complete with value", () {
     Result<int> result = new ValueResult<int>(42);
-    Completer c = new Completer<int>();
-    c.future.then(expectAsync((int v) { expect(v, equals(42)); }),
-                  onError: (e, s) { fail("Unexpected error"); });
+    var c = new Completer<int>();
+    c.future.then(expectAsync1((int v) {
+      expect(v, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error");
+    });
     result.complete(c);
   });
 
   test("complete with error", () {
     Result<bool> result = new ErrorResult("BAD", stack);
-    Completer c = new Completer<bool>();
-    c.future.then((bool v) { fail("Unexpected value $v"); },
-                  onError: expectAsync((e, s) {
-                    expect(e, equals("BAD"));
-                    expect(s, same(stack));
-                  }));
+    var c = new Completer<bool>();
+    c.future.then((bool v) {
+      fail("Unexpected value $v");
+    }, onError: expectAsync2((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
     result.complete(c);
   });
 
   test("add sink value", () {
-    Result<int> result = new ValueResult<int>(42);
-    EventSink<int> sink = new TestSink(
-        onData: expectAsync((v) { expect(v, equals(42)); })
-    );
+    var result = new ValueResult<int>(42);
+    EventSink<int> sink = new TestSink(onData: expectAsync1((v) {
+      expect(v, equals(42));
+    }));
     result.addTo(sink);
   });
 
   test("add sink error", () {
     Result<bool> result = new ErrorResult("BAD", stack);
-    EventSink<bool> sink = new TestSink(
-        onError: expectAsync((e, s) {
-          expect(e, equals("BAD"));
-          expect(s, same(stack));
-        })
-    );
+    EventSink<bool> sink = new TestSink(onError: expectAsync2((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
     result.addTo(sink);
   });
 
   test("value as future", () {
     Result<int> result = new ValueResult<int>(42);
-    result.asFuture.then(expectAsync((int v) { expect(v, equals(42)); }),
-                         onError: (e, s) { fail("Unexpected error"); });
+    result.asFuture.then(expectAsync1((int v) {
+      expect(v, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error");
+    });
   });
 
   test("error as future", () {
     Result<bool> result = new ErrorResult("BAD", stack);
-    result.asFuture.then((bool v) { fail("Unexpected value $v"); },
-                         onError: expectAsync((e, s) {
-                           expect(e, equals("BAD"));
-                           expect(s, same(stack));
-                         }));
+    result.asFuture.then((bool v) {
+      fail("Unexpected value $v");
+    }, onError: expectAsync2((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
   });
 
   test("capture future value", () {
     Future<int> value = new Future<int>.value(42);
-    Result.capture(value).then(expectAsync((Result result) {
+    Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isTrue);
       expect(result.isError, isFalse);
       ValueResult value = result.asValue;
@@ -122,7 +128,7 @@
 
   test("capture future error", () {
     Future<bool> value = new Future<bool>.error("BAD", stack);
-    Result.capture(value).then(expectAsync((Result result) {
+    Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isFalse);
       expect(result.isError, isTrue);
       ErrorResult error = result.asError;
@@ -136,7 +142,7 @@
   test("release future value", () {
     Future<Result<int>> future =
         new Future<Result<int>>.value(new Result<int>.value(42));
-    Result.release(future).then(expectAsync((v) {
+    Result.release(future).then(expectAsync1((v) {
       expect(v, equals(42));
     }), onError: (e, s) {
       fail("Unexpected error: $e");
@@ -149,7 +155,7 @@
         new Future<Result<bool>>.value(new Result<bool>.error("BAD", stack));
     Result.release(future).then((v) {
       fail("Unexpected value: $v");
-    }, onError: expectAsync((e, s) {
+    }, onError: expectAsync2((e, s) {
       expect(e, equals("BAD"));
       expect(s, same(stack));
     }));
@@ -160,7 +166,7 @@
     Future<Result<bool>> future = new Future<Result<bool>>.error("BAD", stack);
     Result.release(future).then((v) {
       fail("Unexpected value: $v");
-    }, onError: expectAsync((e, s) {
+    }, onError: expectAsync2((e, s) {
       expect(e, equals("BAD"));
       expect(s, same(stack));
     }));
@@ -169,17 +175,19 @@
   test("capture stream", () {
     StreamController<int> c = new StreamController<int>();
     Stream<Result> stream = Result.captureStream(c.stream);
-    var expectedList = new Queue.from([new Result.value(42),
-                                       new Result.error("BAD", stack),
-                                       new Result.value(37)]);
+    var expectedList = new Queue.from([
+      new Result.value(42),
+      new Result.error("BAD", stack),
+      new Result.value(37)
+    ]);
     void listener(Result actual) {
       expect(expectedList.isEmpty, isFalse);
       expectResult(actual, expectedList.removeFirst());
     }
-    stream.listen(expectAsync(listener, count: 3),
-                  onError: (e, s) { fail("Unexpected error: $e"); },
-                  onDone: expectAsync((){}),
-                  cancelOnError: true);
+
+    stream.listen(expectAsync1(listener, count: 3), onError: (e, s) {
+      fail("Unexpected error: $e");
+    }, onDone: expectAsync0(() {}), cancelOnError: true);
     c.add(42);
     c.addError("BAD", stack);
     c.add(37);
@@ -189,12 +197,14 @@
   test("release stream", () {
     StreamController<Result<int>> c = new StreamController<Result<int>>();
     Stream<int> stream = Result.releaseStream(c.stream);
-    List events = [new Result<int>.value(42),
-                   new Result<int>.error("BAD", stack),
-                   new Result<int>.value(37)];
+    var events = [
+      new Result<int>.value(42),
+      new Result<int>.error("BAD", stack),
+      new Result<int>.value(37)
+    ];
     // Expect the data events, and an extra error event.
     var expectedList = new Queue.from(events)
-        ..add(new Result.error("BAD2", stack));
+      ..add(new Result.error("BAD2", stack));
 
     void dataListener(int v) {
       expect(expectedList.isEmpty, isFalse);
@@ -211,33 +221,33 @@
       expect(stackTrace, same(expected.asError.stackTrace));
     }
 
-    stream.listen(expectAsync(dataListener, count: 2),
-                  onError: expectAsync(errorListener, count: 2),
-                  onDone: expectAsync((){}));
+    stream.listen(expectAsync1(dataListener, count: 2),
+        onError: expectAsync2(errorListener, count: 2),
+        onDone: expectAsync0(() {}));
     for (Result<int> result in events) {
-      c.add(result);  // Result value or error in data line.
+      c.add(result); // Result value or error in data line.
     }
-    c.addError("BAD2", stack);  // Error in error line.
+    c.addError("BAD2", stack); // Error in error line.
     c.close();
   });
 
   test("release stream cancel on error", () {
     StreamController<Result<int>> c = new StreamController<Result<int>>();
     Stream<int> stream = Result.releaseStream(c.stream);
-    stream.listen(expectAsync((v) { expect(v, equals(42)); }),
-                  onError: expectAsync((e, s) {
-                    expect(e, equals("BAD"));
-                    expect(s, same(stack));
-                  }),
-                  onDone: () { fail("Unexpected done event"); },
-                  cancelOnError: true);
+    stream.listen(expectAsync1((v) {
+      expect(v, equals(42));
+    }), onError: expectAsync2((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }), onDone: () {
+      fail("Unexpected done event");
+    }, cancelOnError: true);
     c.add(new Result.value(42));
     c.add(new Result.error("BAD", stack));
     c.add(new Result.value(37));
     c.close();
   });
 
-
   test("flatten error 1", () {
     Result<int> error = new Result<int>.error("BAD", stack);
     Result<int> flattened =
@@ -259,7 +269,7 @@
   });
 
   test("handle unary", () {
-    var result = new Result.error("error", stack);
+    ErrorResult result = new Result.error("error", stack);
     bool called = false;
     result.handle((error) {
       called = true;
@@ -269,7 +279,7 @@
   });
 
   test("handle binary", () {
-    var result = new Result.error("error", stack);
+    ErrorResult result = new Result.error("error", stack);
     bool called = false;
     result.handle((error, stackTrace) {
       called = true;
@@ -280,7 +290,7 @@
   });
 
   test("handle unary and binary", () {
-    var result = new Result.error("error", stack);
+    ErrorResult result = new Result.error("error", stack);
     bool called = false;
     result.handle((error, [stackTrace]) {
       called = true;
@@ -291,19 +301,13 @@
   });
 
   test("handle neither unary nor binary", () {
-    var result = new Result.error("error", stack);
-    expect(() => result.handle(() => fail("unreachable")),
-           throws);
-    expect(() => result.handle((a, b, c) => fail("unreachable")),
-           throws);
-    expect(() => result.handle((a, b, {c}) => fail("unreachable")),
-           throws);
-    expect(() => result.handle((a, {b}) => fail("unreachable")),
-           throws);
-    expect(() => result.handle(({a, b}) => fail("unreachable")),
-           throws);
-    expect(() => result.handle(({a}) => fail("unreachable")),
-           throws);
+    ErrorResult result = new Result.error("error", stack);
+    expect(() => result.handle(() => fail("unreachable")), throws);
+    expect(() => result.handle((a, b, c) => fail("unreachable")), throws);
+    expect(() => result.handle((a, b, {c}) => fail("unreachable")), throws);
+    expect(() => result.handle((a, {b}) => fail("unreachable")), throws);
+    expect(() => result.handle(({a, b}) => fail("unreachable")), throws);
+    expect(() => result.handle(({a}) => fail("unreachable")), throws);
   });
 }
 
@@ -323,17 +327,32 @@
   final Function onError;
   final Function onDone;
 
-  TestSink({void this.onData(T data) : _nullData,
-            void this.onError(e, StackTrace s) : _nullError,
-            void this.onDone() : _nullDone });
+  TestSink(
+      {void this.onData(T data): _nullData,
+      void this.onError(e, StackTrace s): _nullError,
+      void this.onDone(): _nullDone});
 
-  void add(T value) { onData(value); }
-  void addError(error, [StackTrace stack]) { onError(error, stack); }
-  void close() { onDone(); }
+  void add(T value) {
+    onData(value);
+  }
 
-  static void _nullData(value) { fail("Unexpected sink add: $value"); }
+  void addError(error, [StackTrace stack]) {
+    onError(error, stack);
+  }
+
+  void close() {
+    onDone();
+  }
+
+  static void _nullData(value) {
+    fail("Unexpected sink add: $value");
+  }
+
   static void _nullError(e, StackTrace s) {
     fail("Unexpected sink addError: $e");
   }
-  static void _nullDone() { fail("Unepxected sink close"); }
+
+  static void _nullDone() {
+    fail("Unepxected sink close");
+  }
 }
diff --git a/packages/async/test/single_subscription_transformer_test.dart b/packages/async/test/single_subscription_transformer_test.dart
new file mode 100644
index 0000000..74e462b
--- /dev/null
+++ b/packages/async/test/single_subscription_transformer_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  test("buffers events as soon as it's bound", () async {
+    var controller = new StreamController.broadcast();
+    var stream =
+        controller.stream.transform(const SingleSubscriptionTransformer());
+
+    // Add events before [stream] has a listener to be sure it buffers them.
+    controller.add(1);
+    controller.add(2);
+    await flushMicrotasks();
+
+    expect(stream.toList(), completion(equals([1, 2, 3, 4])));
+    await flushMicrotasks();
+
+    controller.add(3);
+    controller.add(4);
+    controller.close();
+  });
+
+  test("cancels the subscription to the broadcast stream when it's canceled",
+      () async {
+    var canceled = false;
+    var controller = new StreamController.broadcast(onCancel: () {
+      canceled = true;
+    });
+    var stream =
+        controller.stream.transform(const SingleSubscriptionTransformer());
+    await flushMicrotasks();
+    expect(canceled, isFalse);
+
+    var subscription = stream.listen(null);
+    await flushMicrotasks();
+    expect(canceled, isFalse);
+
+    subscription.cancel();
+    await flushMicrotasks();
+    expect(canceled, isTrue);
+  });
+}
diff --git a/packages/async/test/stream_completer_test.dart b/packages/async/test/stream_completer_test.dart
index cd3ceb9..2e9ff9b 100644
--- a/packages/async/test/stream_completer_test.dart
+++ b/packages/async/test/stream_completer_test.dart
@@ -27,9 +27,9 @@
   test("cancel before linking a stream doesn't listen on stream", () async {
     var completer = new StreamCompleter();
     var subscription = completer.stream.listen(null);
-    subscription.pause();  // Should be ignored.
+    subscription.pause(); // Should be ignored.
     subscription.cancel();
-    completer.setSourceStream(new UnusableStream());  // Doesn't throw.
+    completer.setSourceStream(new UnusableStream()); // Doesn't throw.
   });
 
   test("listen and pause before linking stream", () async {
@@ -78,14 +78,13 @@
     var lastEvent = -1;
     var controller = new StreamController();
     var subscription;
-    subscription = completer.stream.listen(
-        (value) {
-          expect(value, lessThan(3));
-          lastEvent = value;
-          if (value == 2) {
-            subscription.cancel();
-          }
-        },
+    subscription = completer.stream.listen((value) {
+      expect(value, lessThan(3));
+      lastEvent = value;
+      if (value == 2) {
+        subscription.cancel();
+      }
+    },
         onError: unreachable("error"),
         onDone: unreachable("done"),
         cancelOnError: true);
@@ -110,27 +109,23 @@
     var completer = new StreamCompleter();
     completer.setEmpty();
     var done = new Completer();
-    completer.stream.listen(
-        unreachable("data"),
-        onError: unreachable("error"),
-        onDone: done.complete);
+    completer.stream.listen(unreachable("data"),
+        onError: unreachable("error"), onDone: done.complete);
     await done.future;
   });
 
   test("complete with setEmpty after listening", () async {
     var completer = new StreamCompleter();
     var done = new Completer();
-    completer.stream.listen(
-        unreachable("data"),
-        onError: unreachable("error"),
-        onDone: done.complete);
+    completer.stream.listen(unreachable("data"),
+        onError: unreachable("error"), onDone: done.complete);
     completer.setEmpty();
     await done.future;
   });
 
   test("source stream isn't listened to until completer stream is", () async {
     var completer = new StreamCompleter();
-    var controller;
+    StreamController controller;
     controller = new StreamController(onListen: () {
       scheduleMicrotask(controller.close);
     });
@@ -147,17 +142,13 @@
     var completer = new StreamCompleter();
     var lastEvent = -1;
     var controller = new StreamController();
-    completer.stream.listen(
-        (value) {
-          expect(value, lessThan(3));
-          lastEvent = value;
-        },
-        onError: (value) {
-          expect(value, "3");
-          lastEvent = value;
-        },
-        onDone: unreachable("done"),
-        cancelOnError: true);
+    completer.stream.listen((value) {
+      expect(value, lessThan(3));
+      lastEvent = value;
+    }, onError: (value) {
+      expect(value, "3");
+      lastEvent = value;
+    }, onDone: unreachable("done"), cancelOnError: true);
     completer.setSourceStream(controller.stream);
     expect(controller.hasListener, isTrue);
 
@@ -188,17 +179,13 @@
     controller.add(1);
     expect(controller.hasListener, isFalse);
 
-    completer.stream.listen(
-        (value) {
-          expect(value, lessThan(3));
-          lastEvent = value;
-        },
-        onError: (value) {
-          expect(value, "3");
-          lastEvent = value;
-        },
-        onDone: unreachable("done"),
-        cancelOnError: true);
+    completer.stream.listen((value) {
+      expect(value, lessThan(3));
+      lastEvent = value;
+    }, onError: (value) {
+      expect(value, "3");
+      lastEvent = value;
+    }, onDone: unreachable("done"), cancelOnError: true);
 
     expect(controller.hasListener, isTrue);
 
@@ -281,7 +268,7 @@
     var completer = new StreamCompleter();
     var controller = new StreamController();
     var subscription = completer.stream.listen(null);
-    var lastEvent = 0;
+    Object lastEvent = 0;
     subscription.onData((value) => lastEvent = value);
     subscription.onError((value) => lastEvent = "$value");
     subscription.onDone(() => lastEvent = -1);
@@ -324,8 +311,8 @@
   test("asFuture with error accross setting stream", () async {
     var completer = new StreamCompleter();
     var controller = new StreamController();
-    var subscription = completer.stream.listen(unreachable("data"),
-                                               cancelOnError: false);
+    var subscription =
+        completer.stream.listen(unreachable("data"), cancelOnError: false);
     var done = subscription.asFuture();
     expect(controller.hasListener, isFalse);
     completer.setSourceStream(controller.stream);
@@ -337,6 +324,30 @@
     });
     expect(controller.hasListener, isFalse);
   });
+
+  group("setError()", () {
+    test("produces a stream that emits a single error", () {
+      var completer = new StreamCompleter();
+      completer.stream.listen(unreachable("data"),
+          onError: expectAsync2((error, stackTrace) {
+        expect(error, equals("oh no"));
+      }), onDone: expectAsync0(() {}));
+
+      completer.setError("oh no");
+    });
+
+    test("produces a stream that emits a single error on a later listen",
+        () async {
+      var completer = new StreamCompleter();
+      completer.setError("oh no");
+      await flushMicrotasks();
+
+      completer.stream.listen(unreachable("data"),
+          onError: expectAsync2((error, stackTrace) {
+        expect(error, equals("oh no"));
+      }), onDone: expectAsync0(() {}));
+    });
+  });
 }
 
 Stream<int> createStream() async* {
diff --git a/packages/async/test/stream_group_test.dart b/packages/async/test/stream_group_test.dart
index db6c938..65ddb42 100644
--- a/packages/async/test/stream_group_test.dart
+++ b/packages/async/test/stream_group_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library async.test.stream_group_test;
-
 import 'dart:async';
 
 import 'package:async/async.dart';
@@ -77,22 +75,24 @@
           new StreamTransformer.fromHandlers(
               handleData: (data, sink) => sink.add("data: $data"),
               handleError: (error, _, sink) => sink.add("error: $error")));
-      expect(transformed.toList(), completion(equals([
-        "data: first",
-        "error: second",
-        "data: third",
-        "error: fourth",
-        "error: fifth",
-        "data: sixth"
-      ])));
+      expect(
+          transformed.toList(),
+          completion(equals([
+            "data: first",
+            "error: second",
+            "data: third",
+            "error: fourth",
+            "error: fifth",
+            "data: sixth"
+          ])));
     });
 
     test("emits events once there's a listener", () {
       var controller = new StreamController<String>();
       streamGroup.add(controller.stream);
 
-      expect(streamGroup.stream.toList(),
-          completion(equals(["first", "second"])));
+      expect(
+          streamGroup.stream.toList(), completion(equals(["first", "second"])));
 
       controller.add("first");
       controller.add("second");
@@ -139,8 +139,8 @@
       var controller = new StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
-      expect(streamGroup.stream.toList(),
-          completion(equals(["first", "second"])));
+      expect(
+          streamGroup.stream.toList(), completion(equals(["first", "second"])));
 
       controller.add("first");
       controller.add("second");
@@ -152,8 +152,8 @@
     test("forwards cancel errors", () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var controller = new StreamController<String>(
-          onCancel: () => throw "error");
+      var controller =
+          new StreamController<String>(onCancel: () => throw "error");
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -164,8 +164,8 @@
       var subscription = streamGroup.stream.listen(null);
 
       var completer = new Completer();
-      var controller = new StreamController<String>(
-          onCancel: () => completer.future);
+      var controller =
+          new StreamController<String>(onCancel: () => completer.future);
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
@@ -180,15 +180,15 @@
       expect(fired, isTrue);
     });
 
-    test("add() while active pauses the stream if the group is paused, then "
+    test(
+        "add() while active pauses the stream if the group is paused, then "
         "resumes once the group resumes", () async {
       var subscription = streamGroup.stream.listen(null);
       await flushMicrotasks();
 
       var paused = false;
       var controller = new StreamController<String>(
-          onPause: () => paused = true,
-          onResume: () => paused = false);
+          onPause: () => paused = true, onResume: () => paused = false);
 
       subscription.pause();
       await flushMicrotasks();
@@ -213,7 +213,7 @@
         var canceled = false;
         var controller = new StreamController<String>(onListen: () {
           listened = true;
-        }, onCancel: expectAsync(() {
+        }, onCancel: expectAsync0(() {
           expect(listened, isTrue);
           canceled = true;
         }));
@@ -225,16 +225,16 @@
       });
 
       test("forwards cancel errors", () {
-        var controller = new StreamController<String>(
-            onCancel: () => throw "error");
+        var controller =
+            new StreamController<String>(onCancel: () => throw "error");
 
         expect(streamGroup.add(controller.stream), throwsA("error"));
       });
 
       test("forwards a cancel future", () async {
         var completer = new Completer();
-        var controller = new StreamController<String>(
-            onCancel: () => completer.future);
+        var controller =
+            new StreamController<String>(onCancel: () => completer.future);
 
         var fired = false;
         streamGroup.add(controller.stream).then((_) => fired = true);
@@ -270,8 +270,8 @@
 
       expect(streamGroup.close(), completes);
 
-      expect(streamGroup.stream.toList(),
-          completion(equals(["first", "second"])));
+      expect(
+          streamGroup.stream.toList(), completion(equals(["first", "second"])));
     });
 
     test("emits events from multiple sources once there's a listener", () {
@@ -281,8 +281,8 @@
       var controller2 = new StreamController<String>();
       streamGroup.add(controller2.stream);
 
-      expect(streamGroup.stream.toList(),
-          completion(equals(["first", "second"])));
+      expect(
+          streamGroup.stream.toList(), completion(equals(["first", "second"])));
 
       controller1.add("first");
       controller2.add("second");
@@ -327,8 +327,8 @@
       var controller = new StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
-      expect(streamGroup.stream.toList(),
-          completion(equals(["first", "second"])));
+      expect(
+          streamGroup.stream.toList(), completion(equals(["first", "second"])));
 
       controller.add("first");
       controller.add("second");
@@ -358,8 +358,8 @@
     test("never cancels single-subscription streams", () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var controller = new StreamController<String>(
-          onCancel: expectAsync(() {}, count: 0));
+      var controller =
+          new StreamController<String>(onCancel: expectAsync0(() {}, count: 0));
 
       streamGroup.add(controller.stream);
       await flushMicrotasks();
@@ -509,7 +509,7 @@
         await flushMicrotasks();
         controller.add("second");
 
-        expect(streamGroup.remove(controller.stream), isNull);
+        expect(streamGroup.remove(controller.stream), completion(null));
         expect(streamGroup.close(), completes);
       });
 
@@ -550,7 +550,7 @@
         expect(streamGroup.stream.toList(), completion(isEmpty));
 
         controller.add("first");
-        expect(streamGroup.remove(controller.stream), isNull);
+        expect(streamGroup.remove(controller.stream), completion(null));
         controller.add("second");
 
         expect(streamGroup.close(), completes);
@@ -570,8 +570,8 @@
       });
 
       test("forwards cancel errors", () async {
-        var controller = new StreamController<String>(
-            onCancel: () => throw "error");
+        var controller =
+            new StreamController<String>(onCancel: () => throw "error");
         streamGroup.add(controller.stream);
 
         streamGroup.stream.listen(null);
@@ -582,8 +582,8 @@
 
       test("forwards cancel futures", () async {
         var completer = new Completer();
-        var controller = new StreamController<String>(
-            onCancel: () => completer.future);
+        var controller =
+            new StreamController<String>(onCancel: () => completer.future);
 
         streamGroup.stream.listen(null);
         await flushMicrotasks();
@@ -643,7 +643,8 @@
         expect(streamGroup.stream.toList(), completion(isEmpty));
       });
 
-      test("if there are streams, closes the group once those streams close "
+      test(
+          "if there are streams, closes the group once those streams close "
           "and there's a listener", () async {
         var controller1 = new StreamController<String>();
         var controller2 = new StreamController<String>();
diff --git a/packages/async/test/stream_queue_test.dart b/packages/async/test/stream_queue_test.dart
index 228ba8a..2e4805b 100644
--- a/packages/async/test/stream_queue_test.dart
+++ b/packages/async/test/stream_queue_test.dart
@@ -4,7 +4,7 @@
 
 import "dart:async";
 
-import "package:async/async.dart" show StreamQueue;
+import "package:async/async.dart";
 import "package:test/test.dart";
 
 import "utils.dart";
@@ -12,7 +12,7 @@
 main() {
   group("source stream", () {
     test("is listened to on first request, paused between requests", () async {
-      var controller = new StreamController();
+      var controller = new StreamController<int>();
       var events = new StreamQueue<int>(controller.stream);
       await flushMicrotasks();
       expect(controller.hasListener, isFalse);
@@ -42,6 +42,106 @@
     });
   });
 
+  group("eventsDispatched", () {
+    test("increments after a next future completes", () async {
+      var events = new StreamQueue<int>(createStream());
+
+      expect(events.eventsDispatched, equals(0));
+      await flushMicrotasks();
+      expect(events.eventsDispatched, equals(0));
+
+      var next = events.next;
+      expect(events.eventsDispatched, equals(0));
+
+      await next;
+      expect(events.eventsDispatched, equals(1));
+
+      await events.next;
+      expect(events.eventsDispatched, equals(2));
+    });
+
+    test("increments multiple times for multi-value requests", () async {
+      var events = new StreamQueue<int>(createStream());
+      await events.take(3);
+      expect(events.eventsDispatched, equals(3));
+    });
+
+    test("increments multiple times for an accepted transaction", () async {
+      var events = new StreamQueue<int>(createStream());
+      await events.withTransaction((queue) async {
+        await queue.next;
+        await queue.next;
+        return true;
+      });
+      expect(events.eventsDispatched, equals(2));
+    });
+
+    test("doesn't increment for rest requests", () async {
+      var events = new StreamQueue<int>(createStream());
+      await events.rest.toList();
+      expect(events.eventsDispatched, equals(0));
+    });
+  });
+
+  group("lookAhead operation", () {
+    test("as simple list of events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.lookAhead(4), [1, 2, 3, 4]);
+      expect(await events.next, 1);
+      expect(await events.lookAhead(2), [2, 3]);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("of 0 events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(events.lookAhead(0), completion([]));
+      expect(events.next, completion(1));
+      expect(events.lookAhead(0), completion([]));
+      expect(events.next, completion(2));
+      expect(events.lookAhead(0), completion([]));
+      expect(events.next, completion(3));
+      expect(events.lookAhead(0), completion([]));
+      expect(events.next, completion(4));
+      expect(events.lookAhead(0), completion([]));
+      expect(events.lookAhead(5), completion([]));
+      expect(events.next, throwsStateError);
+      await events.cancel();
+    });
+
+    test("with bad arguments throws", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(() => events.lookAhead(-1), throwsArgumentError);
+      expect(await events.next, 1); // Did not consume event.
+      expect(() => events.lookAhead(-1), throwsArgumentError);
+      expect(await events.next, 2); // Did not consume event.
+      await events.cancel();
+    });
+
+    test("of too many arguments", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.lookAhead(6), [1, 2, 3, 4]);
+      await events.cancel();
+    });
+
+    test("too large later", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.lookAhead(6), [3, 4]);
+      await events.cancel();
+    });
+
+    test("error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.lookAhead(4), throwsA("To err is divine!"));
+      expect(events.take(4), throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
   group("next operation", () {
     test("simple sequence of requests", () async {
       var events = new StreamQueue<int>(createStream());
@@ -53,8 +153,8 @@
 
     test("multiple requests at the same time", () async {
       var events = new StreamQueue<int>(createStream());
-      var result = await Future.wait(
-          [events.next, events.next, events.next, events.next]);
+      var result = await Future
+          .wait([events.next, events.next, events.next, events.next]);
       expect(result, [1, 2, 3, 4]);
       await events.cancel();
     });
@@ -83,9 +183,9 @@
       expect(() => events.skip(-1), throwsArgumentError);
       // A non-int throws either a type error or an argument error,
       // depending on whether it's checked mode or not.
-      expect(await events.next, 1);  // Did not consume event.
+      expect(await events.next, 1); // Did not consume event.
       expect(() => events.skip(-1), throwsArgumentError);
-      expect(await events.next, 2);  // Did not consume event.
+      expect(await events.next, 2); // Did not consume event.
       await events.cancel();
     });
 
@@ -150,15 +250,17 @@
       var skip4 = events.skip(1);
       var index = 0;
       // Check that futures complete in order.
-      sequence(expectedValue, sequenceIndex) => (value) {
-        expect(value, expectedValue);
-        expect(index, sequenceIndex);
-        index++;
-      };
-      await Future.wait([skip1.then(sequence(0, 0)),
-                         skip2.then(sequence(0, 1)),
-                         skip3.then(sequence(1, 2)),
-                         skip4.then(sequence(1, 3))]);
+      Func1Required<int> sequence(expectedValue, sequenceIndex) => (value) {
+            expect(value, expectedValue);
+            expect(index, sequenceIndex);
+            index++;
+          };
+      await Future.wait([
+        skip1.then(sequence(0, 0)),
+        skip2.then(sequence(0, 1)),
+        skip3.then(sequence(1, 2)),
+        skip4.then(sequence(1, 3))
+      ]);
       await events.cancel();
     });
   });
@@ -191,9 +293,9 @@
     test("with bad arguments throws", () async {
       var events = new StreamQueue<int>(createStream());
       expect(() => events.take(-1), throwsArgumentError);
-      expect(await events.next, 1);  // Did not consume event.
+      expect(await events.next, 1); // Did not consume event.
       expect(() => events.take(-1), throwsArgumentError);
-      expect(await events.next, 2);  // Did not consume event.
+      expect(await events.next, 2); // Did not consume event.
       await events.cancel();
     });
 
@@ -288,7 +390,7 @@
 
     test("forwards to underlying stream", () async {
       var cancel = new Completer();
-      var controller = new StreamController(onCancel: () => cancel.future);
+      var controller = new StreamController<int>(onCancel: () => cancel.future);
       var events = new StreamQueue<int>(controller.stream);
       expect(controller.hasListener, isFalse);
       var next = events.next;
@@ -333,11 +435,46 @@
     });
   });
 
+  group("peek operation", () {
+    test("peeks one event", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.peek, 1);
+      expect(await events.next, 1);
+      expect(await events.peek, 2);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.peek, 4);
+      expect(await events.next, 4);
+      // Throws at end.
+      expect(events.peek, throws);
+      await events.cancel();
+    });
+    test("multiple requests at the same time", () async {
+      var events = new StreamQueue<int>(createStream());
+      var result = await Future.wait(
+          [events.peek, events.peek, events.next, events.peek, events.peek]);
+      expect(result, [1, 1, 1, 2, 2]);
+      await events.cancel();
+    });
+    test("sequence of requests with error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(events.peek, throwsA("To err is divine!"));
+      // Error stays in queue.
+      expect(events.peek, throwsA("To err is divine!"));
+      expect(events.next, throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
   group("cancel operation", () {
     test("closes the events, prevents any other operation", () async {
       var events = new StreamQueue<int>(createStream());
       await events.cancel();
+      expect(() => events.lookAhead(1), throwsStateError);
       expect(() => events.next, throwsStateError);
+      expect(() => events.peek, throwsStateError);
       expect(() => events.skip(1), throwsStateError);
       expect(() => events.take(1), throwsStateError);
       expect(() => events.rest, throwsStateError);
@@ -347,14 +484,14 @@
     test("cancels underlying subscription when called before any event",
         () async {
       var cancelFuture = new Future.value(42);
-      var controller = new StreamController(onCancel: () => cancelFuture);
+      var controller = new StreamController<int>(onCancel: () => cancelFuture);
       var events = new StreamQueue<int>(controller.stream);
       expect(await events.cancel(), 42);
     });
 
     test("cancels underlying subscription, returns result", () async {
       var cancelFuture = new Future.value(42);
-      var controller = new StreamController(onCancel: () => cancelFuture);
+      var controller = new StreamController<int>(onCancel: () => cancelFuture);
       var events = new StreamQueue<int>(controller.stream);
       controller.add(1);
       expect(await events.next, 1);
@@ -373,7 +510,7 @@
       });
 
       test("cancels the underlying subscription immediately", () async {
-        var controller = new StreamController();
+        var controller = new StreamController<int>();
         controller.add(1);
 
         var events = new StreamQueue<int>(controller.stream);
@@ -387,7 +524,8 @@
       test("cancels the underlying subscription when called before any event",
           () async {
         var cancelFuture = new Future.value(42);
-        var controller = new StreamController(onCancel: () => cancelFuture);
+        var controller =
+            new StreamController<int>(onCancel: () => cancelFuture);
 
         var events = new StreamQueue<int>(controller.stream);
         expect(await events.cancel(immediate: true), 42);
@@ -404,8 +542,8 @@
 
       test("returns the result of closing the underlying subscription",
           () async {
-        var controller = new StreamController(
-            onCancel: () => new Future.value(42));
+        var controller =
+            new StreamController<int>(onCancel: () => new Future.value(42));
         var events = new StreamQueue<int>(controller.stream);
         expect(await events.cancel(immediate: true), 42);
       });
@@ -413,8 +551,8 @@
       test("listens and then cancels a stream that hasn't been listened to yet",
           () async {
         var wasListened = false;
-        var controller = new StreamController(
-            onListen: () => wasListened = true);
+        var controller =
+            new StreamController<int>(onListen: () => wasListened = true);
         var events = new StreamQueue<int>(controller.stream);
         expect(wasListened, isFalse);
         expect(controller.hasListener, isFalse);
@@ -448,7 +586,7 @@
 
     test("true when enqueued", () async {
       var events = new StreamQueue<int>(createStream());
-      var values = [];
+      var values = <int>[];
       for (int i = 1; i <= 3; i++) {
         events.next.then(values.add);
       }
@@ -459,7 +597,7 @@
 
     test("false when enqueued", () async {
       var events = new StreamQueue<int>(createStream());
-      var values = [];
+      var values = <int>[];
       for (int i = 1; i <= 4; i++) {
         events.next.then(values.add);
       }
@@ -469,11 +607,13 @@
     });
 
     test("true when data event", () async {
-      var controller = new StreamController();
+      var controller = new StreamController<int>();
       var events = new StreamQueue<int>(controller.stream);
 
       var hasNext;
-      events.hasNext.then((result) { hasNext = result; });
+      events.hasNext.then((result) {
+        hasNext = result;
+      });
       await flushMicrotasks();
       expect(hasNext, isNull);
       controller.add(42);
@@ -483,11 +623,13 @@
     });
 
     test("true when error event", () async {
-      var controller = new StreamController();
+      var controller = new StreamController<int>();
       var events = new StreamQueue<int>(controller.stream);
 
       var hasNext;
-      events.hasNext.then((result) { hasNext = result; });
+      events.hasNext.then((result) {
+        hasNext = result;
+      });
       await flushMicrotasks();
       expect(hasNext, isNull);
       controller.addError("BAD");
@@ -525,7 +667,7 @@
 
     test("- next after true, enqueued", () async {
       var events = new StreamQueue<int>(createStream());
-      var responses = [];
+      var responses = <Object>[];
       events.next.then(responses.add);
       events.hasNext.then(responses.add);
       events.next.then(responses.add);
@@ -629,6 +771,313 @@
     });
   });
 
+  group("startTransaction operation produces a transaction that", () {
+    StreamQueue<int> events;
+    StreamQueueTransaction<int> transaction;
+    StreamQueue<int> queue1;
+    StreamQueue<int> queue2;
+    setUp(() async {
+      events = new StreamQueue(createStream());
+      expect(await events.next, 1);
+      transaction = events.startTransaction();
+      queue1 = transaction.newQueue();
+      queue2 = transaction.newQueue();
+    });
+
+    group("emits queues that", () {
+      test("independently emit events", () async {
+        expect(await queue1.next, 2);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+        expect(await queue1.next, 3);
+        expect(await queue1.next, 4);
+        expect(await queue2.next, 4);
+        expect(await queue1.hasNext, isFalse);
+        expect(await queue2.hasNext, isFalse);
+      });
+
+      test("queue requests for events", () async {
+        expect(queue1.next, completion(2));
+        expect(queue2.next, completion(2));
+        expect(queue2.next, completion(3));
+        expect(queue1.next, completion(3));
+        expect(queue1.next, completion(4));
+        expect(queue2.next, completion(4));
+        expect(queue1.hasNext, completion(isFalse));
+        expect(queue2.hasNext, completion(isFalse));
+      });
+
+      test("independently emit errors", () async {
+        events = new StreamQueue(createErrorStream());
+        expect(await events.next, 1);
+        transaction = events.startTransaction();
+        queue1 = transaction.newQueue();
+        queue2 = transaction.newQueue();
+
+        expect(queue1.next, completion(2));
+        expect(queue2.next, completion(2));
+        expect(queue2.next, throwsA("To err is divine!"));
+        expect(queue1.next, throwsA("To err is divine!"));
+        expect(queue1.next, completion(4));
+        expect(queue2.next, completion(4));
+        expect(queue1.hasNext, completion(isFalse));
+        expect(queue2.hasNext, completion(isFalse));
+      });
+    });
+
+    group("when rejected", () {
+      test("further original requests use the previous state", () async {
+        expect(await queue1.next, 2);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+
+        await flushMicrotasks();
+        transaction.reject();
+
+        expect(await events.next, 2);
+        expect(await events.next, 3);
+        expect(await events.next, 4);
+        expect(await events.hasNext, isFalse);
+      });
+
+      test("pending original requests use the previous state", () async {
+        expect(await queue1.next, 2);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+        expect(events.next, completion(2));
+        expect(events.next, completion(3));
+        expect(events.next, completion(4));
+        expect(events.hasNext, completion(isFalse));
+
+        await flushMicrotasks();
+        transaction.reject();
+      });
+
+      test("further child requests act as though the stream was closed",
+          () async {
+        expect(await queue1.next, 2);
+        transaction.reject();
+
+        expect(await queue1.hasNext, isFalse);
+        expect(queue1.next, throwsStateError);
+      });
+
+      test("pending child requests act as though the stream was closed",
+          () async {
+        expect(await queue1.next, 2);
+        expect(queue1.hasNext, completion(isFalse));
+        expect(queue1.next, throwsStateError);
+        transaction.reject();
+      });
+
+      // Regression test.
+      test("pending child rest requests emit no more events", () async {
+        var controller = new StreamController();
+        var events = new StreamQueue(controller.stream);
+        var transaction = events.startTransaction();
+        var queue = transaction.newQueue();
+
+        // This should emit no more events after the transaction is rejected.
+        queue.rest.listen(expectAsync1((_) {}, count: 3),
+            onDone: expectAsync0(() {}, count: 0));
+
+        controller.add(1);
+        controller.add(2);
+        controller.add(3);
+        await flushMicrotasks();
+
+        transaction.reject();
+        await flushMicrotasks();
+
+        // These shouldn't affect the result of `queue.rest.toList()`.
+        controller.add(4);
+        controller.add(5);
+      });
+
+      test("child requests' cancel() may still be called explicitly", () async {
+        transaction.reject();
+        await queue1.cancel();
+      });
+
+      test("calls to commit() or reject() fail", () async {
+        transaction.reject();
+        expect(transaction.reject, throwsStateError);
+        expect(() => transaction.commit(queue1), throwsStateError);
+      });
+    });
+
+    group("when committed,", () {
+      test("further original requests use the committed state", () async {
+        expect(await queue1.next, 2);
+        await flushMicrotasks();
+        transaction.commit(queue1);
+        expect(await events.next, 3);
+      });
+
+      test("pending original requests use the committed state", () async {
+        expect(await queue1.next, 2);
+        expect(events.next, completion(3));
+        await flushMicrotasks();
+        transaction.commit(queue1);
+      });
+
+      test("further child requests act as though the stream was closed",
+          () async {
+        expect(await queue2.next, 2);
+        transaction.commit(queue2);
+
+        expect(await queue1.hasNext, isFalse);
+        expect(queue1.next, throwsStateError);
+      });
+
+      test("pending child requests act as though the stream was closed",
+          () async {
+        expect(await queue2.next, 2);
+        expect(queue1.hasNext, completion(isFalse));
+        expect(queue1.next, throwsStateError);
+        transaction.commit(queue2);
+      });
+
+      test("further requests act as though the stream was closed", () async {
+        expect(await queue1.next, 2);
+        transaction.commit(queue1);
+
+        expect(await queue1.hasNext, isFalse);
+        expect(queue1.next, throwsStateError);
+      });
+
+      test("cancel() may still be called explicitly", () async {
+        expect(await queue1.next, 2);
+        transaction.commit(queue1);
+        await queue1.cancel();
+      });
+
+      test("throws if there are pending requests", () async {
+        expect(await queue1.next, 2);
+        expect(queue1.hasNext, completion(isTrue));
+        expect(() => transaction.commit(queue1), throwsStateError);
+      });
+
+      test("calls to commit() or reject() fail", () async {
+        transaction.commit(queue1);
+        expect(transaction.reject, throwsStateError);
+        expect(() => transaction.commit(queue1), throwsStateError);
+      });
+    });
+  });
+
+  group("withTransaction operation", () {
+    StreamQueue<int> events;
+    setUp(() async {
+      events = new StreamQueue(createStream());
+      expect(await events.next, 1);
+    });
+
+    test("passes a copy of the parent queue", () async {
+      await events.withTransaction(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+        expect(await queue.next, 3);
+        expect(await queue.next, 4);
+        expect(await queue.hasNext, isFalse);
+        return true;
+      }));
+    });
+
+    test(
+        "the parent queue continues from the child position if it returns "
+        "true", () async {
+      await events.withTransaction(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+        return true;
+      }));
+
+      expect(await events.next, 3);
+    });
+
+    test(
+        "the parent queue continues from its original position if it returns "
+        "false", () async {
+      await events.withTransaction(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+        return false;
+      }));
+
+      expect(await events.next, 2);
+    });
+
+    test("the parent queue continues from the child position if it throws", () {
+      expect(events.withTransaction(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+        throw "oh no";
+      })), throwsA("oh no"));
+
+      expect(events.next, completion(3));
+    });
+
+    test("returns whether the transaction succeeded", () {
+      expect(events.withTransaction((_) async => true), completion(isTrue));
+      expect(events.withTransaction((_) async => false), completion(isFalse));
+    });
+  });
+
+  group("cancelable operation", () {
+    StreamQueue<int> events;
+    setUp(() async {
+      events = new StreamQueue(createStream());
+      expect(await events.next, 1);
+    });
+
+    test("passes a copy of the parent queue", () async {
+      await events.cancelable(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+        expect(await queue.next, 3);
+        expect(await queue.next, 4);
+        expect(await queue.hasNext, isFalse);
+      })).value;
+    });
+
+    test("the parent queue continues from the child position by default",
+        () async {
+      await events.cancelable(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+      })).value;
+
+      expect(await events.next, 3);
+    });
+
+    test(
+        "the parent queue continues from the child position if an error is "
+        "thrown", () async {
+      expect(
+          events.cancelable(expectAsync1((queue) async {
+            expect(await queue.next, 2);
+            throw "oh no";
+          })).value,
+          throwsA("oh no"));
+
+      expect(events.next, completion(3));
+    });
+
+    test("the parent queue continues from the original position if canceled",
+        () async {
+      var operation = events.cancelable(expectAsync1((queue) async {
+        expect(await queue.next, 2);
+      }));
+      operation.cancel();
+
+      expect(await events.next, 2);
+    });
+
+    test("forwards the value from the callback", () async {
+      expect(
+          await events.cancelable(expectAsync1((queue) async {
+            expect(await queue.next, 2);
+            return "value";
+          })).value,
+          "value");
+    });
+  });
+
   test("all combinations sequential skip/next/take operations", () async {
     // Takes all combinations of two of next, skip and take, then ends with
     // doing rest. Each of the first rounds do 10 events of each type,
@@ -653,8 +1102,9 @@
     // `take(10)`.
     takeTest(startIndex) {
       expect(events.take(10),
-             completion(new List.generate(10, (i) => startIndex + i)));
+          completion(new List.generate(10, (i) => startIndex + i)));
     }
+
     var tests = [nextTest, skipTest, takeTest];
 
     int counter = 0;
@@ -668,10 +1118,12 @@
     }
     // Then expect 20 more events as a `rest` call.
     expect(events.rest.toList(),
-           completion(new List.generate(20, (i) => counter + i)));
+        completion(new List.generate(20, (i) => counter + i)));
   });
 }
 
+typedef T Func1Required<T>(T value);
+
 Stream<int> createStream() async* {
   yield 1;
   await flushMicrotasks();
@@ -683,7 +1135,7 @@
 }
 
 Stream<int> createErrorStream() {
-  StreamController controller = new StreamController<int>();
+  var controller = new StreamController<int>();
   () async {
     controller.add(1);
     await flushMicrotasks();
diff --git a/packages/async/test/stream_sink_completer_test.dart b/packages/async/test/stream_sink_completer_test.dart
new file mode 100644
index 0000000..3c8b576
--- /dev/null
+++ b/packages/async/test/stream_sink_completer_test.dart
@@ -0,0 +1,297 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:async/async.dart";
+import "package:test/test.dart";
+
+import "utils.dart";
+
+main() {
+  var completer;
+  setUp(() {
+    completer = new StreamSinkCompleter();
+  });
+
+  group("when a stream is linked before events are added", () {
+    test("data events are forwarded", () {
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      completer.sink..add(1)..add(2)..add(3)..add(4);
+
+      expect(sink.results[0].asValue.value, equals(1));
+      expect(sink.results[1].asValue.value, equals(2));
+      expect(sink.results[2].asValue.value, equals(3));
+      expect(sink.results[3].asValue.value, equals(4));
+    });
+
+    test("error events are forwarded", () {
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      completer.sink..addError("oh no")..addError("that's bad");
+
+      expect(sink.results[0].asError.error, equals("oh no"));
+      expect(sink.results[1].asError.error, equals("that's bad"));
+    });
+
+    test("addStream is forwarded", () async {
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+
+      var controller = new StreamController();
+      completer.sink.addStream(controller.stream);
+
+      controller.add(1);
+      controller.addError("oh no");
+      controller.add(2);
+      controller.addError("that's bad");
+      await flushMicrotasks();
+
+      expect(sink.results[0].asValue.value, equals(1));
+      expect(sink.results[1].asError.error, equals("oh no"));
+      expect(sink.results[2].asValue.value, equals(2));
+      expect(sink.results[3].asError.error, equals("that's bad"));
+      expect(sink.isClosed, isFalse);
+
+      controller.close();
+      await flushMicrotasks();
+      expect(sink.isClosed, isFalse);
+    });
+
+    test("close() is forwarded", () {
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      completer.sink.close();
+      expect(sink.isClosed, isTrue);
+    });
+
+    test("the future from the inner close() is returned", () async {
+      var closeCompleter = new Completer();
+      var sink = new TestSink(onDone: () => closeCompleter.future);
+      completer.setDestinationSink(sink);
+
+      var closeCompleted = false;
+      completer.sink.close().then(expectAsync1((_) {
+        closeCompleted = true;
+      }));
+
+      await flushMicrotasks();
+      expect(closeCompleted, isFalse);
+
+      closeCompleter.complete();
+      await flushMicrotasks();
+      expect(closeCompleted, isTrue);
+    });
+
+    test("errors are forwarded from the inner close()", () {
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.close(), throwsA("oh no"));
+    });
+
+    test("errors aren't top-leveled if only close() is listened to", () async {
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+      expect(completer.sink.close(), throwsA("oh no"));
+
+      // Give the event loop a chance to top-level errors if it's going to.
+      await flushMicrotasks();
+    });
+
+    test("errors aren't top-leveled if only done is listened to", () async {
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+      completer.sink.close();
+      expect(completer.sink.done, throwsA("oh no"));
+
+      // Give the event loop a chance to top-level errors if it's going to.
+      await flushMicrotasks();
+    });
+  });
+
+  group("when a stream is linked after events are added", () {
+    test("data events are forwarded", () async {
+      completer.sink..add(1)..add(2)..add(3)..add(4);
+      await flushMicrotasks();
+
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      await flushMicrotasks();
+
+      expect(sink.results[0].asValue.value, equals(1));
+      expect(sink.results[1].asValue.value, equals(2));
+      expect(sink.results[2].asValue.value, equals(3));
+      expect(sink.results[3].asValue.value, equals(4));
+    });
+
+    test("error events are forwarded", () async {
+      completer.sink..addError("oh no")..addError("that's bad");
+      await flushMicrotasks();
+
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      await flushMicrotasks();
+
+      expect(sink.results[0].asError.error, equals("oh no"));
+      expect(sink.results[1].asError.error, equals("that's bad"));
+    });
+
+    test("addStream is forwarded", () async {
+      var controller = new StreamController();
+      completer.sink.addStream(controller.stream);
+
+      controller.add(1);
+      controller.addError("oh no");
+      controller.add(2);
+      controller.addError("that's bad");
+      controller.close();
+      await flushMicrotasks();
+
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      await flushMicrotasks();
+
+      expect(sink.results[0].asValue.value, equals(1));
+      expect(sink.results[1].asError.error, equals("oh no"));
+      expect(sink.results[2].asValue.value, equals(2));
+      expect(sink.results[3].asError.error, equals("that's bad"));
+      expect(sink.isClosed, isFalse);
+    });
+
+    test("close() is forwarded", () async {
+      completer.sink.close();
+      await flushMicrotasks();
+
+      var sink = new TestSink();
+      completer.setDestinationSink(sink);
+      await flushMicrotasks();
+
+      expect(sink.isClosed, isTrue);
+    });
+
+    test("the future from the inner close() is returned", () async {
+      var closeCompleted = false;
+      completer.sink.close().then(expectAsync1((_) {
+        closeCompleted = true;
+      }));
+      await flushMicrotasks();
+
+      var closeCompleter = new Completer();
+      var sink = new TestSink(onDone: () => closeCompleter.future);
+      completer.setDestinationSink(sink);
+      await flushMicrotasks();
+      expect(closeCompleted, isFalse);
+
+      closeCompleter.complete();
+      await flushMicrotasks();
+      expect(closeCompleted, isTrue);
+    });
+
+    test("errors are forwarded from the inner close()", () async {
+      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.close(), throwsA("oh no"));
+      await flushMicrotasks();
+
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+    });
+
+    test("errors aren't top-leveled if only close() is listened to", () async {
+      expect(completer.sink.close(), throwsA("oh no"));
+      await flushMicrotasks();
+
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+
+      // Give the event loop a chance to top-level errors if it's going to.
+      await flushMicrotasks();
+    });
+
+    test("errors aren't top-leveled if only done is listened to", () async {
+      completer.sink.close();
+      expect(completer.sink.done, throwsA("oh no"));
+      await flushMicrotasks();
+
+      var sink = new TestSink(onDone: () => throw "oh no");
+      completer.setDestinationSink(sink);
+
+      // Give the event loop a chance to top-level errors if it's going to.
+      await flushMicrotasks();
+    });
+  });
+
+  test("the sink is closed, the destination is set, then done is read",
+      () async {
+    expect(completer.sink.close(), completes);
+    await flushMicrotasks();
+
+    completer.setDestinationSink(new TestSink());
+    await flushMicrotasks();
+
+    expect(completer.sink.done, completes);
+  });
+
+  test("done is read, the destination is set, then the sink is closed",
+      () async {
+    expect(completer.sink.done, completes);
+    await flushMicrotasks();
+
+    completer.setDestinationSink(new TestSink());
+    await flushMicrotasks();
+
+    expect(completer.sink.close(), completes);
+  });
+
+  group("fromFuture()", () {
+    test("with a successful completion", () async {
+      var futureCompleter = new Completer<StreamSink>();
+      var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
+      sink.add(1);
+      sink.add(2);
+      sink.add(3);
+      sink.close();
+
+      var testSink = new TestSink();
+      futureCompleter.complete(testSink);
+      await testSink.done;
+
+      expect(testSink.results[0].asValue.value, equals(1));
+      expect(testSink.results[1].asValue.value, equals(2));
+      expect(testSink.results[2].asValue.value, equals(3));
+    });
+
+    test("with an error", () async {
+      var futureCompleter = new Completer<StreamSink>();
+      var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
+      expect(sink.done, throwsA("oh no"));
+      futureCompleter.completeError("oh no");
+    });
+  });
+
+  group("setError()", () {
+    test("produces a closed sink with the error", () {
+      completer.setError("oh no");
+      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.close(), throwsA("oh no"));
+    });
+
+    test("produces an error even if done was accessed earlier", () async {
+      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.close(), throwsA("oh no"));
+      await flushMicrotasks();
+
+      completer.setError("oh no");
+    });
+  });
+
+  test("doesn't allow the destination sink to be set multiple times", () {
+    completer.setDestinationSink(new TestSink());
+    expect(
+        () => completer.setDestinationSink(new TestSink()), throwsStateError);
+    expect(
+        () => completer.setDestinationSink(new TestSink()), throwsStateError);
+  });
+}
diff --git a/packages/async/test/stream_sink_transformer_test.dart b/packages/async/test/stream_sink_transformer_test.dart
new file mode 100644
index 0000000..208a03a
--- /dev/null
+++ b/packages/async/test/stream_sink_transformer_test.dart
@@ -0,0 +1,215 @@
+// Copyright (c) 2015, 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 filevents.
+
+import "dart:async";
+
+import "package:async/async.dart";
+import "package:test/test.dart";
+
+import "utils.dart";
+
+void main() {
+  var controller;
+  setUp(() {
+    controller = new StreamController();
+  });
+
+  group("fromStreamTransformer", () {
+    test("transforms data events", () {
+      var transformer = new StreamSinkTransformer.fromStreamTransformer(
+          new StreamTransformer.fromHandlers(handleData: (i, sink) {
+        sink.add(i * 2);
+      }));
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(results.add, onDone: expectAsync0(() {
+        expect(results, equals([2, 4, 6]));
+      }));
+
+      sink.add(1);
+      sink.add(2);
+      sink.add(3);
+      sink.close();
+    });
+
+    test("transforms error events", () {
+      var transformer = new StreamSinkTransformer.fromStreamTransformer(
+          new StreamTransformer.fromHandlers(
+              handleError: (i, stackTrace, sink) {
+        sink.addError((i as num) * 2, stackTrace);
+      }));
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(expectAsync1((_) {}, count: 0),
+          onError: (error, stackTrace) {
+        results.add(error);
+      }, onDone: expectAsync0(() {
+        expect(results, equals([2, 4, 6]));
+      }));
+
+      sink.addError(1);
+      sink.addError(2);
+      sink.addError(3);
+      sink.close();
+    });
+
+    test("transforms done events", () {
+      var transformer = new StreamSinkTransformer.fromStreamTransformer(
+          new StreamTransformer.fromHandlers(handleDone: (sink) {
+        sink.add(1);
+        sink.close();
+      }));
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(results.add, onDone: expectAsync0(() {
+        expect(results, equals([1]));
+      }));
+
+      sink.close();
+    });
+
+    test("forwards the future from inner.close", () async {
+      var transformer = new StreamSinkTransformer.fromStreamTransformer(
+          new StreamTransformer.fromHandlers());
+      var innerSink = new CompleterStreamSink();
+      var sink = transformer.bind(innerSink);
+
+      // The futures shouldn't complete until the inner sink's close future
+      // completes.
+      var doneResult = new ResultFuture(sink.done);
+      doneResult.catchError((_) {});
+      var closeResult = new ResultFuture(sink.close());
+      closeResult.catchError((_) {});
+      await flushMicrotasks();
+      expect(doneResult.isComplete, isFalse);
+      expect(closeResult.isComplete, isFalse);
+
+      // Once the inner sink is completed, the futures should fire.
+      innerSink.completer.complete();
+      await flushMicrotasks();
+      expect(doneResult.isComplete, isTrue);
+      expect(closeResult.isComplete, isTrue);
+    });
+
+    test("doesn't top-level the future from inner.close", () async {
+      var transformer = new StreamSinkTransformer.fromStreamTransformer(
+          new StreamTransformer.fromHandlers(handleData: (_, sink) {
+        sink.close();
+      }));
+      var innerSink = new CompleterStreamSink();
+      var sink = transformer.bind(innerSink);
+
+      // This will close the inner sink, but it shouldn't top-level the error.
+      sink.add(1);
+      innerSink.completer.completeError("oh no");
+      await flushMicrotasks();
+
+      // The error should be piped through done and close even if they're called
+      // after the underlying sink is closed.
+      expect(sink.done, throwsA("oh no"));
+      expect(sink.close(), throwsA("oh no"));
+    });
+  });
+
+  group("fromHandlers", () {
+    test("transforms data events", () {
+      var transformer =
+          new StreamSinkTransformer.fromHandlers(handleData: (i, sink) {
+        sink.add(i * 2);
+      });
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(results.add, onDone: expectAsync0(() {
+        expect(results, equals([2, 4, 6]));
+      }));
+
+      sink.add(1);
+      sink.add(2);
+      sink.add(3);
+      sink.close();
+    });
+
+    test("transforms error events", () {
+      var transformer = new StreamSinkTransformer.fromHandlers(
+          handleError: (i, stackTrace, sink) {
+        sink.addError((i as num) * 2, stackTrace);
+      });
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(expectAsync1((_) {}, count: 0),
+          onError: (error, stackTrace) {
+        results.add(error);
+      }, onDone: expectAsync0(() {
+        expect(results, equals([2, 4, 6]));
+      }));
+
+      sink.addError(1);
+      sink.addError(2);
+      sink.addError(3);
+      sink.close();
+    });
+
+    test("transforms done events", () {
+      var transformer =
+          new StreamSinkTransformer.fromHandlers(handleDone: (sink) {
+        sink.add(1);
+        sink.close();
+      });
+      var sink = transformer.bind(controller.sink);
+
+      var results = [];
+      controller.stream.listen(results.add, onDone: expectAsync0(() {
+        expect(results, equals([1]));
+      }));
+
+      sink.close();
+    });
+
+    test("forwards the future from inner.close", () async {
+      var transformer = new StreamSinkTransformer.fromHandlers();
+      var innerSink = new CompleterStreamSink();
+      var sink = transformer.bind(innerSink);
+
+      // The futures shouldn't complete until the inner sink's close future
+      // completes.
+      var doneResult = new ResultFuture(sink.done);
+      doneResult.catchError((_) {});
+      var closeResult = new ResultFuture(sink.close());
+      closeResult.catchError((_) {});
+      await flushMicrotasks();
+      expect(doneResult.isComplete, isFalse);
+      expect(closeResult.isComplete, isFalse);
+
+      // Once the inner sink is completed, the futures should fire.
+      innerSink.completer.complete();
+      await flushMicrotasks();
+      expect(doneResult.isComplete, isTrue);
+      expect(closeResult.isComplete, isTrue);
+    });
+
+    test("doesn't top-level the future from inner.close", () async {
+      var transformer =
+          new StreamSinkTransformer.fromHandlers(handleData: (_, sink) {
+        sink.close();
+      });
+      var innerSink = new CompleterStreamSink();
+      var sink = transformer.bind(innerSink);
+
+      // This will close the inner sink, but it shouldn't top-level the error.
+      sink.add(1);
+      innerSink.completer.completeError("oh no");
+      await flushMicrotasks();
+
+      // The error should be piped through done and close even if they're called
+      // after the underlying sink is closed.
+      expect(sink.done, throwsA("oh no"));
+      expect(sink.close(), throwsA("oh no"));
+    });
+  });
+}
diff --git a/packages/async/test/stream_splitter_test.dart b/packages/async/test/stream_splitter_test.dart
index ffd0c87..68a6b74 100644
--- a/packages/async/test/stream_splitter_test.dart
+++ b/packages/async/test/stream_splitter_test.dart
@@ -8,7 +8,7 @@
 import 'package:test/test.dart';
 
 main() {
-  var controller;
+  StreamController<int> controller;
   var splitter;
   setUp(() {
     controller = new StreamController<int>();
@@ -47,20 +47,22 @@
     controller.close();
 
     var count = 0;
-    branch.listen(expectAsync((value) {
-      expect(count, anyOf(0, 2));
-      expect(value, equals(count + 1));
-      count++;
-    }, count: 2), onError: expectAsync((error) {
+    branch.listen(
+        expectAsync1((value) {
+          expect(count, anyOf(0, 2));
+          expect(value, equals(count + 1));
+          count++;
+        }, count: 2), onError: expectAsync1((error) {
       expect(count, equals(1));
       expect(error, equals("error"));
       count++;
-    }), onDone: expectAsync(() {
+    }), onDone: expectAsync0(() {
       expect(count, equals(3));
     }));
   });
 
-  test("a branch that's created in the middle of a stream replays it", () async {
+  test("a branch that's created in the middle of a stream replays it",
+      () async {
     controller.add(1);
     controller.add(2);
     await flushMicrotasks();
@@ -104,12 +106,12 @@
     controller.add(1);
     controller.add(2);
     await flushMicrotasks();
-    
+
     var branch2 = splitter.split();
     controller.add(3);
     controller.close();
     await flushMicrotasks();
-    
+
     var branch3 = splitter.split();
     splitter.close();
 
@@ -207,7 +209,8 @@
     expect(controller.isPaused, isFalse);
   });
 
-  test("the source stream is canceled when it's closed after all branches have "
+  test(
+      "the source stream is canceled when it's closed after all branches have "
       "been canceled", () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
@@ -233,7 +236,8 @@
     expect(controller.hasListener, isFalse);
   });
 
-  test("the source stream is canceled when all branches are canceled after it "
+  test(
+      "the source stream is canceled when all branches are canceled after it "
       "has been closed", () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
@@ -257,7 +261,8 @@
     expect(controller.hasListener, isFalse);
   });
 
-  test("a splitter that's closed before any branches are added never listens "
+  test(
+      "a splitter that's closed before any branches are added never listens "
       "to the source stream", () {
     splitter.close();
 
@@ -265,7 +270,8 @@
     controller.stream.listen(null);
   });
 
-  test("splitFrom splits a source stream into the designated number of "
+  test(
+      "splitFrom splits a source stream into the designated number of "
       "branches", () {
     var branches = StreamSplitter.splitFrom(controller.stream, 5);
 
diff --git a/packages/async/test/stream_zip_test.dart b/packages/async/test/stream_zip_test.dart
index 35ace7d..71d8eee 100644
--- a/packages/async/test/stream_zip_test.dart
+++ b/packages/async/test/stream_zip_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:async";
-import "package:async/stream_zip.dart";
+
+import "package:async/async.dart";
 import "package:test/test.dart";
 
 /// Create an error with the same values as [base], except that it throwsA
@@ -35,49 +36,96 @@
 
 main() {
   // Test that zipping [streams] gives the results iterated by [expectedData].
-  testZip(Iterable streams, Iterable expectedData) {
+  testZip(Iterable<Stream> streams, Iterable expectedData) {
     List data = [];
     Stream zip = new StreamZip(streams);
-    zip.listen(data.add, onDone: expectAsync(() {
+    zip.listen(data.add, onDone: expectAsync0(() {
       expect(data, equals(expectedData));
     }));
   }
 
   test("Basic", () {
-    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([7, 8, 9])],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3]),
+      mks([4, 5, 6]),
+      mks([7, 8, 9])
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Uneven length 1", () {
-    testZip([mks([1, 2, 3, 99, 100]), mks([4, 5, 6]), mks([7, 8, 9])],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3, 99, 100]),
+      mks([4, 5, 6]),
+      mks([7, 8, 9])
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Uneven length 2", () {
-    testZip([mks([1, 2, 3]), mks([4, 5, 6, 99, 100]), mks([7, 8, 9])],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3]),
+      mks([4, 5, 6, 99, 100]),
+      mks([7, 8, 9])
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Uneven length 3", () {
-    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([7, 8, 9, 99, 100])],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3]),
+      mks([4, 5, 6]),
+      mks([7, 8, 9, 99, 100])
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Uneven length 4", () {
-    testZip([mks([1, 2, 3, 98]), mks([4, 5, 6]), mks([7, 8, 9, 99, 100])],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3, 98]),
+      mks([4, 5, 6]),
+      mks([7, 8, 9, 99, 100])
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Empty 1", () {
-    testZip([mks([]), mks([4, 5, 6]), mks([7, 8, 9])], []);
+    testZip([
+      mks([]),
+      mks([4, 5, 6]),
+      mks([7, 8, 9])
+    ], []);
   });
 
   test("Empty 2", () {
-    testZip([mks([1, 2, 3]), mks([]), mks([7, 8, 9])], []);
+    testZip([
+      mks([1, 2, 3]),
+      mks([]),
+      mks([7, 8, 9])
+    ], []);
   });
 
   test("Empty 3", () {
-    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([])], []);
+    testZip([
+      mks([1, 2, 3]),
+      mks([4, 5, 6]),
+      mks([])
+    ], []);
   });
 
   test("Empty source", () {
@@ -85,57 +133,88 @@
   });
 
   test("Single Source", () {
-    testZip([mks([1, 2, 3])], [[1], [2], [3]]);
+    testZip([
+      mks([1, 2, 3])
+    ], [
+      [1],
+      [2],
+      [3]
+    ]);
   });
 
   test("Other-streams", () {
     Stream st1 = mks([1, 2, 3, 4, 5, 6]).where((x) => x < 4);
-    Stream st2 = new Stream.periodic(const Duration(milliseconds: 5),
-                                     (x) => x + 4).take(3);
+    Stream st2 =
+        new Stream.periodic(const Duration(milliseconds: 5), (x) => x + 4)
+            .take(3);
     StreamController c = new StreamController.broadcast();
     Stream st3 = c.stream;
-    testZip([st1, st2, st3],
-            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
-    c..add(7)..add(8)..add(9)..close();
+    testZip([
+      st1,
+      st2,
+      st3
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
+    c
+      ..add(7)
+      ..add(8)
+      ..add(9)
+      ..close();
   });
 
   test("Error 1", () {
-    expect(new StreamZip([streamError(mks([1, 2, 3]), 2, "BAD-1"),
-                          mks([4, 5, 6]),
-                          mks([7, 8, 9])]).toList(),
-           throwsA(equals("BAD-1")));
+    expect(
+        new StreamZip([
+          streamError(mks([1, 2, 3]), 2, "BAD-1"),
+          mks([4, 5, 6]),
+          mks([7, 8, 9])
+        ]).toList(),
+        throwsA(equals("BAD-1")));
   });
 
   test("Error 2", () {
-    expect(new StreamZip([mks([1, 2, 3]),
-                          streamError(mks([4, 5, 6]), 5, "BAD-2"),
-                          mks([7, 8, 9])]).toList(),
-           throwsA(equals("BAD-2")));
+    expect(
+        new StreamZip([
+          mks([1, 2, 3]),
+          streamError(mks([4, 5, 6]), 5, "BAD-2"),
+          mks([7, 8, 9])
+        ]).toList(),
+        throwsA(equals("BAD-2")));
   });
 
   test("Error 3", () {
-    expect(new StreamZip([mks([1, 2, 3]),
-                          mks([4, 5, 6]),
-                          streamError(mks([7, 8, 9]), 8, "BAD-3")]).toList(),
-           throwsA(equals("BAD-3")));
+    expect(
+        new StreamZip([
+          mks([1, 2, 3]),
+          mks([4, 5, 6]),
+          streamError(mks([7, 8, 9]), 8, "BAD-3")
+        ]).toList(),
+        throwsA(equals("BAD-3")));
   });
 
   test("Error at end", () {
-    expect(new StreamZip([mks([1, 2, 3]),
-                          streamError(mks([4, 5, 6]), 6, "BAD-4"),
-                          mks([7, 8, 9])]).toList(),
-           throwsA(equals("BAD-4")));
+    expect(
+        new StreamZip([
+          mks([1, 2, 3]),
+          streamError(mks([4, 5, 6]), 6, "BAD-4"),
+          mks([7, 8, 9])
+        ]).toList(),
+        throwsA(equals("BAD-4")));
   });
 
   test("Error before first end", () {
     // StreamControllers' streams with no "close" called will never be done,
     // so the fourth event of the first stream is guaranteed to come first.
-    expect(new StreamZip(
-                [streamError(mks([1, 2, 3, 4]), 4, "BAD-5"),
-                 (new StreamController()..add(4)..add(5)..add(6)).stream,
-                 (new StreamController()..add(7)..add(8)..add(9)).stream]
-               ).toList(),
-           throwsA(equals("BAD-5")));
+    expect(
+        new StreamZip([
+          streamError(mks([1, 2, 3, 4]), 4, "BAD-5"),
+          (new StreamController()..add(4)..add(5)..add(6)).stream,
+          (new StreamController()..add(7)..add(8)..add(9)).stream
+        ]).toList(),
+        throwsA(equals("BAD-5")));
   });
 
   test("Error after first end", () {
@@ -143,40 +222,43 @@
     controller..add(7)..add(8)..add(9);
     // Transformer that puts error into controller when one of the first two
     // streams have sent a done event.
-    StreamTransformer trans = new StreamTransformer.fromHandlers(
-        handleDone: (EventSink s) {
-      Timer.run(() { controller.addError("BAD-6"); });
+    StreamTransformer trans =
+        new StreamTransformer.fromHandlers(handleDone: (EventSink s) {
+      Timer.run(() {
+        controller.addError("BAD-6");
+      });
       s.close();
     });
-    testZip([mks([1, 2, 3]).transform(trans),
-             mks([4, 5, 6]).transform(trans),
-             controller.stream],
-           [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    testZip([
+      mks([1, 2, 3]).transform(trans),
+      mks([4, 5, 6]).transform(trans),
+      controller.stream
+    ], [
+      [1, 4, 7],
+      [2, 5, 8],
+      [3, 6, 9]
+    ]);
   });
 
   test("Pause/Resume", () {
     int sc1p = 0;
-    StreamController c1 = new StreamController(
-      onPause: () {
-        sc1p++;
-      },
-      onResume: () {
-        sc1p--;
-      });
+    StreamController c1 = new StreamController(onPause: () {
+      sc1p++;
+    }, onResume: () {
+      sc1p--;
+    });
 
     int sc2p = 0;
-    StreamController c2 = new StreamController(
-      onPause: () {
-        sc2p++;
-      },
-      onResume: () {
-        sc2p--;
-      });
+    StreamController c2 = new StreamController(onPause: () {
+      sc2p++;
+    }, onResume: () {
+      sc2p--;
+    });
 
-    var done = expectAsync((){
+    var done = expectAsync0(() {
       expect(sc1p, equals(1));
       expect(sc2p, equals(0));
-    });  // Call to complete test.
+    }); // Call to complete test.
 
     Stream zip = new StreamZip([c1.stream, c2.stream]);
 
@@ -197,7 +279,9 @@
     }).then((hasMore) {
       expect(hasMore, isTrue);
       expect(it.current, equals([5, 6]));
-      new Future.delayed(ms25).then((_) { c2.add(8); });
+      new Future.delayed(ms25).then((_) {
+        c2.add(8);
+      });
       return it.moveNext();
     }).then((hasMore) {
       expect(hasMore, isTrue);
@@ -209,7 +293,12 @@
       done();
     });
 
-    c1..add(1)..add(3)..add(5)..add(7)..close();
+    c1
+      ..add(1)
+      ..add(3)
+      ..add(5)
+      ..add(7)
+      ..close();
     c2..add(2)..add(4);
   });
 
@@ -219,7 +308,7 @@
     var sz = new StreamZip([s1, s2]);
     int ctr = 0;
     var sub;
-    sub = sz.listen(expectAsync((v) {
+    sub = sz.listen(expectAsync1((v) {
       expect(v, equals([ctr * 2, ctr * 2 + 1]));
       if (ctr == 1) {
         sub.pause(new Future.delayed(const Duration(milliseconds: 25)));
diff --git a/packages/async/test/stream_zip_zone_test.dart b/packages/async/test/stream_zip_zone_test.dart
index 47957a9..a0773a6 100644
--- a/packages/async/test/stream_zip_zone_test.dart
+++ b/packages/async/test/stream_zip_zone_test.dart
@@ -9,22 +9,22 @@
 // listen occurred.
 
 main() {
- StreamController controller;
- controller = new StreamController();
- testStream("singlesub-async", controller, controller.stream);
- controller = new StreamController.broadcast();
- testStream("broadcast-async", controller, controller.stream);
- controller = new StreamController();
- testStream("asbroadcast-async", controller,
-                                 controller.stream.asBroadcastStream());
+  StreamController controller;
+  controller = new StreamController();
+  testStream("singlesub-async", controller, controller.stream);
+  controller = new StreamController.broadcast();
+  testStream("broadcast-async", controller, controller.stream);
+  controller = new StreamController();
+  testStream(
+      "asbroadcast-async", controller, controller.stream.asBroadcastStream());
 
- controller = new StreamController(sync: true);
- testStream("singlesub-sync", controller, controller.stream);
- controller = new StreamController.broadcast(sync: true);
- testStream("broadcast-sync", controller, controller.stream);
- controller = new StreamController(sync: true);
- testStream("asbroadcast-sync", controller,
-                                controller.stream.asBroadcastStream());
+  controller = new StreamController(sync: true);
+  testStream("singlesub-sync", controller, controller.stream);
+  controller = new StreamController.broadcast(sync: true);
+  testStream("broadcast-sync", controller, controller.stream);
+  controller = new StreamController(sync: true);
+  testStream(
+      "asbroadcast-sync", controller, controller.stream.asBroadcastStream());
 }
 
 void testStream(String name, StreamController controller, Stream stream) {
@@ -33,15 +33,15 @@
     runZoned(() {
       Zone newZone1 = Zone.current;
       StreamSubscription sub;
-      sub = stream.listen(expectAsync((v) {
+      sub = stream.listen(expectAsync1((v) {
         expect(v, 42);
         expect(Zone.current, newZone1);
         outer.run(() {
-          sub.onData(expectAsync((v) {
+          sub.onData(expectAsync1((v) {
             expect(v, 37);
             expect(Zone.current, newZone1);
             runZoned(() {
-              sub.onData(expectAsync((v) {
+              sub.onData(expectAsync1((v) {
                 expect(v, 87);
                 expect(Zone.current, newZone1);
               }));
diff --git a/packages/async/test/subscription_stream_test.dart b/packages/async/test/subscription_stream_test.dart
index 0d1870b..6e2c9d5 100644
--- a/packages/async/test/subscription_stream_test.dart
+++ b/packages/async/test/subscription_stream_test.dart
@@ -22,7 +22,7 @@
     var stream = createStream();
     var skips = 0;
     var completer = new Completer();
-    var subscription;
+    StreamSubscription<int> subscription;
     subscription = stream.listen((value) {
       ++skips;
       expect(value, skips);
@@ -73,13 +73,13 @@
     for (var sourceCancels in [false, true]) {
       group("${sourceCancels ? "yes" : "no"}:", () {
         var subscriptionStream;
-        var onCancel;  // Completes if source stream is canceled before done.
+        var onCancel; // Completes if source stream is canceled before done.
         setUp(() {
           var cancelCompleter = new Completer();
           var source = createErrorStream(cancelCompleter);
           onCancel = cancelCompleter.future;
-          var sourceSubscription = source.listen(null,
-                                                 cancelOnError: sourceCancels);
+          var sourceSubscription =
+              source.listen(null, cancelOnError: sourceCancels);
           subscriptionStream = new SubscriptionStream<int>(sourceSubscription);
         });
 
@@ -87,15 +87,15 @@
           var done = new Completer();
           var events = [];
           subscriptionStream.listen(events.add,
-                                    onError: events.add,
-                                    onDone: done.complete,
-                                    cancelOnError: false);
+              onError: events.add, onDone: done.complete, cancelOnError: false);
           var expected = [1, 2, "To err is divine!"];
           if (sourceCancels) {
             await onCancel;
             // And [done] won't complete at all.
             bool isDone = false;
-            done.future.then((_) { isDone = true; });
+            done.future.then((_) {
+              isDone = true;
+            });
             await new Future.delayed(const Duration(milliseconds: 5));
             expect(isDone, false);
           } else {
@@ -109,12 +109,12 @@
           var completer = new Completer();
           var events = [];
           subscriptionStream.listen(events.add,
-                                    onError: (value) {
-                                      events.add(value);
-                                      completer.complete();
-                                    },
-                                    onDone: () => throw "should not happen",
-                                    cancelOnError: true);
+              onError: (value) {
+                events.add(value);
+                completer.complete();
+              },
+              onDone: () => throw "should not happen",
+              cancelOnError: true);
           await completer.future;
           await flushMicrotasks();
           expect(events, [1, 2, "To err is divine!"]);
@@ -128,8 +128,7 @@
           var stream = createStream();
           var sourceSubscription =
               stream.listen(null, cancelOnError: cancelOnError);
-          var subscriptionStream =
-              new SubscriptionStream(sourceSubscription);
+          var subscriptionStream = new SubscriptionStream(sourceSubscription);
           var subscription =
               subscriptionStream.listen(null, cancelOnError: cancelOnError);
           expect(subscription.asFuture(42), completion(42));
@@ -137,10 +136,9 @@
 
         test("- error goes to asFuture", () async {
           var stream = createErrorStream();
-          var sourceSubscription = stream.listen(null,
-                                                 cancelOnError: cancelOnError);
-          var subscriptionStream =
-              new SubscriptionStream(sourceSubscription);
+          var sourceSubscription =
+              stream.listen(null, cancelOnError: cancelOnError);
+          var subscriptionStream = new SubscriptionStream(sourceSubscription);
 
           var subscription =
               subscriptionStream.listen(null, cancelOnError: cancelOnError);
@@ -168,7 +166,7 @@
     await flushMicrotasks();
     yield 2;
     await flushMicrotasks();
-    yield* new Future.error("To err is divine!").asStream();
+    yield* new Future<int>.error("To err is divine!").asStream();
     await flushMicrotasks();
     yield 4;
     await flushMicrotasks();
diff --git a/packages/async/test/subscription_transformer_test.dart b/packages/async/test/subscription_transformer_test.dart
new file mode 100644
index 0000000..dbbf597
--- /dev/null
+++ b/packages/async/test/subscription_transformer_test.dart
@@ -0,0 +1,288 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group("with no callbacks", () {
+    test("forwards cancellation", () async {
+      var isCanceled = false;
+      var cancelCompleter = new Completer();
+      var controller = new StreamController(onCancel: expectAsync0(() {
+        isCanceled = true;
+        return cancelCompleter.future;
+      }));
+      var subscription = controller.stream
+          .transform(subscriptionTransformer())
+          .listen(expectAsync1((_) {}, count: 0));
+
+      var cancelFired = false;
+      subscription.cancel().then(expectAsync1((_) {
+        cancelFired = true;
+      }));
+
+      await flushMicrotasks();
+      expect(isCanceled, isTrue);
+      expect(cancelFired, isFalse);
+
+      cancelCompleter.complete();
+      await flushMicrotasks();
+      expect(cancelFired, isTrue);
+
+      // This shouldn't call the onCancel callback again.
+      expect(subscription.cancel(), completes);
+    });
+
+    test("forwards pausing and resuming", () async {
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer())
+          .listen(expectAsync1((_) {}, count: 0));
+
+      subscription.pause();
+      await flushMicrotasks();
+      expect(controller.isPaused, isTrue);
+
+      subscription.pause();
+      await flushMicrotasks();
+      expect(controller.isPaused, isTrue);
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(controller.isPaused, isTrue);
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(controller.isPaused, isFalse);
+    });
+
+    test("forwards pausing with a resume future", () async {
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer())
+          .listen(expectAsync1((_) {}, count: 0));
+
+      var completer = new Completer();
+      subscription.pause(completer.future);
+      await flushMicrotasks();
+      expect(controller.isPaused, isTrue);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(controller.isPaused, isFalse);
+    });
+  });
+
+  group("with a cancel callback", () {
+    test("invokes the callback when the subscription is canceled", () async {
+      var isCanceled = false;
+      var callbackInvoked = false;
+      var controller = new StreamController(onCancel: expectAsync0(() {
+        isCanceled = true;
+      }));
+      var subscription = controller.stream.transform(
+          subscriptionTransformer(handleCancel: expectAsync1((inner) {
+        callbackInvoked = true;
+        inner.cancel();
+      }))).listen(expectAsync1((_) {}, count: 0));
+
+      await flushMicrotasks();
+      expect(callbackInvoked, isFalse);
+      expect(isCanceled, isFalse);
+
+      subscription.cancel();
+      await flushMicrotasks();
+      expect(callbackInvoked, isTrue);
+      expect(isCanceled, isTrue);
+    });
+
+    test("invokes the callback once and caches its result", () async {
+      var completer = new Completer();
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer(
+              handleCancel: expectAsync1((inner) => completer.future)))
+          .listen(expectAsync1((_) {}, count: 0));
+
+      var cancelFired1 = false;
+      subscription.cancel().then(expectAsync1((_) {
+        cancelFired1 = true;
+      }));
+
+      var cancelFired2 = false;
+      subscription.cancel().then(expectAsync1((_) {
+        cancelFired2 = true;
+      }));
+
+      await flushMicrotasks();
+      expect(cancelFired1, isFalse);
+      expect(cancelFired2, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(cancelFired1, isTrue);
+      expect(cancelFired2, isTrue);
+    });
+  });
+
+  group("with a pause callback", () {
+    test("invokes the callback when pause is called", () async {
+      var pauseCount = 0;
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer(
+              handlePause: expectAsync1((inner) {
+            pauseCount++;
+            inner.pause();
+          }, count: 3)))
+          .listen(expectAsync1((_) {}, count: 0));
+
+      await flushMicrotasks();
+      expect(pauseCount, equals(0));
+
+      subscription.pause();
+      await flushMicrotasks();
+      expect(pauseCount, equals(1));
+
+      subscription.pause();
+      await flushMicrotasks();
+      expect(pauseCount, equals(2));
+
+      subscription.resume();
+      subscription.resume();
+      await flushMicrotasks();
+      expect(pauseCount, equals(2));
+
+      subscription.pause();
+      await flushMicrotasks();
+      expect(pauseCount, equals(3));
+    });
+
+    test("doesn't invoke the callback when the subscription has been canceled",
+        () async {
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer(
+              handlePause: expectAsync1((_) {}, count: 0)))
+          .listen(expectAsync1((_) {}, count: 0));
+
+      subscription.cancel();
+      subscription.pause();
+      subscription.pause();
+      subscription.pause();
+    });
+  });
+
+  group("with a resume callback", () {
+    test("invokes the callback when resume is called", () async {
+      var resumeCount = 0;
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer(
+              handleResume: expectAsync1((inner) {
+            resumeCount++;
+            inner.resume();
+          }, count: 3)))
+          .listen(expectAsync1((_) {}, count: 0));
+
+      await flushMicrotasks();
+      expect(resumeCount, equals(0));
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(resumeCount, equals(1));
+
+      subscription.pause();
+      subscription.pause();
+      await flushMicrotasks();
+      expect(resumeCount, equals(1));
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(resumeCount, equals(2));
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(resumeCount, equals(3));
+    });
+
+    test("invokes the callback when a resume future completes", () async {
+      var resumed = false;
+      var controller = new StreamController();
+      var subscription = controller.stream.transform(
+          subscriptionTransformer(handleResume: expectAsync1((inner) {
+        resumed = true;
+        inner.resume();
+      }))).listen(expectAsync1((_) {}, count: 0));
+
+      var completer = new Completer();
+      subscription.pause(completer.future);
+      await flushMicrotasks();
+      expect(resumed, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(resumed, isTrue);
+    });
+
+    test("doesn't invoke the callback when the subscription has been canceled",
+        () async {
+      var controller = new StreamController();
+      var subscription = controller.stream
+          .transform(subscriptionTransformer(
+              handlePause: expectAsync1((_) {}, count: 0)))
+          .listen(expectAsync1((_) {}, count: 0));
+
+      subscription.cancel();
+      subscription.resume();
+      subscription.resume();
+      subscription.resume();
+    });
+  });
+
+  group("when the outer subscription is canceled but the inner is not", () {
+    StreamSubscription subscription;
+    setUp(() {
+      var controller = new StreamController();
+      subscription = controller.stream
+          .transform(subscriptionTransformer(handleCancel: (_) {}))
+          .listen(expectAsync1((_) {}, count: 0),
+              onError: expectAsync2((_, __) {}, count: 0),
+              onDone: expectAsync0(() {}, count: 0));
+      subscription.cancel();
+      controller.add(1);
+      controller.addError("oh no!");
+      controller.close();
+    });
+
+    test("doesn't call a new onData", () async {
+      subscription.onData(expectAsync1((_) {}, count: 0));
+      await flushMicrotasks();
+    });
+
+    test("doesn't call a new onError", () async {
+      subscription.onError(expectAsync2((_, __) {}, count: 0));
+      await flushMicrotasks();
+    });
+
+    test("doesn't call a new onDone", () async {
+      subscription.onDone(expectAsync0(() {}, count: 0));
+      await flushMicrotasks();
+    });
+
+    test("isPaused returns false", () {
+      expect(subscription.isPaused, isFalse);
+    });
+
+    test("asFuture never completes", () async {
+      subscription.asFuture().then(expectAsync1((_) {}, count: 0));
+      await flushMicrotasks();
+    });
+  });
+}
diff --git a/packages/async/test/typed_wrapper/future_test.dart b/packages/async/test/typed_wrapper/future_test.dart
new file mode 100644
index 0000000..0c8b00a
--- /dev/null
+++ b/packages/async/test/typed_wrapper/future_test.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import "package:async/src/typed/future.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    TypeSafeFuture<int> errorWrapper;
+    setUp(() {
+      wrapper = new TypeSafeFuture<int>(new Future<Object>.value(12));
+
+      var error = new Future<Object>.error("oh no");
+      error.catchError((_) {}); // Don't let the error cause the test to fail.
+      errorWrapper = new TypeSafeFuture<int>(error);
+    });
+
+    test("asStream()", () {
+      expect(wrapper.asStream().toList(), completion(equals([12])));
+      expect(errorWrapper.asStream().first, throwsA("oh no"));
+    });
+
+    test("catchError()", () {
+      expect(
+          wrapper.catchError(expectAsync1((_) {}, count: 0),
+              test: expectAsync1((_) {}, count: 0)),
+          completion(equals(12)));
+
+      expect(
+          errorWrapper.catchError(expectAsync1((error) {
+            expect(error, equals("oh no"));
+            return 42;
+          }), test: expectAsync1((error) {
+            expect(error, equals("oh no"));
+            return true;
+          })),
+          completion(equals(42)));
+    });
+
+    test("then()", () {
+      expect(
+          wrapper.then((value) => value.toString()), completion(equals("12")));
+      expect(
+          errorWrapper.then(expectAsync1((_) {}, count: 0)), throwsA("oh no"));
+    });
+
+    test("whenComplete()", () {
+      expect(wrapper.whenComplete(expectAsync0(() {})), completion(equals(12)));
+      expect(errorWrapper.whenComplete(expectAsync0(() {})), throwsA("oh no"));
+    });
+
+    test("timeout()", () {
+      expect(wrapper.timeout(new Duration(seconds: 1)), completion(equals(12)));
+      expect(errorWrapper.timeout(new Duration(seconds: 1)), throwsA("oh no"));
+
+      expect(
+          new TypeSafeFuture<int>(new Completer<Object>().future)
+              .timeout(Duration.ZERO),
+          throwsA(new isInstanceOf<TimeoutException>()));
+
+      expect(
+          new TypeSafeFuture<int>(new Completer<Object>().future)
+              .timeout(Duration.ZERO, onTimeout: expectAsync0(() => 15)),
+          completion(equals(15)));
+    });
+  });
+
+  group("with invalid types", () {
+    TypeSafeFuture<int> wrapper;
+    setUp(() {
+      wrapper = new TypeSafeFuture<int>(new Future<Object>.value("foo"));
+    });
+
+    group("throws a CastError for", () {
+      test("asStream()", () {
+        expect(wrapper.asStream().first, throwsCastError);
+      });
+
+      test("then()", () {
+        expect(
+            wrapper.then(expectAsync1((_) {}, count: 0),
+                onError: expectAsync1((_) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("whenComplete()", () {
+        expect(wrapper.whenComplete(expectAsync0(() {})).then((_) {}),
+            throwsCastError);
+      });
+
+      test("timeout()", () {
+        expect(wrapper.timeout(new Duration(seconds: 3)).then((_) {}),
+            throwsCastError);
+
+        expect(
+            new TypeSafeFuture<int>(new Completer<Object>().future)
+                .timeout(Duration.ZERO, onTimeout: expectAsync0(() => "foo"))
+                .then((_) {}),
+            throwsCastError);
+      });
+    });
+  });
+}
diff --git a/packages/async/test/typed_wrapper/stream_subscription_test.dart b/packages/async/test/typed_wrapper/stream_subscription_test.dart
new file mode 100644
index 0000000..f52abe7
--- /dev/null
+++ b/packages/async/test/typed_wrapper/stream_subscription_test.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import "package:async/src/typed/stream_subscription.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var controller;
+    var wrapper;
+    var isCanceled;
+    setUp(() {
+      controller = new StreamController<Object>(onCancel: () {
+        isCanceled = true;
+      });
+      wrapper =
+          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
+    });
+
+    test("onData()", () {
+      wrapper.onData(expectAsync1((data) {
+        expect(data, equals(1));
+      }));
+      controller.add(1);
+    });
+
+    test("onError()", () {
+      wrapper.onError(expectAsync1((error) {
+        expect(error, equals("oh no"));
+      }));
+      controller.addError("oh no");
+    });
+
+    test("onDone()", () {
+      wrapper.onDone(expectAsync0(() {}));
+      controller.close();
+    });
+
+    test("pause(), resume(), and isPaused", () async {
+      expect(wrapper.isPaused, isFalse);
+
+      wrapper.pause();
+      await flushMicrotasks();
+      expect(controller.isPaused, isTrue);
+      expect(wrapper.isPaused, isTrue);
+
+      wrapper.resume();
+      await flushMicrotasks();
+      expect(controller.isPaused, isFalse);
+      expect(wrapper.isPaused, isFalse);
+    });
+
+    test("cancel()", () async {
+      wrapper.cancel();
+      await flushMicrotasks();
+      expect(isCanceled, isTrue);
+    });
+
+    test("asFuture()", () {
+      expect(wrapper.asFuture(12), completion(equals(12)));
+      controller.close();
+    });
+  });
+
+  group("with invalid types,", () {
+    var controller;
+    var wrapper;
+    var isCanceled;
+    setUp(() {
+      controller = new StreamController<Object>(onCancel: () {
+        isCanceled = true;
+      });
+      wrapper =
+          new TypeSafeStreamSubscription<int>(controller.stream.listen(null));
+    });
+
+    group("throws a CastError for", () {
+      test("onData()", () {
+        expect(() {
+          // TODO(nweiz): Use the wrapper declared in setUp when sdk#26226 is
+          // fixed.
+          controller = new StreamController<Object>();
+          wrapper = new TypeSafeStreamSubscription<int>(
+              controller.stream.listen(null));
+
+          wrapper.onData(expectAsync1((_) {}, count: 0));
+          controller.add("foo");
+        }, throwsZonedCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("onError()", () {
+        wrapper.onError(expectAsync1((error) {
+          expect(error, equals("oh no"));
+        }));
+        controller.add("foo");
+        controller.addError("oh no");
+      });
+
+      test("onDone()", () {
+        wrapper.onDone(expectAsync0(() {}));
+        controller.add("foo");
+        controller.close();
+      });
+
+      test("pause(), resume(), and isPaused", () async {
+        controller.add("foo");
+
+        expect(wrapper.isPaused, isFalse);
+
+        wrapper.pause();
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+        expect(wrapper.isPaused, isTrue);
+
+        wrapper.resume();
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+        expect(wrapper.isPaused, isFalse);
+      });
+
+      test("cancel()", () async {
+        controller.add("foo");
+
+        wrapper.cancel();
+        await flushMicrotasks();
+        expect(isCanceled, isTrue);
+      });
+
+      test("asFuture()", () {
+        expect(wrapper.asFuture(12), completion(equals(12)));
+        controller.add("foo");
+        controller.close();
+      });
+    });
+  });
+}
diff --git a/packages/async/test/typed_wrapper/stream_test.dart b/packages/async/test/typed_wrapper/stream_test.dart
new file mode 100644
index 0000000..88fbee6
--- /dev/null
+++ b/packages/async/test/typed_wrapper/stream_test.dart
@@ -0,0 +1,608 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import "package:async/src/typed/stream.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var controller;
+    var wrapper;
+    var emptyWrapper;
+    var singleWrapper;
+    var errorWrapper;
+    setUp(() {
+      controller = new StreamController<Object>()
+        ..add(1)
+        ..add(2)
+        ..add(3)
+        ..add(4)
+        ..add(5)
+        ..close();
+
+      // TODO(nweiz): Use public methods when test#414 is fixed and we can run
+      // this on DDC.
+      wrapper = new TypeSafeStream<int>(controller.stream);
+      emptyWrapper = new TypeSafeStream<int>(new Stream<Object>.empty());
+      singleWrapper =
+          new TypeSafeStream<int>(new Stream<Object>.fromIterable([1]));
+      errorWrapper = new TypeSafeStream<int>(
+          new Stream<Object>.fromFuture(new Future.error("oh no")));
+    });
+
+    test("first", () {
+      expect(wrapper.first, completion(equals(1)));
+      expect(emptyWrapper.first, throwsStateError);
+    });
+
+    test("last", () {
+      expect(wrapper.last, completion(equals(5)));
+      expect(emptyWrapper.last, throwsStateError);
+    });
+
+    test("single", () {
+      expect(wrapper.single, throwsStateError);
+      expect(singleWrapper.single, completion(equals(1)));
+    });
+
+    test("isBroadcast", () {
+      expect(wrapper.isBroadcast, isFalse);
+      var broadcastWrapper = new TypeSafeStream<int>(
+          new Stream<Object>.empty().asBroadcastStream());
+      expect(broadcastWrapper.isBroadcast, isTrue);
+    });
+
+    test("isEmpty", () {
+      expect(wrapper.isEmpty, completion(isFalse));
+      expect(emptyWrapper.isEmpty, completion(isTrue));
+    });
+
+    test("length", () {
+      expect(wrapper.length, completion(equals(5)));
+      expect(emptyWrapper.length, completion(equals(0)));
+    });
+
+    group("asBroadcastStream()", () {
+      test("with no parameters", () {
+        var broadcast = wrapper.asBroadcastStream();
+        expect(broadcast.toList(), completion(equals([1, 2, 3, 4, 5])));
+        expect(broadcast.toList(), completion(equals([1, 2, 3, 4, 5])));
+      });
+
+      test("with onListen", () {
+        var broadcast =
+            wrapper.asBroadcastStream(onListen: expectAsync1((subscription) {
+          expect(subscription, new isInstanceOf<StreamSubscription<int>>());
+          subscription.pause();
+        }));
+
+        broadcast.listen(null);
+        expect(controller.isPaused, isTrue);
+      });
+
+      test("with onCancel", () {
+        var broadcast =
+            wrapper.asBroadcastStream(onCancel: expectAsync1((subscription) {
+          expect(subscription, new isInstanceOf<StreamSubscription<int>>());
+          subscription.pause();
+        }));
+
+        broadcast.listen(null).cancel();
+        expect(controller.isPaused, isTrue);
+      });
+    });
+
+    test("asyncExpand()", () {
+      expect(
+          wrapper.asyncExpand((i) => new Stream.fromIterable([i, i])).toList(),
+          completion(equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])));
+    });
+
+    test("asyncMap()", () {
+      expect(wrapper.asyncMap((i) => new Future.value(i * 2)).toList(),
+          completion(equals([2, 4, 6, 8, 10])));
+    });
+
+    group("distinct()", () {
+      test("without equals", () {
+        expect(
+            wrapper.distinct().toList(), completion(equals([1, 2, 3, 4, 5])));
+
+        expect(
+            new TypeSafeStream<int>(
+                    new Stream<Object>.fromIterable([1, 1, 2, 2, 3, 3]))
+                .distinct()
+                .toList(),
+            completion(equals([1, 2, 3])));
+      });
+
+      test("with equals", () {
+        expect(wrapper.distinct((i1, i2) => (i1 ~/ 2 == i2 ~/ 2)).toList(),
+            completion(equals([1, 2, 4])));
+      });
+    });
+
+    group("drain()", () {
+      test("without a value", () {
+        expect(wrapper.drain(), completes);
+        expect(() => wrapper.drain(), throwsStateError);
+      });
+
+      test("with a value", () {
+        expect(wrapper.drain(12), completion(equals(12)));
+      });
+    });
+
+    test("expand()", () {
+      expect(wrapper.expand((i) => [i, i]).toList(),
+          completion(equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])));
+    });
+
+    group("firstWhere()", () {
+      test("finding a value", () {
+        expect(wrapper.firstWhere((i) => i > 3), completion(equals(4)));
+      });
+
+      test("finding no value", () {
+        expect(wrapper.firstWhere((i) => i > 5), throwsStateError);
+      });
+
+      test("with a default value", () {
+        expect(wrapper.firstWhere((i) => i > 5, defaultValue: () => "value"),
+            completion(equals("value")));
+      });
+    });
+
+    group("lastWhere()", () {
+      test("finding a value", () {
+        expect(wrapper.lastWhere((i) => i < 3), completion(equals(2)));
+      });
+
+      test("finding no value", () {
+        expect(wrapper.lastWhere((i) => i > 5), throwsStateError);
+      });
+
+      test("with a default value", () {
+        expect(wrapper.lastWhere((i) => i > 5, defaultValue: () => "value"),
+            completion(equals("value")));
+      });
+    });
+
+    group("singleWhere()", () {
+      test("finding a single value", () {
+        expect(wrapper.singleWhere((i) => i == 3), completion(equals(3)));
+      });
+
+      test("finding no value", () {
+        expect(wrapper.singleWhere((i) => i == 6), throwsStateError);
+      });
+
+      test("finding multiple values", () {
+        expect(wrapper.singleWhere((i) => i.isOdd), throwsStateError);
+      });
+    });
+
+    test("fold()", () {
+      expect(wrapper.fold("foo", (previous, i) => previous + i.toString()),
+          completion(equals("foo12345")));
+    });
+
+    test("forEach()", () async {
+      emptyWrapper.forEach(expectAsync1((_) {}, count: 0));
+
+      var results = [];
+      await wrapper.forEach(results.add);
+      expect(results, equals([1, 2, 3, 4, 5]));
+    });
+
+    group("handleError()", () {
+      test("without a test", () {
+        expect(
+            errorWrapper.handleError(expectAsync1((error) {
+              expect(error, equals("oh no"));
+            })).toList(),
+            completion(isEmpty));
+      });
+
+      test("with a matching test", () {
+        expect(
+            errorWrapper.handleError(expectAsync1((error) {
+              expect(error, equals("oh no"));
+            }), test: expectAsync1((error) {
+              expect(error, equals("oh no"));
+              return true;
+            })).toList(),
+            completion(isEmpty));
+      });
+
+      test("with a matching test", () {
+        expect(
+            errorWrapper.handleError(expectAsync1((_) {}, count: 0),
+                test: expectAsync1((error) {
+              expect(error, equals("oh no"));
+              return false;
+            })).toList(),
+            throwsA("oh no"));
+      });
+    });
+
+    group("listen()", () {
+      test("with a callback", () {
+        var subscription;
+        subscription = wrapper.listen(expectAsync1((data) {
+          expect(data, equals(1));
+
+          subscription.onData(expectAsync1((data) {
+            expect(data, equals(2));
+            subscription.cancel();
+          }));
+        }));
+      });
+
+      test("with a null callback", () {
+        expect(wrapper.listen(null).asFuture(), completes);
+      });
+    });
+
+    test("map()", () {
+      expect(wrapper.map((i) => i * 2).toList(),
+          completion(equals([2, 4, 6, 8, 10])));
+    });
+
+    test("pipe()", () {
+      var consumer = new StreamController();
+      expect(wrapper.pipe(consumer), completes);
+      expect(consumer.stream.toList(), completion(equals([1, 2, 3, 4, 5])));
+    });
+
+    test("reduce()", () {
+      expect(wrapper.reduce((value, i) => value + i), completion(equals(15)));
+      expect(emptyWrapper.reduce((value, i) => value + i), throwsStateError);
+    });
+
+    test("skipWhile()", () {
+      expect(wrapper.skipWhile((i) => i < 3).toList(),
+          completion(equals([3, 4, 5])));
+    });
+
+    test("takeWhile()", () {
+      expect(
+          wrapper.takeWhile((i) => i < 3).toList(), completion(equals([1, 2])));
+    });
+
+    test("toSet()", () {
+      expect(wrapper.toSet(), completion(unorderedEquals([1, 2, 3, 4, 5])));
+      expect(
+          new TypeSafeStream<int>(
+              new Stream<Object>.fromIterable([1, 1, 2, 2, 3, 3])).toSet(),
+          completion(unorderedEquals([1, 2, 3])));
+    });
+
+    test("transform()", () {
+      var transformer = new StreamTransformer<int, String>.fromHandlers(
+          handleData: (data, sink) {
+        sink.add(data.toString());
+      });
+
+      expect(wrapper.transform(transformer).toList(),
+          completion(equals(["1", "2", "3", "4", "5"])));
+    });
+
+    test("where()", () {
+      expect(wrapper.where((i) => i.isOdd).toList(),
+          completion(equals([1, 3, 5])));
+    });
+
+    group("any()", () {
+      test("with matches", () {
+        expect(wrapper.any((i) => i > 3), completion(isTrue));
+      });
+
+      test("without matches", () {
+        expect(wrapper.any((i) => i > 5), completion(isFalse));
+      });
+    });
+
+    group("every()", () {
+      test("with all matches", () {
+        expect(wrapper.every((i) => i < 6), completion(isTrue));
+      });
+
+      test("with some non-matches", () {
+        expect(wrapper.every((i) => i > 3), completion(isFalse));
+      });
+    });
+
+    group("skip()", () {
+      test("with a valid index", () {
+        expect(wrapper.skip(3).toList(), completion(equals([4, 5])));
+      });
+
+      test("with a longer index than length", () {
+        expect(wrapper.skip(6).toList(), completion(isEmpty));
+      });
+
+      test("with a negative index", () {
+        expect(() => wrapper.skip(-1), throwsArgumentError);
+      });
+    });
+
+    group("take()", () {
+      test("with a valid index", () {
+        expect(wrapper.take(3).toList(), completion(equals([1, 2, 3])));
+      });
+
+      test("with a longer index than length", () {
+        expect(wrapper.take(6).toList(), completion(equals([1, 2, 3, 4, 5])));
+      });
+
+      test("with a negative index", () {
+        expect(wrapper.take(-1).toList(), completion(isEmpty));
+      });
+    });
+
+    group("elementAt()", () {
+      test("with a valid index", () {
+        expect(wrapper.elementAt(3), completion(equals(4)));
+      });
+
+      test("with too high an index", () {
+        expect(wrapper.elementAt(6), throwsRangeError);
+      });
+
+      test("with a negative index", () {
+        expect(wrapper.elementAt(-1), throwsArgumentError);
+      });
+    });
+
+    group("contains()", () {
+      test("with an element", () {
+        expect(wrapper.contains(2), completion(isTrue));
+      });
+
+      test("with a non-element", () {
+        expect(wrapper.contains(6), completion(isFalse));
+      });
+
+      test("with a non-element of a different type", () {
+        expect(wrapper.contains("foo"), completion(isFalse));
+      });
+    });
+
+    group("join()", () {
+      test("without a separator", () {
+        expect(wrapper.join(), completion(equals("12345")));
+      });
+
+      test("with a separator", () {
+        expect(wrapper.join(" "), completion(equals("1 2 3 4 5")));
+      });
+    });
+
+    test("toString()", () {
+      expect(wrapper.toString(), contains("Stream"));
+    });
+  });
+
+  group("with invalid types", () {
+    var wrapper;
+    var singleWrapper;
+    setUp(() {
+      wrapper = new TypeSafeStream<int>(
+          new Stream<Object>.fromIterable(["foo", "bar", "baz"]));
+      singleWrapper =
+          new TypeSafeStream<int>(new Stream<Object>.fromIterable(["foo"]));
+    });
+
+    group("throws a CastError for", () {
+      test("first", () {
+        expect(wrapper.first, throwsCastError);
+      });
+
+      test("last", () {
+        expect(wrapper.last, throwsCastError);
+      });
+
+      test("single", () {
+        expect(singleWrapper.single, throwsCastError);
+      });
+
+      test("asBroadcastStream()", () {
+        var broadcast = wrapper.asBroadcastStream();
+        expect(broadcast.first, throwsCastError);
+      });
+
+      test("asyncExpand()", () {
+        expect(wrapper.asyncExpand(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("asyncMap()", () {
+        expect(wrapper.asyncMap(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      group("distinct()", () {
+        test("without equals", () {
+          expect(wrapper.distinct().first, throwsCastError);
+        });
+
+        test("with equals", () {
+          expect(wrapper.distinct(expectAsync2((_, __) {}, count: 0)).first,
+              throwsCastError);
+        });
+      });
+
+      test("expand()", () {
+        expect(wrapper.expand(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("firstWhere()", () {
+        expect(wrapper.firstWhere(expectAsync1((_) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("lastWhere()", () {
+        expect(
+            wrapper.lastWhere(expectAsync1((_) {}, count: 0)), throwsCastError);
+      });
+
+      test("singleWhere()", () {
+        expect(wrapper.singleWhere(expectAsync1((_) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("fold()", () {
+        expect(wrapper.fold("foo", expectAsync2((_, __) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("forEach()", () async {
+        expect(
+            wrapper.forEach(expectAsync1((_) {}, count: 0)), throwsCastError);
+      });
+
+      test("handleError()", () {
+        expect(wrapper.handleError(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("listen()", () {
+        expect(() => wrapper.take(1).listen(expectAsync1((_) {}, count: 0)),
+            throwsZonedCastError);
+      });
+
+      test("map()", () {
+        expect(
+            wrapper.map(expectAsync1((_) {}, count: 0)).first, throwsCastError);
+      });
+
+      test("reduce()", () {
+        expect(wrapper.reduce(expectAsync2((_, __) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("skipWhile()", () {
+        expect(wrapper.skipWhile(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("takeWhile()", () {
+        expect(wrapper.takeWhile(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("toList()", () async {
+        var list = await wrapper.toList();
+        expect(() => list.first, throwsCastError);
+      }, skip: "Re-enable this when test can run DDC (test#414).");
+
+      test("toSet()", () async {
+        var asSet = await wrapper.toSet();
+        expect(() => asSet.first, throwsCastError);
+      }, skip: "Re-enable this when test can run DDC (test#414).");
+
+      test("where()", () {
+        expect(wrapper.where(expectAsync1((_) {}, count: 0)).first,
+            throwsCastError);
+      });
+
+      test("any()", () {
+        expect(wrapper.any(expectAsync1((_) {}, count: 0)), throwsCastError);
+      });
+
+      test("every()", () {
+        expect(wrapper.every(expectAsync1((_) {}, count: 0)), throwsCastError);
+      });
+
+      test("skip()", () {
+        expect(wrapper.skip(1).first, throwsCastError);
+      });
+
+      test("take()", () {
+        expect(wrapper.take(1).first, throwsCastError);
+      });
+
+      test("elementAt()", () {
+        expect(wrapper.elementAt(1), throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("single", () {
+        expect(wrapper.single, throwsStateError);
+      });
+
+      test("length", () {
+        expect(wrapper.length, completion(equals(3)));
+      });
+
+      test("isBroadcast", () {
+        expect(wrapper.isBroadcast, isFalse);
+      });
+
+      test("isEmpty", () {
+        expect(wrapper.isEmpty, completion(isFalse));
+      });
+
+      group("drain()", () {
+        test("without a value", () {
+          expect(wrapper.drain(), completes);
+          expect(() => wrapper.drain(), throwsStateError);
+        });
+
+        test("with a value", () {
+          expect(wrapper.drain(12), completion(equals(12)));
+        });
+      });
+
+      test("skip()", () {
+        expect(() => wrapper.skip(-1), throwsArgumentError);
+      });
+
+      group("elementAt()", () {
+        test("with too high an index", () {
+          expect(wrapper.elementAt(6), throwsRangeError);
+        });
+
+        test("with a negative index", () {
+          expect(wrapper.elementAt(-1), throwsArgumentError);
+        });
+      });
+
+      group("contains()", () {
+        test("with an element", () {
+          expect(wrapper.contains("foo"), completion(isTrue));
+        });
+
+        test("with a non-element", () {
+          expect(wrapper.contains("qux"), completion(isFalse));
+        });
+
+        test("with a non-element of a different type", () {
+          expect(wrapper.contains(1), completion(isFalse));
+        });
+      });
+
+      group("join()", () {
+        test("without a separator", () {
+          expect(wrapper.join(), completion(equals("foobarbaz")));
+        });
+
+        test("with a separator", () {
+          expect(wrapper.join(" "), completion(equals("foo bar baz")));
+        });
+      });
+
+      test("toString()", () {
+        expect(wrapper.toString(), contains("Stream"));
+      });
+    });
+  });
+}
diff --git a/packages/async/test/utils.dart b/packages/async/test/utils.dart
index b2ea885..9270886 100644
--- a/packages/async/test/utils.dart
+++ b/packages/async/test/utils.dart
@@ -3,18 +3,45 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Helper utilities for testing.
-library async.test.util;
-
 import "dart:async";
+
+import "package:async/async.dart";
 import "package:test/test.dart";
 
 /// A zero-millisecond timer should wait until after all microtasks.
 Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
 
+typedef void OptionalArgAction([a, b]);
+
 /// A generic unreachable callback function.
 ///
 /// Returns a function that fails the test if it is ever called.
-unreachable(String name) => ([a, b]) => fail("Unreachable: $name");
+OptionalArgAction unreachable(String name) =>
+    ([a, b]) => fail("Unreachable: $name");
+
+// TODO(nweiz): Use the version of this in test when test#418 is fixed.
+/// A matcher that runs a callback in its own zone and asserts that that zone
+/// emits an error that matches [matcher].
+Matcher throwsZoned(matcher) => predicate((callback) {
+      var firstError = true;
+      runZoned(callback,
+          onError: expectAsync2((error, stackTrace) {
+            if (firstError) {
+              expect(error, matcher);
+              firstError = false;
+            } else {
+              registerException(error, stackTrace);
+            }
+          }, max: -1));
+      return true;
+    });
+
+/// A matcher that runs a callback in its own zone and asserts that that zone
+/// emits a [CastError].
+final throwsZonedCastError = throwsZoned(new isInstanceOf<CastError>());
+
+/// A matcher that matches a callback or future that throws a [CastError].
+final throwsCastError = throwsA(new isInstanceOf<CastError>());
 
 /// A badly behaved stream which throws if it's ever listened to.
 ///
@@ -24,3 +51,62 @@
     throw new UnimplementedError("Gotcha!");
   }
 }
+
+/// A dummy [StreamSink] for testing the routing of the [done] and [close]
+/// futures.
+///
+/// The [completer] field allows the user to control the future returned by
+/// [done] and [close].
+class CompleterStreamSink<T> implements StreamSink<T> {
+  final completer = new Completer();
+
+  Future get done => completer.future;
+
+  void add(T event) {}
+  void addError(error, [StackTrace stackTrace]) {}
+  Future addStream(Stream<T> stream) async {}
+  Future close() => completer.future;
+}
+
+/// A [StreamSink] that collects all events added to it as results.
+///
+/// This is used for testing code that interacts with sinks.
+class TestSink<T> implements StreamSink<T> {
+  /// The results corresponding to events that have been added to the sink.
+  final results = <Result<T>>[];
+
+  /// Whether [close] has been called.
+  bool get isClosed => _isClosed;
+  var _isClosed = false;
+
+  Future get done => _doneCompleter.future;
+  final _doneCompleter = new Completer();
+
+  final Function _onDone;
+
+  /// Creates a new sink.
+  ///
+  /// If [onDone] is passed, it's called when the user calls [close]. Its result
+  /// is piped to the [done] future.
+  TestSink({onDone()}) : _onDone = onDone ?? (() {});
+
+  void add(T event) {
+    results.add(new Result<T>.value(event));
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    results.add(new Result<T>.error(error, stackTrace));
+  }
+
+  Future addStream(Stream<T> stream) {
+    var completer = new Completer.sync();
+    stream.listen(add, onError: addError, onDone: completer.complete);
+    return completer.future;
+  }
+
+  Future close() {
+    _isClosed = true;
+    _doneCompleter.complete(new Future.microtask(_onDone));
+    return done;
+  }
+}
diff --git a/packages/barback/.analysis_options b/packages/barback/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/barback/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/barback/CHANGELOG.md b/packages/barback/CHANGELOG.md
index 02bbd68..7101619 100644
--- a/packages/barback/CHANGELOG.md
+++ b/packages/barback/CHANGELOG.md
@@ -1,3 +1,22 @@
+## 0.15.2+11
+
+* Update `AssetNode.whenAvailable` to be a generic method to fix a new strong
+  mode error.
+
+## 0.15.2+10
+
+* Update `CancelableFuture` to match the new `Future.then` type signature. The
+  `onValue` parameter now has a return type of `FutureOr<S>` instead of
+  `S`.
+
+## 0.15.2+9
+
+* Fix all strong-mode warnings in Dart 1.18.
+
+## 0.15.2+8
+
+* Fix all strong-mode warnings in Dart 1.16.
+
 ## 0.15.2+7
 
 * Add periodic fine-grained logging for long running transformers.
diff --git a/packages/barback/lib/src/asset/asset_node.dart b/packages/barback/lib/src/asset/asset_node.dart
index 45d1b17..a9e0000 100644
--- a/packages/barback/lib/src/asset/asset_node.dart
+++ b/packages/barback/lib/src/asset/asset_node.dart
@@ -8,7 +8,6 @@
 
 import '../errors.dart';
 import '../graph/transform_node.dart';
-import '../utils.dart';
 import 'asset.dart';
 import 'asset_id.dart';
 
@@ -84,7 +83,7 @@
   /// The return value of [callback] is piped to the returned Future. If the
   /// asset is removed before becoming available, the returned future will throw
   /// an [AssetNotFoundException].
-  Future whenAvailable(callback(Asset asset)) {
+  Future/*<T>*/ whenAvailable/*<T>*/(/*=T*/ callback(Asset asset)) {
     return _waitForState((state) => state.isAvailable || state.isRemoved,
         (state) {
       if (state.isRemoved) throw new AssetNotFoundException(id);
@@ -115,9 +114,9 @@
   /// [callback] is called synchronously if this is already in such a state.
   ///
   /// The return value of [callback] is piped to the returned Future.
-  Future _waitForState(bool test(AssetState state),
-      callback(AssetState state)) {
-    if (test(state)) return syncFuture(() => callback(state));
+  Future/*<T>*/ _waitForState/*<T>*/(bool test(AssetState state),
+      /*=T*/ callback(AssetState state)) {
+    if (test(state)) return new Future.sync(() => callback(state));
     return onStateChange.firstWhere(test).then((_) => callback(state));
   }
 
diff --git a/packages/barback/lib/src/asset/asset_set.dart b/packages/barback/lib/src/asset/asset_set.dart
index ac58774..a529443 100644
--- a/packages/barback/lib/src/asset/asset_set.dart
+++ b/packages/barback/lib/src/asset/asset_set.dart
@@ -54,10 +54,7 @@
   }
 
   /// Returns `true` if the set contains [asset].
-  bool contains(Asset asset) {
-    var other = _assets[asset.id];
-    return other == asset;
-  }
+  bool contains(Object asset) => asset is Asset && _assets[asset.id] == asset;
 
   /// Returns `true` if the set contains an [Asset] with [id].
   bool containsId(AssetId id) {
diff --git a/packages/barback/lib/src/asset/internal_asset.dart b/packages/barback/lib/src/asset/internal_asset.dart
index dfacba5..ed7f309 100644
--- a/packages/barback/lib/src/asset/internal_asset.dart
+++ b/packages/barback/lib/src/asset/internal_asset.dart
@@ -8,6 +8,9 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
+import 'package:async/async.dart';
+import 'package:collection/collection.dart';
+
 import '../serialize.dart';
 import '../utils.dart';
 import '../utils/file_pool.dart';
@@ -52,11 +55,14 @@
 Asset deserializeAsset(Map asset) {
   var id = deserializeId(asset['id']);
   switch (asset['type']) {
-    case 'binary': return new BinaryAsset(id, asset['contents']);
+    case 'binary':
+      return new BinaryAsset(
+          id, DelegatingList.typed(asset['contents'] as List));
     case 'file': return new FileAsset(id, asset['path']);
     case 'string': return new StringAsset(id, asset['contents']);
     case 'stream':
-      return new StreamAsset(id, deserializeStream(asset['stream']));
+      return new StreamAsset(
+          id, DelegatingStream.typed(deserializeStream(asset['stream'])));
     default:
       throw new FormatException('Unknown asset type "${asset['type']}".');
   }
@@ -177,8 +183,8 @@
 
   Future<String> readAsString({Encoding encoding}) {
     if (encoding == null) encoding = UTF8;
-    return _replayer.getReplay().toList()
-        .then((chunks) => encoding.decode(flatten(chunks)));
+    return _replayer.getReplay().expand((chunk) => chunk).toList()
+        .then((bytes) => encoding.decode(bytes));
   }
 
   Stream<List<int>> read() => _replayer.getReplay();
diff --git a/packages/barback/lib/src/build_result.dart b/packages/barback/lib/src/build_result.dart
index faeb256..fff2e24 100644
--- a/packages/barback/lib/src/build_result.dart
+++ b/packages/barback/lib/src/build_result.dart
@@ -44,7 +44,9 @@
 
     return "errors:\n" + errors.map((error) {
       var stackTrace = null;
-      if (error is TransformerException || error is AssetLoadException) {
+      if (error is TransformerException) {
+        stackTrace = error.stackTrace.terse;
+      } else if (error is AssetLoadException) {
         stackTrace = error.stackTrace.terse;
       }
 
diff --git a/packages/barback/lib/src/errors.dart b/packages/barback/lib/src/errors.dart
index 3488e31..96cfbc7 100644
--- a/packages/barback/lib/src/errors.dart
+++ b/packages/barback/lib/src/errors.dart
@@ -24,8 +24,8 @@
 Iterable<BarbackException> flattenAggregateExceptions(
     Iterable<BarbackException> errors) {
   return errors.expand((error) {
-    if (error is! AggregateException) return [error];
-    return error.errors;
+    if (error is AggregateException) return error.errors;
+    return [error];
   });
 }
 
diff --git a/packages/barback/lib/src/graph/asset_cascade.dart b/packages/barback/lib/src/graph/asset_cascade.dart
index 70bc4c9..d307b87 100644
--- a/packages/barback/lib/src/graph/asset_cascade.dart
+++ b/packages/barback/lib/src/graph/asset_cascade.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:async/async.dart';
+
 import '../asset/asset.dart';
 import '../asset/asset_id.dart';
 import '../asset/asset_node.dart';
@@ -13,7 +15,6 @@
 import '../errors.dart';
 import '../log.dart';
 import '../transformer/transformer.dart';
-import '../utils.dart';
 import '../utils/cancelable_future.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
@@ -113,13 +114,13 @@
     // * 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 oldLastPhase.getOutput(id).then((node) {
+    return DelegatingFuture.typed(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);
-    });
+    }));
   }
 
   /// Adds [sources] to the graph's known set of source assets.
@@ -142,11 +143,11 @@
       if (_loadingSources.containsKey(id)) _loadingSources[id].cancel();
 
       _loadingSources[id] = new CancelableFuture<Asset>(
-          syncFuture(() => graph.provider.getAsset(id)));
+          new Future.sync(() => graph.provider.getAsset(id)));
       _loadingSources[id].whenComplete(() {
         _loadingSources.remove(id);
       }).then((asset) {
-        var controller = _sourceControllerMap[id].setAvailable(asset);
+        _sourceControllerMap[id].setAvailable(asset);
       }).catchError((error, stack) {
         reportError(new AssetLoadException(id, error, stack));
 
diff --git a/packages/barback/lib/src/graph/group_runner.dart b/packages/barback/lib/src/graph/group_runner.dart
index f9dcaa1..1cb94ee 100644
--- a/packages/barback/lib/src/graph/group_runner.dart
+++ b/packages/barback/lib/src/graph/group_runner.dart
@@ -35,7 +35,7 @@
 
   /// A stream that emits an event every time the group's status changes.
   Stream<NodeStatus> get onStatusChange => _onStatusChange;
-  Stream _onStatusChange;
+  Stream<NodeStatus> _onStatusChange;
 
   /// A stream that emits any new assets emitted by [this].
   ///
diff --git a/packages/barback/lib/src/graph/package_graph.dart b/packages/barback/lib/src/graph/package_graph.dart
index 7573081..1c2b534 100644
--- a/packages/barback/lib/src/graph/package_graph.dart
+++ b/packages/barback/lib/src/graph/package_graph.dart
@@ -127,7 +127,7 @@
   ///
   /// If the asset cannot be found, returns null.
   Future<AssetNode> getAssetNode(AssetId id) {
-    return _inErrorZone(() {
+    return _inErrorZone/*<Future<AssetNode>>*/(() {
       var cascade = _cascades[id.package];
       if (cascade != null) return cascade.getAssetNode(id);
       return new Future.value(null);
@@ -158,7 +158,7 @@
 
     if (_status != NodeStatus.IDLE) {
       // A build is still ongoing, so wait for it to complete and try again.
-      return results.first.then((_) => getAllAssets());
+      return results.first.then/*<Future<AssetSet>>*/((_) => getAllAssets());
     }
 
     // If an unexpected error occurred, complete with that.
@@ -178,7 +178,7 @@
             (cascade) => cascade.availableOutputs))
           .then((assetSets) {
       var assets = unionAll(assetSets.map((assetSet) => assetSet.toSet()));
-      return new Future.value(new AssetSet.from(assets));
+      return new AssetSet.from(assets);
     });
   }
 
@@ -274,10 +274,11 @@
   /// [Future]. If it throws a [BarbackException], that exception will be piped
   /// to the returned [Future] as well. Any other exceptions will be piped to
   /// [results].
-  Future _inErrorZone(body()) {
-    var completer = new Completer.sync();
+  Future/*<T>*/ _inErrorZone/*<T>*/(/*=T*/ body()) {
+    var completer = new Completer/*<T>*/.sync();
     runZoned(() {
-      syncFuture(body).then(completer.complete).catchError((error, stackTrace) {
+      new Future.sync(body).then(completer.complete)
+          .catchError((error, stackTrace) {
         if (error is! BarbackException) throw error;
         completer.completeError(error, stackTrace);
       });
diff --git a/packages/barback/lib/src/graph/phase.dart b/packages/barback/lib/src/graph/phase.dart
index 4bfc5e1..629291a 100644
--- a/packages/barback/lib/src/graph/phase.dart
+++ b/packages/barback/lib/src/graph/phase.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:collection/collection.dart';
+
 import '../asset/asset_id.dart';
 import '../asset/asset_node.dart';
 import '../asset/asset_node_set.dart';
@@ -14,7 +16,6 @@
 import '../transformer/aggregate_transformer.dart';
 import '../transformer/transformer.dart';
 import '../transformer/transformer_group.dart';
-import '../utils.dart';
 import '../utils/multiset.dart';
 import 'asset_cascade.dart';
 import 'group_runner.dart';
@@ -205,7 +206,7 @@
   /// 
   /// If the output cannot be found, returns null.
   Future<AssetNode> getOutput(AssetId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
       if (_outputs.containsKey(id)) {
         var output = _outputs[id].output;
@@ -258,8 +259,8 @@
       }
     }
 
-    var newGroups = transformers.where((op) => op is TransformerGroup)
-        .toSet();
+    var newGroups = DelegatingSet.typed/*<TransformerGroup>*/(
+        transformers.where((op) => op is TransformerGroup).toSet());
     var oldGroups = _groups.keys.toSet();
     for (var removed in oldGroups.difference(newGroups)) {
       _groups.remove(removed).remove();
@@ -389,7 +390,9 @@
     asset.whenStateChanges().then((state) {
       if (state.isRemoved) return getOutput(asset.id);
       return asset;
-    }).then(request.complete).catchError(request.completeError);
+    })
+       .then((asset) => request.complete(asset))
+       .catchError(request.completeError);
   }
 
   String toString() => "phase $_location.$_index";
diff --git a/packages/barback/lib/src/graph/static_asset_cascade.dart b/packages/barback/lib/src/graph/static_asset_cascade.dart
index 7eeda96..4effda5 100644
--- a/packages/barback/lib/src/graph/static_asset_cascade.dart
+++ b/packages/barback/lib/src/graph/static_asset_cascade.dart
@@ -6,6 +6,9 @@
 
 import 'dart:async';
 
+import 'package:async/async.dart';
+import 'package:collection/collection.dart';
+
 import '../asset/asset_id.dart';
 import '../asset/asset_node.dart';
 import '../asset/asset_set.dart';
@@ -38,18 +41,18 @@
   final status = NodeStatus.IDLE;
 
   final onLog = new StreamController<LogEntry>.broadcast().stream;
-  final onStatusChange = new StreamController<LogEntry>.broadcast().stream;
+  final onStatusChange = new StreamController<NodeStatus>.broadcast().stream;
   final onAsset = new StreamController<AssetNode>.broadcast().stream;
 
   Future<AssetSet> get availableOutputs {
     var provider = graph.provider as StaticPackageProvider;
     return provider.getAllAssetIds(package).asyncMap(provider.getAsset).toList()
-        .then((assets) => new AssetSet.from(assets));
+        .then((assets) => new AssetSet.from(DelegatingList.typed(assets)));
   }
 
   Future<AssetNode> getAssetNode(AssetId id) {
     return _sources.putIfAbsent(id, () {
-      return graph.provider.getAsset(id).then((asset) {
+      return DelegatingFuture.typed(graph.provider.getAsset(id).then((asset) {
         return new AssetNodeController.available(asset).node;
       }).catchError((error, stackTrace) {
         if (error is! AssetNotFoundException) {
@@ -58,7 +61,7 @@
 
         // TODO(nweiz): propagate error information through asset nodes.
         return null;
-      });
+      }));
     });
   }
 
diff --git a/packages/barback/lib/src/graph/transform_node.dart b/packages/barback/lib/src/graph/transform_node.dart
index 2a24335..39f5c52 100644
--- a/packages/barback/lib/src/graph/transform_node.dart
+++ b/packages/barback/lib/src/graph/transform_node.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:async/async.dart';
+
 import '../asset/asset.dart';
 import '../asset/asset_id.dart';
 import '../asset/asset_node.dart';
@@ -443,7 +445,7 @@
     }
     _maybeFinishDeclareController();
 
-    syncFuture(() {
+    new Future.sync(() {
       return (transformer as DeclaringAggregateTransformer)
           .declareOutputs(controller.transform);
     }).whenComplete(() {
@@ -643,7 +645,7 @@
 
     var transformCounterTimer;
 
-    return syncFuture(() {
+    return DelegatingFuture.typed(new Future.sync(() {
       _timeInTransformer.reset();
       _timeAwaitingInputs.reset();
       _timeInTransformer.start();
@@ -725,7 +727,7 @@
       // is so a broken transformer doesn't take down the whole graph.
       phase.cascade.reportError(_wrapException(error, stackTrace));
       return true;
-    });
+    }));
   }
 
   /// Handle the results of running [Transformer.apply].
diff --git a/packages/barback/lib/src/graph/transformer_classifier.dart b/packages/barback/lib/src/graph/transformer_classifier.dart
index a095e8d..d57f80a 100644
--- a/packages/barback/lib/src/graph/transformer_classifier.dart
+++ b/packages/barback/lib/src/graph/transformer_classifier.dart
@@ -12,7 +12,6 @@
 import '../log.dart';
 import '../transformer/aggregate_transformer.dart';
 import '../transformer/wrapping_aggregate_transformer.dart';
-import '../utils.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase.dart';
@@ -74,8 +73,8 @@
   /// Adds a new asset as an input for this transformer.
   void addInput(AssetNode input) {
     _activeClassifications++;
-    syncFuture(() => transformer.classifyPrimary(input.id)).catchError(
-        (error, stackTrace) {
+    new Future.sync(() => transformer.classifyPrimary(input.id))
+        .catchError((error, stackTrace) {
       if (input.state.isRemoved) return null;
 
       // Catch all transformer errors and pipe them to the results stream. This
diff --git a/packages/barback/lib/src/transformer/aggregate_transform.dart b/packages/barback/lib/src/transformer/aggregate_transform.dart
index 6d471fd..a92f738 100644
--- a/packages/barback/lib/src/transformer/aggregate_transform.dart
+++ b/packages/barback/lib/src/transformer/aggregate_transform.dart
@@ -7,6 +7,8 @@
 import 'dart:async';
 import 'dart:convert';
 
+import 'package:async/async.dart';
+
 import '../asset/asset.dart';
 import '../asset/asset_id.dart';
 import '../asset/asset_set.dart';
@@ -62,7 +64,7 @@
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
     if (_emittedPrimaryInputs.containsId(id)) {
-      return syncFuture(() => _emittedPrimaryInputs[id]);
+      return new Future.sync(() => _emittedPrimaryInputs[id]);
     } else {
       return _node.getInput(id);
     }
@@ -79,7 +81,8 @@
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
     if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+    return getInput(id).then/*<Future<String>>*/(
+        (input) => input.readAsString(encoding: encoding));
   }
 
   /// A convenience method to the contents of the input with [id].
@@ -97,10 +100,11 @@
   /// This is equivalent to calling [getInput] and catching an
   /// [AssetNotFoundException].
   Future<bool> hasInput(AssetId id) {
-    return getInput(id).then((_) => true).catchError((error) {
+    return DelegatingFuture.typed(
+        getInput(id).then((_) => true).catchError((error) {
       if (error is AssetNotFoundException && error.id == id) return false;
       throw error;
-    });
+    }));
   }
 
   /// Stores [output] as an output created by this transformation.
@@ -124,7 +128,7 @@
 
 /// The controller for [AggregateTransform].
 class AggregateTransformController extends BaseTransformController {
-  AggregateTransform get transform => super.transform;
+  final AggregateTransform transform;
 
   /// The set of assets that the transformer has emitted.
   AssetSet get outputs => transform._outputs;
@@ -132,7 +136,7 @@
   bool get isDone => transform._inputController.isClosed;
 
   AggregateTransformController(TransformNode node)
-      : super(new AggregateTransform._(node));
+      : transform = new AggregateTransform._(node);
 
   /// Adds a primary input asset to the [AggregateTransform.primaryInputs]
   /// stream.
diff --git a/packages/barback/lib/src/transformer/base_transform.dart b/packages/barback/lib/src/transformer/base_transform.dart
index fe3ab3b..69492f0 100644
--- a/packages/barback/lib/src/transformer/base_transform.dart
+++ b/packages/barback/lib/src/transformer/base_transform.dart
@@ -76,7 +76,7 @@
 /// [BaseTransform] without exposing getters in the public API.
 abstract class BaseTransformController {
   /// The [BaseTransform] controlled by this controller.
-  final BaseTransform transform;
+  BaseTransform get transform;
 
   /// The ids of primary inputs that should be consumed.
   Set<AssetId> get consumedPrimaries => transform._consumedPrimaries;
@@ -92,8 +92,6 @@
   /// See also [done].
   bool get isDone;
 
-  BaseTransformController(this.transform);
-
   /// Mark this transform as finished emitting new inputs or input ids.
   ///
   /// This is distinct from [cancel] in that it *doesn't* indicate that the
diff --git a/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart b/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart
index cfcb782..e0f3956 100644
--- a/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart
+++ b/packages/barback/lib/src/transformer/declaring_aggregate_transform.dart
@@ -85,7 +85,7 @@
 
 /// The controller for [DeclaringAggregateTransform].
 class DeclaringAggregateTransformController extends BaseTransformController {
-  DeclaringAggregateTransform get transform => super.transform;
+  final DeclaringAggregateTransform transform;
 
   /// The set of ids that the transformer declares it will emit.
   Set<AssetId> get outputIds => transform._outputIds;
@@ -93,7 +93,7 @@
   bool get isDone => transform._idController.isClosed;
 
   DeclaringAggregateTransformController(TransformNode node)
-      : super(new DeclaringAggregateTransform._(node));
+      : transform = new DeclaringAggregateTransform._(node);
 
   /// Adds a primary input id to the [DeclaringAggregateTransform.primaryIds]
   /// stream.
diff --git a/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart b/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
index f41d075..a24260d 100644
--- a/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
+++ b/packages/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 
 import '../asset/asset_id.dart';
-import '../utils.dart';
 import 'aggregate_transform.dart';
 import 'aggregate_transformer.dart';
 import 'declaring_aggregate_transform.dart';
@@ -44,7 +43,7 @@
   WrappingAggregateTransformer._(this.transformer);
 
   Future<String> classifyPrimary(AssetId id) {
-    return syncFuture(() => transformer.isPrimary(id))
+    return new Future.sync(() => transformer.isPrimary(id))
         .then((isPrimary) => isPrimary ? id.path : null);
   }
 
diff --git a/packages/barback/lib/src/utils.dart b/packages/barback/lib/src/utils.dart
index 7ce6724..e991078 100644
--- a/packages/barback/lib/src/utils.dart
+++ b/packages/barback/lib/src/utils.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:typed_data';
 
+import 'package:async/async.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 /// A class that represents a value or an error.
@@ -129,8 +130,9 @@
 ///
 /// This returns a map whose keys are the return values of [fn] and whose values
 /// are lists of each element in [iter] for which [fn] returned that key.
-Map<Object, List> groupBy(Iterable iter, fn(element)) {
-  var map = {};
+Map<Object/*=T*/, List/*<S>*/> groupBy/*<S, T>*/(Iterable/*<S>*/ iter,
+    /*=T*/ fn(/*=S*/ element)) {
+  var map = /*<T, List<S>>*/{};
   for (var element in iter) {
     var list = map.putIfAbsent(fn(element), () => []);
     list.add(element);
@@ -156,27 +158,35 @@
 }
 
 /// Returns the union of all elements in each set in [sets].
-Set unionAll(Iterable<Set> sets) =>
+Set/*<T>*/ unionAll/*<T>*/(Iterable<Set/*<T>*/> sets) =>
   sets.fold(new Set(), (union, set) => union.union(set));
 
 /// Creates a new map from [map] with new keys and values.
 ///
 /// The return values of [keyFn] are used as the keys and the return values of
 /// [valueFn] are used as the values for the new map.
-Map mapMap(Map map, keyFn(key, value), valueFn(key, value)) =>
+Map/*<K2, V2>*/ mapMap/*<K1, V1, K2, V2>*/(Map/*<K1, V1>*/ map,
+    /*=K2*/ keyFn(/*=K1*/ key, /*=V1*/ value),
+    /*=V2*/ valueFn(/*=K1*/ key, /*=V1*/ value)) =>
   new Map.fromIterable(map.keys,
-      key: (key) => keyFn(key, map[key]),
-      value: (key) => valueFn(key, map[key]));
+      key: (key) => keyFn(key as dynamic/*=K1*/, map[key]),
+      value: (key) => valueFn(key as dynamic/*=K1*/, map[key]));
 
 /// Creates a new map from [map] with the same keys.
 ///
 /// The return values of [fn] are used as the values for the new map.
-Map mapMapValues(Map map, fn(key, value)) => mapMap(map, (key, _) => key, fn);
+Map/*<K, V2>*/ mapMapValues/*<K, V1, V2>*/(Map/*<K, V1>*/ map,
+    /*=V2*/ fn(/*=K*/ key, /*=V1*/ value)) =>
+  // TODO(nweiz): Don't explicitly type [key] when sdk#25490 is fixed.
+  mapMap(map, (/*=K*/ key, _) => key, fn);
 
 /// Creates a new map from [map] with the same keys.
 ///
 /// The return values of [fn] are used as the keys for the new map.
-Map mapMapKeys(Map map, fn(key, value)) => mapMap(map, fn, (_, value) => value);
+Map/*<K2, V>*/ mapMapKeys/*<K1, V, K2>*/(Map/*<K1, V>*/ map,
+    /*=K2*/ fn(/*=K1*/ key, /*=V*/ value)) =>
+  // TODO(nweiz): Don't explicitly type [value] when sdk#25490 is fixed.
+  mapMap(map, fn, (_, /*=V*/ value) => value);
 
 /// Returns whether [set1] has exactly the same elements as [set2].
 bool setEquals(Set set1, Set set2) =>
@@ -186,15 +196,17 @@
 ///
 /// If [broadcast] is true, this will return a broadcast stream; otherwise, it
 /// will return a buffered stream.
-Stream mergeStreams(Iterable<Stream> streams, {bool broadcast: false}) {
+Stream/*<T>*/ mergeStreams/*<T>*/(Iterable<Stream/*<T>*/> streams,
+    {bool broadcast: false}) {
   streams = streams.toList();
   var doneCount = 0;
   // Use a sync stream to preserve the synchrony behavior of the input streams.
   // If the inputs are sync, then this will be sync as well; if the inputs are
   // async, then the events we receive will also be async, and forwarding them
   // sync won't change that.
-  var controller = broadcast ? new StreamController.broadcast(sync: true)
-      : new StreamController(sync: true);
+  var controller = broadcast
+      ? new StreamController/*<T>*/.broadcast(sync: true)
+      : new StreamController/*<T>*/(sync: true);
 
   for (var stream in streams) {
     stream.listen(
@@ -235,13 +247,9 @@
   return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
 }
 
-/// Like `new Future`, but avoids issue 11911 by using `new Future.value` under
+/// Like [new Future], but avoids dartbug.com/11911 by using async/await under
 /// the covers.
-// TODO(jmesserly): doc comment changed to due 14601.
-Future newFuture(callback()) => new Future.value().then((_) => callback());
-
-/// Like [Future.sync], but wraps the Future in [Chain.track] as well.
-Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
+Future/*<T>*/ newFuture/*<T>*/(/*=T*/ callback()) async => await callback();
 
 /// Returns a buffered stream that will emit the same values as the stream
 /// returned by [future] once [future] completes.
@@ -252,17 +260,18 @@
 /// If [broadcast] is true, a broadcast stream is returned. This assumes that
 /// the stream returned by [future] will be a broadcast stream as well.
 /// [broadcast] defaults to false.
-Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
-  var subscription;
-  var controller;
+Stream/*<T>*/ futureStream/*<T>*/(Future<Stream/*<T>*/> future,
+    {bool broadcast: false}) {
+  StreamSubscription/*<T>*/ subscription;
+  StreamController/*<T>*/ controller;
 
-  future = future.catchError((e, stackTrace) {
+  future = DelegatingFuture.typed(future.catchError((e, stackTrace) {
     // Since [controller] is synchronous, it's likely that emitting an error
     // will cause it to be cancelled before we call close.
     if (controller != null) controller.addError(e, stackTrace);
     if (controller != null) controller.close();
     controller = null;
-  });
+  }));
 
   onListen() {
     future.then((stream) {
@@ -281,10 +290,10 @@
   }
 
   if (broadcast) {
-    controller = new StreamController.broadcast(
+    controller = new StreamController/*<T>*/.broadcast(
         sync: true, onListen: onListen, onCancel: onCancel);
   } else {
-    controller = new StreamController(
+    controller = new StreamController/*<T>*/(
         sync: true, onListen: onListen, onCancel: onCancel);
   }
   return controller.stream;
@@ -294,10 +303,10 @@
 /// [callback].
 ///
 /// [callback] will only be called when the returned [Stream] gets a subscriber.
-Stream callbackStream(Stream callback()) {
-  var subscription;
-  var controller;
-  controller = new StreamController(onListen: () {
+Stream/*<T>*/ callbackStream/*<T>*/(Stream/*<T>*/ callback()) {
+  StreamSubscription/*<T>*/ subscription;
+  StreamController/*<T>*/ controller;
+  controller = new StreamController/*<T>*/(onListen: () {
     subscription = callback().listen(controller.add,
         onError: controller.addError,
         onDone: controller.close);
@@ -313,13 +322,14 @@
 ///
 /// The returned stream will enqueue events from [broadcast] until a listener is
 /// attached, then pipe events to that listener.
-Stream broadcastToSingleSubscription(Stream broadcast) {
+Stream/*<T>*/ broadcastToSingleSubscription/*<T>*/(Stream/*<T>*/ broadcast) {
   if (!broadcast.isBroadcast) return broadcast;
 
   // TODO(nweiz): Implement this using a transformer when issues 18588 and 18586
   // are fixed.
   var subscription;
-  var controller = new StreamController(onCancel: () => subscription.cancel());
+  var controller = new StreamController/*<T>*/(
+      onCancel: () => subscription.cancel());
   subscription = broadcast.listen(controller.add,
       onError: controller.addError,
       onDone: controller.close);
diff --git a/packages/barback/lib/src/utils/cancelable_future.dart b/packages/barback/lib/src/utils/cancelable_future.dart
index 64d2b5f..aaa5e36 100644
--- a/packages/barback/lib/src/utils/cancelable_future.dart
+++ b/packages/barback/lib/src/utils/cancelable_future.dart
@@ -27,13 +27,15 @@
   }
 
   Stream<T> asStream() => _completer.future.asStream();
-  Future catchError(Function onError, {bool test(error)}) =>
-    _completer.future.catchError(onError, test: test);
-  Future then(onValue(T value), {Function onError}) =>
-    _completer.future.then(onValue, onError: onError);
+  Future<T> catchError(Function onError, {bool test(Object error)}) =>
+      _completer.future.catchError(onError, test: test);
+  Future/*<S>*/ then/*<S>*/(/*=FutureOr<S>*/ onValue(T value),
+          {Function onError}) =>
+      _completer.future.then(onValue, onError: onError);
   Future<T> whenComplete(action()) => _completer.future.whenComplete(action);
-  Future timeout(Duration timeLimit, {void onTimeout()}) =>
-    _completer.future.timeout(timeLimit, onTimeout: onTimeout);
+  Future<T> timeout(Duration timeLimit, {void onTimeout()}) =>
+      _completer.future.timeout(timeLimit, onTimeout: onTimeout);
+
   /// Cancels this future.
   void cancel() {
     _canceled = true;
diff --git a/packages/barback/lib/src/utils/file_pool.dart b/packages/barback/lib/src/utils/file_pool.dart
index 6a23337..c7f3d39 100644
--- a/packages/barback/lib/src/utils/file_pool.dart
+++ b/packages/barback/lib/src/utils/file_pool.dart
@@ -9,7 +9,6 @@
 import 'dart:io';
 
 import 'package:pool/pool.dart';
-import 'package:stack_trace/stack_trace.dart';
 
 import '../utils.dart';
 
@@ -35,7 +34,7 @@
   /// try again.
   Stream<List<int>> openRead(String path) {
     return futureStream(_pool.request().then((resource) {
-      return Chain.track(new File(path).openRead()).transform(
+      return new File(path).openRead().transform(
           new StreamTransformer.fromHandlers(handleDone: (sink) {
         sink.close();
         resource.release();
diff --git a/packages/barback/lib/src/utils/multiset.dart b/packages/barback/lib/src/utils/multiset.dart
index 20d1c57..4b3edea 100644
--- a/packages/barback/lib/src/utils/multiset.dart
+++ b/packages/barback/lib/src/utils/multiset.dart
@@ -23,9 +23,10 @@
   final _map = new Map<E, int>();
 
   Iterator<E> get iterator {
-    return _map.keys.expand((element) {
-      return new Iterable.generate(_map[element], (_) => element);
-    }).iterator;
+    return _map.keys
+        .expand((element) =>
+            new Iterable<E>.generate(_map[element], (_) => element))
+        .iterator;
   }
 
   Multiset()
@@ -56,7 +57,7 @@
   }
 
   /// Returns whether [value] is in the set.
-  bool contains(E value) => _map.containsKey(value);
+  bool contains(Object value) => _map.containsKey(value);
 
   /// Returns the number of copies of [value] in the set.
   int count(E value) => _map.containsKey(value) ? _map[value] : 0;
diff --git a/packages/barback/pubspec.yaml b/packages/barback/pubspec.yaml
index 9c05ff1..7d239af 100644
--- a/packages/barback/pubspec.yaml
+++ b/packages/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.15.2+7
+version: 0.15.2+11
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://github.com/dart-lang/barback
@@ -22,13 +22,14 @@
   Runs transforms asynchronously and in parallel when possible to maximize
   responsiveness.
 dependencies:
+  async: "^1.10.0"
   path: ">=0.9.0 <2.0.0"
   pool: ">=1.0.0 <2.0.0"
   source_span: ">=1.0.0 <2.0.0"
   stack_trace: ">=0.9.1 <2.0.0"
-  collection: ">=0.9.1 <2.0.0"
+  collection: "^1.5.0"
 dev_dependencies:
   scheduled_test: ">=0.9.0 <0.11.0"
   unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=1.0.1 <2.0.0"
+  sdk: ">=1.22.0 <2.0.0"
diff --git a/packages/barback/test/transformer/aggregate_many_to_one.dart b/packages/barback/test/transformer/aggregate_many_to_one.dart
index 7bba89f..af3bbaa 100644
--- a/packages/barback/test/transformer/aggregate_many_to_one.dart
+++ b/packages/barback/test/transformer/aggregate_many_to_one.dart
@@ -32,15 +32,14 @@
     return path.url.dirname(id.path);
   }
 
-  Future doApply(AggregateTransform transform) {
-    return getPrimaryInputs(transform).toList().then((assets) {
-      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
-      return Future.wait(assets.map((asset) => asset.readAsString()));
-    }).then((contents) {
-      var id = new AssetId(transform.package,
-          path.url.join(transform.key, output));
-      transform.addOutput(new Asset.fromString(id, contents.join('\n')));
-    });
+  Future doApply(AggregateTransform transform) async {
+    var assets = await getPrimaryInputs(transform).toList();
+    assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+    var contents = await Future.wait(
+        assets.map((asset) => asset.readAsString()));
+    var id = new AssetId(transform.package,
+        path.url.join(transform.key, output));
+    transform.addOutput(new Asset.fromString(id, contents.join('\n')));
   }
 
   String toString() => "aggregate $extension->$output";
diff --git a/packages/barback/test/transformer/declaring_check_content_and_rename.dart b/packages/barback/test/transformer/declaring_check_content_and_rename.dart
index b26a15b..5783e67 100644
--- a/packages/barback/test/transformer/declaring_check_content_and_rename.dart
+++ b/packages/barback/test/transformer/declaring_check_content_and_rename.dart
@@ -4,8 +4,6 @@
 
 library barback.test.transformer.declaring_check_content_and_rename;
 
-import 'dart:async';
-
 import 'package:barback/barback.dart';
 
 import 'check_content_and_rename.dart';
diff --git a/packages/barback/test/transformer/lazy_check_content_and_rename.dart b/packages/barback/test/transformer/lazy_check_content_and_rename.dart
index 330ad22..30ba6c2 100644
--- a/packages/barback/test/transformer/lazy_check_content_and_rename.dart
+++ b/packages/barback/test/transformer/lazy_check_content_and_rename.dart
@@ -4,8 +4,6 @@
 
 library barback.test.transformer.lazy_check_content_and_rename;
 
-import 'dart:async';
-
 import 'package:barback/barback.dart';
 
 import 'declaring_check_content_and_rename.dart';
diff --git a/packages/barback/test/transformer/many_to_one.dart b/packages/barback/test/transformer/many_to_one.dart
index a7414f6..efe5288 100644
--- a/packages/barback/test/transformer/many_to_one.dart
+++ b/packages/barback/test/transformer/many_to_one.dart
@@ -25,24 +25,23 @@
 
   bool doIsPrimary(AssetId id) => id.extension == ".$extension";
 
-  Future doApply(Transform transform) {
-    return getPrimary(transform)
-        .then((primary) => primary.readAsString())
-        .then((contents) {
-      // Get all of the included inputs.
-      return Future.wait(contents.split(",").map((path) {
-        var id;
-        if (path.contains("|")) {
-          id = new AssetId.parse(path);
-        } else {
-          id = new AssetId(transform.primaryInput.id.package, path);
-        }
-        return getInput(transform, id).then((input) => input.readAsString());
-      }));
-    }).then((outputs) {
-      var id = transform.primaryInput.id.changeExtension(".out");
-      transform.addOutput(new Asset.fromString(id, outputs.join()));
-    });
+  Future doApply(Transform transform) async {
+    var primary = await getPrimary(transform);
+    var contents = await primary.readAsString();
+
+    // Get all of the included inputs.
+    var outputs = await Future.wait(contents.split(",").map((path) {
+      var id;
+      if (path.contains("|")) {
+        id = new AssetId.parse(path);
+      } else {
+        id = new AssetId(transform.primaryInput.id.package, path);
+      }
+      return getInput(transform, id).then((input) => input.readAsString());
+    }));
+
+    var id = transform.primaryInput.id.changeExtension(".out");
+    transform.addOutput(new Asset.fromString(id, outputs.join()));
   }
 
   String toString() => "many->1 $extension";
diff --git a/packages/barback/test/transformer/mock.dart b/packages/barback/test/transformer/mock.dart
index 143496b..09c3628 100644
--- a/packages/barback/test/transformer/mock.dart
+++ b/packages/barback/test/transformer/mock.dart
@@ -152,10 +152,9 @@
   /// Like [Transform.getInput], but respects [pauseGetInput].
   ///
   /// This is intended for use by subclasses of [MockTransformer].
-  Future<Asset> getInput(Transform transform, AssetId id) {
-    return newFuture(() {
-      if (_getInput.containsKey(id)) return _getInput[id].future;
-    }).then((_) => transform.getInput(id));
+  Future<Asset> getInput(Transform transform, AssetId id) async {
+    if (_getInput.containsKey(id)) await _getInput[id].future;
+    return await transform.getInput(id);
   }
 
   /// Like [Transform.primaryInput], but respects [pauseGetPrimary].
@@ -167,14 +166,10 @@
     }).then((_) => transform.primaryInput);
   }
 
-  Future<bool> isPrimary(AssetId id) {
-    return newFuture(() => doIsPrimary(id)).then((result) {
-      return newFuture(() {
-        if (_isPrimary.containsKey(id)) {
-          return _isPrimary[id].future;
-        }
-      }).then((_) => result);
-    });
+  Future<bool> isPrimary(AssetId id) async {
+    var result = await doIsPrimary(id);
+    if (_isPrimary.containsKey(id)) await _isPrimary[id].future;
+    return result;
   }
 
   Future apply(Transform transform) {
diff --git a/packages/barback/test/transformer/mock_aggregate.dart b/packages/barback/test/transformer/mock_aggregate.dart
index 7f47b53..1b1fefd 100644
--- a/packages/barback/test/transformer/mock_aggregate.dart
+++ b/packages/barback/test/transformer/mock_aggregate.dart
@@ -153,10 +153,9 @@
   /// Like [AggregateTransform.getInput], but respects [pauseGetInput].
   ///
   /// This is intended for use by subclasses of [MockAggregateTransformer].
-  Future<Asset> getInput(AggregateTransform transform, AssetId id) {
-    return newFuture(() {
-      if (_getInput.containsKey(id)) return _getInput[id].future;
-    }).then((_) => transform.getInput(id));
+  Future<Asset> getInput(AggregateTransform transform, AssetId id) async {
+    if (_getInput.containsKey(id)) await _getInput[id].future;
+    return await transform.getInput(id);
   }
 
   /// Like [AggregateTransform.primaryInputs], but respects
@@ -169,14 +168,10 @@
     }).then((_) => transform.primaryInputs));
   }
 
-  Future<String> classifyPrimary(AssetId id) {
-    return newFuture(() => doClassifyPrimary(id)).then((result) {
-      return newFuture(() {
-        if (_classifyPrimary.containsKey(id)) {
-          return _classifyPrimary[id].future;
-        }
-      }).then((_) => result);
-    });
+  Future<String> classifyPrimary(AssetId id) async {
+    var result = await doClassifyPrimary(id);
+    if (_classifyPrimary.containsKey(id)) await _classifyPrimary[id].future;
+    return result;
   }
 
   Future apply(AggregateTransform transform) {
diff --git a/packages/barback/test/transformer/one_to_many.dart b/packages/barback/test/transformer/one_to_many.dart
index 0076680..05bea4d 100644
--- a/packages/barback/test/transformer/one_to_many.dart
+++ b/packages/barback/test/transformer/one_to_many.dart
@@ -23,15 +23,12 @@
 
   bool doIsPrimary(AssetId id) => id.extension == ".$extension";
 
-  Future doApply(Transform transform) {
-    return getPrimary(transform)
-        .then((input) => input.readAsString())
-        .then((lines) {
-      for (var line in lines.split(",")) {
-        var id = new AssetId(transform.primaryInput.id.package, line);
-        transform.addOutput(new Asset.fromString(id, "spread $extension"));
-      }
-    });
+  Future doApply(Transform transform) async {
+    var lines = await (await getPrimary(transform)).readAsString();
+    for (var line in lines.split(",")) {
+      var id = new AssetId(transform.primaryInput.id.package, line);
+      transform.addOutput(new Asset.fromString(id, "spread $extension"));
+    }
   }
 
   String toString() => "1->many $extension";
diff --git a/packages/barback/test/transformer/sync_rewrite.dart b/packages/barback/test/transformer/sync_rewrite.dart
index 00ee32e..1a906a7 100644
--- a/packages/barback/test/transformer/sync_rewrite.dart
+++ b/packages/barback/test/transformer/sync_rewrite.dart
@@ -4,8 +4,6 @@
 
 library barback.test.transformer.sync_rewrite;
 
-import 'dart:async';
-
 import 'package:barback/barback.dart';
 
 /// Like [DeclaringRewriteTransformer], but with no methods returning Futures.
diff --git a/packages/barback/test/utils.dart b/packages/barback/test/utils.dart
index c24b58c..edfbf65 100644
--- a/packages/barback/test/utils.dart
+++ b/packages/barback/test/utils.dart
@@ -114,9 +114,9 @@
 /// Each item in the list may either be an [AssetId] or a string that can be
 /// parsed as one.
 void updateSources(Iterable assets) {
-  assets = _parseAssets(assets);
-  schedule(() => _barback.updateSources(assets),
-      "updating ${assets.join(', ')}");
+  var parsed = _parseAssets(assets);
+  schedule(() => _barback.updateSources(parsed),
+      "updating ${parsed.join(', ')}");
 }
 
 /// Updates [assets] in the current [PackageProvider].
@@ -132,9 +132,9 @@
 /// Each item in the list may either be an [AssetId] or a string that can be
 /// parsed as one.
 void removeSources(Iterable assets) {
-  assets = _parseAssets(assets);
-  schedule(() => _barback.removeSources(assets),
-      "removing ${assets.join(', ')}");
+  var parsed = _parseAssets(assets);
+  schedule(() => _barback.removeSources(parsed),
+      "removing ${parsed.join(', ')}");
 }
 
 /// Removes [assets] from the current [PackageProvider].
@@ -155,7 +155,7 @@
 List<AssetId> _parseAssets(Iterable assets) {
   return assets.map((asset) {
     if (asset is String) return new AssetId.parse(asset);
-    return asset;
+    return asset as AssetId;
   }).toList();
 }
 
@@ -210,7 +210,9 @@
 /// Expects that the next [BuildResult] is a build success.
 void buildShouldSucceed() {
   expect(_getNextBuildResult("build should succeed").then((result) {
-    result.errors.forEach(currentSchedule.signalError);
+    for (var error in result.errors) {
+      currentSchedule.signalError(error);
+    }
     expect(result.succeeded, isTrue);
   }), completes);
 }
@@ -518,7 +520,7 @@
 
   static Map<String, AssetSet> _normalizeAssets(assets,
       Iterable<String> additionalPackages) {
-    var assetList;
+    Iterable<Asset> assetList;
     if (assets is Map) {
       assetList = assets.keys.map((asset) {
         var id = new AssetId.parse(asset);
@@ -532,8 +534,9 @@
       });
     }
 
-    var assetMap = mapMapValues(groupBy(assetList, (asset) => asset.id.package),
-        (package, assets) => new AssetSet.from(assets));
+    var assetMap = mapMapValues(
+        groupBy(assetList, (asset) => asset.id.package),
+        (_, assets) => new AssetSet.from(assets));
 
     // Make sure that packages that have transformers but no assets are
     // considered by MockProvider to exist.
@@ -563,7 +566,7 @@
   Stream<AssetId> getAllAssetIds(String package) =>
       new Stream.fromIterable(_assets[package].map((asset) => asset.id));
 
-  Future<Asset> getAsset(AssetId id) {
+  Future<Asset> getAsset(AssetId id) async {
     // Eagerly load the asset so we can test an asset's value changing between
     // when a load starts and when it finishes.
     var assets = _assets[id.package];
@@ -573,18 +576,11 @@
     if (_syncErrors.contains(id)) throw new MockLoadException(id);
     var hasError = _errors.contains(id);
 
-    var future;
-    if (_pauseCompleter != null) {
-      future = _pauseCompleter.future;
-    } else {
-      future = new Future.value();
-    }
+    if (_pauseCompleter != null) await _pauseCompleter.future;
 
-    return future.then((_) {
-      if (hasError) throw new MockLoadException(id);
-      if (asset == null) throw new AssetNotFoundException(id);
-      return asset;
-    });
+    if (hasError) throw new MockLoadException(id);
+    if (asset == null) throw new AssetNotFoundException(id);
+    return asset;
   }
 }
 
diff --git a/packages/charcode/.analysis_options b/packages/charcode/.analysis_options
new file mode 100644
index 0000000..b727f4d
--- /dev/null
+++ b/packages/charcode/.analysis_options
@@ -0,0 +1,29 @@
+analyzer:
+  strong-mode: true
+linter:
+  rules:
+     # Errors
+     - avoid_empty_else
+     - comment_references
+     - control_flow_in_finally
+     - empty_statements
+     - hash_and_equals
+     - test_types_in_equals
+     - throw_in_finally
+     - unrelated_type_equality_checks
+     - valid_regexps
+
+     # Style
+     - annotate_overrides
+     - avoid_init_to_null
+     - avoid_return_types_on_setters
+     - await_only_futures
+     - camel_case_types
+     - empty_catches
+     - empty_constructor_bodies
+     - library_names
+     - library_prefixes
+     - non_constant_identifier_names
+     - prefer_is_not_empty
+     - slash_for_doc_comments
+     - type_init_formals
diff --git a/packages/charcode/.gitignore b/packages/charcode/.gitignore
new file mode 100644
index 0000000..1d79863
--- /dev/null
+++ b/packages/charcode/.gitignore
@@ -0,0 +1,3 @@
+.packages
+.pub
+pubspec.lock
diff --git a/packages/charcode/.status b/packages/charcode/.status
new file mode 100644
index 0000000..59f3573
--- /dev/null
+++ b/packages/charcode/.status
@@ -0,0 +1,3 @@
+# Copyright (c) 2015, 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.
diff --git a/packages/charcode/.travis.yml b/packages/charcode/.travis.yml
new file mode 100644
index 0000000..b1279b7
--- /dev/null
+++ b/packages/charcode/.travis.yml
@@ -0,0 +1,3 @@
+language: dart
+script: ./tool/travis.sh
+sudo: false
diff --git a/packages/charcode/AUTHORS b/packages/charcode/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/packages/charcode/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/packages/charcode/CHANGELOG.md b/packages/charcode/CHANGELOG.md
new file mode 100644
index 0000000..83c2884
--- /dev/null
+++ b/packages/charcode/CHANGELOG.md
@@ -0,0 +1,9 @@
+## 1.1.1
+
+- Spelling fixes.
+
+- Linting fixes.
+
+## 1.1.0
+
+- Initial version
diff --git a/packages/charcode/CONTRIBUTING.md b/packages/charcode/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/packages/charcode/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/packages/charcode/README.md b/packages/charcode/README.md
index 35c4818..4eedcbe 100644
--- a/packages/charcode/README.md
+++ b/packages/charcode/README.md
@@ -1,19 +1,24 @@
 Character code constants.
 
-These libraries define symbolic names for some character codes.
+[![Build Status](https://travis-ci.org/dart-lang/charcode.svg?branch=master)](https://travis-ci.org/dart-lang/charcode)
+[![Pub](https://img.shields.io/pub/v/charcode.svg)](https://pub.dartlang.org/packages/charcode)
 
-This is not an official Goggle package, and is not supported by Google.
+These libraries define symbolic names for some character codes.
 
 ## Using
 
 Import either one of the libraries:
 
-    import "package:charcode/ascii.dart"
-    import "package:charcode/html_entity.dart"
+```dart
+import "package:charcode/ascii.dart";
+import "package:charcode/html_entity.dart";
+```
 
 or import both libraries using the `charcode.dart` library:
 
-    import "package:charcode/charcode.dart"
+```dart
+import "package:charcode/charcode.dart";
+```
 
 # Naming
 
@@ -25,15 +30,15 @@
 
 The names of letters are lower-case for lower-case letters, and mixed- or
 upper-case for upper-case letters. The names of symbols are all lower-case,
-and omit suffixes like "sign", "symbol" and "mark". E
-xamples: `$plus`, `$exclamation`
+and omit suffixes like "sign", "symbol" and "mark".
+Examples: `$plus`, `$exclamation`
 
 The `ascii.dart` library defines a symbolic name for each ASCII character.
-For some chraceters, it has more than one name. For example the common `$tab`
-and the official `$ht` for the horisontal tab.
+For some characters, it has more than one name. For example the common `$tab`
+and the official `$ht` for the horizontal tab.
 
 The `html_entity.dart` library defines a constant for each HTML 4.01 character
-entity, using the standard entity abbreviation, incluing its case.
+entity, using the standard entity abbreviation, including its case.
 Examples: `$nbsp` for `&nbps;`, `$aring` for the lower-case `&aring;`
 and `$Aring` for the upper-case `&Aring;`.
 
@@ -48,4 +53,4 @@
 The Dart language doesn't have character literals. If that ever happens, this
 library will be irrelevant. Until then, this library can be used for the most
 common characters.
-See [http://dartbug.com/4415](request for character literals).
+See [request for character literals](http://dartbug.com/4415).
diff --git a/packages/charcode/codereview.settings b/packages/charcode/codereview.settings
new file mode 100644
index 0000000..e031891
--- /dev/null
+++ b/packages/charcode/codereview.settings
@@ -0,0 +1,4 @@
+# This file is used by gcl to get repository specific information.
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/charcode/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/packages/charcode/lib/ascii.dart b/packages/charcode/lib/ascii.dart
index 48b51d0..319ab73 100644
--- a/packages/charcode/lib/ascii.dart
+++ b/packages/charcode/lib/ascii.dart
@@ -2,353 +2,507 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Declare integer constants for each ASCII character.
- *
- * The constants all start with "$" to avoid conflicting with other constants.
- *
- * For characters that are valid in an identifier, the character iteself
- * follows the "$". For other characters, a symbolic name is used.
- * In some cases, multiple alternative symbolic names are provided.
- * Please stick to using one name per character in your code.
- *
- * The symbolic names are, where applicable, the name of the symbol without
- * any "mark", "symbol" "sign" or "accent" suffix.
- * Examples: [$exclamation], [$pipe], [$dollar] and [$grave].
- * For less common symbols, a selection of common names are used.
- *
- * For parenthetical markers, there is both a short name, [$lparen]/[$rparen],
- * and a long name, [$open_paren]/ [$close_paren].
- *
- * For common HTML entities, the entity names are also useable as symbolic
- * names: [$apos], [$quot], [$lt], [$gt], and [$amp].
- */
+/// Declare integer constants for each ASCII character.
+///
+/// The constants all start with "$" to avoid conflicting with other constants.
+///
+/// For characters that are valid in an identifier, the character itself
+/// follows the "$". For other characters, a symbolic name is used.
+/// In some cases, multiple alternative symbolic names are provided.
+/// Please stick to using one name per character in your code.
+///
+/// The symbolic names are, where applicable, the name of the symbol without
+/// any "mark", "symbol" "sign" or "accent" suffix.
+/// Examples: [$exclamation], [$pipe], [$dollar] and [$grave].
+/// For less common symbols, a selection of common names are used.
+///
+/// For parenthetical markers, there is both a short name, [$lparen]/[$rparen],
+/// and a long name, [$open_paren]/ [$close_paren].
+///
+/// For common HTML entities, the entity names are also usable as symbolic
+/// names: [$apos], [$quot], [$lt], [$gt], and [$amp].
 library charcode.ascii.dollar_lowercase;
 
 // Control characters.
 
 /// "Null character" control character.
-const int $nul               = 0x00;
+const int $nul = 0x00;
+
 /// "Start of Header" control character.
-const int $soh               = 0x01;
+const int $soh = 0x01;
+
 /// "Start of Text" control character.
-const int $stx               = 0x02;
+const int $stx = 0x02;
+
 /// "End of Text" control character.
-const int $etx               = 0x03;
+const int $etx = 0x03;
+
 /// "End of Transmission" control character.
-const int $eot               = 0x04;
+const int $eot = 0x04;
+
 /// "Enquiry" control character.
-const int $enq               = 0x05;
+const int $enq = 0x05;
+
 /// "Acknowledgment" control character.
-const int $ack               = 0x06;
+const int $ack = 0x06;
+
 /// "Bell" control character.
-const int $bel               = 0x07;
+const int $bel = 0x07;
+
 /// "Backspace" control character.
-const int $bs                = 0x08;
+const int $bs = 0x08;
+
 /// "Horizontal Tab" control character.
-const int $ht                = 0x09;
+const int $ht = 0x09;
+
 /// "Horizontal Tab" control character, common name.
-const int $tab               = 0x09;
+const int $tab = 0x09;
+
 /// "Line feed" control character.
-const int $lf                = 0x0A;
+const int $lf = 0x0A;
+
 /// "Vertical Tab" control character.
-const int $vt                = 0x0B;
+const int $vt = 0x0B;
+
 /// "Form feed" control character.
-const int $ff                = 0x0C;
+const int $ff = 0x0C;
+
 /// "Carriage return" control character.
-const int $cr                = 0x0D;
+const int $cr = 0x0D;
+
 /// "Shift Out" control character.
-const int $so                = 0x0E;
+const int $so = 0x0E;
+
 /// "Shift In" control character.
-const int $si                = 0x0F;
+const int $si = 0x0F;
+
 /// "Data Link Escape" control character.
-const int $dle               = 0x10;
+const int $dle = 0x10;
+
 /// "Device Control 1" control character (oft. XON).
-const int $dc1               = 0x11;
+const int $dc1 = 0x11;
+
 /// "Device Control 2" control character.
-const int $dc2               = 0x12;
+const int $dc2 = 0x12;
+
 /// "Device Control 3" control character (oft. XOFF).
-const int $dc3               = 0x13;
+const int $dc3 = 0x13;
+
 /// "Device Control 4" control character.
-const int $dc4               = 0x14;
+const int $dc4 = 0x14;
+
 /// "Negative Acknowledgment" control character.
-const int $nak               = 0x15;
+const int $nak = 0x15;
+
 /// "Synchronous idle" control character.
-const int $syn               = 0x16;
+const int $syn = 0x16;
+
 /// "End of Transmission Block" control character.
-const int $etb               = 0x17;
+const int $etb = 0x17;
+
 /// "Cancel" control character.
-const int $can               = 0x18;
+const int $can = 0x18;
+
 /// "End of Medium" control character.
-const int $em                = 0x19;
+const int $em = 0x19;
+
 /// "Substitute" control character.
-const int $sub               = 0x1A;
+const int $sub = 0x1A;
+
 /// "Escape" control character.
-const int $esc               = 0x1B;
+const int $esc = 0x1B;
+
 /// "File Separator" control character.
-const int $fs                = 0x1C;
+const int $fs = 0x1C;
+
 /// "Group Separator" control character.
-const int $gs                = 0x1D;
+const int $gs = 0x1D;
+
 /// "Record Separator" control character.
-const int $rs                = 0x1E;
+const int $rs = 0x1E;
+
 /// "Unit Separator" control character.
-const int $us                = 0x1F;
+const int $us = 0x1F;
+
 /// "Delete" control character.
-const int $del               = 0x7F;
+const int $del = 0x7F;
 
 // Visible characters.
 
 /// Space character.
-const int $space             = 0x20;
+const int $space = 0x20;
+
 /// Character '!'.
-const int $exclamation       = 0x21;
+const int $exclamation = 0x21;
+
 /// Character '"', short name.
-const int $quot              = 0x22;
+const int $quot = 0x22;
+
 /// Character '"'.
-const int $quote             = 0x22;
+const int $quote = 0x22;
+
 /// Character '"'.
-const int $double_quote      = 0x22;
+const int $double_quote = 0x22;
+
 /// Character '"'.
-const int $quotation         = 0x22;
+const int $quotation = 0x22;
+
 /// Character '#'.
-const int $hash              = 0x23;
+const int $hash = 0x23;
+
 /// Character '$'.
-const int $$                 = 0x24;
+const int $$ = 0x24;
+
 /// Character '$'.
-const int $dollar            = 0x24;
+const int $dollar = 0x24;
+
 /// Character '%'.
-const int $percent           = 0x25;
+const int $percent = 0x25;
+
 /// Character '&', short name.
-const int $amp               = 0x26;
+const int $amp = 0x26;
+
 /// Character '&'.
-const int $ampersand         = 0x26;
+const int $ampersand = 0x26;
+
 /// Character "'".
-const int $apos              = 0x27;
+const int $apos = 0x27;
+
 /// Character '''.
-const int $apostrophe        = 0x27;
+const int $apostrophe = 0x27;
+
 /// Character '''.
-const int $single_quote      = 0x27;
+const int $single_quote = 0x27;
+
 /// Character '('.
-const int $lparen            = 0x28;
+const int $lparen = 0x28;
+
 /// Character '('.
-const int $open_paren        = 0x28;
+const int $open_paren = 0x28;
+
 /// Character '('.
-const int $open_parenthesis  = 0x28;
+const int $open_parenthesis = 0x28;
+
 /// Character ')'.
-const int $rparen            = 0x29;
+const int $rparen = 0x29;
+
 /// Character ')'.
-const int $close_paren       = 0x29;
+const int $close_paren = 0x29;
+
 /// Character ')'.
 const int $close_parenthesis = 0x29;
+
 /// Character '*'.
-const int $asterisk          = 0x2A;
+const int $asterisk = 0x2A;
+
 /// Character '+'.
-const int $plus              = 0x2B;
+const int $plus = 0x2B;
+
 /// Character ','.
-const int $comma             = 0x2C;
+const int $comma = 0x2C;
+
 /// Character '-'.
-const int $minus             = 0x2D;
+const int $minus = 0x2D;
+
 /// Character '-'.
-const int $dash              = 0x2D;
+const int $dash = 0x2D;
+
 /// Character '.'.
-const int $dot               = 0x2E;
+const int $dot = 0x2E;
+
 /// Character '.'.
-const int $fullstop          = 0x2E;
+const int $fullstop = 0x2E;
+
 /// Character '/'.
-const int $slash             = 0x2F;
+const int $slash = 0x2F;
+
 /// Character '/'.
-const int $solidus           = 0x2F;
+const int $solidus = 0x2F;
+
 /// Character '/'.
-const int $division          = 0x2F;
+const int $division = 0x2F;
+
 /// Character '0'.
-const int $0                 = 0x30;
+const int $0 = 0x30;
+
 /// Character '1'.
-const int $1                 = 0x31;
+const int $1 = 0x31;
+
 /// Character '2'.
-const int $2                 = 0x32;
+const int $2 = 0x32;
+
 /// Character '3'.
-const int $3                 = 0x33;
+const int $3 = 0x33;
+
 /// Character '4'.
-const int $4                 = 0x34;
+const int $4 = 0x34;
+
 /// Character '5'.
-const int $5                 = 0x35;
+const int $5 = 0x35;
+
 /// Character '6'.
-const int $6                 = 0x36;
+const int $6 = 0x36;
+
 /// Character '7'.
-const int $7                 = 0x37;
+const int $7 = 0x37;
+
 /// Character '8'.
-const int $8                 = 0x38;
+const int $8 = 0x38;
+
 /// Character '9'.
-const int $9                 = 0x39;
+const int $9 = 0x39;
+
 /// Character ':'.
-const int $colon             = 0x3A;
+const int $colon = 0x3A;
+
 /// Character ';'.
-const int $semicolon         = 0x3B;
+const int $semicolon = 0x3B;
+
 /// Character '<'.
-const int $lt                = 0x3C;
+const int $lt = 0x3C;
+
 /// Character '<'.
-const int $less_than         = 0x3C;
+const int $less_than = 0x3C;
+
 /// Character '<'.
-const int $langle            = 0x3C;
+const int $langle = 0x3C;
+
 /// Character '<'.
-const int $open_angle        = 0x3C;
+const int $open_angle = 0x3C;
+
 /// Character '='.
-const int $equal             = 0x3D;
+const int $equal = 0x3D;
+
 /// Character '>'.
-const int $gt                = 0x3E;
+const int $gt = 0x3E;
+
 /// Character '>'.
-const int $greater_than      = 0x3E;
+const int $greater_than = 0x3E;
+
 /// Character '>'.
-const int $rangle            = 0x3E;
+const int $rangle = 0x3E;
+
 /// Character '>'.
-const int $close_angle       = 0x3E;
+const int $close_angle = 0x3E;
+
 /// Character '?'.
-const int $question          = 0x3F;
+const int $question = 0x3F;
 
 /// Character '@'.
-const int $at                = 0x40;
+const int $at = 0x40;
+
 /// Character 'A'.
-const int $A                 = 0x41;
+const int $A = 0x41;
+
 /// Character 'B'.
-const int $B                 = 0x42;
+const int $B = 0x42;
+
 /// Character 'C'.
-const int $C                 = 0x43;
+const int $C = 0x43;
+
 /// Character 'D'.
-const int $D                 = 0x44;
+const int $D = 0x44;
+
 /// Character 'E'.
-const int $E                 = 0x45;
+const int $E = 0x45;
+
 /// Character 'F'.
-const int $F                 = 0x46;
+const int $F = 0x46;
+
 /// Character 'G'.
-const int $G                 = 0x47;
+const int $G = 0x47;
+
 /// Character 'H'.
-const int $H                 = 0x48;
+const int $H = 0x48;
+
 /// Character 'I'.
-const int $I                 = 0x49;
+const int $I = 0x49;
+
 /// Character 'J'.
-const int $J                 = 0x4A;
+const int $J = 0x4A;
+
 /// Character 'K'.
-const int $K                 = 0x4B;
+const int $K = 0x4B;
+
 /// Character 'L'.
-const int $L                 = 0x4C;
+const int $L = 0x4C;
+
 /// Character 'M'.
-const int $M                 = 0x4D;
+const int $M = 0x4D;
+
 /// Character 'N'.
-const int $N                 = 0x4E;
+const int $N = 0x4E;
+
 /// Character 'O'.
-const int $O                 = 0x4F;
+const int $O = 0x4F;
+
 /// Character 'P'.
-const int $P                 = 0x50;
+const int $P = 0x50;
+
 /// Character 'Q'.
-const int $Q                 = 0x51;
+const int $Q = 0x51;
+
 /// Character 'R'.
-const int $R                 = 0x52;
+const int $R = 0x52;
+
 /// Character 'S'.
-const int $S                 = 0x53;
+const int $S = 0x53;
+
 /// Character 'T'.
-const int $T                 = 0x54;
+const int $T = 0x54;
+
 /// Character 'U'.
-const int $U                 = 0x55;
+const int $U = 0x55;
+
 /// Character 'V'.
-const int $V                 = 0x56;
+const int $V = 0x56;
+
 /// Character 'W'.
-const int $W                 = 0x57;
+const int $W = 0x57;
+
 /// Character 'X'.
-const int $X                 = 0x58;
+const int $X = 0x58;
+
 /// Character 'Y'.
-const int $Y                 = 0x59;
+const int $Y = 0x59;
+
 /// Character 'Z'.
-const int $Z                 = 0x5A;
+const int $Z = 0x5A;
+
 /// Character '['.
-const int $lbracket          = 0x5B;
+const int $lbracket = 0x5B;
+
 /// Character '['.
-const int $open_bracket      = 0x5B;
+const int $open_bracket = 0x5B;
+
 /// Character '\'.
-const int $backslash         = 0x5C;
+const int $backslash = 0x5C;
+
 /// Character ']'.
-const int $rbracket          = 0x5D;
+const int $rbracket = 0x5D;
+
 /// Character ']'.
-const int $close_bracket     = 0x5D;
+const int $close_bracket = 0x5D;
+
 /// Character '^'.
-const int $circumflex        = 0x5E;
+const int $circumflex = 0x5E;
+
 /// Character '^'.
-const int $caret             = 0x5E;
+const int $caret = 0x5E;
+
 /// Character '^'.
-const int $hat               = 0x5E;
+const int $hat = 0x5E;
+
 /// Character '_'.
-const int $_                 = 0x5F;
+const int $_ = 0x5F;
+
 /// Character '_'.
-const int $underscore        = 0x5F;
+const int $underscore = 0x5F;
+
 /// Character '_'.
-const int $underline         = 0x5F;
+const int $underline = 0x5F;
 
 /// Character '`'.
-const int $backquote         = 0x60;
+const int $backquote = 0x60;
+
 /// Character '`'.
-const int $grave             = 0x60;
+const int $grave = 0x60;
+
 /// Character 'a'.
-const int $a                 = 0x61;
+const int $a = 0x61;
+
 /// Character 'b'.
-const int $b                 = 0x62;
+const int $b = 0x62;
+
 /// Character 'c'.
-const int $c                 = 0x63;
+const int $c = 0x63;
+
 /// Character 'd'.
-const int $d                 = 0x64;
+const int $d = 0x64;
+
 /// Character 'e'.
-const int $e                 = 0x65;
+const int $e = 0x65;
+
 /// Character 'f'.
-const int $f                 = 0x66;
+const int $f = 0x66;
+
 /// Character 'g'.
-const int $g                 = 0x67;
+const int $g = 0x67;
+
 /// Character 'h'.
-const int $h                 = 0x68;
+const int $h = 0x68;
+
 /// Character 'i'.
-const int $i                 = 0x69;
+const int $i = 0x69;
+
 /// Character 'j'.
-const int $j                 = 0x6A;
+const int $j = 0x6A;
+
 /// Character 'k'.
-const int $k                 = 0x6B;
+const int $k = 0x6B;
+
 /// Character 'l'.
-const int $l                 = 0x6C;
+const int $l = 0x6C;
+
 /// Character 'm'.
-const int $m                 = 0x6D;
+const int $m = 0x6D;
+
 /// Character 'n'.
-const int $n                 = 0x6E;
+const int $n = 0x6E;
+
 /// Character 'o'.
-const int $o                 = 0x6F;
+const int $o = 0x6F;
+
 /// Character 'p'.
-const int $p                 = 0x70;
+const int $p = 0x70;
+
 /// Character 'q'.
-const int $q                 = 0x71;
+const int $q = 0x71;
+
 /// Character 'r'.
-const int $r                 = 0x72;
+const int $r = 0x72;
+
 /// Character 's'.
-const int $s                 = 0x73;
+const int $s = 0x73;
+
 /// Character 't'.
-const int $t                 = 0x74;
+const int $t = 0x74;
+
 /// Character 'u'.
-const int $u                 = 0x75;
+const int $u = 0x75;
+
 /// Character 'v'.
-const int $v                 = 0x76;
+const int $v = 0x76;
+
 /// Character 'w'.
-const int $w                 = 0x77;
+const int $w = 0x77;
+
 /// Character 'x'.
-const int $x                 = 0x78;
+const int $x = 0x78;
+
 /// Character 'y'.
-const int $y                 = 0x79;
+const int $y = 0x79;
+
 /// Character 'z'.
-const int $z                 = 0x7A;
+const int $z = 0x7A;
+
 /// Character '{'.
-const int $lbrace            = 0x7B;
+const int $lbrace = 0x7B;
+
 /// Character '{'.
-const int $open_brace        = 0x7B;
+const int $open_brace = 0x7B;
+
 /// Character '|'.
-const int $pipe              = 0x7C;
+const int $pipe = 0x7C;
+
 /// Character '|'.
-const int $bar               = 0x7C;
+const int $bar = 0x7C;
+
 /// Character '}'.
-const int $rbrace            = 0x7D;
+const int $rbrace = 0x7D;
+
 /// Character '}'.
-const int $close_brace       = 0x7D;
+const int $close_brace = 0x7D;
+
 /// Character '~'.
-const int $tilde             = 0x7E;
+const int $tilde = 0x7E;
diff --git a/packages/charcode/lib/charcode.dart b/packages/charcode/lib/charcode.dart
index a47fc19..6a702d7 100644
--- a/packages/charcode/lib/charcode.dart
+++ b/packages/charcode/lib/charcode.dart
@@ -2,17 +2,15 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Defines symbolic names for character code points.
- *
- * Includes all ASCII and Latin-1 characters.
- *
- * Exports the libraries `ascii.dart` and `html_entity.dart`.
- *
- * Hides the characters `$minus`, `$sub` and `$tilde` from
- * `html_entities.dart`, since other characters have the same name in
- * `ascii.dart`.
- */
+/// Defines symbolic names for character code points.
+///
+/// Includes all ASCII and Latin-1 characters.
+///
+/// Exports the libraries `ascii.dart` and `html_entity.dart`.
+///
+/// Hides the characters `$minus`, `$sub` and `$tilde` from
+/// `html_entities.dart`, since other characters have the same name in
+/// `ascii.dart`.
 library charcode;
 
 export "ascii.dart";
diff --git a/packages/charcode/lib/html_entity.dart b/packages/charcode/lib/html_entity.dart
index 507afd4..fa7c493 100644
--- a/packages/charcode/lib/html_entity.dart
+++ b/packages/charcode/lib/html_entity.dart
@@ -2,522 +2,768 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Character codes based on HTML 4.01 character entity names.
- *
- * For each entity name, e.g., `nbsp`,
- * a constant with that name prefixed by `$` is defined
- * for that entity's code point.
- *
- * The HTML entities include the non-ASCII Latin-1 characters and
- * symbols, mathematical symbols and Greek litters.
- *
- * The five characters that are ASCII
- * are exported from the `ascii.dart` library.
- *
- * Three names conflict with `ascii.dart`: `$minus`, `$sub` and `$tilde`.
- * If importing both libraries, these three should be hidden from one of the
- * libraries.
- */
+/// Character codes based on HTML 4.01 character entity names.
+///
+/// For each entity name, e.g., `nbsp`,
+/// a constant with that name prefixed by `$` is defined
+/// for that entity's code point.
+///
+/// The HTML entities include the non-ASCII Latin-1 characters and
+/// symbols, mathematical symbols and Greek litters.
+///
+/// The five characters that are ASCII
+/// are exported from the `ascii.dart` library.
+///
+/// Three names conflict with `ascii.dart`: `$minus`, `$sub` and `$tilde`.
+/// If importing both libraries, these three should be hidden from one of the
+/// libraries.
 library charcode.htmlentity.dollar_lowercase;
 
 export "ascii.dart" show $quot, $amp, $apos, $lt, $gt;
 
 /// no-break space (non-breaking space)
-const int $nbsp     = 0x00A0;
+const int $nbsp = 0x00A0;
+
 /// inverted exclamation mark ('¡')
-const int $iexcl    = 0x00A1;
+const int $iexcl = 0x00A1;
+
 /// cent sign ('¢')
-const int $cent     = 0x00A2;
+const int $cent = 0x00A2;
+
 /// pound sign ('£')
-const int $pound    = 0x00A3;
+const int $pound = 0x00A3;
+
 /// currency sign ('¤')
-const int $curren   = 0x00A4;
+const int $curren = 0x00A4;
+
 /// yen sign (yuan sign) ('¥')
-const int $yen      = 0x00A5;
+const int $yen = 0x00A5;
+
 /// broken bar (broken vertical bar) ('¦')
-const int $brvbar   = 0x00A6;
+const int $brvbar = 0x00A6;
+
 /// section sign ('§')
-const int $sect     = 0x00A7;
+const int $sect = 0x00A7;
+
 /// diaeresis (spacing diaeresis); see Germanic umlaut ('¨')
-const int $uml      = 0x00A8;
+const int $uml = 0x00A8;
+
 /// copyright symbol ('©')
-const int $copy     = 0x00A9;
+const int $copy = 0x00A9;
+
 /// feminine ordinal indicator ('ª')
-const int $ordf     = 0x00AA;
+const int $ordf = 0x00AA;
+
 /// left-pointing double angle quotation mark (left pointing guillemet) ('«')
-const int $laquo    = 0x00AB;
+const int $laquo = 0x00AB;
+
 /// not sign ('¬')
-const int $not      = 0x00AC;
+const int $not = 0x00AC;
+
 /// soft hyphen (discretionary hyphen)
-const int $shy      = 0x00AD;
+const int $shy = 0x00AD;
+
 /// registered sign (registered trademark symbol) ('®')
-const int $reg      = 0x00AE;
+const int $reg = 0x00AE;
+
 /// macron (spacing macron, overline, APL overbar) ('¯')
-const int $macr     = 0x00AF;
+const int $macr = 0x00AF;
+
 /// degree symbol ('°')
-const int $deg      = 0x00B0;
+const int $deg = 0x00B0;
+
 /// plus-minus sign (plus-or-minus sign) ('±')
-const int $plusmn   = 0x00B1;
+const int $plusmn = 0x00B1;
+
 /// superscript two (superscript digit two, squared) ('²')
-const int $sup2     = 0x00B2;
+const int $sup2 = 0x00B2;
+
 /// superscript three (superscript digit three, cubed) ('³')
-const int $sup3     = 0x00B3;
+const int $sup3 = 0x00B3;
+
 /// acute accent (spacing acute) ('´')
-const int $acute    = 0x00B4;
+const int $acute = 0x00B4;
+
 /// micro sign ('µ')
-const int $micro    = 0x00B5;
+const int $micro = 0x00B5;
+
 /// pilcrow sign (paragraph sign) ('¶')
-const int $para     = 0x00B6;
+const int $para = 0x00B6;
+
 /// middle dot (Georgian comma, Greek middle dot) ('·')
-const int $middot   = 0x00B7;
+const int $middot = 0x00B7;
+
 /// cedilla (spacing cedilla) ('¸')
-const int $cedil    = 0x00B8;
+const int $cedil = 0x00B8;
+
 /// superscript one (superscript digit one) ('¹')
-const int $sup1     = 0x00B9;
+const int $sup1 = 0x00B9;
+
 /// masculine ordinal indicator ('º')
-const int $ordm     = 0x00BA;
+const int $ordm = 0x00BA;
+
 /// right-pointing double angle quotation mark (right pointing guillemet) ('»')
-const int $raquo    = 0x00BB;
+const int $raquo = 0x00BB;
+
 /// vulgar fraction one quarter (fraction one quarter) ('¼')
-const int $frac14   = 0x00BC;
+const int $frac14 = 0x00BC;
+
 /// vulgar fraction one half (fraction one half) ('½')
-const int $frac12   = 0x00BD;
+const int $frac12 = 0x00BD;
+
 /// vulgar fraction three quarters (fraction three quarters) ('¾')
-const int $frac34   = 0x00BE;
+const int $frac34 = 0x00BE;
+
 /// inverted question mark (turned question mark) ('¿')
-const int $iquest   = 0x00BF;
+const int $iquest = 0x00BF;
+
 /// Latin capital letter A with grave accent (Latin capital letter A grave) ('À')
-const int $Agrave   = 0x00C0;
+const int $Agrave = 0x00C0;
+
 /// Latin capital letter A with acute accent ('Á')
-const int $Aacute   = 0x00C1;
+const int $Aacute = 0x00C1;
+
 /// Latin capital letter A with circumflex ('Â')
-const int $Acirc    = 0x00C2;
+const int $Acirc = 0x00C2;
+
 /// Latin capital letter A with tilde ('Ã')
-const int $Atilde   = 0x00C3;
+const int $Atilde = 0x00C3;
+
 /// Latin capital letter A with diaeresis ('Ä')
-const int $Auml     = 0x00C4;
+const int $Auml = 0x00C4;
+
 /// Latin capital letter A with ring above (Latin capital letter A ring) ('Å')
-const int $Aring    = 0x00C5;
+const int $Aring = 0x00C5;
+
 /// Latin capital letter AE (Latin capital ligature AE) ('Æ')
-const int $AElig    = 0x00C6;
+const int $AElig = 0x00C6;
+
 /// Latin capital letter C with cedilla ('Ç')
-const int $Ccedil   = 0x00C7;
+const int $Ccedil = 0x00C7;
+
 /// Latin capital letter E with grave accent ('È')
-const int $Egrave   = 0x00C8;
+const int $Egrave = 0x00C8;
+
 /// Latin capital letter E with acute accent ('É')
-const int $Eacute   = 0x00C9;
+const int $Eacute = 0x00C9;
+
 /// Latin capital letter E with circumflex ('Ê')
-const int $Ecirc    = 0x00CA;
+const int $Ecirc = 0x00CA;
+
 /// Latin capital letter E with diaeresis ('Ë')
-const int $Euml     = 0x00CB;
+const int $Euml = 0x00CB;
+
 /// Latin capital letter I with grave accent ('Ì')
-const int $Igrave   = 0x00CC;
+const int $Igrave = 0x00CC;
+
 /// Latin capital letter I with acute accent ('Í')
-const int $Iacute   = 0x00CD;
+const int $Iacute = 0x00CD;
+
 /// Latin capital letter I with circumflex ('Î')
-const int $Icirc    = 0x00CE;
+const int $Icirc = 0x00CE;
+
 /// Latin capital letter I with diaeresis ('Ï')
-const int $Iuml     = 0x00CF;
+const int $Iuml = 0x00CF;
+
 /// Latin capital letter Eth ('Ð')
-const int $ETH      = 0x00D0;
+const int $ETH = 0x00D0;
+
 /// Latin capital letter N with tilde ('Ñ')
-const int $Ntilde   = 0x00D1;
+const int $Ntilde = 0x00D1;
+
 /// Latin capital letter O with grave accent ('Ò')
-const int $Ograve   = 0x00D2;
+const int $Ograve = 0x00D2;
+
 /// Latin capital letter O with acute accent ('Ó')
-const int $Oacute   = 0x00D3;
+const int $Oacute = 0x00D3;
+
 /// Latin capital letter O with circumflex ('Ô')
-const int $Ocirc    = 0x00D4;
+const int $Ocirc = 0x00D4;
+
 /// Latin capital letter O with tilde ('Õ')
-const int $Otilde   = 0x00D5;
+const int $Otilde = 0x00D5;
+
 /// Latin capital letter O with diaeresis ('Ö')
-const int $Ouml     = 0x00D6;
+const int $Ouml = 0x00D6;
+
 /// multiplication sign ('×')
-const int $times    = 0x00D7;
+const int $times = 0x00D7;
+
 /// Latin capital letter O with stroke (Latin capital letter O slash) ('Ø')
-const int $Oslash   = 0x00D8;
+const int $Oslash = 0x00D8;
+
 /// Latin capital letter U with grave accent ('Ù')
-const int $Ugrave   = 0x00D9;
+const int $Ugrave = 0x00D9;
+
 /// Latin capital letter U with acute accent ('Ú')
-const int $Uacute   = 0x00DA;
+const int $Uacute = 0x00DA;
+
 /// Latin capital letter U with circumflex ('Û')
-const int $Ucirc    = 0x00DB;
+const int $Ucirc = 0x00DB;
+
 /// Latin capital letter U with diaeresis ('Ü')
-const int $Uuml     = 0x00DC;
+const int $Uuml = 0x00DC;
+
 /// Latin capital letter Y with acute accent ('Ý')
-const int $Yacute   = 0x00DD;
+const int $Yacute = 0x00DD;
+
 /// Latin capital letter THORN ('Þ')
-const int $THORN    = 0x00DE;
+const int $THORN = 0x00DE;
+
 /// Latin small letter sharp s (ess-zed); see German Eszett ('ß')
-const int $szlig    = 0x00DF;
+const int $szlig = 0x00DF;
+
 /// Latin small letter a with grave accent ('à')
-const int $agrave   = 0x00E0;
+const int $agrave = 0x00E0;
+
 /// Latin small letter a with acute accent ('á')
-const int $aacute   = 0x00E1;
+const int $aacute = 0x00E1;
+
 /// Latin small letter a with circumflex ('â')
-const int $acirc    = 0x00E2;
+const int $acirc = 0x00E2;
+
 /// Latin small letter a with tilde ('ã')
-const int $atilde   = 0x00E3;
+const int $atilde = 0x00E3;
+
 /// Latin small letter a with diaeresis ('ä')
-const int $auml     = 0x00E4;
+const int $auml = 0x00E4;
+
 /// Latin small letter a with ring above ('å')
-const int $aring    = 0x00E5;
+const int $aring = 0x00E5;
+
 /// Latin small letter ae (Latin small ligature ae) ('æ')
-const int $aelig    = 0x00E6;
+const int $aelig = 0x00E6;
+
 /// Latin small letter c with cedilla ('ç')
-const int $ccedil   = 0x00E7;
+const int $ccedil = 0x00E7;
+
 /// Latin small letter e with grave accent ('è')
-const int $egrave   = 0x00E8;
+const int $egrave = 0x00E8;
+
 /// Latin small letter e with acute accent ('é')
-const int $eacute   = 0x00E9;
+const int $eacute = 0x00E9;
+
 /// Latin small letter e with circumflex ('ê')
-const int $ecirc    = 0x00EA;
+const int $ecirc = 0x00EA;
+
 /// Latin small letter e with diaeresis ('ë')
-const int $euml     = 0x00EB;
+const int $euml = 0x00EB;
+
 /// Latin small letter i with grave accent ('ì')
-const int $igrave   = 0x00EC;
+const int $igrave = 0x00EC;
+
 /// Latin small letter i with acute accent ('í')
-const int $iacute   = 0x00ED;
+const int $iacute = 0x00ED;
+
 /// Latin small letter i with circumflex ('î')
-const int $icirc    = 0x00EE;
+const int $icirc = 0x00EE;
+
 /// Latin small letter i with diaeresis ('ï')
-const int $iuml     = 0x00EF;
+const int $iuml = 0x00EF;
+
 /// Latin small letter eth ('ð')
-const int $eth      = 0x00F0;
+const int $eth = 0x00F0;
+
 /// Latin small letter n with tilde ('ñ')
-const int $ntilde   = 0x00F1;
+const int $ntilde = 0x00F1;
+
 /// Latin small letter o with grave accent ('ò')
-const int $ograve   = 0x00F2;
+const int $ograve = 0x00F2;
+
 /// Latin small letter o with acute accent ('ó')
-const int $oacute   = 0x00F3;
+const int $oacute = 0x00F3;
+
 /// Latin small letter o with circumflex ('ô')
-const int $ocirc    = 0x00F4;
+const int $ocirc = 0x00F4;
+
 /// Latin small letter o with tilde ('õ')
-const int $otilde   = 0x00F5;
+const int $otilde = 0x00F5;
+
 /// Latin small letter o with diaeresis ('ö')
-const int $ouml     = 0x00F6;
+const int $ouml = 0x00F6;
+
 /// division sign (obelus) ('÷')
-const int $divide   = 0x00F7;
+const int $divide = 0x00F7;
+
 /// Latin small letter o with stroke (Latin small letter o slash) ('ø')
-const int $oslash   = 0x00F8;
+const int $oslash = 0x00F8;
+
 /// Latin small letter u with grave accent ('ù')
-const int $ugrave   = 0x00F9;
+const int $ugrave = 0x00F9;
+
 /// Latin small letter u with acute accent ('ú')
-const int $uacute   = 0x00FA;
+const int $uacute = 0x00FA;
+
 /// Latin small letter u with circumflex ('û')
-const int $ucirc    = 0x00FB;
+const int $ucirc = 0x00FB;
+
 /// Latin small letter u with diaeresis ('ü')
-const int $uuml     = 0x00FC;
+const int $uuml = 0x00FC;
+
 /// Latin small letter y with acute accent ('ý')
-const int $yacute   = 0x00FD;
+const int $yacute = 0x00FD;
+
 /// Latin small letter thorn ('þ')
-const int $thorn    = 0x00FE;
+const int $thorn = 0x00FE;
+
 /// Latin small letter y with diaeresis ('ÿ')
-const int $yuml     = 0x00FF;
+const int $yuml = 0x00FF;
+
 /// Latin capital ligature oe ('Œ')
-const int $OElig    = 0x0152;
+const int $OElig = 0x0152;
+
 /// Latin small ligature oe ('œ')
-const int $oelig    = 0x0153;
+const int $oelig = 0x0153;
+
 /// Latin capital letter s with caron ('Š')
-const int $Scaron   = 0x0160;
+const int $Scaron = 0x0160;
+
 /// Latin small letter s with caron ('š')
-const int $scaron   = 0x0161;
+const int $scaron = 0x0161;
+
 /// Latin capital letter y with diaeresis ('Ÿ')
-const int $Yuml     = 0x0178;
+const int $Yuml = 0x0178;
+
 /// Latin small letter f with hook (function, florin) ('ƒ')
-const int $fnof     = 0x0192;
+const int $fnof = 0x0192;
+
 /// modifier letter circumflex accent ('ˆ')
-const int $circ     = 0x02C6;
+const int $circ = 0x02C6;
+
 /// small tilde ('˜')
-const int $tilde    = 0x02DC;
+const int $tilde = 0x02DC;
+
 /// Greek capital letter Alpha ('Α')
-const int $Alpha    = 0x0391;
+const int $Alpha = 0x0391;
+
 /// Greek capital letter Beta ('Β')
-const int $Beta     = 0x0392;
+const int $Beta = 0x0392;
+
 /// Greek capital letter Gamma ('Γ')
-const int $Gamma    = 0x0393;
+const int $Gamma = 0x0393;
+
 /// Greek capital letter Delta ('Δ')
-const int $Delta    = 0x0394;
+const int $Delta = 0x0394;
+
 /// Greek capital letter Epsilon ('Ε')
-const int $Epsilon  = 0x0395;
+const int $Epsilon = 0x0395;
+
 /// Greek capital letter Zeta ('Ζ')
-const int $Zeta     = 0x0396;
+const int $Zeta = 0x0396;
+
 /// Greek capital letter Eta ('Η')
-const int $Eta      = 0x0397;
+const int $Eta = 0x0397;
+
 /// Greek capital letter Theta ('Θ')
-const int $Theta    = 0x0398;
+const int $Theta = 0x0398;
+
 /// Greek capital letter Iota ('Ι')
-const int $Iota     = 0x0399;
+const int $Iota = 0x0399;
+
 /// Greek capital letter Kappa ('Κ')
-const int $Kappa    = 0x039A;
+const int $Kappa = 0x039A;
+
 /// Greek capital letter Lambda ('Λ')
-const int $Lambda   = 0x039B;
+const int $Lambda = 0x039B;
+
 /// Greek capital letter Mu ('Μ')
-const int $Mu       = 0x039C;
+const int $Mu = 0x039C;
+
 /// Greek capital letter Nu ('Ν')
-const int $Nu       = 0x039D;
+const int $Nu = 0x039D;
+
 /// Greek capital letter Xi ('Ξ')
-const int $Xi       = 0x039E;
+const int $Xi = 0x039E;
+
 /// Greek capital letter Omicron ('Ο')
-const int $Omicron  = 0x039F;
+const int $Omicron = 0x039F;
+
 /// Greek capital letter Pi ('Π')
-const int $Pi       = 0x03A0;
+const int $Pi = 0x03A0;
+
 /// Greek capital letter Rho ('Ρ')
-const int $Rho      = 0x03A1;
+const int $Rho = 0x03A1;
+
 /// Greek capital letter Sigma ('Σ')
-const int $Sigma    = 0x03A3;
+const int $Sigma = 0x03A3;
+
 /// Greek capital letter Tau ('Τ')
-const int $Tau      = 0x03A4;
+const int $Tau = 0x03A4;
+
 /// Greek capital letter Upsilon ('Υ')
-const int $Upsilon  = 0x03A5;
+const int $Upsilon = 0x03A5;
+
 /// Greek capital letter Phi ('Φ')
-const int $Phi      = 0x03A6;
+const int $Phi = 0x03A6;
+
 /// Greek capital letter Chi ('Χ')
-const int $Chi      = 0x03A7;
+const int $Chi = 0x03A7;
+
 /// Greek capital letter Psi ('Ψ')
-const int $Psi      = 0x03A8;
+const int $Psi = 0x03A8;
+
 /// Greek capital letter Omega ('Ω')
-const int $Omega    = 0x03A9;
+const int $Omega = 0x03A9;
+
 /// Greek small letter alpha ('α')
-const int $alpha    = 0x03B1;
+const int $alpha = 0x03B1;
+
 /// Greek small letter beta ('β')
-const int $beta     = 0x03B2;
+const int $beta = 0x03B2;
+
 /// Greek small letter gamma ('γ')
-const int $gamma    = 0x03B3;
+const int $gamma = 0x03B3;
+
 /// Greek small letter delta ('δ')
-const int $delta    = 0x03B4;
+const int $delta = 0x03B4;
+
 /// Greek small letter epsilon ('ε')
-const int $epsilon  = 0x03B5;
+const int $epsilon = 0x03B5;
+
 /// Greek small letter zeta ('ζ')
-const int $zeta     = 0x03B6;
+const int $zeta = 0x03B6;
+
 /// Greek small letter eta ('η')
-const int $eta      = 0x03B7;
+const int $eta = 0x03B7;
+
 /// Greek small letter theta ('θ')
-const int $theta    = 0x03B8;
+const int $theta = 0x03B8;
+
 /// Greek small letter iota ('ι')
-const int $iota     = 0x03B9;
+const int $iota = 0x03B9;
+
 /// Greek small letter kappa ('κ')
-const int $kappa    = 0x03BA;
+const int $kappa = 0x03BA;
+
 /// Greek small letter lambda ('λ')
-const int $lambda   = 0x03BB;
+const int $lambda = 0x03BB;
+
 /// Greek small letter mu ('μ')
-const int $mu       = 0x03BC;
+const int $mu = 0x03BC;
+
 /// Greek small letter nu ('ν')
-const int $nu       = 0x03BD;
+const int $nu = 0x03BD;
+
 /// Greek small letter xi ('ξ')
-const int $xi       = 0x03BE;
+const int $xi = 0x03BE;
+
 /// Greek small letter omicron ('ο')
-const int $omicron  = 0x03BF;
+const int $omicron = 0x03BF;
+
 /// Greek small letter pi ('π')
-const int $pi       = 0x03C0;
+const int $pi = 0x03C0;
+
 /// Greek small letter rho ('ρ')
-const int $rho      = 0x03C1;
+const int $rho = 0x03C1;
+
 /// Greek small letter final sigma ('ς')
-const int $sigmaf   = 0x03C2;
+const int $sigmaf = 0x03C2;
+
 /// Greek small letter sigma ('σ')
-const int $sigma    = 0x03C3;
+const int $sigma = 0x03C3;
+
 /// Greek small letter tau ('τ')
-const int $tau      = 0x03C4;
+const int $tau = 0x03C4;
+
 /// Greek small letter upsilon ('υ')
-const int $upsilon  = 0x03C5;
+const int $upsilon = 0x03C5;
+
 /// Greek small letter phi ('φ')
-const int $phi      = 0x03C6;
+const int $phi = 0x03C6;
+
 /// Greek small letter chi ('χ')
-const int $chi      = 0x03C7;
+const int $chi = 0x03C7;
+
 /// Greek small letter psi ('ψ')
-const int $psi      = 0x03C8;
+const int $psi = 0x03C8;
+
 /// Greek small letter omega ('ω')
-const int $omega    = 0x03C9;
+const int $omega = 0x03C9;
+
 /// Greek theta symbol ('ϑ')
 const int $thetasym = 0x03D1;
+
 /// Greek Upsilon with hook symbol ('ϒ')
-const int $upsih    = 0x03D2;
+const int $upsih = 0x03D2;
+
 /// Greek pi symbol ('ϖ')
-const int $piv      = 0x03D6;
+const int $piv = 0x03D6;
+
 /// en space
-const int $ensp     = 0x2002;
+const int $ensp = 0x2002;
+
 /// em space
-const int $emsp     = 0x2003;
+const int $emsp = 0x2003;
+
 /// thin space
-const int $thinsp   = 0x2009;
+const int $thinsp = 0x2009;
+
 /// zero-width non-joiner
-const int $zwnj     = 0x200C;
+const int $zwnj = 0x200C;
+
 /// zero-width joiner
-const int $zwj      = 0x200D;
+const int $zwj = 0x200D;
+
 /// left-to-right mark
-const int $lrm      = 0x200E;
+const int $lrm = 0x200E;
+
 /// right-to-left mark
-const int $rlm      = 0x200F;
+const int $rlm = 0x200F;
+
 /// en dash ('–')
-const int $ndash    = 0x2013;
+const int $ndash = 0x2013;
+
 /// em dash ('—')
-const int $mdash    = 0x2014;
+const int $mdash = 0x2014;
+
 /// left single quotation mark ('‘')
-const int $lsquo    = 0x2018;
+const int $lsquo = 0x2018;
+
 /// right single quotation mark ('’')
-const int $rsquo    = 0x2019;
+const int $rsquo = 0x2019;
+
 /// single low-9 quotation mark ('‚')
-const int $sbquo    = 0x201A;
+const int $sbquo = 0x201A;
+
 /// left double quotation mark ('“')
-const int $ldquo    = 0x201C;
+const int $ldquo = 0x201C;
+
 /// right double quotation mark ('”')
-const int $rdquo    = 0x201D;
+const int $rdquo = 0x201D;
+
 /// double low-9 quotation mark ('„')
-const int $bdquo    = 0x201E;
+const int $bdquo = 0x201E;
+
 /// dagger, obelisk ('†')
-const int $dagger   = 0x2020;
+const int $dagger = 0x2020;
+
 /// double dagger, double obelisk ('‡')
-const int $Dagger   = 0x2021;
+const int $Dagger = 0x2021;
+
 /// bullet (black small circle) ('•')
-const int $bull     = 0x2022;
+const int $bull = 0x2022;
+
 /// horizontal ellipsis (three dot leader) ('…')
-const int $hellip   = 0x2026;
+const int $hellip = 0x2026;
+
 /// per mille sign ('‰')
-const int $permil   = 0x2030;
+const int $permil = 0x2030;
+
 /// prime (minutes, feet) ('′')
-const int $prime    = 0x2032;
+const int $prime = 0x2032;
+
 /// double prime (seconds, inches) ('″')
-const int $Prime    = 0x2033;
+const int $Prime = 0x2033;
+
 /// single left-pointing angle quotation mark ('‹')
-const int $lsaquo   = 0x2039;
+const int $lsaquo = 0x2039;
+
 /// single right-pointing angle quotation mark ('›')
-const int $rsaquo   = 0x203A;
+const int $rsaquo = 0x203A;
+
 /// overline (spacing overscore) ('‾')
-const int $oline    = 0x203E;
+const int $oline = 0x203E;
+
 /// fraction slash (solidus) ('⁄')
-const int $frasl    = 0x2044;
+const int $frasl = 0x2044;
+
 /// euro sign ('€')
-const int $euro     = 0x20AC;
+const int $euro = 0x20AC;
+
 /// black-letter capital I (imaginary part) ('ℑ')
-const int $image    = 0x2111;
+const int $image = 0x2111;
+
 /// script capital P (power set, Weierstrass p) ('℘')
-const int $weierp   = 0x2118;
+const int $weierp = 0x2118;
+
 /// black-letter capital R (real part symbol) ('ℜ')
-const int $real     = 0x211C;
+const int $real = 0x211C;
+
 /// trademark symbol ('™')
-const int $trade    = 0x2122;
+const int $trade = 0x2122;
+
 /// alef symbol (first transfinite cardinal) ('ℵ')
-const int $alefsym  = 0x2135;
+const int $alefsym = 0x2135;
+
 /// leftwards arrow ('←')
-const int $larr     = 0x2190;
+const int $larr = 0x2190;
+
 /// upwards arrow ('↑')
-const int $uarr     = 0x2191;
+const int $uarr = 0x2191;
+
 /// rightwards arrow ('→')
-const int $rarr     = 0x2192;
+const int $rarr = 0x2192;
+
 /// downwards arrow ('↓')
-const int $darr     = 0x2193;
+const int $darr = 0x2193;
+
 /// left right arrow ('↔')
-const int $harr     = 0x2194;
+const int $harr = 0x2194;
+
 /// downwards arrow with corner leftwards (carriage return) ('↵')
-const int $crarr    = 0x21B5;
+const int $crarr = 0x21B5;
+
 /// leftwards double arrow ('⇐')
-const int $lArr     = 0x21D0;
+const int $lArr = 0x21D0;
+
 /// upwards double arrow ('⇑')
-const int $uArr     = 0x21D1;
+const int $uArr = 0x21D1;
+
 /// rightwards double arrow ('⇒')
-const int $rArr     = 0x21D2;
+const int $rArr = 0x21D2;
+
 /// downwards double arrow ('⇓')
-const int $dArr     = 0x21D3;
+const int $dArr = 0x21D3;
+
 /// left right double arrow ('⇔')
-const int $hArr     = 0x21D4;
+const int $hArr = 0x21D4;
+
 /// for all ('∀')
-const int $forall   = 0x2200;
+const int $forall = 0x2200;
+
 /// partial differential ('∂')
-const int $part     = 0x2202;
+const int $part = 0x2202;
+
 /// there exists ('∃')
-const int $exist    = 0x2203;
+const int $exist = 0x2203;
+
 /// empty set (null set); see also U+8960, ⌀ ('∅')
-const int $empty    = 0x2205;
+const int $empty = 0x2205;
+
 /// del or nabla (vector differential operator) ('∇')
-const int $nabla    = 0x2207;
+const int $nabla = 0x2207;
+
 /// element of ('∈')
-const int $isin     = 0x2208;
+const int $isin = 0x2208;
+
 /// not an element of ('∉')
-const int $notin    = 0x2209;
+const int $notin = 0x2209;
+
 /// contains as member ('∋')
-const int $ni       = 0x220B;
+const int $ni = 0x220B;
+
 /// n-ary product (product sign) ('∏')
-const int $prod     = 0x220F;
+const int $prod = 0x220F;
+
 /// n-ary summation ('∑')
-const int $sum      = 0x2211;
+const int $sum = 0x2211;
+
 /// minus sign ('−')
-const int $minus    = 0x2212;
+const int $minus = 0x2212;
+
 /// asterisk operator ('∗')
-const int $lowast   = 0x2217;
+const int $lowast = 0x2217;
+
 /// square root (radical sign) ('√')
-const int $radic    = 0x221A;
+const int $radic = 0x221A;
+
 /// proportional to ('∝')
-const int $prop     = 0x221D;
+const int $prop = 0x221D;
+
 /// infinity ('∞')
-const int $infin    = 0x221E;
+const int $infin = 0x221E;
+
 /// angle ('∠')
-const int $ang      = 0x2220;
+const int $ang = 0x2220;
+
 /// logical and (wedge) ('∧')
-const int $and      = 0x2227;
+const int $and = 0x2227;
+
 /// logical or (vee) ('∨')
-const int $or       = 0x2228;
+const int $or = 0x2228;
+
 /// intersection (cap) ('∩')
-const int $cap      = 0x2229;
+const int $cap = 0x2229;
+
 /// union (cup) ('∪')
-const int $cup      = 0x222A;
+const int $cup = 0x222A;
+
 /// integral ('∫')
-const int $int      = 0x222B;
+const int $int = 0x222B;
+
 /// therefore sign ('∴')
-const int $there4   = 0x2234;
+const int $there4 = 0x2234;
+
 /// tilde operator (varies with, similar to) ('∼')
-const int $sim      = 0x223C;
+const int $sim = 0x223C;
+
 /// congruent to ('≅')
-const int $cong     = 0x2245;
+const int $cong = 0x2245;
+
 /// almost equal to (asymptotic to) ('≈')
-const int $asymp    = 0x2248;
+const int $asymp = 0x2248;
+
 /// not equal to ('≠')
-const int $ne       = 0x2260;
+const int $ne = 0x2260;
+
 /// identical to; sometimes used for 'equivalent to' ('≡')
-const int $equiv    = 0x2261;
+const int $equiv = 0x2261;
+
 /// less-than or equal to ('≤')
-const int $le       = 0x2264;
+const int $le = 0x2264;
+
 /// greater-than or equal to ('≥')
-const int $ge       = 0x2265;
+const int $ge = 0x2265;
+
 /// subset of ('⊂')
-const int $sub      = 0x2282;
+const int $sub = 0x2282;
+
 /// superset of ('⊃')
-const int $sup      = 0x2283;
+const int $sup = 0x2283;
+
 /// not a subset of ('⊄')
-const int $nsub     = 0x2284;
+const int $nsub = 0x2284;
+
 /// subset of or equal to ('⊆')
-const int $sube     = 0x2286;
+const int $sube = 0x2286;
+
 /// superset of or equal to ('⊇')
-const int $supe     = 0x2287;
+const int $supe = 0x2287;
+
 /// circled plus (direct sum) ('⊕')
-const int $oplus    = 0x2295;
+const int $oplus = 0x2295;
+
 /// circled times (vector product) ('⊗')
-const int $otimes   = 0x2297;
+const int $otimes = 0x2297;
+
 /// up tack (orthogonal to, perpendicular) ('⊥')
-const int $perp     = 0x22A5;
+const int $perp = 0x22A5;
+
 /// dot operator ('⋅')
-const int $sdot     = 0x22C5;
+const int $sdot = 0x22C5;
+
 /// vertical ellipsis ('⋮')
-const int $vellip   = 0x22EE;
+const int $vellip = 0x22EE;
+
 /// left ceiling (APL upstile) ('⌈')
-const int $lceil    = 0x2308;
+const int $lceil = 0x2308;
+
 /// right ceiling ('⌉')
-const int $rceil    = 0x2309;
+const int $rceil = 0x2309;
+
 /// left floor (APL downstile) ('⌊')
-const int $lfloor   = 0x230A;
+const int $lfloor = 0x230A;
+
 /// right floor ('⌋')
-const int $rfloor   = 0x230B;
+const int $rfloor = 0x230B;
+
 /// left-pointing angle bracket (bra) ('⟨')
-const int $lang     = 0x2329;
+const int $lang = 0x2329;
+
 /// right-pointing angle bracket (ket) ('⟩')
-const int $rang     = 0x232A;
+const int $rang = 0x232A;
+
 /// lozenge ('◊')
-const int $loz      = 0x25CA;
+const int $loz = 0x25CA;
+
 /// black spade suit ('♠')
-const int $spades   = 0x2660;
+const int $spades = 0x2660;
+
 /// black club suit (shamrock) ('♣')
-const int $clubs    = 0x2663;
+const int $clubs = 0x2663;
+
 /// black heart suit (valentine) ('♥')
-const int $hearts   = 0x2665;
+const int $hearts = 0x2665;
+
 /// black diamond suit ('♦')
-const int $diams    = 0x2666;
+const int $diams = 0x2666;
diff --git a/packages/charcode/pubspec.yaml b/packages/charcode/pubspec.yaml
index 6494810..9fe3ce3 100644
--- a/packages/charcode/pubspec.yaml
+++ b/packages/charcode/pubspec.yaml
@@ -1,5 +1,5 @@
 name: charcode
-version: 1.1.0
+version: 1.1.1
 author: Dart Team <misc@dartlang.org>
 description: >
   Constants for ASCII and common non-ASCII character codes.
@@ -7,6 +7,6 @@
   When working with characters in Dart, there is no simple way to
   represent the code point of a character.
   This library declares readable symbolic names for character codes.
-homepage: http://www.dartlang.org
+homepage: https://github.com/dart-lang/charcode
 environment:
   sdk: '>=1.0.0 <2.0.0'
diff --git a/packages/charcode/tool/travis.sh b/packages/charcode/tool/travis.sh
new file mode 100755
index 0000000..c7c9d06
--- /dev/null
+++ b/packages/charcode/tool/travis.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# Copyright (c) 2015, 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.
+
+# Fast fail the script on failures.		
+set -e
+
+# Verify that the libraries are error free.
+dartanalyzer --fatal-warnings \
+  lib/charcode.dart
diff --git a/packages/charted/README.md b/packages/charted/README.md
index 2f7f57e..1002aba 100644
--- a/packages/charted/README.md
+++ b/packages/charted/README.md
@@ -1,18 +1,25 @@
-Visualization toolkit for Dart
-==============================
+# Visualization toolkit for Dart
+
 [![Build Status](https://drone.io/github.com/google/charted/status.png)](https://drone.io/github.com/google/charted/latest)
 
 Charted provides
-* A selection API similar to D3.js
-* Visualization utilities ported from D3.js
-* An easy-to-use API to create charts including an SVG implementation based on the Selection API.
-* An interactive demo
+
+*   A selection API similar to D3.js
+*   Visualization utilities ported from D3.js
+*   An easy-to-use API to create charts including an SVG implementation based on
+    the Selection API.
+*   An interactive demo
 
 ## Screenshot of Charted interactive demo
+
 ![Screenshot of Charted interactive demo](https://raw.githubusercontent.com/google/charted/master/charted-demo-screenshot.png)
 
 ## Get started with the interactive demo
-Get started with Charted by trying out the interactive demo provided with the package. Follow these instructions and get it running locally on your machine (Git and the Dart SDK has to be installed first):
+
+Get started with Charted by trying out the interactive demo provided with the
+package. Follow these instructions and get it running locally on your machine
+(Git and the Dart SDK has to be installed first):
+
 ```bash
 git clone git@github.com:google/charted.git
 cd charted
diff --git a/packages/charted/examples/charts/demo_interactive.dart b/packages/charted/examples/charts/demo_interactive.dart
index f577b5f..f22840e 100644
--- a/packages/charted/examples/charts/demo_interactive.dart
+++ b/packages/charted/examples/charts/demo_interactive.dart
@@ -9,7 +9,7 @@
 library charted.demo.interactive;
 
 import 'dart:html';
-import 'package:observe/observe.dart';
+import 'package:observable/observable.dart';
 import 'package:charted/charts/charts.dart';
 
 import 'demo_charts.dart';
@@ -22,6 +22,7 @@
   'bar-chart': 'Bar chart',
   'line-chart': 'Line chart',
   'stacked-bar-chart': 'Stacked bar chart',
+  'stacked-line-chart': 'Stacked line chart',
   'waterfall-chart': 'Waterfall chart',
 };
 
@@ -29,6 +30,7 @@
   if (name == 'bar-chart') return new BarChartRenderer();
   if (name == 'line-chart') return new LineChartRenderer();
   if (name == 'stacked-bar-chart') return new StackedBarChartRenderer();
+  if (name == 'stacked-line-chart') return new StackedLineChartRenderer();
   return new BarChartRenderer();
 }
 
@@ -36,6 +38,7 @@
   if (renderer is BarChartRenderer) return 'bar-chart';
   if (renderer is LineChartRenderer) return 'line-chart';
   if (renderer is StackedBarChartRenderer) return 'stacked-bar-chart';
+  if (renderer is StackedLineChartRenderer) return 'stacked-line-chart';
   return 'bar-chart';
 }
 
diff --git a/packages/charted/examples/layout/treemap_demo.dart b/packages/charted/examples/layout/treemap_demo.dart
index 5733c0a..3108a4b 100644
--- a/packages/charted/examples/layout/treemap_demo.dart
+++ b/packages/charted/examples/layout/treemap_demo.dart
@@ -59,8 +59,8 @@
     node.enter.append("div")
       ..styleWithCallback('left', (d, i, e) => '${d.x}px')
       ..styleWithCallback('top', (d, i, e) => '${d.y}px')
-      ..styleWithCallback('width', (d, i, e) => '${max(0, d.dx - 1)}px')
-      ..styleWithCallback('height', (d, i, e) => '${max(0, d.dy - 1)}px')
+      ..styleWithCallback('width', (d, i, e) => '${max(0, (d.dx as int) - 1)}px')
+      ..styleWithCallback('height', (d, i, e) => '${max(0, (d.dy as int) - 1)}px')
       ..styleWithCallback('background', (d, i, e) => d.children.isNotEmpty ?
           theme.getColorForKey(d.label, ChartTheme.STATE_NORMAL) : null)
       ..textWithCallback((d, i, e) => d.children.isNotEmpty ? null : d.label)
diff --git a/packages/charted/lib/charts/behaviors/chart_tooltip.dart b/packages/charted/lib/charts/behaviors/chart_tooltip.dart
index 85d4b55..308b211 100644
--- a/packages/charted/lib/charts/behaviors/chart_tooltip.dart
+++ b/packages/charted/lib/charts/behaviors/chart_tooltip.dart
@@ -91,14 +91,11 @@
     // tooltip for them, if none is selected/hovered, show all.
     var activeMeasures = [];
     if (showSelectedMeasure) {
-      if(_state != null) {
+      if (_state != null) {
         activeMeasures.addAll(_state.selection);
-        activeMeasures
-            .add(_state.preview != null
-                ? _state.preview
-                : _state.hovered.first);
+        activeMeasures.add(
+            _state.preview != null ? _state.preview : _state.hovered.first);
       } else {
-
         // If state is null, chart tooltip will not capture selection, but only
         // display for the currently hovered measure column.
         activeMeasures.add(e.column);
@@ -167,7 +164,7 @@
       y = coord.y + _TOOLTIP_OFFSET;
     }
     return boundTooltipPosition(
-        new math.Rectangle(x, y, rect.width, rect.height));
+        new math.Rectangle(x as num, y as num, rect.width, rect.height));
   }
 
   /// Positions the tooltip to be inside of the chart boundary.
diff --git a/packages/charted/lib/charts/behaviors/hovercard.dart b/packages/charted/lib/charts/behaviors/hovercard.dart
index 3654ea8..e60cb45 100644
--- a/packages/charted/lib/charts/behaviors/hovercard.dart
+++ b/packages/charted/lib/charts/behaviors/hovercard.dart
@@ -51,6 +51,7 @@
 ///     single row.  Eg: Would not work with a water-fall chart.
 ///
 class Hovercard implements ChartBehavior {
+  static const _HOVERCARD_OFFSET = 20;
   final HovercardBuilder builder;
 
   bool _isMouseTracking;
@@ -66,7 +67,6 @@
     'left',
     'orientation'
   ];
-  int offset = 20;
 
   ChartArea _area;
   ChartState _state;
@@ -181,7 +181,7 @@
   }
 
   void _positionAtMousePointer(ChartEvent e) =>
-      _positionAtPoint(e.chartX, e.chartY, offset, offset, false, false);
+      _positionAtPoint(e.chartX, e.chartY, _HOVERCARD_OFFSET, _HOVERCARD_OFFSET, false, false);
 
   void _positionOnLayout(column, row) {
     // Currently for layouts, when hovercard is triggered due to change
@@ -198,7 +198,7 @@
     var dimensionCol = area.config.dimensions.first,
         dimensionScale = area.dimensionScales.first,
         measureScale = _getScaleForColumn(column),
-        dimensionOffset = this.offset,
+        dimensionOffset = _HOVERCARD_OFFSET,
         dimensionCenterOffset = 0;
 
     // If we are using bands on the one axis that is shown
@@ -228,16 +228,18 @@
       });
     } else {
       var value = rowData.elementAt(column);
-      isNegative = value < 0;
-      measurePosition = measureScale.scale(rowData.elementAt(column));
+      if (value != null) {
+        isNegative = value < 0;
+        measurePosition = measureScale.scale(value);
+      }
     }
 
     if (area.config.isLeftAxisPrimary) {
-      _positionAtPoint(measurePosition, dimensionPosition, 0, dimensionOffset,
-          isNegative, true);
+      _positionAtPoint(measurePosition, dimensionPosition, _HOVERCARD_OFFSET,
+          dimensionOffset, isNegative, true);
     } else {
-      _positionAtPoint(dimensionPosition, measurePosition, dimensionOffset, 0,
-          isNegative, false);
+      _positionAtPoint(dimensionPosition, measurePosition, dimensionOffset,
+          _HOVERCARD_OFFSET, isNegative, false);
     }
   }
 
@@ -288,8 +290,8 @@
 
       // Check if the popup is contained in the RenderArea.
       // If not, try other placements.
-      if (top > 0 &&
-          left > 0 &&
+      if (top >= 0 &&
+          left >= 0 &&
           top + height < renderAreaHeight &&
           left + width < renderAreaWidth) {
         break;
diff --git a/packages/charted/lib/charts/cartesian_renderers/cartesian_base_renderer.dart b/packages/charted/lib/charts/cartesian_renderers/cartesian_base_renderer.dart
index 92ccbd6..1d682db 100644
--- a/packages/charted/lib/charts/cartesian_renderers/cartesian_base_renderer.dart
+++ b/packages/charted/lib/charts/cartesian_renderers/cartesian_base_renderer.dart
@@ -79,10 +79,9 @@
   @override
   Extent get extent {
     assert(series != null && area != null);
-    var rows = area.data.rows,
-        measures = series.measures,
-        max = SMALL_INT_MIN,
-        min = SMALL_INT_MAX;
+    var rows = area.data.rows, measures = series.measures;
+    num max = SMALL_INT_MIN;
+    num min = SMALL_INT_MAX;
 
     for (int i = 0, len = rows.length; i < len; ++i) {
       var row = rows.elementAt(i);
@@ -97,6 +96,12 @@
         }
       }
     }
+
+    // If all values are null or non finite, set the extent to be 0.
+    if (max == SMALL_INT_MIN && min == SMALL_INT_MAX) {
+      max = 0;
+      min = 0;
+    }
     return new Extent(min, max);
   }
 
diff --git a/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart b/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart
index 4806d2d..b904327 100644
--- a/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart
+++ b/packages/charted/lib/charts/cartesian_renderers/line_chart_renderer.dart
@@ -1,4 +1,3 @@
-//
 // Copyright 2014 Google Inc. All rights reserved.
 //
 // Use of this source code is governed by a BSD-style
@@ -12,6 +11,7 @@
   final Iterable<int> dimensionsUsingBand = const [];
 
   final bool alwaysAnimate;
+  final bool showHoverCardOnTrackedDataPoints;
   final bool trackDataPoints;
   final bool trackOnDimensionAxis;
   final int quantitativeScaleProximity;
@@ -30,6 +30,7 @@
 
   LineChartRenderer(
       {this.alwaysAnimate: false,
+      this.showHoverCardOnTrackedDataPoints: false,
       this.trackDataPoints: true,
       this.trackOnDimensionAxis: false,
       this.quantitativeScaleProximity: 5});
@@ -114,10 +115,10 @@
 
   @override
   void dispose() {
+    _disposer.dispose();
     if (root == null) return;
     root.selectAll('.line-rdr-line').remove();
     root.selectAll('.line-rdr-point').remove();
-    _disposer.dispose();
   }
 
   @override
@@ -166,7 +167,7 @@
     _trackingPointsCreated = true;
   }
 
-  void _showTrackingCircles(int row) {
+  void _showTrackingCircles(ChartEvent event, int row) {
     if (_trackingPointsCreated == false) {
       _createTrackingCircles();
     }
@@ -197,19 +198,31 @@
           ..setProperty('visibility', 'hidden');
       }
     });
+
+    if (showHoverCardOnTrackedDataPoints) {
+      var firstMeasureColumn = series.measures.first;
+      mouseOverController.add(new DefaultChartEventImpl(
+          event.source, area, series, row, firstMeasureColumn, 0));
+      _savedOverRow = row;
+      _savedOverColumn = firstMeasureColumn;
+    }
   }
 
-  void _hideTrackingCircles() {
+  void _hideTrackingCircles(ChartEvent event) {
     root.selectAll('.line-rdr-point')
       ..style('opacity', '0.0')
       ..style('visibility', 'hidden');
+    if (showHoverCardOnTrackedDataPoints) {
+      mouseOutController.add(new DefaultChartEventImpl(
+          event.source, area, series, _savedOverRow, _savedOverColumn, 0));
+    }
   }
 
   int _getNearestRowIndex(num x) {
-    var lastSmallerValue = 0;
+    double lastSmallerValue = 0.0;
     var chartX = x - area.layout.renderArea.x;
     for (var i = 0; i < _xPositions.length; i++) {
-      var pos = _xPositions[i];
+      double pos = _xPositions[i].toDouble();
       if (pos < chartX) {
         lastSmallerValue = pos;
       } else {
@@ -226,19 +239,24 @@
     _disposer.add(area.onMouseMove.listen((ChartEvent event) {
       if (area.layout.renderArea.contains(event.chartX, event.chartY)) {
         var row = _getNearestRowIndex(event.chartX);
-        window.animationFrame.then((_) => _showTrackingCircles(row));
+        window.animationFrame.then((_) {
+          _showTrackingCircles(event, row);
+        });
       } else {
-        _hideTrackingCircles();
+        _hideTrackingCircles(event);
       }
     }));
     _disposer.add(area.onMouseOut.listen((ChartEvent event) {
-      _hideTrackingCircles();
+      _hideTrackingCircles(event);
     }));
   }
 
   void _mouseClickHandler(d, int i, Element e) {
     if (area.state != null) {
-      area.state.select(int.parse(e.dataset['column']));
+      var selectedColumn = int.parse(e.dataset['column']);
+      area.state.isSelected(selectedColumn)
+          ? area.state.unselect(selectedColumn)
+          : area.state.select(selectedColumn);
     }
     if (mouseClickController != null && e.tagName == 'circle') {
       var row = int.parse(e.dataset['row']),
diff --git a/packages/charted/lib/charts/cartesian_renderers/stackedbar_chart_renderer.dart b/packages/charted/lib/charts/cartesian_renderers/stackedbar_chart_renderer.dart
index 0d26675..d2adb79 100644
--- a/packages/charted/lib/charts/cartesian_renderers/stackedbar_chart_renderer.dart
+++ b/packages/charted/lib/charts/cartesian_renderers/stackedbar_chart_renderer.dart
@@ -169,8 +169,9 @@
     var buildPath = (d, int i, Element e, bool animate, int roundIdx) {
       var position = animate ? getInitialBarPos(i) : getBarPos(d, i),
           length = animate ? 0 : getBarLength(d, i),
-          radius =
-          series.measures.elementAt(_reverseIdx(i)) == roundIdx ? RADIUS : 0,
+          radius = series.measures.elementAt(_reverseIdx(i)) == roundIdx
+              ? RADIUS
+              : 0,
           path = (length != 0)
               ? verticalBars
                   ? topRoundedRect(0, position, barWidth, length, radius)
@@ -261,14 +262,13 @@
   @override
   Extent get extent {
     assert(area != null && series != null);
-    var rows = area.data.rows,
-        max = SMALL_INT_MIN,
-        min = SMALL_INT_MAX,
-        rowIndex = 0;
+    var rows = area.data.rows, rowIndex = 0;
+    num max = SMALL_INT_MIN;
+    num min = SMALL_INT_MAX;
     _lastMeasureWithData = new List.generate(rows.length, (i) => -1);
 
     rows.forEach((row) {
-      var bar = null;
+      num bar = null;
       series.measures.forEach((idx) {
         var value = row.elementAt(idx);
         if (value != null && value.isFinite) {
diff --git a/packages/charted/lib/charts/cartesian_renderers/stackedline_chart_renderer.dart b/packages/charted/lib/charts/cartesian_renderers/stackedline_chart_renderer.dart
new file mode 100644
index 0000000..5bac934
--- /dev/null
+++ b/packages/charted/lib/charts/cartesian_renderers/stackedline_chart_renderer.dart
@@ -0,0 +1,345 @@
+// Copyright 2017 Google Inc. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+//
+
+part of charted.charts;
+
+class StackedLineChartRenderer extends CartesianRendererBase {
+  final Iterable<int> dimensionsUsingBand = const [];
+
+  final bool alwaysAnimate;
+  final bool showHoverCardOnTrackedDataPoints;
+  final bool trackDataPoints;
+  final bool trackOnDimensionAxis;
+  final int quantitativeScaleProximity;
+
+  bool _trackingPointsCreated = false;
+  List _xPositions = [];
+
+  // Currently hovered row/column
+  int _savedOverRow = 0;
+  int _savedOverColumn = 0;
+
+  int currentDataIndex = -1;
+
+  @override
+  final String name = "stacked-line-rdr";
+
+  StackedLineChartRenderer(
+      {this.alwaysAnimate: false,
+      this.showHoverCardOnTrackedDataPoints: false,
+      this.trackDataPoints: true,
+      this.trackOnDimensionAxis: false,
+      this.quantitativeScaleProximity: 5});
+
+  // Returns false if the number of dimension axes on the area is 0.
+  // Otherwise, the first dimension scale is used to render the chart.
+  @override
+  bool prepare(ChartArea area, ChartSeries series) {
+    _ensureAreaAndSeries(area, series);
+    if (trackDataPoints) {
+      _trackPointerInArea();
+    }
+    return area is CartesianArea;
+  }
+
+  @override
+  void draw(Element element, {Future schedulePostRender}) {
+    _ensureReadyToDraw(element);
+
+    var measureScale = area.measureScales(series).first,
+        dimensionScale = area.dimensionScales.first;
+
+    // We only support one dimension axes, so we always use the
+    // first dimension.
+    var x = area.data.rows
+        .map((row) => row.elementAt(area.config.dimensions.first))
+        .toList();
+
+    var accumulated = new List.filled(x.length, 0.0);
+
+    var reversedMeasures = series.measures.toList().reversed.toList();
+    // Create lists of values used for drawing.
+    // First Half: previous values reversed (need for drawing)
+    // Second Half: current accumulated values (need for drawing)
+    var lines = reversedMeasures.map((column) {
+      var row = area.data.rows.map((values) => values[column]).toList();
+      return accumulated.reversed.toList()..addAll(
+          new List.generate(x.length, (i) => accumulated[i] += row[i]));
+    }).toList();
+
+    var rangeBandOffset =
+        dimensionScale is OrdinalScale ? dimensionScale.rangeBand / 2 : 0;
+
+    // If tracking data points is enabled, cache location of points that
+    // represent data.
+    if (trackDataPoints) {
+      _xPositions =
+          x.map((val) => dimensionScale.scale(val) + rangeBandOffset).toList();
+    }
+
+    var fillLine = new SvgLine(
+        xValueAccessor: (d, i) {
+          // The first x.length values are the bottom part of the path that
+          // should be drawn backword. The second part is the accumulated values
+          // that should be drawn forward.
+          var xval = i < x.length ? x[x.length - i - 1] : x[i - x.length];
+          return dimensionScale.scale(xval) + rangeBandOffset;
+        },
+        yValueAccessor: (d, i) => measureScale.scale(d));
+    var strokeLine = new SvgLine(
+        xValueAccessor: (d, i) => dimensionScale.scale(x[i]) + rangeBandOffset,
+        yValueAccessor: (d, i) => measureScale.scale(d));
+
+    // Add lines and hook up hover and selection events.
+    var svgLines = root.selectAll('.stacked-line-rdr-line').data(lines.reversed);
+    svgLines.enter.append('g');
+
+    svgLines.each((d, i, e) {
+      var column = series.measures.elementAt(i),
+          color = colorForColumn(column),
+          filter = filterForColumn(column),
+          styles = stylesForColumn(column),
+          fill = new SvgElement.tag('path'),
+          stroke = new SvgElement.tag('path'),
+          fillData = d,
+          // Second half contains the accumulated data for this measure
+          strokeData = d.sublist(x.length, d.length);
+      e.attributes
+        ..['stroke'] = color
+        ..['fill'] = color
+        ..['class'] = styles.isEmpty
+          ? 'stacked-line-rdr-line'
+          : 'stacked-line-rdr-line ${styles.join(' ')}'
+        ..['data-column'] = '$column';
+      fill.attributes
+        ..['d'] = fillLine.path(fillData, i, e)
+        ..['stroke'] = 'none';
+      stroke.attributes
+        ..['d'] = strokeLine.path(strokeData, i, e)
+        ..['fill'] = 'none';
+      e.children = [fill, stroke];
+      if (isNullOrEmpty(filter)) {
+        e.attributes.remove('filter');
+      } else {
+        e.attributes['filter'] = filter;
+      }
+    });
+
+    if (area.state != null) {
+      svgLines
+        ..on('click', (d, i, e) => _mouseClickHandler(d, i, e))
+        ..on('mouseover', (d, i, e) => _mouseOverHandler(d, i, e))
+        ..on('mouseout', (d, i, e) => _mouseOutHandler(d, i, e));
+    }
+
+    svgLines.exit.remove();
+  }
+
+  @override
+  void dispose() {
+    _disposer.dispose();
+    if (root == null) return;
+    root.selectAll('.stacked-line-rdr-line').remove();
+    root.selectAll('.stacked-line-rdr-point').remove();
+  }
+
+  @override
+  Extent get extent {
+    assert(area != null && series != null);
+    var rows = area.data.rows,
+        max = SMALL_INT_MIN,
+        min = SMALL_INT_MAX,
+        rowIndex = 0;
+
+    rows.forEach((row) {
+      var line = null;
+      series.measures.forEach((idx) {
+        var value = row.elementAt(idx);
+        if (value != null && value.isFinite) {
+          if (line == null) line = 0.0;
+          line += value;
+        }
+      });
+      if (line > max) max = line;
+      if (line < min) min = line;
+      rowIndex++;
+    });
+
+    return new Extent(min, max);
+  }
+
+  @override
+  void handleStateChanges(List<ChangeRecord> changes) {
+    var lines = host.querySelectorAll('.stacked-line-rdr-line');
+    if (lines == null || lines.isEmpty) return;
+
+    for (int i = 0, len = lines.length; i < len; ++i) {
+      var line = lines.elementAt(i),
+          column = int.parse(line.dataset['column']),
+          filter = filterForColumn(column);
+      line.classes.removeAll(ChartState.COLUMN_CLASS_NAMES);
+      line.classes.addAll(stylesForColumn(column));
+      line.attributes['stroke'] = colorForColumn(column);
+      line.attributes['fill'] = colorForColumn(column);
+
+      if (isNullOrEmpty(filter)) {
+        line.attributes.remove('filter');
+      } else {
+        line.attributes['filter'] = filter;
+      }
+    }
+  }
+
+  void _createTrackingCircles() {
+    var linePoints = root.selectAll('.stacked-line-rdr-point')
+        .data(series.measures.toList().reversed);
+    linePoints.enter.append('circle').each((d, i, e) {
+      e.classes.add('stacked-line-rdr-point');
+      e.attributes['r'] = '4';
+    });
+
+    linePoints
+      ..each((d, i, e) {
+        var color = colorForColumn(d);
+        e.attributes
+          ..['r'] = '4'
+          ..['stroke'] = color
+          ..['fill'] = color
+          ..['data-column'] = '$d';
+      })
+      ..on('click', _mouseClickHandler)
+      ..on('mousemove', _mouseOverHandler) // Ensure that we update values
+      ..on('mouseover', _mouseOverHandler)
+      ..on('mouseout', _mouseOutHandler);
+
+    linePoints.exit.remove();
+    _trackingPointsCreated = true;
+  }
+
+  void _showTrackingCircles(ChartEvent event, int row) {
+    if (_trackingPointsCreated == false) {
+      _createTrackingCircles();
+    }
+
+    double cumulated =  0.0;
+    var yScale = area.measureScales(series).first;
+    root.selectAll('.stacked-line-rdr-point').each((d, i, e) {
+      var x = _xPositions[row],
+          measureVal = cumulated += area.data.rows.elementAt(row).elementAt(d);
+      if (measureVal != null && measureVal.isFinite) {
+        var color = colorForColumn(d), filter = filterForColumn(d);
+        e.attributes
+          ..['cx'] = '$x'
+          ..['cy'] = '${yScale.scale(measureVal)}'
+          ..['fill'] = color
+          ..['stroke'] = color
+          ..['data-row'] = '$row';
+        e.style
+          ..setProperty('opacity', '1')
+          ..setProperty('visibility', 'visible');
+        if (isNullOrEmpty(filter)) {
+          e.attributes.remove('filter');
+        } else {
+          e.attributes['filter'] = filter;
+        }
+      } else {
+        e.style
+          ..setProperty('opacity', '$EPSILON')
+          ..setProperty('visibility', 'hidden');
+      }
+    });
+
+    if (showHoverCardOnTrackedDataPoints) {
+      var firstMeasureColumn = series.measures.first;
+      mouseOverController.add(new DefaultChartEventImpl(
+          event.source, area, series, row, firstMeasureColumn, 0));
+      _savedOverRow = row;
+      _savedOverColumn = firstMeasureColumn;
+    }
+  }
+
+  void _hideTrackingCircles(ChartEvent event) {
+    root.selectAll('.stacked-line-rdr-point')
+      ..style('opacity', '0.0')
+      ..style('visibility', 'hidden');
+    if (showHoverCardOnTrackedDataPoints) {
+      mouseOutController.add(new DefaultChartEventImpl(
+          event.source, area, series, _savedOverRow, _savedOverColumn, 0));
+    }
+  }
+
+  int _getNearestRowIndex(num x) {
+    double lastSmallerValue = 0.0;
+    var chartX = x - area.layout.renderArea.x;
+    for (var i = 0; i < _xPositions.length; i++) {
+      var pos = _xPositions[i];
+      if (pos < chartX) {
+        lastSmallerValue = pos;
+      } else {
+        return i == 0
+            ? 0
+            : (chartX - lastSmallerValue <= pos - chartX) ? i - 1 : i;
+      }
+    }
+    return _xPositions.length - 1;
+  }
+
+  void _trackPointerInArea() {
+    _trackingPointsCreated = false;
+    _disposer.add(area.onMouseMove.listen((ChartEvent event) {
+      if (area.layout.renderArea.contains(event.chartX, event.chartY)) {
+        var row = _getNearestRowIndex(event.chartX);
+        window.animationFrame.then((_) {
+          _showTrackingCircles(event, row);
+        });
+      } else {
+        _hideTrackingCircles(event);
+      }
+    }));
+    _disposer.add(area.onMouseOut.listen((ChartEvent event) {
+      _hideTrackingCircles(event);
+    }));
+  }
+
+  void _mouseClickHandler(d, int i, Element e) {
+    if (area.state != null) {
+      var selectedColumn = int.parse(e.dataset['column']);
+      area.state.isSelected(selectedColumn)
+          ? area.state.unselect(selectedColumn)
+          : area.state.select(selectedColumn);
+    }
+    if (mouseClickController != null && e.tagName == 'circle') {
+      var row = int.parse(e.dataset['row']),
+          column = int.parse(e.dataset['column']);
+      mouseClickController.add(
+          new DefaultChartEventImpl(scope.event, area, series, row, column, d));
+    }
+  }
+
+  void _mouseOverHandler(d, int i, Element e) {
+    if (area.state != null) {
+      area.state.preview = int.parse(e.dataset['column']);
+    }
+    if (mouseOverController != null && e.tagName == 'circle') {
+      _savedOverRow = int.parse(e.dataset['row']);
+      _savedOverColumn = int.parse(e.dataset['column']);
+      mouseOverController.add(new DefaultChartEventImpl(
+          scope.event, area, series, _savedOverRow, _savedOverColumn, d));
+    }
+  }
+
+  void _mouseOutHandler(d, int i, Element e) {
+    if (area.state != null &&
+        area.state.preview == int.parse(e.dataset['column'])) {
+      area.state.preview = null;
+    }
+    if (mouseOutController != null && e.tagName == 'circle') {
+      mouseOutController.add(new DefaultChartEventImpl(
+          scope.event, area, series, _savedOverRow, _savedOverColumn, d));
+    }
+  }
+}
diff --git a/packages/charted/lib/charts/chart_config.dart b/packages/charted/lib/charts/chart_config.dart
index 73ce850..0baae21 100644
--- a/packages/charted/lib/charts/chart_config.dart
+++ b/packages/charted/lib/charts/chart_config.dart
@@ -91,4 +91,9 @@
   /// For a quantitative scale, values at which ticks should be displayed.
   /// When not specified, the ticks are based on the type of [scale] used.
   Iterable tickValues;
+
+  /// Forces the ticks count of a scale to be of the forcedTicksCount.
+  /// The tick values on the scale does not guarantee to be niced numbers, but
+  /// domain of the scale does.  Only valid for quantitative scale.
+  int forcedTicksCount;
 }
diff --git a/packages/charted/lib/charts/chart_data.dart b/packages/charted/lib/charts/chart_data.dart
index 1367cc1..ce11c17 100644
--- a/packages/charted/lib/charts/chart_data.dart
+++ b/packages/charted/lib/charts/chart_data.dart
@@ -21,7 +21,7 @@
 
   /// Create a new instance of [ChartData]'s internal implementation
   factory ChartData(Iterable<ChartColumnSpec> columns,
-      Iterable<Iterable> rows) = DefaultChartDataImpl;
+      List<List> rows) = DefaultChartDataImpl;
 }
 
 ///
diff --git a/packages/charted/lib/charts/chart_state.dart b/packages/charted/lib/charts/chart_state.dart
index 3b05e84..ce9de99 100644
--- a/packages/charted/lib/charts/chart_state.dart
+++ b/packages/charted/lib/charts/chart_state.dart
@@ -12,7 +12,7 @@
 /// Model to provide highlight, selection and visibility in a ChartArea.
 /// Selection and visibility
 ///
-abstract class ChartState implements ChangeNotifier {
+abstract class ChartState implements Observable {
   static int COL_SELECTED = 0x001;
   static int COL_UNSELECTED = 0x002;
   static int COL_PREVIEW = 0x004;
diff --git a/packages/charted/lib/charts/chart_theme.dart b/packages/charted/lib/charts/chart_theme.dart
index 1e49a4e..a7d89d5 100644
--- a/packages/charted/lib/charts/chart_theme.dart
+++ b/packages/charted/lib/charts/chart_theme.dart
@@ -84,12 +84,9 @@
   /// Space between axis and label for dimension axes
   int get axisTickPadding;
 
-  /// Space between the first tick and the measure axes.
+  /// Space between the first tick and the measure axes in pixels.
   /// Only used on charts that don't have renderers that use "bands" of space
   /// on the dimension axes
-  ///
-  /// Represented as a percentage of space between two consecutive ticks. The
-  /// space between two consecutive ticks is also known as the segment size.
   double get axisOuterPadding;
 
   /// Space between the two bands in the chart.
@@ -100,12 +97,9 @@
   /// space between two consecutive ticks is also known as the segment size.
   double get axisBandInnerPadding;
 
-  /// Space between the first band and the measure axis.
+  /// Space between the first band and the measure axis in pixels.
   /// Only used on charts that have renderers that use "bands" of space on the
   /// dimension axes.
-  ///
-  /// Represented as a percentage of space between two consecutive ticks. The
-  /// space between two consecutive ticks is also known as the segment size.
   double get axisBandOuterPadding;
 
   /// When set to true, the vertical axes resize to fit the labels.
diff --git a/packages/charted/lib/charts/charts.dart b/packages/charted/lib/charts/charts.dart
index 3d00cf6..ad24994 100644
--- a/packages/charted/lib/charts/charts.dart
+++ b/packages/charted/lib/charts/charts.dart
@@ -27,7 +27,7 @@
 
 import 'package:collection/equality.dart';
 import 'package:logging/logging.dart';
-import 'package:observe/observe.dart';
+import 'package:observable/observable.dart';
 import 'package:quiver/core.dart';
 
 part 'chart_area.dart';
@@ -50,6 +50,7 @@
 part 'cartesian_renderers/cartesian_base_renderer.dart';
 part 'cartesian_renderers/bubble_chart_renderer.dart';
 part 'cartesian_renderers/line_chart_renderer.dart';
+part 'cartesian_renderers/stackedline_chart_renderer.dart';
 part 'cartesian_renderers/stackedbar_chart_renderer.dart';
 
 part 'layout_renderers/layout_base_renderer.dart';
diff --git a/packages/charted/lib/charts/data_transformers/aggregation_item.dart b/packages/charted/lib/charts/data_transformers/aggregation_item.dart
index 5ac5b56..73f78a7 100644
--- a/packages/charted/lib/charts/data_transformers/aggregation_item.dart
+++ b/packages/charted/lib/charts/data_transformers/aggregation_item.dart
@@ -11,7 +11,7 @@
 /// AggregationItem is created by [AggregationModel] to make access to facts
 /// observable. Users must use AggregationItem.isValid before trying to access
 /// the aggregations.
-abstract class AggregationItem extends ChangeNotifier {
+abstract class AggregationItem extends Observable {
   /// List of dimension fields in effect
   List<String> dimensions;
 
@@ -42,7 +42,7 @@
 
 /// Implementation of AggregationItem
 /// Instances of _AggregationItemImpl are created only by AggregationModel
-class _AggregationItemImpl extends ChangeNotifier implements AggregationItem {
+class _AggregationItemImpl extends Observable implements AggregationItem {
   static final List<String> derivedAggregationTypes = ['count', 'avg'];
 
   AggregationModel model;
diff --git a/packages/charted/lib/charts/data_transformers/aggregation_transformer.dart b/packages/charted/lib/charts/data_transformers/aggregation_transformer.dart
index 0c5af4f..4716cdb 100644
--- a/packages/charted/lib/charts/data_transformers/aggregation_transformer.dart
+++ b/packages/charted/lib/charts/data_transformers/aggregation_transformer.dart
@@ -18,7 +18,7 @@
 /// The output column will be re-ordered first by the indices specified in the
 /// dimension column indices then by the facts column indices.  The data in the
 /// cells of each row will also follow this rule.
-class AggregationTransformer extends ChangeNotifier
+class AggregationTransformer extends Observable
     implements ChartDataTransform, ChartData {
   static const String AGGREGATION_TYPE_SUM = 'sum';
   static const String AGGREGATION_TYPE_MIN = 'min';
diff --git a/packages/charted/lib/charts/data_transformers/filter_transformer.dart b/packages/charted/lib/charts/data_transformers/filter_transformer.dart
index cc002ea..55b5b33 100644
--- a/packages/charted/lib/charts/data_transformers/filter_transformer.dart
+++ b/packages/charted/lib/charts/data_transformers/filter_transformer.dart
@@ -14,7 +14,7 @@
 /// of data will be tested by passing the value at target column to the filter
 /// function.  If filter function returns false, the row will be filtered out.
 /// This transformer does not modify the column part of the input ChartData.
-class FilterTransformer extends ChangeNotifier
+class FilterTransformer extends Observable
     implements ChartDataTransform, ChartData {
   final SubscriptionsDisposer _dataSubscriptions = new SubscriptionsDisposer();
   List<ChartColumnSpec> columns;
diff --git a/packages/charted/lib/charts/data_transformers/transpose_transformer.dart b/packages/charted/lib/charts/data_transformers/transpose_transformer.dart
index d1cad14..b09c681 100644
--- a/packages/charted/lib/charts/data_transformers/transpose_transformer.dart
+++ b/packages/charted/lib/charts/data_transformers/transpose_transformer.dart
@@ -17,7 +17,7 @@
 /// All values in the data except for the data in the label column must have the
 /// same type; All columns except for the label column must have the same
 /// formatter if a formatter exist for columns.
-class TransposeTransformer extends ChangeNotifier
+class TransposeTransformer extends Observable
     implements ChartDataTransform, ChartData {
   final SubscriptionsDisposer _dataSubscriptions = new SubscriptionsDisposer();
   ObservableList<ChartColumnSpec> columns = new ObservableList();
diff --git a/packages/charted/lib/charts/src/cartesian_area_impl.dart b/packages/charted/lib/charts/src/cartesian_area_impl.dart
index 870971a..c022b39 100644
--- a/packages/charted/lib/charts/src/cartesian_area_impl.dart
+++ b/packages/charted/lib/charts/src/cartesian_area_impl.dart
@@ -84,6 +84,7 @@
   Iterable<ChartSeries> _series;
 
   bool _pendingLegendUpdate = false;
+  bool _pendingAxisConfigUpdate = false;
   List<ChartBehavior> _behaviors = new List<ChartBehavior>();
   Map<ChartSeries, _ChartSeriesInfo> _seriesInfoCache = new Map();
 
@@ -135,6 +136,9 @@
       _chartAxesUpdatedController.close();
       _chartAxesUpdatedController = null;
     }
+    if (_behaviors.isNotEmpty) {
+      _behaviors.forEach((behavior) => behavior.dispose());
+    }
   }
 
   static bool isNotInline(Element e) =>
@@ -166,9 +170,11 @@
     _config = value;
     _configEventsDisposer.dispose();
     _pendingLegendUpdate = true;
+    _pendingAxisConfigUpdate = true;
 
     if (_config != null && _config is Observable) {
       _configEventsDisposer.add((_config as Observable).changes.listen((_) {
+        _pendingAxisConfigUpdate = true;
         _pendingLegendUpdate = true;
         draw();
       }));
@@ -200,6 +206,7 @@
               : new DefaultChartAxisImpl(this);
       return axis;
     });
+
     return _measureAxes[axisId];
   }
 
@@ -317,7 +324,7 @@
         info.check();
         group.attributes['transform'] = transform;
         (s.renderer as CartesianRenderer)
-            .draw(group, schedulePostRender: schedulePostRender);
+            ?.draw(group, schedulePostRender: schedulePostRender);
       });
 
       // A series that was rendered earlier isn't there anymore, remove it
@@ -339,6 +346,7 @@
 
     // Save the list of valid series and initialize axes.
     _series = series;
+    _updateAxisConfig();
     _initAxes(preRender: preRender);
 
     // Render the chart, now that the axes layer is already in DOM.
@@ -353,6 +361,7 @@
   /// Initialize the axes - required even if the axes are not being displayed.
   _initAxes({bool preRender: false}) {
     Map measureAxisUsers = <String, Iterable<ChartSeries>>{};
+    var keysToRemove = _measureAxes.keys.toList();
 
     // Create necessary measures axes.
     // If measure axes were not configured on the series, default is used.
@@ -360,6 +369,9 @@
       var measureAxisIds =
           isNullOrEmpty(s.measureAxisIds) ? MEASURE_AXIS_IDS : s.measureAxisIds;
       measureAxisIds.forEach((axisId) {
+        if (keysToRemove.contains(axisId)) {
+          keysToRemove.remove(axisId);
+        }
         _getMeasureAxis(axisId); // Creates axis if required
         var users = measureAxisUsers[axisId];
         if (users == null) {
@@ -370,6 +382,10 @@
       });
     });
 
+    for (var key in keysToRemove) {
+      _measureAxes.remove(key);
+    }
+
     // Now that we know a list of series using each measure axis, configure
     // the input domain of each axis.
     measureAxisUsers.forEach((id, listOfSeries) {
@@ -579,6 +595,28 @@
     _pendingLegendUpdate = false;
   }
 
+  // Updates the AxisConfig, if configuration chagned since the last time the
+  // AxisConfig was updated.
+  _updateAxisConfig() {
+    if (!_pendingAxisConfigUpdate) return;
+    _series.forEach((ChartSeries s) {
+      var measureAxisIds =
+          isNullOrEmpty(s.measureAxisIds) ? MEASURE_AXIS_IDS : s.measureAxisIds;
+      measureAxisIds.forEach((axisId) {
+        var axis = _getMeasureAxis(axisId); // Creates axis if required
+        axis.config = config.getMeasureAxis(axisId);
+      });
+    });
+
+    int dimensionAxesCount = useTwoDimensionAxes ? 2 : 1;
+    config.dimensions.take(dimensionAxesCount).forEach((int column) {
+      var axis = _getDimensionAxis(column);
+      axis.config = config.getDimensionAxis(column);
+    });
+
+    _pendingAxisConfigUpdate = false;
+  }
+
   @override
   Stream<ChartEvent> get onMouseUp =>
       host.onMouseUp.map((MouseEvent e) => new DefaultChartEventImpl(e, this));
diff --git a/packages/charted/lib/charts/src/chart_axis_impl.dart b/packages/charted/lib/charts/src/chart_axis_impl.dart
index 4a684b3..caf48eb 100644
--- a/packages/charted/lib/charts/src/chart_axis_impl.dart
+++ b/packages/charted/lib/charts/src/chart_axis_impl.dart
@@ -9,8 +9,10 @@
 part of charted.charts;
 
 class DefaultChartAxisImpl {
+  static const int _AXIS_TITLE_HEIGHT = 20;
+
   CartesianArea _area;
-  ChartAxisConfig _config;
+  ChartAxisConfig config;
   ChartAxisTheme _theme;
   SvgAxisTicks _axisTicksPlacement;
 
@@ -22,10 +24,11 @@
   String _orientation;
   Scale _scale;
   SelectionScope _scope;
+  String _title;
 
   MutableRect size;
 
-  DefaultChartAxisImpl.withAxisConfig(this._area, this._config);
+  DefaultChartAxisImpl.withAxisConfig(this._area, this.config);
   DefaultChartAxisImpl(this._area);
 
   void initAxisDomain(int column, bool isDimension, Iterable domain) {
@@ -44,10 +47,13 @@
         : _area.theme.getMeasureAxisTheme(scale);
 
     // Sets the domain if not using a custom scale.
-    if (_config == null || (_config != null && _config.scale == null)) {
+    if (config == null || (config != null && config.scale == null)) {
       scale.domain = domain;
-      scale.nice = !_isDimension;
+      scale.nice = !_isDimension &&
+          !(config?.forcedTicksCount != null && config.forcedTicksCount > 0);
     }
+
+    _title = config?.title;
   }
 
   void initAxisScale(Iterable range) {
@@ -63,10 +69,20 @@
       if (_area.config.isLeftAxisPrimary) {
         range = range.toList().reversed;
       }
-      (scale as OrdinalScale)
-          .rangeRoundBands(range, innerPadding, outerPadding);
+      if (usingBands) {
+        (scale as OrdinalScale)
+            .rangeRoundBands(range, innerPadding, outerPadding);
+      } else {
+        (scale as OrdinalScale).rangePoints(range, outerPadding);
+      }
     } else {
-      scale.range = range;
+      if (_title != null) {
+        var modifiedRange = range.take(range.length - 1).toList();
+        modifiedRange.add(range.last + _AXIS_TITLE_HEIGHT);
+        scale.range = modifiedRange;
+      } else {
+        scale.range = range;
+      }
       scale.ticksCount = _theme.axisTickCount;
     }
   }
@@ -82,10 +98,15 @@
         ? new MutableRect.size(_theme.verticalAxisWidth, layout.width)
         : new MutableRect.size(layout.height, _theme.horizontalAxisHeight);
 
+    if (config?.forcedTicksCount != null && config.forcedTicksCount > 0) {
+      scale.forcedTicksCount = config.forcedTicksCount;
+    }
+
     // Handle auto re-sizing of horizontal axis.
-    var ticks = (_config != null && !isNullOrEmpty(_config.tickValues))
-        ? _config.tickValues
+    var ticks = (config != null && !isNullOrEmpty(config.tickValues))
+        ? config.tickValues
         : scale.ticks,
+
     formatter = _columnSpec.formatter == null
         ? scale.createTickFormatter()
         : _columnSpec.formatter,
@@ -131,8 +152,8 @@
         innerTickSize = _theme.axisTickSize <= ChartAxisTheme.FILL_RENDER_AREA
             ? 0 - (_isVertical ? renderAreaRect.width : renderAreaRect.height)
             : _theme.axisTickSize,
-        tickValues = _config != null && !isNullOrEmpty(_config.tickValues)
-            ? _config.tickValues
+        tickValues = config != null && !isNullOrEmpty(config.tickValues)
+            ? config.tickValues
             : null;
 
     element.attributes['transform'] = 'translate(${rect.x}, ${rect.y})';
@@ -141,8 +162,21 @@
       _axisTicksPlacement = new RotateHorizontalAxisTicks(
           rect, _theme.ticksFont, _theme.axisTickSize + _theme.axisTickPadding);
     }
-
     initAxisScale(range);
+
+    if (_title != null) {
+      var label = element.querySelector('.chart-axis-label');
+      if (label != null) {
+        label.text = _title;
+      } else {
+        var title = Namespace.createChildElement('text', element);
+        title.attributes['text-anchor'] = 'middle';
+        title.text = _title;
+        title.classes.add('chart-axis-label');
+        element.append(title);
+      }
+    }
+
     var axis = new SvgAxis(
         orientation: _orientation,
         innerTickSize: innerTickSize,
@@ -160,11 +194,12 @@
 
   // Scale passed through configuration takes precedence
   Scale get scale =>
-      (_config != null && _config.scale != null) ? _config.scale : _scale;
+      (config != null && config.scale != null) ? config.scale : _scale;
 
   set scale(Scale value) {
     _scale = value;
   }
+
 }
 
 class PrecomputedAxisTicks implements SvgAxisTicks {
diff --git a/packages/charted/lib/charts/src/chart_config_impl.dart b/packages/charted/lib/charts/src/chart_config_impl.dart
index 80bedaf..3290dca 100644
--- a/packages/charted/lib/charts/src/chart_config_impl.dart
+++ b/packages/charted/lib/charts/src/chart_config_impl.dart
@@ -8,7 +8,7 @@
 
 part of charted.charts;
 
-class DefaultChartConfigImpl extends ChangeNotifier implements ChartConfig {
+class DefaultChartConfigImpl extends Observable implements ChartConfig {
   final Map<String, ChartAxisConfig> _measureAxisRegistry = {};
   final Map<int, ChartAxisConfig> _dimensionAxisRegistry = {};
   final SubscriptionsDisposer _disposer = new SubscriptionsDisposer();
@@ -110,6 +110,7 @@
   void registerMeasureAxis(String id, ChartAxisConfig config) {
     assert(config != null);
     _measureAxisRegistry[id] = config;
+    notifyChange(const ChartConfigChangeRecord());
   }
 
   @override
@@ -120,6 +121,7 @@
     assert(config != null);
     assert(dimensions.contains(column));
     _dimensionAxisRegistry[column] = config;
+    notifyChange(const ChartConfigChangeRecord());
   }
 
   @override
diff --git a/packages/charted/lib/charts/src/chart_data_impl.dart b/packages/charted/lib/charts/src/chart_data_impl.dart
index 2dc6ed0..08ef87e 100644
--- a/packages/charted/lib/charts/src/chart_data_impl.dart
+++ b/packages/charted/lib/charts/src/chart_data_impl.dart
@@ -8,7 +8,7 @@
 
 part of charted.charts;
 
-class DefaultChartDataImpl extends ChangeNotifier implements ChartData {
+class DefaultChartDataImpl extends Observable implements ChartData {
   List<ChartColumnSpec> _columns;
   List<List> _rows;
 
@@ -16,11 +16,9 @@
   SubscriptionsDisposer _disposer = new SubscriptionsDisposer();
 
   DefaultChartDataImpl(
-      Iterable<ChartColumnSpec> columns, Iterable<Iterable> rows) {
-    this.columns = new List<ChartColumnSpec>.from(columns);
-    var rowsList = new List.from(rows);
-    this.rows = new List<List>.generate(
-        rowsList.length, (i) => new List.from(rowsList[i]));
+      Iterable<ChartColumnSpec> columns, List<List> rows) {
+    this.columns = columns;
+    this.rows = rows;
   }
 
   set columns(Iterable<ChartColumnSpec> value) {
diff --git a/packages/charted/lib/charts/src/chart_series_impl.dart b/packages/charted/lib/charts/src/chart_series_impl.dart
index 5bbabd2..0287219 100644
--- a/packages/charted/lib/charts/src/chart_series_impl.dart
+++ b/packages/charted/lib/charts/src/chart_series_impl.dart
@@ -8,7 +8,7 @@
 
 part of charted.charts;
 
-class DefaultChartSeriesImpl extends ChangeNotifier implements ChartSeries {
+class DefaultChartSeriesImpl extends Observable implements ChartSeries {
   final String name;
 
   Iterable<String> _measureAxisIds;
diff --git a/packages/charted/lib/charts/src/chart_state_impl.dart b/packages/charted/lib/charts/src/chart_state_impl.dart
index e5bccd8..6b86628 100644
--- a/packages/charted/lib/charts/src/chart_state_impl.dart
+++ b/packages/charted/lib/charts/src/chart_state_impl.dart
@@ -14,7 +14,7 @@
 /// - In [CartesianArea] it is always a column.
 /// - In [LayoutArea] renders choose either columns or rows.
 ///
-class DefaultChartStateImpl extends ChangeNotifier implements ChartState {
+class DefaultChartStateImpl extends Observable implements ChartState {
   final bool isMultiSelect;
   final bool isMultiHighlight;
   final bool isSelectOrHighlight;
diff --git a/packages/charted/lib/charts/themes/quantum_theme.dart b/packages/charted/lib/charts/themes/quantum_theme.dart
index 127e78a..5db5796 100644
--- a/packages/charted/lib/charts/themes/quantum_theme.dart
+++ b/packages/charted/lib/charts/themes/quantum_theme.dart
@@ -37,6 +37,13 @@
     const ['#EFF3C2', '#9D9C23', '#817616']
   ];
 
+  static final _MEASURE_AXIS_THEME =
+      new QuantumChartAxisTheme(ChartAxisTheme.FILL_RENDER_AREA, 5);
+  static final _ORDINAL_DIMENSION_AXIS_THEME =
+  new QuantumChartAxisTheme(0, 10);
+  static final _DEFAULT_DIMENSION_AXIS_THEME =
+  new QuantumChartAxisTheme(4, 10);
+
   final OrdinalScale _scale = new OrdinalScale()..range = COLORS;
 
   @override
@@ -74,14 +81,13 @@
       : OTHER_COLORS;
 
   @override
-  ChartAxisTheme getMeasureAxisTheme([Scale _]) =>
-      const QuantumChartAxisTheme(ChartAxisTheme.FILL_RENDER_AREA, 5);
+  ChartAxisTheme getMeasureAxisTheme([Scale _]) => _MEASURE_AXIS_THEME;
 
   @override
   ChartAxisTheme getDimensionAxisTheme([Scale scale]) =>
       scale == null || scale is OrdinalScale
-          ? const QuantumChartAxisTheme(0, 10)
-          : const QuantumChartAxisTheme(4, 10);
+          ? _ORDINAL_DIMENSION_AXIS_THEME
+          : _DEFAULT_DIMENSION_AXIS_THEME;
 
   @override
   AbsoluteRect get padding => const AbsoluteRect(10, 40, 0, 0);
@@ -107,37 +113,46 @@
 
 class QuantumChartAxisTheme implements ChartAxisTheme {
   @override
-  final axisOuterPadding = 0.1;
+  final double axisOuterPadding;
 
   @override
-  final axisBandInnerPadding = 0.35;
+  final double axisBandInnerPadding;
 
   @override
-  final axisBandOuterPadding = 0.175;
+  final double axisBandOuterPadding;
 
   @override
-  final axisTickPadding = 6;
+  final int axisTickPadding;
 
   @override
-  final axisTickSize;
+  final int axisTickSize;
 
   @override
-  final axisTickCount;
+  final int axisTickCount;
 
   @override
-  final verticalAxisAutoResize = true;
+  final bool verticalAxisAutoResize;
 
   @override
-  final verticalAxisWidth = 75;
+  final int verticalAxisWidth;
 
   @override
-  final horizontalAxisAutoResize = false;
+  final bool horizontalAxisAutoResize;
 
   @override
-  final horizontalAxisHeight = 50;
+  final int horizontalAxisHeight;
 
   @override
-  final ticksFont = '12px Roboto';
+  final String ticksFont;
 
-  const QuantumChartAxisTheme(this.axisTickSize, this.axisTickCount);
+  QuantumChartAxisTheme(this.axisTickSize, this.axisTickCount,
+      {this.axisOuterPadding: 12.0,
+      this.axisBandInnerPadding: 0.35,
+      this.axisBandOuterPadding: 12.0,
+      this.axisTickPadding: 6,
+      this.verticalAxisAutoResize: true,
+      this.verticalAxisWidth: 75,
+      this.horizontalAxisAutoResize: false,
+      this.horizontalAxisHeight: 50,
+      this.ticksFont: '12px Roboto'});
 }
diff --git a/packages/charted/lib/core/scales.dart b/packages/charted/lib/core/scales.dart
index 48a11f5..5ac34f3 100644
--- a/packages/charted/lib/core/scales.dart
+++ b/packages/charted/lib/core/scales.dart
@@ -65,6 +65,12 @@
   /// Note: This property is only valid on quantitative scales.
   int ticksCount;
 
+  /// Forces the number of ticks on this scale to be the forcedTicksCount.
+  /// The tick values on the scale does not guarantee to be niced numbers, but
+  /// domain of the scale does.
+  /// Note: This property is only valid on quantitative scales.
+  int forcedTicksCount;
+
   /// Indicates if the current scale is using niced values for ticks.
   /// Note: This property is only valid on quantitative scales.
   bool nice;
diff --git a/packages/charted/lib/core/scales/linear_scale.dart b/packages/charted/lib/core/scales/linear_scale.dart
index ae745cc..e95ae82 100644
--- a/packages/charted/lib/core/scales/linear_scale.dart
+++ b/packages/charted/lib/core/scales/linear_scale.dart
@@ -16,9 +16,10 @@
   Iterable _range = defaultRange;
 
   int _ticksCount = 5;
+  int _forcedTicksCount = -1;
+
   bool _clamp = false;
   bool _nice = false;
-
   Function _invert;
   Function _scale;
 
@@ -38,6 +39,11 @@
     if (nice) {
       _domain = ScaleUtils.nice(
           _domain, ScaleUtils.niceStep(_linearTickRange().step));
+    } else {
+      if (_forcedTicksCount > 0) {
+        var tickRange = _linearTickRange();
+        _domain = [tickRange.first, tickRange.last];
+      }
     }
 
     Function linear = math.min(_domain.length, _range.length) > 2
@@ -99,6 +105,13 @@
   @override
   int get ticksCount => _ticksCount;
 
+  set forcedTicksCount(int value) {
+    _forcedTicksCount = value;
+    _reset(nice: false);
+  }
+
+  get forcedTicksCount => _forcedTicksCount;
+
   @override
   Iterable get ticks => _linearTickRange();
 
@@ -143,16 +156,38 @@
     if (span == 0) {
       span = 1.0; // [span / _ticksCount] should never be equal zero.
     }
-    var step = math.pow(10, (math.log(span / _ticksCount) / math.LN10).floor());
-    var err = _ticksCount / span * step;
 
-    // Filter ticks to get closer to the desired count.
-    if (err <= .15) {
-      step *= 10;
-    } else if (err <= .35) {
-      step *= 5;
-    } else if (err <= .75) {
-      step *= 2;
+    var step;
+    if (_forcedTicksCount > 0) {
+      // Find the factor (in power of 10) for the max and min of the extent and
+      // round the max up and min down to make sure the domain of the scale is
+      // of nicely rounded number and it contains the original domain.  This way
+      // when forcing the ticks count at least the two ends of the scale would
+      // look nice and has a high chance of having the intermediate tick values
+      // to be nice.
+      var maxFactor = extent.max == 0 ? 1
+          : math.pow(10, (math.log((extent.max as num).abs() / forcedTicksCount)
+              / math.LN10).floor());
+      var max = (extent.max / maxFactor).ceil() * maxFactor;
+      var minFactor = extent.min == 0 ? 1
+          : math.pow(10, (math.log((extent.min as num).abs() / forcedTicksCount)
+              / math.LN10).floor());
+      var min = (extent.min / minFactor).floor() * minFactor;
+      step = (max - min) / forcedTicksCount;
+      return new Range(min, max + step * 0.5, step);
+    } else {
+
+      step = math.pow(10, (math.log(span / _ticksCount) / math.LN10).floor());
+      var err = _ticksCount / span * step;
+
+      // Filter ticks to get closer to the desired count.
+      if (err <= .15) {
+        step *= 10;
+      } else if (err <= .35) {
+        step *= 5;
+      } else if (err <= .75) {
+        step *= 2;
+      }
     }
 
     return new Range((extent.min / step).ceil() * step,
diff --git a/packages/charted/lib/core/scales/log_scale.dart b/packages/charted/lib/core/scales/log_scale.dart
index ae9d5b0..7431e68 100644
--- a/packages/charted/lib/core/scales/log_scale.dart
+++ b/packages/charted/lib/core/scales/log_scale.dart
@@ -176,4 +176,8 @@
 
   @override
   LogScale clone() => new LogScale._clone(this);
+
+  // TODO(midoringo): Implement this for the log scale.
+  @override
+  int forcedTicksCount;
 }
diff --git a/packages/charted/lib/core/scales/ordinal_scale.dart b/packages/charted/lib/core/scales/ordinal_scale.dart
index 695f951..dc9e7de 100644
--- a/packages/charted/lib/core/scales/ordinal_scale.dart
+++ b/packages/charted/lib/core/scales/ordinal_scale.dart
@@ -19,8 +19,8 @@
   _OrdinalScale();
 
   _OrdinalScale._clone(_OrdinalScale source)
-      : _domain = source._domain,
-        _range = source._range,
+      : _domain = new List.from(source._domain),
+        _range = new List.from(source._range),
         _reset = source._reset,
         _rangeExtent = source._rangeExtent,
         _rangeBand = source._rangeBand {
@@ -120,11 +120,12 @@
     scale._reset = (_OrdinalScale s) {
       var start = range.first,
           stop = range.last,
-          step = (stop - start) / (s.domain.length - 1 + padding);
+          step = s.domain.length > 1
+              ? (stop - start - 2 * padding) / (s.domain.length - 1)
+              : 0;
 
       s._range = s._steps(
-          s.domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2,
-          step);
+          s.domain.length < 2 ? (start + stop) / 2 : start + padding, step);
       s._rangeBand = 0;
       s._rangeExtent = new Extent(start, stop);
     };
@@ -138,7 +139,10 @@
     scale._reset = (_OrdinalScale s) {
       var start = range.first,
           stop = range.last,
-          step = (stop - start) / s.domain.length - padding + 2 * outerPadding;
+          step = (stop - start - 2 * outerPadding) /
+              (s.domain.length > 1
+                  ? (s.domain.length - padding)
+                  : 1);
 
       s._range = s._steps(start + step * outerPadding, step);
       s._rangeBand = step * (1 - padding);
@@ -155,11 +159,12 @@
       var start = range.first,
           stop = range.last,
           step =
-          ((stop - start) / (s.domain.length - padding + 2 * outerPadding))
-              .floor(),
-          error = stop - start - (s.domain.length - padding) * step;
+          ((stop - start - 2 * outerPadding) /
+              (s.domain.length > 1
+                  ? (s.domain.length - padding)
+                  : 1)).floor();
 
-      s._range = s._steps(start + (error / 2).round(), step);
+      s._range = s._steps(start + outerPadding, step);
       s._rangeBand = (step * (1 - padding)).round();
       s._rangeExtent = new Extent(start, stop);
     };
@@ -171,9 +176,9 @@
   //
   // Properties that are valid only on quantitative scales.
   //
-
   bool clamp;
   bool nice;
   bool rounded;
   int ticksCount;
+  int forcedTicksCount;
 }
diff --git a/packages/charted/lib/core/text_metrics.dart b/packages/charted/lib/core/text_metrics.dart
index 9fb7d06..a84f828 100644
--- a/packages/charted/lib/core/text_metrics.dart
+++ b/packages/charted/lib/core/text_metrics.dart
@@ -100,6 +100,7 @@
           min = mid + 1;
         }
       }
+      if (max < 0) max = 0;
       text = text.substring(0, indices[max]) + '…';
     }
     return text;
diff --git a/packages/charted/lib/core/utils/lists.dart b/packages/charted/lib/core/utils/lists.dart
index 02689a9..eb9d3c5 100644
--- a/packages/charted/lib/core/utils/lists.dart
+++ b/packages/charted/lib/core/utils/lists.dart
@@ -14,14 +14,14 @@
     : values.fold(0.0, (old, next) => old + next);
 
 /// Returns the smallest number in the given list of values
-num min(Iterable values) => values == null || values.isEmpty
+num min(Iterable<num> values) => values == null || values.isEmpty
     ? null
-    : values.fold(values.elementAt(0), math.min);
+    : values.fold(values.elementAt(0), (x, y) => math.min(x, y));
 
 /// Returns the largest number in the given list of values
-num max(Iterable values) => values == null || values.isEmpty
+num max(Iterable<num> values) => values == null || values.isEmpty
     ? null
-    : values.fold(values.elementAt(0), math.max);
+    : values.fold(values.elementAt(0), (x, y) => math.max(x, y));
 
 /// Represents a constant pair of values
 class Pair<T1, T2> {
diff --git a/packages/charted/lib/locale/format/number_format.dart b/packages/charted/lib/locale/format/number_format.dart
index 9e938f9..5964fcd 100644
--- a/packages/charted/lib/locale/format/number_format.dart
+++ b/packages/charted/lib/locale/format/number_format.dart
@@ -141,6 +141,7 @@
     var zcomma = (zfill != null) && comma;
 
     return (value) {
+      if (value == null) return '-';
       var fullSuffix = suffix;
 
       // Return the empty string for floats formatted as ints.
diff --git a/packages/charted/lib/svg/axis.dart b/packages/charted/lib/svg/axis.dart
index 474b436..fdc7d60 100644
--- a/packages/charted/lib/svg/axis.dart
+++ b/packages/charted/lib/svg/axis.dart
@@ -99,7 +99,6 @@
 
     var enter = ticks.enter.appendWithCallback((d, i, e) {
       var group = Namespace.createChildElement('g', e)
-        ..attributes['class'] = 'tick'
         ..append(Namespace.createChildElement('line', e))
         ..append(Namespace.createChildElement('text', e)
           ..attributes['dy'] =
@@ -113,6 +112,7 @@
     // All attributes/styles/classes that may change due to theme and scale.
     // TODO(prsd): Order elements before updating ticks.
     ticks.each((d, i, e) {
+      e.attributes['class'] = 'tick tick-$i';
       Element line = e.firstChild;
       Element text = e.lastChild;
       bool isRTLText = false; // FIXME(prsd)
diff --git a/packages/charted/pubspec.yaml b/packages/charted/pubspec.yaml
index cb9707a..5b55f85 100644
--- a/packages/charted/pubspec.yaml
+++ b/packages/charted/pubspec.yaml
@@ -1,5 +1,5 @@
 name: charted
-version: 0.4.0+1
+version: 0.4.8
 authors:
 - Prasad Sunkari <prsd@google.com>
 - Michael Cheng <midoringo@google.com>
@@ -10,7 +10,7 @@
   browser: any
   intl: any
   logging: any
-  observe: any
+  observable: '>=0.14.0 <0.15.0'
   quiver: any
 dev_dependencies:
   hop: '>=0.27.0'
diff --git a/packages/charted/test.disabled/charts/transformers/aggregation_transformer_test.dart b/packages/charted/test.disabled/charts/transformers/aggregation_transformer_test.dart
index 7616c19..bc6dd57 100644
--- a/packages/charted/test.disabled/charts/transformers/aggregation_transformer_test.dart
+++ b/packages/charted/test.disabled/charts/transformers/aggregation_transformer_test.dart
@@ -10,7 +10,7 @@
 import 'package:charted/charts/charts.dart';
 import 'package:charted/core/utils.dart';
 import 'package:unittest/unittest.dart';
-import 'package:observe/observe.dart';
+import 'package:observable/observable.dart';
 
 main() {
   List COLUMNS = [
diff --git a/packages/charted/test.disabled/charts/transformers/chain_transform_test.dart b/packages/charted/test.disabled/charts/transformers/chain_transform_test.dart
index 9b11053..68af614 100644
--- a/packages/charted/test.disabled/charts/transformers/chain_transform_test.dart
+++ b/packages/charted/test.disabled/charts/transformers/chain_transform_test.dart
@@ -3,7 +3,7 @@
 import 'package:charted/charts/charts.dart';
 import 'package:charted/core/utils.dart';
 import 'package:unittest/unittest.dart';
-import 'package:observe/observe.dart';
+import 'package:observable/observable.dart';
 
 main() {
   List COLUMNS = [
diff --git a/packages/cli_util/.gitignore b/packages/cli_util/.gitignore
index cc69f5b..76b960e 100644
--- a/packages/cli_util/.gitignore
+++ b/packages/cli_util/.gitignore
@@ -5,5 +5,7 @@
 .project
 .settings
 build/
+doc/api/
 packages
-pubspec.lock
\ No newline at end of file
+pubspec.lock
+.packages
diff --git a/packages/cli_util/CHANGELOG.md b/packages/cli_util/CHANGELOG.md
index 85af3d8..7a7bfa4 100644
--- a/packages/cli_util/CHANGELOG.md
+++ b/packages/cli_util/CHANGELOG.md
@@ -1,5 +1,23 @@
 # Changelog
 
+## 0.1.2
+
+- Fix a bug in `getSdkDir` (#21)
+
+## 0.1.1
+
+- Updated to the output for indeterminate progress
+- Exposed a `Logger.isVerbose` getter
+
+## 0.1.0
+
+- Use the new `Platform.resolvedExecutable` API to locate the SDK
+- Add the `cli_logging.dart` library - utilities to display output and progress
+
+## 0.0.1+3
+
+- Find SDK properly when invoked from inside SDK tests.
+
 ## 0.0.1+2
 
 - Support an executable in a symlinked directory.
diff --git a/packages/cli_util/CONTRIBUTING.md b/packages/cli_util/CONTRIBUTING.md
index 6f5e0ea..286d61c 100644
--- a/packages/cli_util/CONTRIBUTING.md
+++ b/packages/cli_util/CONTRIBUTING.md
@@ -23,7 +23,7 @@
 ### File headers
 All files in the project must start with the following header.
 
-    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
     // for details. All rights reserved. Use of this source code is governed by a
     // BSD-style license that can be found in the LICENSE file.
 
diff --git a/packages/cli_util/README.md b/packages/cli_util/README.md
index bcff2f3..0256472 100644
--- a/packages/cli_util/README.md
+++ b/packages/cli_util/README.md
@@ -7,8 +7,9 @@
 interact with the Dart SDK (such as the [analyzer][analyzer]).
 
 [![Build Status](https://travis-ci.org/dart-lang/cli_util.svg)](https://travis-ci.org/dart-lang/cli_util)
+[![Pub](https://img.shields.io/pub/v/cli_util.svg)](https://pub.dartlang.org/packages/cli_util)
 
-## Usage
+## Locating the Dart SDK
 
 ```dart
 import 'dart:io';
@@ -17,15 +18,47 @@
 import 'package:path/path.dart' as path;
 
 main(args) {
-  // Get sdk dir from cli_util
-  Directory sdkDir = getSdkDir(args);
+  // Get sdk dir from cli_util.
+  String sdkPath = getSdkPath();
   
   // Do stuff... For example, print version string
-  File versionFile = new File(path.join(sdkDir.path, 'version'));
+  File versionFile = new File(path.join(sdkPath, 'version'));
   print(versionFile.readAsStringSync());
 }
 ```
 
+## Displaying output and progress
+
+`package:cli_util` can also be used to help CLI tools display output and progress.
+It has a logging mechanism which can help differentiate between regular tool
+output and error messages, and can facilitate having a more verbose (`-v`) mode for
+output.
+
+In addition, it can display an indeterminate progress spinner for longer running
+tasks, and optionally display the elapsed time when finished: 
+
+```dart
+import 'package:cli_util/cli_logging.dart';
+
+main(List<String> args) async {
+  bool verbose = args.contains('-v');
+  Logger logger = verbose ? new Logger.verbose() : new Logger.standard();
+
+  logger.stdout('Hello world!');
+  logger.trace('message 1');
+  await new Future.delayed(new Duration(milliseconds: 200));
+  logger.trace('message 2');
+  logger.trace('message 3');
+
+  Progress progress = logger.progress('doing some work');
+  await new Future.delayed(new Duration(seconds: 2));
+  progress.finish(showTiming: true);
+
+  logger.stdout('All ${logger.ansi.emphasized('done')}.');
+  logger.flush();
+}
+```
+
 ## Features and bugs
 
 Please file feature requests and bugs at the [issue tracker][tracker].
diff --git a/packages/cli_util/analysis_options.yaml b/packages/cli_util/analysis_options.yaml
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/cli_util/analysis_options.yaml
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/cli_util/example/main.dart b/packages/cli_util/example/main.dart
new file mode 100644
index 0000000..0cc6846
--- /dev/null
+++ b/packages/cli_util/example/main.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:cli_util/cli_logging.dart';
+
+main(List<String> args) async {
+  bool verbose = args.contains('-v');
+  Logger logger = verbose ? new Logger.verbose() : new Logger.standard();
+
+  logger.stdout('Hello world!');
+  logger.trace('message 1');
+  await new Future.delayed(new Duration(milliseconds: 200));
+  logger.trace('message 2');
+  logger.trace('message 3');
+
+  Progress progress = logger.progress('doing some work');
+  await new Future.delayed(new Duration(seconds: 2));
+  progress.finish(showTiming: true);
+
+  logger.stdout('All ${logger.ansi.emphasized('done')}.');
+  logger.flush();
+}
diff --git a/packages/cli_util/lib/cli_logging.dart b/packages/cli_util/lib/cli_logging.dart
new file mode 100644
index 0000000..2da62ca
--- /dev/null
+++ b/packages/cli_util/lib/cli_logging.dart
@@ -0,0 +1,273 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library contains functionality to help command-line utilities to easily
+/// create aesthetic output.
+library cli_logging;
+
+import 'dart:async';
+import 'dart:io' as io;
+
+/// A small utility class to make it easier to work with common ANSI escape
+/// sequences.
+class Ansi {
+  /// Return whether the current stdout terminal supports ANSI escape sequences.
+  static bool get terminalSupportsAnsi {
+    return io.stdout.supportsAnsiEscapes &&
+        io.stdioType(io.stdout) == io.StdioType.TERMINAL;
+  }
+
+  final bool useAnsi;
+
+  Ansi(this.useAnsi);
+
+  String get cyan => _code('\u001b[36m');
+  String get green => _code('\u001b[32m');
+  String get magenta => _code('\u001b[35m');
+  String get red => _code('\u001b[31m');
+  String get yellow => _code('\u001b[33m');
+  String get blue => _code('\u001b[34m');
+  String get gray => _code('\u001b[1;30m');
+  String get noColor => _code('\u001b[39m');
+
+  String get none => _code('\u001b[0m');
+
+  String get bold => _code('\u001b[1m');
+
+  String get backspace => '\b';
+
+  String get bullet => io.stdout.supportsAnsiEscapes ? '•' : '-';
+
+  /// Display [message] in an emphasized format.
+  String emphasized(String message) => '$bold$message$none';
+
+  /// Display [message] in an subtle (gray) format.
+  String subtle(String message) => '$gray$message$none';
+
+  /// Display [message] in an error (red) format.
+  String error(String message) => '$red$message$none';
+
+  String _code(String ansiCode) => useAnsi ? ansiCode : '';
+}
+
+/// An abstract representation of a [Logger] - used to pretty print errors,
+/// standard status messages, trace level output, and indeterminate progress.
+abstract class Logger {
+  /// Create a normal [Logger]; this logger will not display trace level output.
+  factory Logger.standard({Ansi ansi}) => new _StandardLogger(ansi: ansi);
+
+  /// Create a [Logger] that will display trace level output.
+  factory Logger.verbose({Ansi ansi}) => new _VerboseLogger(ansi: ansi);
+
+  Ansi get ansi;
+
+  bool get isVerbose;
+
+  /// Print an error message.
+  void stderr(String message);
+
+  /// Print a standard status message.
+  void stdout(String message);
+
+  /// Print trace output.
+  void trace(String message);
+
+  /// Start an indeterminate progress display.
+  Progress progress(String message);
+  void _progressFinished(Progress progress);
+
+  /// Flush any un-written output.
+  void flush();
+}
+
+/// A handle to an indeterminate progress display.
+abstract class Progress {
+  final String message;
+  final Stopwatch _stopwatch;
+
+  Progress._(this.message) : _stopwatch = new Stopwatch()..start();
+
+  Duration get elapsed => _stopwatch.elapsed;
+
+  /// Finish the indeterminate progress display.
+  void finish({String message, bool showTiming});
+
+  /// Cancel the indeterminate progress display.
+  void cancel();
+}
+
+class _StandardLogger implements Logger {
+  Ansi ansi;
+
+  _StandardLogger({this.ansi}) {
+    ansi ??= new Ansi(Ansi.terminalSupportsAnsi);
+  }
+
+  bool get isVerbose => false;
+
+  Progress _currentProgress;
+
+  void stderr(String message) {
+    io.stderr.writeln(message);
+    _currentProgress?.cancel();
+    _currentProgress = null;
+  }
+
+  void stdout(String message) {
+    print(message);
+    _currentProgress?.cancel();
+    _currentProgress = null;
+  }
+
+  void trace(String message) {}
+
+  Progress progress(String message) {
+    _currentProgress?.cancel();
+    _currentProgress = null;
+
+    Progress progress = ansi.useAnsi
+        ? new _AnsiProgress(this, ansi, message)
+        : new _SimpleProgress(this, message);
+    _currentProgress = progress;
+    return progress;
+  }
+
+  void _progressFinished(Progress progress) {
+    if (_currentProgress == progress) {
+      _currentProgress = null;
+    }
+  }
+
+  void flush() {}
+}
+
+class _SimpleProgress extends Progress {
+  final Logger logger;
+
+  _SimpleProgress(this.logger, String message) : super._(message) {
+    logger.stdout('$message...');
+  }
+
+  @override
+  void cancel() {
+    logger._progressFinished(this);
+  }
+
+  @override
+  void finish({String message, bool showTiming}) {
+    logger._progressFinished(this);
+  }
+}
+
+class _AnsiProgress extends Progress {
+  static const List<String> kAnimationItems = const ['/', '-', '\\', '|'];
+
+  final Logger logger;
+  final Ansi ansi;
+
+  int _index = 0;
+  Timer _timer;
+
+  _AnsiProgress(this.logger, this.ansi, String message) : super._(message) {
+    io.stdout.write('${message}...  '.padRight(40));
+
+    _timer = new Timer.periodic(new Duration(milliseconds: 80), (t) {
+      _index++;
+      _updateDisplay();
+    });
+
+    _updateDisplay();
+  }
+
+  @override
+  void cancel() {
+    if (_timer.isActive) {
+      _timer.cancel();
+      _updateDisplay(cancelled: true);
+      logger._progressFinished(this);
+    }
+  }
+
+  @override
+  void finish({String message, bool showTiming: false}) {
+    if (_timer.isActive) {
+      _timer.cancel();
+      _updateDisplay(isFinal: true, message: message, showTiming: showTiming);
+      logger._progressFinished(this);
+    }
+  }
+
+  void _updateDisplay(
+      {bool isFinal: false,
+      bool cancelled: false,
+      String message,
+      bool showTiming: false}) {
+    String char = kAnimationItems[_index % kAnimationItems.length];
+    if (isFinal || cancelled) {
+      char = '';
+    }
+    io.stdout.write('${ansi.backspace}${char}');
+    if (isFinal || cancelled) {
+      if (message != null) {
+        io.stdout.write(message.isEmpty ? ' ' : message);
+      } else if (showTiming) {
+        String time = (elapsed.inMilliseconds / 1000.0).toStringAsFixed(1);
+        io.stdout.write('${time}s');
+      } else {
+        io.stdout.write(' ');
+      }
+      io.stdout.writeln();
+    }
+  }
+}
+
+class _VerboseLogger implements Logger {
+  Ansi ansi;
+  Stopwatch _timer;
+
+  String _previousErr;
+  String _previousMsg;
+
+  _VerboseLogger({this.ansi}) {
+    ansi ??= new Ansi(Ansi.terminalSupportsAnsi);
+    _timer = new Stopwatch()..start();
+  }
+
+  bool get isVerbose => true;
+
+  void stderr(String message) {
+    flush();
+    _previousErr = '${ansi.red}$message${ansi.none}';
+  }
+
+  void stdout(String message) {
+    flush();
+    _previousMsg = message;
+  }
+
+  void trace(String message) {
+    flush();
+    _previousMsg = '${ansi.gray}$message${ansi.none}';
+  }
+
+  Progress progress(String message) => new _SimpleProgress(this, message);
+
+  void _progressFinished(Progress progress) {}
+
+  void flush() {
+    if (_previousErr != null) {
+      io.stderr.writeln('${_createTag()} $_previousErr');
+      _previousErr = null;
+    } else if (_previousMsg != null) {
+      io.stdout.writeln('${_createTag()} $_previousMsg');
+      _previousMsg = null;
+    }
+  }
+
+  String _createTag() {
+    int millis = _timer.elapsedMilliseconds;
+    _timer.reset();
+    return '[${millis.toString().padLeft(4)} ms]';
+  }
+}
diff --git a/packages/cli_util/lib/cli_util.dart b/packages/cli_util/lib/cli_util.dart
index aff2c67..d58be7a 100644
--- a/packages/cli_util/lib/cli_util.dart
+++ b/packages/cli_util/lib/cli_util.dart
@@ -2,15 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Utilities to return the Dart SDK location.
 library cli_util;
 
 import 'dart:io';
 
-import 'package:path/path.dart' as p;
-import 'package:which/which.dart';
+import 'package:path/path.dart' as path;
 
-/// Return the path to the current Dart SDK. This will return `null` if we are
-/// unable to locate the Dart SDK.
+import 'src/utils.dart';
+
+/// Return the path to the current Dart SDK.
+///
+/// This first checks for an explicit SDK listed on the command-line
+/// (`--dart-sdk`). It then looks in any `DART_SDK` environment variable. Next,
+/// it looks relative to the Dart VM executable. Last, it uses the
+/// [Platform.resolvedExecutable] API.
+///
+/// Callers should generally prefer using the [getSdkPath] function.
+@Deprecated('Clients should generally prefer getSdkPath()')
 Directory getSdkDir([List<String> cliArgs]) {
   // Look for --dart-sdk on the command line.
   if (cliArgs != null) {
@@ -33,36 +42,19 @@
   }
 
   // Look relative to the dart executable.
-  Directory sdkDirectory = new File(Platform.executable).parent.parent;
-  if (_isSdkDir(sdkDirectory)) return sdkDirectory;
+  File platformExecutable = new File(Platform.executable);
+  Directory sdkDirectory = platformExecutable.parent.parent;
+  if (isSdkDir(sdkDirectory)) return sdkDirectory;
 
-  // Try and locate the VM using 'which'.
-  String executable = whichSync('dart', orElse: () => null);
+  // Handle the case where Platform.executable is a sibling of the SDK directory
+  // (this happens during internal testing).
+  sdkDirectory =
+      new Directory(path.join(platformExecutable.parent.path, 'dart-sdk'));
+  if (isSdkDir(sdkDirectory)) return sdkDirectory;
 
-  if (executable != null) {
-    // In case Dart is symlinked (e.g. homebrew on Mac) follow symbolic links.
-    Link link = new Link(executable);
-    if (link.existsSync()) {
-      executable = link.resolveSymbolicLinksSync();
-    }
-
-    Link parentLink = new Link(p.dirname(executable));
-    if (parentLink.existsSync()) {
-      executable = p.join(
-          parentLink.resolveSymbolicLinksSync(), p.basename(executable));
-    }
-
-    File dartVm = new File(executable);
-    Directory dir = dartVm.parent.parent;
-    if (_isSdkDir(dir)) return dir;
-  }
-
-  return null;
+  // Use `Platform.resolvedExecutable`.
+  return new Directory(getSdkPath());
 }
 
-bool _isSdkDir(Directory dir) => _joinFile(dir, ['version']).existsSync();
-
-File _joinFile(Directory dir, List<String> files) {
-  String pathFragment = files.join(Platform.pathSeparator);
-  return new File("${dir.path}${Platform.pathSeparator}${pathFragment}");
-}
+/// Return the path to the current Dart SDK.
+String getSdkPath() => path.dirname(path.dirname(Platform.resolvedExecutable));
diff --git a/packages/cli_util/lib/src/utils.dart b/packages/cli_util/lib/src/utils.dart
new file mode 100644
index 0000000..66bab2f
--- /dev/null
+++ b/packages/cli_util/lib/src/utils.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+
+bool isSdkDir(Directory dir) =>
+    FileSystemEntity.isFileSync(path.join(dir.path, 'version'));
diff --git a/packages/cli_util/pubspec.yaml b/packages/cli_util/pubspec.yaml
index c27866d..05ccd97 100644
--- a/packages/cli_util/pubspec.yaml
+++ b/packages/cli_util/pubspec.yaml
@@ -1,12 +1,14 @@
 name: cli_util
-version: 0.0.1+2
+version: 0.1.2
 author: Dart Team <misc@dartlang.org>
 description: A library to help in building Dart command-line apps.
 homepage: https://github.com/dart-lang/cli_util
+
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.11.0 <2.0.0-dev.infinity'
+
 dependencies:
   path: '>=1.0.0 <2.0.0'
-  which: '>=0.1.2 <0.2.0'
+
 dev_dependencies:
-  unittest: '>=0.11.0 <0.12.0'
+  test: ^0.12.0
diff --git a/packages/cli_util/test/cli_util_test.dart b/packages/cli_util/test/cli_util_test.dart
index b7b7822..82fb83c 100644
--- a/packages/cli_util/test/cli_util_test.dart
+++ b/packages/cli_util/test/cli_util_test.dart
@@ -2,20 +2,38 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io';
+
 import 'package:cli_util/cli_util.dart';
-import 'package:unittest/unittest.dart';
+import 'package:cli_util/src/utils.dart';
+import 'package:test/test.dart';
+
+main() => defineTests();
 
 void defineTests() {
   group('getSdkDir', () {
     test('arg parsing', () {
+      // ignore: deprecated_member_use
       expect(getSdkDir(['--dart-sdk', '/dart/sdk']).path, equals('/dart/sdk'));
+      // ignore: deprecated_member_use
       expect(getSdkDir(['--dart-sdk=/dart/sdk']).path, equals('/dart/sdk'));
     });
+
+    test('finds the SDK without cli args', () {
+      // ignore: deprecated_member_use
+      expect(getSdkDir(), isNotNull);
+    });
   });
-}
 
-main() {
-  groupSep = ' | ';
+  group('getSdkPath', () {
+    test('sdkPath', () {
+      expect(getSdkPath(), isNotNull);
+    });
+  });
 
-  defineTests();
+  group('utils', () {
+    test('isSdkDir', () {
+      expect(isSdkDir(new Directory(getSdkPath())), true);
+    });
+  });
 }
diff --git a/packages/cli_util/tool/travis.sh b/packages/cli_util/tool/travis.sh
index e8e10b7..0b0aef9 100755
--- a/packages/cli_util/tool/travis.sh
+++ b/packages/cli_util/tool/travis.sh
@@ -23,4 +23,4 @@
     --retry 2 \
     --exclude-test-files \
     test/cli_util_test.dart
-fi
\ No newline at end of file
+fi
diff --git a/packages/code_transformers/.analysis_options b/packages/code_transformers/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/code_transformers/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/code_transformers/.status b/packages/code_transformers/.status
deleted file mode 100644
index c6d9e7f..0000000
--- a/packages/code_transformers/.status
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Don't run any test-like files that show up in packages directories. It
-# shouldn't be necessary to run "pub install" in these packages, but if you do
-# it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
-
-build/*: Skip  # nothing requires pub-build
-
-[ $runtime == vm && $mode == debug]
-test/resolver_test: Skip  # Times out
-
-[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
-test/resolver_test: Skip # Issue 17908
-
-[ $compiler == dart2js ]
-test/unique_message_test: Skip # Intended only as a vm test.
-
-[ $browser ]
-test/assets_test: Skip # Uses dart:io
-test/entry_point_test: Skip # Uses dart:io
-test/resolver_test: Skip # Uses dart:io
-test/unique_message_test: Skip # Uses dart:io
-test/remove_sourcemap_comment_test: Skip # Uses dart:io.
-test/benchmarks_test: Skip # Uses dart:io.
diff --git a/packages/code_transformers/.test_config b/packages/code_transformers/.test_config
new file mode 100644
index 0000000..2535563
--- /dev/null
+++ b/packages/code_transformers/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
diff --git a/packages/code_transformers/.travis.yml b/packages/code_transformers/.travis.yml
index 7012012..2331ace 100644
--- a/packages/code_transformers/.travis.yml
+++ b/packages/code_transformers/.travis.yml
@@ -6,3 +6,4 @@
 cache:
   directories:
     - $HOME/.pub-cache/hosted
+script: ./tool/travis.sh
diff --git a/packages/code_transformers/CHANGELOG.md b/packages/code_transformers/CHANGELOG.md
index 2e397c7..a9eab5d 100644
--- a/packages/code_transformers/CHANGELOG.md
+++ b/packages/code_transformers/CHANGELOG.md
@@ -1,3 +1,92 @@
+## 0.5.1+3
+
+* Support the latest `cli_util` package.
+
+## 0.5.1+2
+
+* Support the latest `analyzer` package.
+
+## 0.5.1+1
+
+* Updated mock SDK sources to include FutureOr<T> (and fixed a syntax error)
+
+## 0.5.1
+
+* Resolver has a new method which can check whether an Asset is a Dart library
+  source
+
+## 0.5.0+2
+
+* Resolver no longer returns a partial LibraryElement for assets which are not
+  libraries
+
+## 0.5.0+1
+
+* Stop using deprecated analyzer apis.
+
+## 0.5.0
+
+* Always use a single `Resolver` instance. Fixes an issue where running with the
+  'build' package in file watching mode would treat some files as never
+  changing.
+* Breaking Change: remove the `useSharedSources` argument to Resolvers ctor
+  since sources are always shared.
+
+## 0.4.2+4
+
+* Update to work with analyzer 0.29.x and transform_test 0.2.x
+
+## 0.4.2+3
+
+* Update to work with analyzer 0.28.x.
+
+## 0.4.2+2
+
+* Update to work with analyzer 0.23.x.
+
+## 0.4.2+1
+
+* Contains a fix for the `useSharedSources` option that could result in null
+  library elements when running on multiple entry points.
+
+## 0.4.2
+
+* Use Strong Mode, fixes
+  [#38](https://github.com/dart-lang/code_transformers/issues/38).
+
+## 0.4.1
+
+* Added a fix for [#24890](https://github.com/dart-lang/sdk/issues/24890).
+  * All constants in all libraries will once again be resolved by default.
+  * Added a new `resolveAllLibraries` option to `Resolver#resolve` and
+    `Resolvers#get`. If `false` is passed then constants will not be resolved in
+    non entry points. This saves significant time if constants are not needed.
+* Added a `useSharedSources` option to `Resolvers`. This gives a significant
+  speed increase, but must be used carefully.
+  * If used, then all `Resolver` instances created from the same `Resolvers`
+    instance will share the same sources cache.
+  * This should be generally safe to use if the `Resolvers` instance is created
+    in the constructor of your `Transformer`.
+  * This option should probably not be used with a static or shared `Resolvers`
+    instance.
+
+## 0.4.0
+
+* Remove dependency on `test`, and move all test related apis to a new
+  `transformer_test` package which is now a dev dependency.
+
+## 0.3.1
+
+* Update to analyzer `>=0.27.0 <0.28.0`.
+
+## 0.3.0+1
+
+* Upgrade `test` to a real dependency.
+
+## 0.3.0
+
+* Re-release `0.2.10` release as `0.3.0`.
+
 ## 0.2.11
 
 * Revert `0.2.10` release, will be re-released as `0.3.0` since it is actually
diff --git a/packages/code_transformers/lib/assets.dart b/packages/code_transformers/lib/assets.dart
index 4a3516f..dacc582 100644
--- a/packages/code_transformers/lib/assets.dart
+++ b/packages/code_transformers/lib/assets.dart
@@ -83,7 +83,7 @@
       return _extractOtherPackageId(1, segments, logger, span);
     } else {
       var prefix = segments[index];
-      var fixedSegments = [];
+      var fixedSegments = <String>[];
       fixedSegments.addAll(sourceSegments.map((_) => '..'));
       fixedSegments.addAll(segments.sublist(index));
       var fixedUrl = urlBuilder.joinAll(fixedSegments);
@@ -99,7 +99,7 @@
 }
 
 AssetId _extractOtherPackageId(
-    int index, List segments, TransformLogger logger, SourceSpan span) {
+    int index, List<String> segments, TransformLogger logger, SourceSpan span) {
   if (index >= segments.length) return null;
   var prefix = segments[index];
   if (prefix != 'packages' && prefix != 'assets') return null;
@@ -140,7 +140,8 @@
       return null;
     }
     return new Uri(
-            path: path.url.relative(assetId.path, from: path.url.dirname(from.path)))
+            path: path.url
+                .relative(assetId.path, from: path.url.dirname(from.path)))
         .toString();
   }
 
diff --git a/packages/code_transformers/lib/messages/build_logger.dart b/packages/code_transformers/lib/messages/build_logger.dart
index 0e7ecf8..39dfcf8 100644
--- a/packages/code_transformers/lib/messages/build_logger.dart
+++ b/packages/code_transformers/lib/messages/build_logger.dart
@@ -10,7 +10,7 @@
 import 'package:barback/barback.dart';
 import 'package:source_span/source_span.dart';
 
-import 'messages.dart' show Message, MessageId, BuildLogEntry, LogEntryTable;
+import 'messages.dart' show Message, BuildLogEntry, LogEntryTable;
 
 /// A [TransformLogger] used to track error and warning messages produced during
 /// a build.
@@ -59,7 +59,7 @@
 
   /// Records a message at the fine level. If [msg] is a [Message] it is
   /// recorded directly, otherwise it is first converted to a [String].
-  void fine(msg, {AssetId asset, SourceSpan span}) {
+  void fine(Object msg, {AssetId asset, SourceSpan span}) {
     msg = msg is Message ? msg : new Message.unknown('$msg');
     _transform.logger.fine(_snippet(msg), asset: asset, span: span);
     _logs.add(new BuildLogEntry(msg, span, LogLevel.FINE.name));
@@ -67,7 +67,7 @@
 
   /// Records a message at the info level. If [msg] is a [Message] it is
   /// recorded directly, otherwise it is first converted to a [String].
-  void info(msg, {AssetId asset, SourceSpan span}) {
+  void info(Object msg, {AssetId asset, SourceSpan span}) {
     msg = msg is Message ? msg : new Message.unknown('$msg');
     _transform.logger.info(_snippet(msg), asset: asset, span: span);
     _logs.add(new BuildLogEntry(msg, span, LogLevel.INFO.name));
@@ -75,7 +75,7 @@
 
   /// Records a warning message. If [msg] is a [Message] it is recorded
   /// directly, otherwise it is first converted to a [String].
-  void warning(msg, {AssetId asset, SourceSpan span}) {
+  void warning(Object msg, {AssetId asset, SourceSpan span}) {
     msg = msg is Message ? msg : new Message.unknown('$msg');
     _transform.logger.warning(_snippet(msg), asset: asset, span: span);
     _logs.add(new BuildLogEntry(msg, span, LogLevel.WARNING.name));
@@ -83,7 +83,7 @@
 
   /// Records an error message. If [msg] is a [Message] it is recorded
   /// directly, otherwise it is first converted to a [String].
-  void error(msg, {AssetId asset, SourceSpan span}) {
+  void error(Object msg, {AssetId asset, SourceSpan span}) {
     msg = msg is Message ? msg : new Message.unknown('$msg');
     if (convertErrorsToWarnings) {
       _transform.logger.warning(_snippet(msg), asset: asset, span: span);
@@ -110,12 +110,11 @@
 
   // Each phase outputs a new log file with an incrementing # appended, this
   // figures out the next # to use.
-  Future<AssetId> _getNextLogAssetId([int nextNumber = 1]) {
+  Future<AssetId> _getNextLogAssetId([int nextNumber = 1]) async {
     var nextAssetPath = _primaryId.addExtension('${LOG_EXTENSION}.$nextNumber');
-    return _transform.hasInput(nextAssetPath).then((exists) {
-      if (!exists) return nextAssetPath;
-      return _getNextLogAssetId(++nextNumber);
-    });
+    bool exists = await _transform.hasInput(nextAssetPath);
+    if (!exists) return nextAssetPath;
+    return _getNextLogAssetId(++nextNumber);
   }
 
   // Reads all log files for an Asset into [logs].
@@ -126,7 +125,8 @@
     return transform.hasInput(nextAssetPath).then((exists) {
       if (!exists) return null;
       return transform.readInputAsString(nextAssetPath).then((data) {
-        entries.addAll(new LogEntryTable.fromJson(JSON.decode(data)));
+        entries.addAll(new LogEntryTable.fromJson(
+            JSON.decode(data) as Map<String, Iterable>));
         return _readLogFilesForAsset(id, transform, entries, ++nextNumber);
       });
     });
diff --git a/packages/code_transformers/lib/messages/messages.dart b/packages/code_transformers/lib/messages/messages.dart
index 56f3c0e..77ea05f 100644
--- a/packages/code_transformers/lib/messages/messages.dart
+++ b/packages/code_transformers/lib/messages/messages.dart
@@ -11,13 +11,14 @@
 // so it can easily be used both in the transformers and in client-side apps
 // (for example in the log_injector).
 import 'dart:collection' show LinkedHashMap;
+
 import 'package:source_span/source_span.dart';
 
 /// A globally unique identifier for an error message. This identifier should be
 /// stable, that is, it should never change after it is asigned to a particular
 /// message. That allows us to document our error messages and make them
 /// searchable for prosperity.
-class MessageId implements Comparable {
+class MessageId implements Comparable<MessageId> {
   /// Name of the package that declares this message.
   final String package;
 
@@ -48,7 +49,9 @@
         data.substring(0, index), int.parse(data.substring(index + 1)));
   }
 
-  operator ==(MessageId other) => package == other.package && id == other.id;
+  operator ==(Object other) =>
+      other is MessageId && package == other.package && id == other.id;
+
   int get hashCode => 31 * package.hashCode + id;
 }
 
@@ -164,7 +167,10 @@
 
   /// Serializes this log entry to JSON.
   Map toJson() {
-    var data = {'level': level, 'message': message.toJson(),};
+    var data = {
+      'level': level,
+      'message': message.toJson(),
+    };
     if (span != null) {
       data['span'] = {
         'start': {
@@ -184,6 +190,7 @@
     }
     return data;
   }
+
   String toString() => '${toJson()}';
 }
 
@@ -194,7 +201,7 @@
   LogEntryTable() : entries = new LinkedHashMap();
 
   /// Creates a new [LogEntryTable] from an encoded value produced via [toJson].
-  factory LogEntryTable.fromJson(Map json) {
+  factory LogEntryTable.fromJson(Map<String, Iterable> json) {
     var res = new LogEntryTable();
     for (String key in json.keys) {
       var id = new MessageId.fromJson(key);
@@ -212,11 +219,13 @@
     });
     return res;
   }
+
   String toString() => '${toJson()}';
 
   void add(BuildLogEntry entry) {
     entries.putIfAbsent(entry.message.id, () => []).add(entry);
   }
+
   void addAll(LogEntryTable other) {
     for (var key in other.entries.keys) {
       var values = entries.putIfAbsent(key, () => []);
diff --git a/packages/code_transformers/lib/src/async_benchmark_base.dart b/packages/code_transformers/lib/src/async_benchmark_base.dart
index 0d9966f..423ff64 100644
--- a/packages/code_transformers/lib/src/async_benchmark_base.dart
+++ b/packages/code_transformers/lib/src/async_benchmark_base.dart
@@ -54,18 +54,16 @@
   }
 
   // Measures the average time to call `run` once and returns it.
-  Future<double> measure({int iterations: 10}) {
+  Future<double> measure({int iterations: 10}) async {
     // Unmeasured setup code.
-    return setup().then((_) {
-      // Warmup for at least 100ms. Discard result.
-      return measureFor(() => warmup(), 100);
-    }).then((_) {
-      // Run the benchmark for at least 2000ms.
-      return measureFor(() => exercise(iterations: iterations), 2000);
-    }).then((result) {
-      // Tear down the test (unmeasured) and return the result divided by the
-      // number of iterations.
-      return teardown().then((_) => result / iterations);
-    });
+    await setup();
+    // Warmup for at least 100ms. Discard result.
+    await measureFor(() => warmup(), 100);
+    // Run the benchmark for at least 2000ms.
+    var result = await measureFor(() => exercise(iterations: iterations), 2000);
+    // Tear down the test (unmeasured) and return the result divided by the
+    // number of iterations.
+    await teardown();
+    return result / iterations;
   }
 }
diff --git a/packages/code_transformers/lib/src/dart_sdk.dart b/packages/code_transformers/lib/src/dart_sdk.dart
index f99e606..4c6ca99 100644
--- a/packages/code_transformers/lib/src/dart_sdk.dart
+++ b/packages/code_transformers/lib/src/dart_sdk.dart
@@ -6,11 +6,13 @@
 
 import 'dart:io' show Directory;
 
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/idl.dart';
 import 'package:cli_util/cli_util.dart' as cli_util;
 
 /// Attempts to provide the current Dart SDK directory.
@@ -31,9 +33,10 @@
 
 /// Dart SDK which wraps all Dart sources as [UriAnnotatedSource] to ensure they
 /// are tracked with Uris.
-class DirectoryBasedDartSdkProxy extends DirectoryBasedDartSdk {
-  DirectoryBasedDartSdkProxy(String sdkDirectory)
-      : super(new JavaFile(sdkDirectory));
+class FolderBasedDartSdkProxy extends FolderBasedDartSdk {
+  FolderBasedDartSdkProxy(
+      ResourceProvider resourceProvider, String sdkDirectory)
+      : super(resourceProvider, resourceProvider.getFolder(sdkDirectory));
 
   Source mapDartUri(String dartUri) =>
       DartSourceProxy.wrap(super.mapDartUri(dartUri), Uri.parse(dartUri));
@@ -62,7 +65,6 @@
 /// This is primarily to support [Resolver.getImportUri] for Dart SDK (dart:)
 /// based libraries.
 class DartSourceProxy implements UriAnnotatedSource {
-
   /// Absolute URI which this source can be imported from
   final Uri uri;
 
@@ -108,6 +110,8 @@
 
   String get fullName => _proxy.fullName;
 
+  Source get librarySource => _proxy.librarySource;
+
   int get modificationStamp => _proxy.modificationStamp;
 
   String get shortName => _proxy.shortName;
@@ -125,11 +129,13 @@
   final Map<String, SdkLibrary> _libs = {};
   final String sdkVersion = '0';
   List<String> get uris => _sources.keys.map((uri) => '$uri').toList();
-  final AnalysisContext context = new SdkAnalysisContext();
+  final InternalAnalysisContext context;
   DartUriResolver _resolver;
   DartUriResolver get resolver => _resolver;
 
-  MockDartSdk(Map<String, String> sources, {this.reportMissing}) {
+  MockDartSdk(Map<String, String> sources, AnalysisOptions options,
+      {this.reportMissing})
+      : this.context = new SdkAnalysisContext(options) {
     sources.forEach((uriString, contents) {
       var uri = Uri.parse(uriString);
       _sources[uri] = new _MockSdkSource(uri, contents);
@@ -166,6 +172,9 @@
   Source fromFileUri(Uri uri) {
     throw new UnsupportedError('MockDartSdk.fromFileUri');
   }
+
+  @override
+  PackageBundle getLinkedBundle() => null;
 }
 
 class _MockSdkSource implements UriAnnotatedSource {
@@ -175,6 +184,8 @@
 
   Source get source => this;
 
+  Source get librarySource => null;
+
   _MockSdkSource(this.uri, this._contents);
 
   bool exists() => true;
@@ -201,6 +212,8 @@
 
   Uri resolveRelativeUri(Uri relativeUri) =>
       throw new UnsupportedError('not expecting relative urls in dart: mocks');
+
+  bool operator ==(Object other) => identical(this, other);
 }
 
 /// Sample mock SDK sources.
@@ -249,6 +262,8 @@
   'dart:async': '''
         class Future<T> {
           Future then(callback) {}
+        }
+        class FutureOr<T> {}
         class Stream<T> {}
   ''',
   'dart:html': '''
diff --git a/packages/code_transformers/lib/src/entry_point.dart b/packages/code_transformers/lib/src/entry_point.dart
index 21f7acf..b654409 100644
--- a/packages/code_transformers/lib/src/entry_point.dart
+++ b/packages/code_transformers/lib/src/entry_point.dart
@@ -4,7 +4,7 @@
 import 'dart:async';
 
 import 'package:analyzer/analyzer.dart' as analyzer;
-import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:barback/barback.dart';
 
 /// Checks to see if the provided AssetId is a Dart file in a directory which
@@ -15,12 +15,8 @@
 bool isPossibleDartEntryId(AssetId id) {
   if (id.extension != '.dart') return false;
 
-  return [
-    'benchmark',
-    'example',
-    'test',
-    'web'
-  ].any((dir) => id.path.startsWith("$dir/"));
+  return ['benchmark', 'example', 'test', 'web']
+      .any((dir) => id.path.startsWith("$dir/"));
 }
 
 /// Checks to see if the provided Asset is possibly a Dart entry point.
@@ -43,10 +39,10 @@
 bool _couldBeEntrypoint(CompilationUnit compilationUnit) {
   // Allow two or fewer arguments so that entrypoints intended for use with
   // [spawnUri] get counted.
-  var hasMain = compilationUnit.declarations.any(
-      (node) => node is FunctionDeclaration &&
-          node.name.name == "main" &&
-          node.functionExpression.parameters.parameters.length <= 2);
+  var hasMain = compilationUnit.declarations.any((node) =>
+      node is FunctionDeclaration &&
+      node.name.name == "main" &&
+      node.functionExpression.parameters.parameters.length <= 2);
 
   if (hasMain) return true;
 
diff --git a/packages/code_transformers/lib/src/messages.dart b/packages/code_transformers/lib/src/messages.dart
index a78969a..c91fe3d 100644
--- a/packages/code_transformers/lib/src/messages.dart
+++ b/packages/code_transformers/lib/src/messages.dart
@@ -9,7 +9,9 @@
 
 const NO_ABSOLUTE_PATHS = const MessageTemplate(
     const MessageId('code_transformers', 1),
-    'absolute paths not allowed: "%-url-%"', 'Absolute paths not allowed', '''
+    'absolute paths not allowed: "%-url-%"',
+    'Absolute paths not allowed',
+    '''
 The transformers processing your code were trying to resolve a URL and identify
 a file that they correspond to. Currently only relative paths can be resolved.
 ''');
@@ -19,7 +21,9 @@
     'Invalid URL to reach to another package: %-url-%. Path '
     'reaching to other packages must first reach up all the '
     'way to the %-prefix-% directory. For example, try changing the URL '
-    'to: %-fixedUrl-%', 'Invalid URL to reach another package', '''
+    'to: %-fixedUrl-%',
+    'Invalid URL to reach another package',
+    '''
 To reach an asset that belongs to another package, use `package:` URLs in
 Dart code, but in any other language (like HTML or CSS) use relative URLs that
 first go all the way to the `packages/` directory.
@@ -34,7 +38,8 @@
     const MessageId('code_transformers', 3),
     'incomplete %-prefix-%/ path. It should have at least 3 '
     'segments %-prefix-%/name/path_from_name\'s_%-folder-%_dir',
-    'Incomplete URL to asset in another package', '''
+    'Incomplete URL to asset in another package',
+    '''
 URLs that refer to assets in other packages need to explicitly mention the
 `packages/` directory. In the future this requirement might be removed, but for
 now you must use a canonical URL form for it.
@@ -50,7 +55,8 @@
 const UNSPECIFIED_FROM_IN_NON_LIB_ASSET = const MessageTemplate(
     const MessageId('code_transformers', 4),
     'Cannot create URI for %-id-% without specifying where to import it from.',
-    'Missing `from` argument.', '''
+    'Missing `from` argument.',
+    '''
 Assets outside of the lib folder can only be imported via relative URIs. Use
 the `from` argument in `assetIdToUri` to specify the location in the same
 package where you intend to import this asset from.
@@ -58,7 +64,8 @@
 
 const IMPORT_FROM_DIFFERENT_PACKAGE = const MessageTemplate(
     const MessageId('code_transformers', 5),
-    'Not possible to import %-toId-% from %-fromId-%', 'Cannot import asset.',
+    'Not possible to import %-toId-% from %-fromId-%',
+    'Cannot import asset.',
     '''
 Assets outside of the lib folder can only be imported via relative URIs from
 assets in the same package. To import an asset from another package, you need to
diff --git a/packages/code_transformers/lib/src/resolver.dart b/packages/code_transformers/lib/src/resolver.dart
index 7d5c8d0..2c8b60f 100644
--- a/packages/code_transformers/lib/src/resolver.dart
+++ b/packages/code_transformers/lib/src/resolver.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-import 'package:analyzer/src/generated/ast.dart' show Expression;
+import 'package:analyzer/dart/ast/ast.dart' show Expression;
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResult;
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:barback/barback.dart';
 import 'package:source_maps/refactor.dart';
 import 'package:source_span/source_span.dart';
@@ -21,11 +21,25 @@
   ///
   /// [release] must be called when done handling this Resolver to allow it
   /// to be used by later phases.
-  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]);
+  ///
+  /// If [resolveAllLibraries] is [false], then transitive imports will not
+  /// be resolved. This will result in faster resolution, but you will need to
+  /// manually call something like
+  /// `libary.context.computeLibraryElement(library.definingCompilationUnit.source);`
+  /// for each [LibraryElement] that you want to ensure is fully resolved. The
+  /// default value is [true].
+  Future<Resolver> resolve(Transform transform,
+      [List<AssetId> entryPoints, bool resolveAllLibraries]);
 
   /// Release this resolver so it can be updated by following transforms.
   void release();
 
+  /// Whether [assetId] represents an Dart library file.
+  ///
+  /// This will be false in the case where the file is not Dart source code, or
+  /// is a 'part of' file.
+  bool isLibrary(AssetId assetId);
+
   /// Gets the resolved Dart library for an asset, or null if the AST has not
   /// been resolved.
   ///
diff --git a/packages/code_transformers/lib/src/resolver_impl.dart b/packages/code_transformers/lib/src/resolver_impl.dart
index 9670c3a..48b5405 100644
--- a/packages/code_transformers/lib/src/resolver_impl.dart
+++ b/packages/code_transformers/lib/src/resolver_impl.dart
@@ -6,10 +6,10 @@
 
 import 'dart:async';
 import 'package:analyzer/analyzer.dart' show parseDirectives;
-import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/constant.dart'
     show ConstantEvaluator, EvaluationResult;
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
@@ -31,8 +31,7 @@
 /// with the resolved AST.
 class ResolverImpl implements Resolver {
   /// Cache of all asset sources currently referenced.
-  final Map<AssetId, _AssetBasedSource> sources =
-      <AssetId, _AssetBasedSource>{};
+  final Map<AssetId, AssetBasedSource> sources = {};
 
   final InternalAnalysisContext _context =
       AnalysisEngine.instance.createAnalysisContext();
@@ -56,29 +55,42 @@
       {AnalysisOptions options}) {
     if (options == null) {
       options = new AnalysisOptionsImpl()
-        ..cacheSize = 256 // # of sources to cache ASTs for.
         ..preserveComments = false
         ..analyzeFunctionBodies = true;
     }
     _context.analysisOptions = options;
-    sdk.context.analysisOptions = options;
     _context.sourceFactory =
         new SourceFactory([dartUriResolver, new _AssetUriResolver(this)]);
   }
 
-  LibraryElement getLibrary(AssetId assetId) {
+  @override
+  bool isLibrary(AssetId assetId) {
     var source = sources[assetId];
-    return source == null ? null : _context.computeLibraryElement(source);
+    return source != null && _isLibrary(source);
   }
 
-  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]) {
+  bool _isLibrary(Source source) =>
+      _context.computeKindOf(source) == SourceKind.LIBRARY;
+
+  @override
+  LibraryElement getLibrary(AssetId assetId) {
+    var source = sources[assetId];
+    if (source == null) return null;
+    if (!_isLibrary(source)) return null;
+    return _context.computeLibraryElement(source);
+  }
+
+  Future<Resolver> resolve(Transform transform,
+      [List<AssetId> entryPoints, bool resolveAllLibraries]) {
     // Can only have one resolve in progress at a time, so chain the current
     // resolution to be after the last one.
     var phaseComplete = new Completer();
     var future = _lastPhaseComplete.whenComplete(() {
       _currentPhaseComplete = phaseComplete;
-      return _performResolve(transform,
-          entryPoints == null ? [transform.primaryInput.id] : entryPoints);
+      return _performResolve(
+          transform,
+          entryPoints == null ? [transform.primaryInput.id] : entryPoints,
+          resolveAllLibraries);
     }).then((_) => this);
     // Advance the lastPhaseComplete to be done when this phase is all done.
     _lastPhaseComplete = phaseComplete.future;
@@ -98,7 +110,9 @@
     _currentTransform = null;
   }
 
-  Future _performResolve(Transform transform, List<AssetId> entryPoints) {
+  Future _performResolve(Transform transform, List<AssetId> entryPoints,
+      bool resolveAllLibraries) {
+    resolveAllLibraries ??= true;
     if (_currentTransform != null) {
       throw new StateError('Cannot be accessed by concurrent transforms');
     }
@@ -116,7 +130,7 @@
       visiting.add(transform.readInputAsString(assetId).then((contents) {
         var source = sources[assetId];
         if (source == null) {
-          source = new _AssetBasedSource(assetId, this);
+          source = new AssetBasedSource(assetId, this);
           sources[assetId] = source;
         }
         source.updateDependencies(contents);
@@ -132,6 +146,7 @@
         }
       }));
     }
+
     entryPoints.forEach(processAsset);
 
     // Once we have all asset sources updated with the new contents then
@@ -139,13 +154,6 @@
     return visiting.future.then((_) {
       var changeSet = new ChangeSet();
       toUpdate.forEach((pending) => pending.apply(changeSet));
-      var unreachableAssets =
-          sources.keys.toSet().difference(visited).map((id) => sources[id]);
-      for (var unreachable in unreachableAssets) {
-        changeSet.removedSource(unreachable);
-        unreachable.updateContents(null);
-        sources.remove(unreachable.assetId);
-      }
 
       // Update the analyzer context with the latest sources
       _context.applyChanges(changeSet);
@@ -154,8 +162,26 @@
       _entryLibraries = entryPoints.map((id) {
         var source = sources[id];
         if (source == null) return null;
+        var kind = _context.computeKindOf(source);
+        if (kind != SourceKind.LIBRARY) return null;
         return _context.computeLibraryElement(source);
       }).toList();
+
+      if (resolveAllLibraries) {
+        // Force resolve all other available libraries. As of analyzer > 0.27.1
+        // this is necessary to get resolved constants.
+        var newLibraries = new Set<LibraryElement>();
+        for (var library in libraries) {
+          if (library.source.uri.scheme == 'dart' ||
+              _entryLibraries.contains(library)) {
+            newLibraries.add(library);
+          } else {
+            newLibraries.add(_context
+                .computeLibraryElement(library.definingCompilationUnit.source));
+          }
+        }
+        _libraries = newLibraries;
+      }
     });
   }
 
@@ -236,7 +262,7 @@
   /// the library URI.
   Uri _getSourceUri(Element element, {AssetId from}) {
     var source = element.source;
-    if (source is _AssetBasedSource) {
+    if (source is AssetBasedSource) {
       var uriString = assetIdToUri(source.assetId, from: from);
       return uriString != null ? Uri.parse(uriString) : null;
     } else if (source is UriAnnotatedSource) {
@@ -248,23 +274,24 @@
 
   AssetId getSourceAssetId(Element element) {
     var source = element.source;
-    if (source is _AssetBasedSource) return source.assetId;
+    if (source is AssetBasedSource) return source.assetId;
     return null;
   }
 
   SourceSpan getSourceSpan(Element element) {
     var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
-    return sourceFile.span(element.node.offset, element.node.end);
+    return sourceFile.span(
+        element.computeNode().offset, element.computeNode().end);
   }
 
   TextEditTransaction createTextEditTransaction(Element element) {
-    if (element.source is! _AssetBasedSource) return null;
+    if (element.source is! AssetBasedSource) return null;
 
     // Cannot edit unless there is an active transformer.
     if (_currentTransform == null) return null;
 
-    _AssetBasedSource source = element.source;
+    AssetBasedSource source = element.source;
     // Cannot modify assets in other packages.
     if (source.assetId.package != _currentTransform.primaryInput.id.package) {
       return null;
@@ -288,8 +315,7 @@
 }
 
 /// Implementation of Analyzer's Source for Barback based assets.
-class _AssetBasedSource extends Source {
-
+class AssetBasedSource extends Source {
   /// Asset ID where this source can be found.
   final AssetId assetId;
 
@@ -305,7 +331,7 @@
   /// The file contents.
   String _contents;
 
-  _AssetBasedSource(this.assetId, this._resolver);
+  AssetBasedSource(this.assetId, this._resolver);
 
   /// Update the dependencies of this source. This parses [contents] but avoids
   /// any analyzer resolution.
@@ -313,11 +339,9 @@
     if (contents == _contents) return;
     var unit = parseDirectives(contents, suppressErrors: true);
     _dependentAssets = unit.directives
-        .where((d) => (d is ImportDirective ||
-            d is PartDirective ||
-            d is ExportDirective))
-        .map((d) => _resolve(
-            assetId, d.uri.stringValue, _logger, _getSpan(d, contents)))
+        .where((d) => d is UriBasedDirective)
+        .map((d) => _resolve(assetId, (d as UriBasedDirective).uri.stringValue,
+            _logger, _getSpan(d, contents)))
         .where((id) => id != null)
         .toSet();
   }
@@ -355,7 +379,7 @@
   bool exists() => _contents != null;
 
   bool operator ==(Object other) =>
-      other is _AssetBasedSource && assetId == other.assetId;
+      other is AssetBasedSource && assetId == other.assetId;
 
   int get hashCode => assetId.hashCode;
 
@@ -437,7 +461,7 @@
     // Analyzer expects that sources which are referenced but do not exist yet
     // still exist, so just make an empty source.
     if (source == null) {
-      source = new _AssetBasedSource(assetId, _resolver);
+      source = new AssetBasedSource(assetId, _resolver);
       _resolver.sources[assetId] = source;
     }
     return source;
@@ -538,7 +562,7 @@
 /// changes after it first discovers the transitive closure of files that are
 /// reachable from the sources.
 class _PendingUpdate {
-  _AssetBasedSource source;
+  AssetBasedSource source;
   String content;
 
   _PendingUpdate(this.source, this.content);
diff --git a/packages/code_transformers/lib/src/resolvers.dart b/packages/code_transformers/lib/src/resolvers.dart
index fa2f953..96b5df7 100644
--- a/packages/code_transformers/lib/src/resolvers.dart
+++ b/packages/code_transformers/lib/src/resolvers.dart
@@ -7,8 +7,10 @@
 import 'dart:async';
 import 'package:barback/barback.dart';
 
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
 
 import 'entry_point.dart';
@@ -25,22 +27,25 @@
 /// If multiple transformers rely on a resolved AST they should (ideally) share
 /// the same Resolvers object to minimize re-parsing the AST.
 class Resolvers {
-  final Map<AssetId, Resolver> _resolvers = {};
-  final DartSdk dartSdk;
-  final DartUriResolver dartUriResolver;
-  final AnalysisOptions options;
+  final Resolver _resolver;
 
-  Resolvers.fromSdk(this.dartSdk, this.dartUriResolver, {this.options});
+  Resolvers.fromSdk(DartSdk dartSdk, DartUriResolver dartUriResolver,
+      {AnalysisOptions options})
+      : _resolver =
+            new ResolverImpl(dartSdk, dartUriResolver, options: options);
 
-  factory Resolvers(dartSdkDirectory, {AnalysisOptions options}) {
-    var sdk = new DirectoryBasedDartSdkProxy(dartSdkDirectory);
+  factory Resolvers(String dartSdkDirectory, {AnalysisOptions options}) {
+    _initAnalysisEngine();
+    var sdk = new FolderBasedDartSdkProxy(
+        PhysicalResourceProvider.INSTANCE, dartSdkDirectory);
     var uriResolver = new DartUriResolverProxy(sdk);
     return new Resolvers.fromSdk(sdk, uriResolver, options: options);
   }
 
   factory Resolvers.fromMock(Map<String, String> sources,
       {bool reportMissing: false, AnalysisOptions options}) {
-    var sdk = new MockDartSdk(sources, reportMissing: reportMissing);
+    _initAnalysisEngine();
+    var sdk = new MockDartSdk(sources, options, reportMissing: reportMissing);
     return new Resolvers.fromSdk(sdk, sdk.resolver, options: options);
   }
 
@@ -51,12 +56,11 @@
   /// [Resolver.release] must be called once it's done being used, or
   /// [ResolverTransformer] should be used to automatically release the
   /// resolver.
-  Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
-    var id = transform.primaryInput.id;
-    var resolver = _resolvers.putIfAbsent(
-        id, () => new ResolverImpl(dartSdk, dartUriResolver, options: options));
-    return resolver.resolve(transform, entryPoints);
-  }
+  ///
+  /// See [Resolver#resolve] for more info on the `resolveAllLibraries` option.
+  Future<Resolver> get(Transform transform,
+          [List<AssetId> entryPoints, bool resolveAllLibraries]) =>
+      _resolver.resolve(transform, entryPoints, resolveAllLibraries);
 }
 
 /// Transformer mixin which automatically gets and releases resolvers.
@@ -67,14 +71,17 @@
   /// The cache of resolvers- must be set from subclass.
   Resolvers resolvers;
 
-  /// By default only process prossible entry point assets.
+  /// See [Resolver#resolve] for more info - can be overridden by a subclass.
+  bool get resolveAllLibraries => true;
+
+  /// By default only process possible entry point assets.
   ///
   /// This is only a preliminary check based on the asset ID.
   Future<bool> isPrimary(assetOrId) {
     // assetOrId is to handle the transition from Asset to AssetID between
     // pub 1.3 and 1.4. Once support for 1.3 is dropped this should only
     // support AssetId.
-    var id = assetOrId is AssetId ? assetOrId : assetOrId.id;
+    var id = assetOrId is AssetId ? assetOrId : (assetOrId as Asset).id;
     return new Future.value(isPossibleDartEntryId(id));
   }
 
@@ -95,8 +102,8 @@
   /// to run the resolver on.
   Future apply(Transform transform) =>
       shouldApplyResolver(transform.primaryInput).then((result) {
-    if (result) return applyToEntryPoints(transform);
-  });
+        if (result) return applyToEntryPoints(transform);
+      });
 
   /// Helper function to make it easy to write an `Transformer.apply` method
   /// that automatically gets and releases the resolver. This is typically used
@@ -107,9 +114,11 @@
   ///       return applyToEntryPoints(transform, entryPoints);
   ///    }
   Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
-    return resolvers.get(transform, entryPoints).then((resolver) {
-      return new Future(() => applyResolver(transform, resolver)).whenComplete(
-          () {
+    return resolvers
+        .get(transform, entryPoints, resolveAllLibraries)
+        .then((resolver) {
+      return new Future(() => applyResolver(transform, resolver))
+          .whenComplete(() {
         resolver.release();
       });
     });
@@ -120,3 +129,10 @@
   /// Return a Future to indicate when apply is completed.
   applyResolver(Transform transform, Resolver resolver);
 }
+
+bool _analysisEngineInitialized = false;
+_initAnalysisEngine() {
+  if (_analysisEngineInitialized) return;
+  _analysisEngineInitialized = true;
+  AnalysisEngine.instance.processRequiredPlugins();
+}
diff --git a/packages/code_transformers/lib/src/test_harness.dart b/packages/code_transformers/lib/src/test_harness.dart
deleted file mode 100644
index 817fbb3..0000000
--- a/packages/code_transformers/lib/src/test_harness.dart
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Utilities for creating unit tests of Barback transformers.
-library code_transformers.src.test_harness;
-
-import 'dart:async';
-
-import 'package:barback/barback.dart';
-import 'package:stack_trace/stack_trace.dart';
-import 'package:unittest/unittest.dart';
-
-String idToString(AssetId id) => '${id.package}|${id.path}';
-AssetId idFromString(String s) {
-  int index = s.indexOf('|');
-  return new AssetId(s.substring(0, index), s.substring(index + 1));
-}
-
-/// A helper package provider that has files stored in memory, also wraps
-/// [Barback] to simply our tests.
-class TestHelper implements PackageProvider {
-
-  /// Maps from an asset string identifier of the form 'package|path' to the
-  /// file contents.
-  final Map<String, String> files;
-  final Iterable<String> packages;
-  final List<String> messages;
-  int messagesSeen = 0;
-  bool errorSeen = false;
-
-  Barback barback;
-  var errorSubscription;
-  var resultSubscription;
-  var logSubscription;
-
-  final StringFormatter formatter;
-
-  Future<Asset> getAsset(AssetId id) =>
-      new Future.value(new Asset.fromString(id, files[idToString(id)]));
-
-  TestHelper(List<List<Transformer>> transformers, Map<String, String> files,
-      this.messages, {this.formatter: StringFormatter.noTrailingWhitespace})
-      : files = files,
-        packages = files.keys.map((s) => idFromString(s).package) {
-    barback = new Barback(this);
-    for (var p in packages) {
-      barback.updateTransformers(p, transformers);
-    }
-
-    errorSubscription = barback.errors.listen((e) {
-      var trace = null;
-      if (e is Error) trace = e.stackTrace;
-      if (trace != null) {
-        print(Trace.format(trace));
-      }
-      fail('error running barback: $e');
-    });
-
-    resultSubscription = barback.results.listen((result) {
-      expect(result.succeeded, !errorSeen, reason: "${result.errors}");
-    });
-
-    logSubscription = barback.log.listen((entry) {
-      // Ignore info and fine messages.
-      if (entry.level == LogLevel.INFO || entry.level == LogLevel.FINE) return;
-      if (entry.level == LogLevel.ERROR) errorSeen = true;
-      // We only check messages when an expectation is provided.
-      if (messages == null) return;
-
-      var msg = '${entry.level.name.toLowerCase()}: ${entry.message}';
-      var span = entry.span;
-      var spanInfo = span == null
-          ? ''
-          : ' (${span.sourceUrl} ${span.start.line} ${span.start.column})';
-      expect(messagesSeen, lessThan(messages.length),
-          reason: 'more messages than expected.\nMessage seen: $msg$spanInfo');
-      expect('$msg$spanInfo', messages[messagesSeen++]);
-    });
-  }
-
-  void tearDown() {
-    errorSubscription.cancel();
-    resultSubscription.cancel();
-    logSubscription.cancel();
-  }
-
-  /// Tells barback which files have changed, and thus anything that depends on
-  /// it on should be computed. By default mark all the input files.
-  void run([Iterable<String> paths]) {
-    if (paths == null) paths = files.keys;
-    barback.updateSources(paths.map(idFromString));
-  }
-
-  Future<String> operator [](String assetString) {
-    return barback
-        .getAssetById(idFromString(assetString))
-        .then((asset) => asset.readAsString());
-  }
-
-  Future check(String assetIdString, String content) {
-    return this[assetIdString].then((value) {
-      value = formatter.formatString(value);
-      content = formatter.formatString(content);
-      expect(value, content, reason: 'Final output of $assetIdString differs.');
-    });
-  }
-
-  Future checkAll(Map<String, String> files) {
-    return barback.results.first.then((_) {
-      if (files == null) return null;
-      var futures = [];
-      files.forEach((k, v) {
-        futures.add(check(k, v));
-      });
-      return Future.wait(futures);
-    }).then((_) {
-      // We only check messages when an expectation is provided.
-      if (messages == null) return;
-      expect(
-          messagesSeen, messages.length, reason: 'less messages than expected');
-    });
-  }
-}
-
-class StringFormatter {
-  // Formatting options
-  final bool stripLeadingWhitespace;
-  final bool stripTrailingWhitespace;
-  final bool stripNewlines;
-
-  // Static variations for convenience
-  static const noLeadingWhitespace =
-      const StringFormatter(stripLeadingWhitespace: true);
-
-  static const noTrailingWhitespace =
-      const StringFormatter(stripTrailingWhitespace: true);
-
-  static const noSurroundingWhitespace = const StringFormatter(
-      stripLeadingWhitespace: true, stripTrailingWhitespace: true);
-
-  static const noNewlines = const StringFormatter(stripNewlines: true);
-
-  static const noNewlinesOrSurroundingWhitespace = const StringFormatter(
-      stripLeadingWhitespace: true,
-      stripTrailingWhitespace: true,
-      stripNewlines: true);
-
-  const StringFormatter({this.stripLeadingWhitespace: false,
-      this.stripTrailingWhitespace: false, this.stripNewlines: false});
-
-  String formatString(String str) {
-    if (stripLeadingWhitespace) str = _removeLeadingWhitespace(str);
-    if (stripTrailingWhitespace) str = _removeTrailingWhitespace(str);
-    if (stripNewlines) str = _removeNewlines(str);
-    return str;
-  }
-}
-
-String _removeTrailingWhitespace(String str) => str.splitMapJoin('\n',
-    onNonMatch: (s) => s.replaceAll(new RegExp(r'\s+$'), ''));
-
-String _removeLeadingWhitespace(String str) => str.splitMapJoin('\n',
-    onNonMatch: (s) => s.replaceAll(new RegExp(r'^\s+'), ''));
-
-String _removeNewlines(String str) => str.replaceAll('\n', '');
diff --git a/packages/code_transformers/lib/tests.dart b/packages/code_transformers/lib/tests.dart
deleted file mode 100644
index 9cb0a40..0000000
--- a/packages/code_transformers/lib/tests.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Collection of utilities which are useful for creating unit tests for
-/// Barback transformers.
-library code_transformers.tests;
-
-import 'dart:async' show Future;
-import 'dart:io' show Platform;
-
-import 'package:barback/barback.dart' show Transformer;
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-import 'src/test_harness.dart';
-import 'src/dart_sdk.dart';
-
-export 'src/test_harness.dart' show StringFormatter;
-
-/// Defines a test which invokes [applyTransformers].
-testPhases(String testName, List<List<Transformer>> phases,
-    Map<String, String> inputs, Map<String, String> results,
-    [List<String> messages,
-    StringFormatter formatter = StringFormatter.noTrailingWhitespace]) {
-  test(testName, () => applyTransformers(phases,
-      inputs: inputs,
-      results: results,
-      messages: messages,
-      formatter: formatter));
-}
-
-/// Updates the provided transformers with [inputs] as asset inputs then
-/// validates that [results] were generated.
-///
-/// The keys for inputs and results are 'package_name|lib/file.dart'.
-/// Only files which are specified in results are validated.
-///
-/// If [messages] is non-null then this will validate that only the specified
-/// messages were generated, ignoring info messages.
-Future applyTransformers(List<List<Transformer>> phases,
-    {Map<String, String> inputs: const {}, Map<String, String> results: const {
-}, List<String> messages: const [],
-    StringFormatter formatter: StringFormatter.noTrailingWhitespace}) {
-  var helper = new TestHelper(phases, inputs, messages, formatter: formatter)
-    ..run();
-  return helper.checkAll(results).then((_) => helper.tearDown());
-}
-
-/// Variant of [dartSdkDirectory] which includes additional cases only
-/// typically encountered in Dart's testing environment.
-String get testingDartSdkDirectory {
-  var sdkDir = dartSdkDirectory;
-  if (sdkDir == null) {
-    // If we cannot find the SDK dir, then assume this is being run from Dart's
-    // source directory and this script is the main script.
-    var segments = path.split(path.fromUri(Platform.script));
-    var index = segments.indexOf('pkg');
-    expect(index, greaterThan(0),
-        reason: 'testingDartSdkDirectory is only supported in pkg/ tests');
-    sdkDir = path.joinAll(segments.sublist(0, index)..add('sdk'));
-  }
-  return sdkDir;
-}
diff --git a/packages/code_transformers/pubspec.yaml b/packages/code_transformers/pubspec.yaml
index 67da04e..e4cf6d9 100644
--- a/packages/code_transformers/pubspec.yaml
+++ b/packages/code_transformers/pubspec.yaml
@@ -1,15 +1,17 @@
 name: code_transformers
-version: 0.2.11
+version: 0.5.1+3
 author: Dart Team <misc@dartlang.org>
 description: Collection of utilities related to creating barback transformers.
 homepage: https://github.com/dart-lang/code-transformers
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.26.0 <0.27.0'
+  analyzer: '>=0.28.0 <0.31.0'
   barback: '>=0.14.2 <0.16.0'
-  cli_util: '>=0.0.1 <0.1.0'
+  cli_util: '>=0.0.1 <0.2.0'
   path: '>=0.9.0 <2.0.0'
   source_maps: '>=0.9.4 <0.11.0'
   source_span: '>=1.0.0 <2.0.0'
-  unittest: '>=0.10.1 <0.12.0'
+dev_dependencies:
+  test: '>=0.12.1 <0.13.0'
+  transformer_test: '>=0.1.0 <0.3.0'
diff --git a/packages/code_transformers/test/assets_test.dart b/packages/code_transformers/test/assets_test.dart
index b909f01..07965f5 100644
--- a/packages/code_transformers/test/assets_test.dart
+++ b/packages/code_transformers/test/assets_test.dart
@@ -1,20 +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.
-
+@TestOn('vm')
 library code_transformers.test.assets_test;
 
 import 'dart:async';
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
-import 'package:code_transformers/tests.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:transformer_test/utils.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   group('uriToAssetId', uriToAssetIdTests);
   group('assetIdToUri', assetIdToUriTests);
 }
@@ -28,18 +25,22 @@
             logger: transform.logger, span: null, from: from);
         expect(uriOut, result);
       });
-      var messages = [];
+      var messages = <String>[];
       if (message != null) messages.add(message);
 
-      return applyTransformers([[transformer]],
-          inputs: {assetId.toString(): ''}, messages: messages);
+      return applyTransformers([
+        [transformer]
+      ], inputs: {
+        assetId.toString(): ''
+      }, messages: messages);
     });
   }
 
   testAssetIdToUri('resolves relative URIs', new AssetId('a', 'web/main.dart'),
       result: 'main.dart', from: new AssetId('a', 'web/foo.dart'));
 
-  testAssetIdToUri('resolves relative URIs in subfolders', new AssetId('a', 'web/foo/main.dart'),
+  testAssetIdToUri('resolves relative URIs in subfolders',
+      new AssetId('a', 'web/foo/main.dart'),
       result: 'foo/main.dart', from: new AssetId('a', 'web/foo.dart'));
 
   testAssetIdToUri('resolves package: URIs', new AssetId('foo', 'lib/foo.dart'),
@@ -61,29 +62,36 @@
   testAssetIdToUri('does not allow non-lib assets without specifying `from`',
       new AssetId('foo', 'not-lib/foo.dart'),
       message: 'warning: Cannot create URI for foo|not-lib/foo.dart without '
-      'specifying where to import it from.');
+          'specifying where to import it from.');
 
   testAssetIdToUri('does not allow non-lib, non-relative assets',
       new AssetId('foo', 'not-lib/foo.dart'),
       from: new AssetId('bar', 'lib/bar.dart'),
       message: 'warning: Not possible to import foo|not-lib/foo.dart from '
-      'bar|lib/bar.dart');
+          'bar|lib/bar.dart');
 }
 
 void uriToAssetIdTests() {
-  void testAssetUri(String name, {AssetId source, String uri, AssetId result,
-      String message, bool errorOnAbsolute: true}) {
+  void testAssetUri(String name,
+      {AssetId source,
+      String uri,
+      AssetId result,
+      String message,
+      bool errorOnAbsolute: true}) {
     test(name, () {
       var transformer = new Validator((transform) {
         var assetId = uriToAssetId(source, uri, transform.logger, null,
             errorOnAbsolute: errorOnAbsolute);
         expect(assetId, result);
       });
-      var messages = [];
+      var messages = <String>[];
       if (message != null) messages.add(message);
 
-      return applyTransformers([[transformer]],
-          inputs: {source.toString(): ''}, messages: messages);
+      return applyTransformers([
+        [transformer]
+      ], inputs: {
+        source.toString(): ''
+      }, messages: messages);
     });
   }
 
@@ -116,9 +124,9 @@
       source: new AssetId('a', 'lib/index.html'),
       uri: 'packages/foo/bar',
       message: 'warning: Invalid URL to reach to another package: '
-      'packages/foo/bar. Path reaching to other packages must first '
-      'reach up all the way to the packages directory. For example, try '
-      'changing the URL to: ../../packages/foo/bar');
+          'packages/foo/bar. Path reaching to other packages must first '
+          'reach up all the way to the packages directory. For example, try '
+          'changing the URL to: ../../packages/foo/bar');
 
   testAssetUri('allows relative packages from non-dart lib files',
       source: new AssetId('a', 'lib/index.html'),
diff --git a/packages/code_transformers/test/benchmarks_test.dart b/packages/code_transformers/test/benchmarks_test.dart
index ca0b31f..e0370fa 100644
--- a/packages/code_transformers/test/benchmarks_test.dart
+++ b/packages/code_transformers/test/benchmarks_test.dart
@@ -1,22 +1,22 @@
 // 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.
+@TestOn('vm')
 library code_transformers.test.benchmarks_test;
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/benchmarks.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   test('can benchmark transformers', () {
     var transformer = new TestTransformer();
-    var transformers = [[transformer]];
+    var transformers = [
+      [transformer]
+    ];
     var id = new AssetId('foo', 'lib/bar.dart');
     var files = {
-        id: 'library foo.bar;',
+      id: 'library foo.bar;',
     };
     var benchmark = new TransformerBenchmark(transformers, files);
     return benchmark.measure().then((result) {
diff --git a/packages/code_transformers/test/entry_point_test.dart b/packages/code_transformers/test/entry_point_test.dart
index 99c4369..31f84c7 100644
--- a/packages/code_transformers/test/entry_point_test.dart
+++ b/packages/code_transformers/test/entry_point_test.dart
@@ -2,68 +2,75 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+@TestOn('vm')
 library code_transformers.test.assets_test;
 
 import 'dart:async';
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
-import 'package:code_transformers/tests.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:transformer_test/utils.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   Future checkDartEntry({Map<String, String> inputs, bool expectation}) {
     var transformer = new Validator((transform) {
       return isPossibleDartEntry(transform.primaryInput).then((value) {
         expect(value, expectation);
       });
     });
-    return applyTransformers([[transformer]], inputs: inputs);
+    return applyTransformers([
+      [transformer]
+    ], inputs: inputs);
   }
 
   group('isPossibleDartEntry', () {
     test('should handle empty files', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': '',}, expectation: false);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': '',
+      }, expectation: false);
     });
 
     test('should detect main methods', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': 'main() {}',}, expectation: true);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': 'main() {}',
+      }, expectation: true);
     });
 
     test('should exclude dart mains in lib folder', () {
-      return checkDartEntry(
-          inputs: {'a|lib/main.dart': 'main() {}',}, expectation: false);
+      return checkDartEntry(inputs: {
+        'a|lib/main.dart': 'main() {}',
+      }, expectation: false);
     });
 
     test('should validate file extension', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.not_dart': 'main() {}',}, expectation: false);
+      return checkDartEntry(inputs: {
+        'a|web/main.not_dart': 'main() {}',
+      }, expectation: false);
     });
 
     test('should count exports as main', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': 'export "foo.dart";',},
-          expectation: true);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': 'export "foo.dart";',
+      }, expectation: true);
     });
 
     test('should count parts as main', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': 'part "foo.dart";',}, expectation: true);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': 'part "foo.dart";',
+      }, expectation: true);
     });
 
     test('is tolerant of syntax errors with main', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': 'main() {} {',}, expectation: true);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': 'main() {} {',
+      }, expectation: true);
     });
 
     test('is tolerant of syntax errors without main', () {
-      return checkDartEntry(
-          inputs: {'a|web/main.dart': 'class Foo {',}, expectation: false);
+      return checkDartEntry(inputs: {
+        'a|web/main.dart': 'class Foo {',
+      }, expectation: false);
     });
   });
 }
diff --git a/packages/code_transformers/test/messages_test.dart b/packages/code_transformers/test/messages_test.dart
index 49142c6..526263d 100644
--- a/packages/code_transformers/test/messages_test.dart
+++ b/packages/code_transformers/test/messages_test.dart
@@ -3,30 +3,39 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests for some of the utility helper functions used by the compiler.
+@TestOn('vm')
 library polymer.test.build.messages_test;
 
 import 'dart:convert';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:code_transformers/messages/messages.dart';
 import 'package:source_span/source_span.dart';
 
 main() {
   group('snippet', () {
     test('template with no-args works', () {
-      expect(new MessageTemplate(_id('code_transformers', 1),
-              'this message has no args', '', '').snippet,
+      expect(
+          new MessageTemplate(_id('code_transformers', 1),
+                  'this message has no args', '', '')
+              .snippet,
           'this message has no args');
     });
 
     test('template with args throws', () {
-      expect(() => new MessageTemplate(_id('code_transformers', 1),
-          'this message has %-args-%', '', '').snippet, throws);
+      expect(
+          () => new MessageTemplate(_id('code_transformers', 1),
+                  'this message has %-args-%', '', '')
+              .snippet,
+          throwsA(contains("missing argument args")));
     });
 
     test('can pass arguments to create snippet', () {
-      expect(new MessageTemplate(_id('code_transformers', 1),
-                  'a %-b-% c something %-name-% too', '', '')
-              .create({'b': "1", 'name': 'foo'}).snippet,
+      expect(
+          new MessageTemplate(
+              _id('code_transformers', 1),
+              'a %-b-% c something %-name-% too',
+              '',
+              '').create({'b': "1", 'name': 'foo'}).snippet,
           'a 1 c something foo too');
     });
   });
@@ -45,6 +54,7 @@
         _eq(msg) {
           expect(new MessageId.fromJson(toJson(msg)) == msg, isTrue);
         }
+
         _eq(const MessageId('hi', 23));
         _eq(new MessageId('hi', 23));
         _eq(new MessageId('a_b', 23));
@@ -59,6 +69,7 @@
           expect(msg.id, parsed.id);
           expect(msg.snippet, parsed.snippet);
         }
+
         _eq(new Message(_id('hi', 33), 'snippet here'));
         _eq(new MessageTemplate(
             _id('hi', 33), 'snippet', 'ignored', 'ignored'));
@@ -72,6 +83,7 @@
           expect(entry.level, parsed.level);
           expect(entry.span, parsed.span);
         }
+
         _eq(_entry(33, 'hi there', 12));
         _eq(_entry(33, 'hi there-', 11));
       });
@@ -85,7 +97,8 @@
         expect(table.entries[_id('hi', 11)].length, 2);
         expect(table.entries[_id('hi', 13)].length, 1);
 
-        var table2 = new LogEntryTable.fromJson(toJson(table));
+        var table2 =
+            new LogEntryTable.fromJson(toJson(table) as Map<String, Iterable>);
         expect(table2.entries.length, 2);
         expect(table2.entries[_id('hi', 11)].length, 2);
         expect(table2.entries[_id('hi', 13)].length, 1);
@@ -99,9 +112,12 @@
     });
   }
 }
+
 _id(s, i) => new MessageId(s, i);
 _entry(id, snippet, offset) => new BuildLogEntry(
-    new Message(_id('hi', id), snippet), new SourceSpan(
+    new Message(_id('hi', id), snippet),
+    new SourceSpan(
         new SourceLocation(offset, sourceUrl: 'a', line: 1, column: 3),
         new SourceLocation(offset + 2, sourceUrl: 'a', line: 1, column: 5),
-        'hi'), 'Warning');
+        'hi'),
+    'Warning');
diff --git a/packages/code_transformers/test/remove_sourcemap_comment_test.dart b/packages/code_transformers/test/remove_sourcemap_comment_test.dart
index f4cdf33..e34faef 100644
--- a/packages/code_transformers/test/remove_sourcemap_comment_test.dart
+++ b/packages/code_transformers/test/remove_sourcemap_comment_test.dart
@@ -1,13 +1,13 @@
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-
+@TestOn('vm')
 library code_transformers.test.remove_sourcemap_comment_test;
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/src/remove_sourcemap_comment.dart';
-import 'package:code_transformers/tests.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
+import 'package:transformer_test/utils.dart';
 
 final phases = [
   [
@@ -17,8 +17,6 @@
 ];
 
 void main() {
-  useCompactVMConfiguration();
-
   testPhases('removes sourcemap comments', phases, {
     'a|web/test.js': '''
           var i = 0;
diff --git a/packages/code_transformers/test/resolver_test.dart b/packages/code_transformers/test/resolver_test.dart
index 4126fcc..0ab7844 100644
--- a/packages/code_transformers/test/resolver_test.dart
+++ b/packages/code_transformers/test/resolver_test.dart
@@ -2,20 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+@TestOn('vm')
 library code_transformers.test.resolver_test;
 
 import 'dart:async';
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
-import 'package:code_transformers/tests.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:transformer_test/utils.dart';
+import 'package:test/test.dart';
 
 import 'package:code_transformers/src/dart_sdk.dart' show mockSdkSources;
 
 main() {
-  useCompactVMConfiguration();
   group('mock sdk', () {
     resolverTests(new Resolvers.fromMock(mockSdkSources));
   });
@@ -23,296 +22,407 @@
   group('real sdk', () {
     resolverTests(new Resolvers(testingDartSdkDirectory));
   });
+
+  group('shared sources', () {
+    resolverTests(new Resolvers.fromMock(mockSdkSources));
+  });
 }
 
 resolverTests(Resolvers resolvers) {
   var entryPoint = new AssetId('a', 'web/main.dart');
-  Future validateResolver({Map<String, String> inputs, validator(Resolver),
-      List<String> messages: const []}) {
-    return applyTransformers(
-        [[new TestTransformer(resolvers, entryPoint, validator)]],
-        inputs: inputs, messages: messages);
+  Future validateResolver(
+      {Map<String, String> inputs,
+      validator(Resolver),
+      List<String> messages: const [],
+      bool resolveAllLibraries: true}) {
+    return applyTransformers([
+      [
+        new TestTransformer(
+            resolvers, entryPoint, validator, resolveAllLibraries)
+      ]
+    ], inputs: inputs, messages: messages);
   }
 
   group('Resolver', () {
     test('should handle initial files', () {
       return validateResolver(
-          inputs: {'a|web/main.dart': ' main() {}',}, validator: (resolver) {
-        var source = resolver.sources[entryPoint];
-        expect(source.modificationStamp, 1);
+          inputs: {
+            'a|web/main.dart': ' main() {}',
+          },
+          validator: (resolver) {
+            var source = resolver.sources[entryPoint];
+            expect(source.modificationStamp, 1);
 
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib, isNotNull);
-      });
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib, isNotNull);
+          });
     });
 
     test('should update when sources change', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': ''' main() {
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': ''' main() {
                 } ''',
-      }, validator: (resolver) {
-        var source = resolver.sources[entryPoint];
-        expect(source.modificationStamp, 2);
+          },
+          validator: (resolver) {
+            var source = resolver.sources[entryPoint];
+            expect(source.modificationStamp, 2);
 
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib, isNotNull);
-        expect(lib.entryPoint, isNotNull);
-      });
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib, isNotNull);
+            expect(lib.entryPoint, isNotNull);
+          });
     });
 
     test('should follow imports', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'a.dart';
 
               main() {
               } ''',
-        'a|web/a.dart': '''
+            'a|web/a.dart': '''
               library a;
               ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 2);
-        var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
-        expect(libA.getType('Foo'), isNull);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+            var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
+            expect(libA.getType('Foo'), isNull);
+          });
     });
 
     test('should update changed imports', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'a.dart';
 
               main() {
               } ''',
-        'a|web/a.dart': '''
+            'a|web/a.dart': '''
               library a;
               class Foo {}
               ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 2);
-        var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
-        expect(libA.getType('Foo'), isNotNull);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+            var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
+            expect(libA.getType('Foo'), isNotNull);
+          });
     });
 
     test('should follow package imports', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'package:b/b.dart';
 
               main() {
               } ''',
-        'b|lib/b.dart': '''
+            'b|lib/b.dart': '''
               library b;
               ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 2);
-        var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
-        expect(libB.getType('Foo'), isNull);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+            var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
+            expect(libB.getType('Foo'), isNull);
+          });
     });
 
     test('handles missing files', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'package:b/missing.dart';
 
               main() {
               } ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 1);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+          });
     });
 
     test('should update on changed package imports', () {
       // TODO(sigmund): remove modification below, see dartbug.com/22638
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'package:b/missing.dart';
 
               main() {
               } // modified, but we shouldn't need to! ''',
-        'b|lib/missing.dart': '''
+            'b|lib/missing.dart': '''
               library b;
               class Bar {}
               ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 2);
-        var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
-        expect(libB.getType('Bar'), isNotNull);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+            var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
+            expect(libB.getType('Bar'), isNotNull);
+          });
     });
 
     test('should handle deleted files', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'package:b/missing.dart';
 
               main() {
               } ''',
-      }, validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 1);
-      });
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+            expect(lib.importedLibraries.where((l) => l.name == 'b'), isEmpty);
+          });
     });
 
     test('should fail on absolute URIs', () {
       var warningPrefix = 'warning: absolute paths not allowed';
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import '/b.dart';
 
               main() {
               } ''',
-      }, messages: [
-        // First from the AST walker
-        '$warningPrefix: "/b.dart" (web/main.dart 0 14)',
-        '$warningPrefix: "/b.dart"',
-      ], validator: (resolver) {
-        var lib = resolver.getLibrary(entryPoint);
-        expect(lib.importedLibraries.length, 1);
-      });
+          },
+          messages: [
+            // First from the AST walker
+            '$warningPrefix: "/b.dart" (web/main.dart 0 14)',
+          ],
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 2);
+          });
     });
 
     test('should list all libraries', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               library a.main;
               import 'package:a/a.dart';
               import 'package:a/b.dart';
               export 'package:a/d.dart';
               ''',
-        'a|lib/a.dart': 'library a.a;\n import "package:a/c.dart";',
-        'a|lib/b.dart': 'library a.b;\n import "c.dart";',
-        'a|lib/c.dart': 'library a.c;',
-        'a|lib/d.dart': 'library a.d;'
-      }, validator: (resolver) {
-        var libs = resolver.libraries.where((l) => !l.isInSdk);
-        expect(libs.map((l) => l.name),
-            unorderedEquals(['a.main', 'a.a', 'a.b', 'a.c', 'a.d',]));
-      });
+            'a|lib/a.dart': 'library a.a;\n import "package:a/c.dart";',
+            'a|lib/b.dart': 'library a.b;\n import "c.dart";',
+            'a|lib/c.dart': 'library a.c;',
+            'a|lib/d.dart': 'library a.d;'
+          },
+          validator: (resolver) {
+            var libs = resolver.libraries.where((l) => !l.isInSdk);
+            expect(
+                libs.map((l) => l.name),
+                unorderedEquals([
+                  'a.main',
+                  'a.a',
+                  'a.b',
+                  'a.c',
+                  'a.d',
+                ]));
+          });
     });
 
     test('should resolve types and library uris', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
               import 'dart:core';
               import 'package:a/a.dart';
               import 'package:a/b.dart';
               import 'sub_dir/d.dart';
               class Foo {}
               ''',
-        'a|lib/a.dart': 'library a.a;\n import "package:a/c.dart";',
-        'a|lib/b.dart': 'library a.b;\n import "c.dart";',
-        'a|lib/c.dart': '''
+            'a|lib/a.dart': 'library a.a;\n import "package:a/c.dart";',
+            'a|lib/b.dart': 'library a.b;\n import "c.dart";',
+            'a|lib/c.dart': '''
                 library a.c;
                 class Bar {}
                 ''',
-        'a|web/sub_dir/d.dart': '''
+            'a|web/sub_dir/d.dart': '''
                 library a.web.sub_dir.d;
                 class Baz{}
                 ''',
-      }, validator: (resolver) {
-        var a = resolver.getLibraryByName('a.a');
-        expect(a, isNotNull);
-        expect(resolver.getImportUri(a).toString(), 'package:a/a.dart');
-        expect(resolver.getLibraryByUri(Uri.parse('package:a/a.dart')), a);
+          },
+          validator: (resolver) {
+            var a = resolver.getLibraryByName('a.a');
+            expect(a, isNotNull);
+            expect(resolver.getImportUri(a).toString(), 'package:a/a.dart');
+            expect(resolver.getLibraryByUri(Uri.parse('package:a/a.dart')), a);
 
-        var main = resolver.getLibraryByName('');
-        expect(main, isNotNull);
-        expect(resolver.getImportUri(main), isNull);
+            var main = resolver.getLibraryByName('');
+            expect(main, isNotNull);
+            expect(resolver.getImportUri(main), isNull);
 
-        var fooType = resolver.getType('Foo');
-        expect(fooType, isNotNull);
-        expect(fooType.library, main);
+            var fooType = resolver.getType('Foo');
+            expect(fooType, isNotNull);
+            expect(fooType.library, main);
 
-        var barType = resolver.getType('a.c.Bar');
-        expect(barType, isNotNull);
-        expect(resolver.getImportUri(barType.library).toString(),
-            'package:a/c.dart');
-        expect(
-            resolver.getSourceAssetId(barType), new AssetId('a', 'lib/c.dart'));
+            var barType = resolver.getType('a.c.Bar');
+            expect(barType, isNotNull);
+            expect(resolver.getImportUri(barType.library).toString(),
+                'package:a/c.dart');
+            expect(resolver.getSourceAssetId(barType),
+                new AssetId('a', 'lib/c.dart'));
 
-        var bazType = resolver.getType('a.web.sub_dir.d.Baz');
-        expect(bazType, isNotNull);
-        expect(resolver.getImportUri(bazType.library), isNull);
-        expect(
-            resolver.getImportUri(bazType.library, from: entryPoint).toString(),
-            'sub_dir/d.dart');
+            var bazType = resolver.getType('a.web.sub_dir.d.Baz');
+            expect(bazType, isNotNull);
+            expect(resolver.getImportUri(bazType.library), isNull);
+            expect(
+                resolver
+                    .getImportUri(bazType.library, from: entryPoint)
+                    .toString(),
+                'sub_dir/d.dart');
 
-        var hashMap = resolver.getType('dart.collection.HashMap');
-        expect(resolver.getImportUri(hashMap.library).toString(),
-            'dart:collection');
-        expect(resolver.getLibraryByUri(Uri.parse('dart:collection')),
-            hashMap.library);
-      });
+            var hashMap = resolver.getType('dart.collection.HashMap');
+            expect(resolver.getImportUri(hashMap.library).toString(),
+                'dart:collection');
+            expect(resolver.getLibraryByUri(Uri.parse('dart:collection')),
+                hashMap.library);
+          });
+    });
+
+    test('should resolve constants in transitive imports by default', () {
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
+              library web.main;
+
+              import 'package:a/do_resolve.dart';
+              export 'package:a/do_resolve.dart';
+
+              class Foo extends Bar {}
+              ''',
+            'a|lib/do_resolve.dart': '''
+              library a.do_resolve;
+
+              const int annotation = 0;
+              @annotation
+              class Bar {}''',
+          },
+          validator: (resolver) {
+            var main = resolver.getLibraryByName('web.main');
+            // Navigate to the library via Element models
+            var meta =
+                main.unit.declarations[0].element.supertype.element.metadata[0];
+            expect(meta, isNotNull);
+            expect(meta.constantValue, isNotNull);
+
+            // Get the library from the resolver directly
+            var lib = resolver.getLibraryByName('a.do_resolve');
+            meta = lib.unit.declarations[1].element.metadata[0];
+            expect(meta, isNotNull);
+            expect(meta.constantValue, isNotNull);
+          });
+    });
+
+    test('can disable resolving of constants in transitive imports', () {
+      return validateResolver(
+          resolveAllLibraries: false,
+          inputs: {
+            'a|web/main.dart': '''
+              library web.main;
+
+              import 'package:a/dont_resolve.dart';
+              export 'package:a/dont_resolve.dart';
+
+              class Foo extends Bar {}
+              ''',
+            'a|lib/dont_resolve.dart': '''
+              library a.dont_resolve;
+
+              const int annotation = 0;
+              @annotation
+              class Bar {}''',
+          },
+          validator: (resolver) {
+            var main = resolver.getLibraryByName('web.main');
+            var meta =
+                main.unit.declarations[0].element.supertype.element.metadata[0];
+            expect(meta, isNotNull);
+            expect(meta.constantValue, isNull);
+          });
     });
 
     test('deleted files should be removed', () {
       return validateResolver(
           inputs: {
-        'a|web/main.dart': '''import 'package:a/a.dart';''',
-        'a|lib/a.dart': '''import 'package:a/b.dart';''',
-        'a|lib/b.dart': '''class Engine{}''',
-      },
+            'a|web/main.dart': '''import 'package:a/a.dart';''',
+            'a|lib/a.dart': '''import 'package:a/b.dart';''',
+            'a|lib/b.dart': '''class Engine{}''',
+          },
           validator: (resolver) {
-        var engine = resolver.getType('Engine');
-        var uri = resolver.getImportUri(engine.library);
-        expect(uri.toString(), 'package:a/b.dart');
-      }).then((_) {
+            var engine = resolver.getType('Engine');
+            var uri = resolver.getImportUri(engine.library);
+            expect(uri.toString(), 'package:a/b.dart');
+          }).then((_) {
         return validateResolver(
             inputs: {
-          'a|web/main.dart': '''import 'package:a/a.dart';''',
-          'a|lib/a.dart': '''lib a;\n class Engine{}'''
-        },
+              'a|web/main.dart': '''import 'package:a/a.dart';''',
+              'a|lib/a.dart': '''lib a;\n class Engine{}'''
+            },
             validator: (resolver) {
-          var engine = resolver.getType('Engine');
-          var uri = resolver.getImportUri(engine.library);
-          expect(uri.toString(), 'package:a/a.dart');
+              var engine = resolver.getType('Engine');
+              var uri = resolver.getImportUri(engine.library);
+              expect(uri.toString(), 'package:a/a.dart');
 
-          // Make sure that we haven't leaked any sources.
-          expect(resolver.sources.length, 2);
-        });
+              // Make sure that we haven't leaked any sources.
+              expect(resolver.sources.length, 2);
+            });
       });
     });
 
     test('handles circular imports', () {
-      return validateResolver(inputs: {
-        'a|web/main.dart': '''
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
                 library main;
                 import 'package:a/a.dart'; ''',
-        'a|lib/a.dart': '''
+            'a|lib/a.dart': '''
                 library a;
                 import 'package:a/b.dart'; ''',
-        'a|lib/b.dart': '''
+            'a|lib/b.dart': '''
                 library b;
                 import 'package:a/a.dart'; ''',
-      }, validator: (resolver) {
-        var libs = resolver.libraries.map((lib) => lib.name);
-        expect(libs.contains('a'), isTrue);
-        expect(libs.contains('b'), isTrue);
-      });
+          },
+          validator: (resolver) {
+            var libs = resolver.libraries.map((lib) => lib.name);
+            expect(libs.contains('a'), isTrue);
+            expect(libs.contains('b'), isTrue);
+          });
     });
 
     test('handles parallel resolves', () {
       return Future.wait([
-        validateResolver(inputs: {
-          'a|web/main.dart': '''
+        validateResolver(
+            inputs: {
+              'a|web/main.dart': '''
                 library foo;'''
-        }, validator: (resolver) {
-          expect(resolver.getLibrary(entryPoint).name, 'foo');
-        }),
-        validateResolver(inputs: {
-          'a|web/main.dart': '''
+            },
+            validator: (resolver) {
+              expect(resolver.getLibrary(entryPoint).name, 'foo');
+            }),
+        validateResolver(
+            inputs: {
+              'a|web/main.dart': '''
                 library bar;'''
-        }, validator: (resolver) {
-          expect(resolver.getLibrary(entryPoint).name, 'bar');
-        }),
+            },
+            validator: (resolver) {
+              expect(resolver.getLibrary(entryPoint).name, 'bar');
+            }),
       ]);
     });
   });
@@ -321,15 +431,17 @@
 class TestTransformer extends Transformer with ResolverTransformer {
   final AssetId primary;
   final Function validator;
+  final bool resolveAllLibraries;
 
-  TestTransformer(Resolvers resolvers, this.primary, this.validator) {
+  TestTransformer(Resolvers resolvers, this.primary, this.validator,
+      this.resolveAllLibraries) {
     this.resolvers = resolvers;
   }
 
   // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
   // is dropped.
   Future<bool> isPrimary(idOrAsset) {
-    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    var id = idOrAsset is AssetId ? idOrAsset : (idOrAsset as Asset).id;
     return new Future.value(id == primary);
   }
 
diff --git a/packages/code_transformers/test/unique_message_test.dart b/packages/code_transformers/test/unique_message_test.dart
index 4b1c924..5e1d21d 100644
--- a/packages/code_transformers/test/unique_message_test.dart
+++ b/packages/code_transformers/test/unique_message_test.dart
@@ -3,11 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests for some of the utility helper functions used by the compiler.
+@TestOn('vm')
 library polymer.test.build.messages_test;
 
 import 'dart:mirrors';
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:code_transformers/messages/messages.dart' show Message;
 
 import 'package:code_transformers/src/messages.dart' as p1;
@@ -27,8 +28,9 @@
       var name = MirrorSystem.getName(symbol);
       if (field is! Message) return;
       var id = field.id;
-      expect(seen.containsKey(id), isFalse, reason: 'Duplicate id `$id`. '
-          'Currently set for both `$name` and `${seen[id]}`.');
+      expect(seen.containsKey(id), isFalse,
+          reason: 'Duplicate id `$id`. '
+              'Currently set for both `$name` and `${seen[id]}`.');
       seen[id] = name;
       total++;
     });
diff --git a/packages/code_transformers/tool/travis.sh b/packages/code_transformers/tool/travis.sh
new file mode 100755
index 0000000..37492cc
--- /dev/null
+++ b/packages/code_transformers/tool/travis.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Fail fast
+set -e
+
+# Analyze
+dartanalyzer --fatal-warnings lib/*dart lib/messages/*dart test/*dart
+
+# Test
+pub run test
+
+# Check format
+pub global activate dart_style
+pub global run dart_style:format --set-exit-if-changed --dry-run lib/ test/
diff --git a/packages/collection/.analysis_options b/packages/collection/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/collection/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/collection/.test_config b/packages/collection/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/packages/collection/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/packages/collection/.travis.yml b/packages/collection/.travis.yml
new file mode 100644
index 0000000..1c89de3
--- /dev/null
+++ b/packages/collection/.travis.yml
@@ -0,0 +1,20 @@
+language: dart
+sudo: false
+dart:
+  - dev
+  - stable
+cache:
+  directories:
+    - $HOME/.pub-cache
+dart_task:
+  - test: --platform vm
+  - test: --platform firefox -j 1
+  - test: --platform dartium
+    install_dartium: true
+  - dartanalyzer
+  - dartfmt
+matrix:
+  # Only run dartfmt checks with stable.
+  exclude:
+    - dart: dev
+      dart_task: dartfmt
diff --git a/packages/collection/CHANGELOG.md b/packages/collection/CHANGELOG.md
index a39a2b5..8ece77f 100644
--- a/packages/collection/CHANGELOG.md
+++ b/packages/collection/CHANGELOG.md
@@ -1,3 +1,106 @@
+## 1.14.1
+
+* Make `Equality` implementations accept `null` as argument to `hash`.
+
+## 1.14.0
+
+* Add `CombinedListView`, a view of several lists concatenated together.
+* Add `CombinedIterableView`, a view of several iterables concatenated together.
+* Add `CombinedMapView`, a view of several maps concatenated together.
+
+## 1.13.0
+
+* Add `EqualityBy`
+
+## 1.12.0
+
+* Add `CaseInsensitiveEquality`.
+
+* Fix bug in `equalsIgnoreAsciiCase`.
+
+## 1.11.0
+
+* Add `EqualityMap` and `EqualitySet` classes which use `Equality` objects for
+  key and element equality, respectively.
+
+## 1.10.1
+
+* `Set.difference` now takes a `Set<Object>` as argument.
+
+## 1.9.1
+
+* Fix some documentation bugs.
+
+## 1.9.0
+
+* Add a top-level `stronglyConnectedComponents()` function that returns the
+  strongly connected components in a directed graph.
+
+## 1.8.0
+
+* Add a top-level `mapMap()` function that works like `Iterable.map()` on a
+  `Map`.
+
+* Add a top-level `mergeMaps()` function that creates a new map with the
+  combined contents of two existing maps.
+
+* Add a top-level `groupBy()` function that converts an `Iterable` to a `Map` by
+  grouping its elements using a function.
+
+* Add top-level `minBy()` and `maxBy()` functions that return the minimum and
+  maximum values in an `Iterable`, respectively, ordered by a derived value.
+
+* Add a top-level `transitiveClosure()` function that returns the transitive
+  closure of a directed graph.
+
+## 1.7.0
+
+* Add a `const UnmodifiableSetView.empty()` constructor.
+
+## 1.6.0
+
+* Add a `UnionSet` class that provides a view of the union of a set of sets.
+
+* Add a `UnionSetController` class that provides a convenient way to manage the
+  contents of a `UnionSet`.
+
+* Fix another incorrectly-declared generic type.
+
+## 1.5.1
+
+* Fix an incorrectly-declared generic type.
+
+## 1.5.0
+
+* Add `DelegatingIterable.typed()`, `DelegatingList.typed()`,
+  `DelegatingSet.typed()`, `DelegatingMap.typed()`, and
+  `DelegatingQueue.typed()` static methods. These wrap untyped instances of
+  these classes with the correct type parameter, and assert the types of values
+  as they're accessed.
+
+* Fix the types for `binarySearch()` and `lowerBound()` so they no longer
+  require all arguments to be comparable.
+
+* Add generic annotations to `insertionSort()` and `mergeSort()`.
+
+## 1.4.1
+
+* Fix all strong mode warnings.
+
+## 1.4.0
+
+* Add a `new PriorityQueue()` constructor that forwards to `new
+  HeapPriorityQueue()`.
+
+* Deprecate top-level libraries other than `package:collection/collection.dart`,
+  which exports these libraries' interfaces.
+
+## 1.3.0
+
+* Add `lowerBound` to binary search for values that might not be present.
+
+* Verify that the is valid for `CanonicalMap.[]`.
+
 ## 1.2.0
 
 * Add string comparators that ignore ASCII case and sort numbers numerically.
diff --git a/packages/collection/README.md b/packages/collection/README.md
index 8772e65..a7985fa 100644
--- a/packages/collection/README.md
+++ b/packages/collection/README.md
@@ -1,47 +1,26 @@
-Contains a number libraries
-with utility functions and classes that makes working with collections easier.
-
-## Using
-
-The `collection` package can be imported as separate libraries, or
-in totality:
-
-```dart
-import 'package:collection/algorithms.dart';
-import 'package:collection/equality.dart';
-import 'package:collection/iterable_zip.dart';
-import 'package:collection/priority_queue.dart';
-import 'package:collection/wrappers.dart';
-```
-
-or
-
-```dart
-import 'package:collection/collection.dart';
-```
+Contains utility functions and classes in the style of `dart:collection` to make
+working with collections easier.
 
 ## Algorithms
 
-The algorithms library contains functions that operate on lists.
+The package contains functions that operate on lists.
 
 It contains ways to shuffle a `List`, do binary search on a sorted `List`, and
 various sorting algorithms.
 
-
 ## Equality
 
-The equality library gives a way to specify equality of elements and
-collections.
+The package provides a way to specify the equality of elements and collections.
 
 Collections in Dart have no inherent equality. Two sets are not equal, even
 if they contain exactly the same objects as elements.
 
-The equality library provides a way to say define such an equality. In this
+The `Equality` interface provides a way to say define such an equality. In this
 case, for example, `const SetEquality(const IdentityEquality())` is an equality
 that considers two sets equal exactly if they contain identical elements.
 
-The library provides ways to define equalities on `Iterable`s, `List`s, `Set`s,
-and `Map`s, as well as combinations of these, such as:
+Equalities are provided for `Iterable`s, `List`s, `Set`s, and `Map`s, as well as
+combinations of these, such as:
 
 ```dart
 const MapEquality(const IdentityEquality(), const ListEquality());
@@ -50,20 +29,17 @@
 This equality considers maps equal if they have identical keys, and the
 corresponding values are lists with equal (`operator==`) values.
 
-
 ## Iterable Zip
 
 Utilities for "zipping" a list of iterables into an iterable of lists.
 
-
 ## Priority Queue
 
 An interface and implementation of a priority queue.
 
-
 ## Wrappers
 
-The wrappers library contains classes that "wrap" a collection.
+The package contains classes that "wrap" a collection.
 
 A wrapper class contains an object of the same type, and it forwards all
 methods to the wrapped object.
diff --git a/packages/collection/lib/algorithms.dart b/packages/collection/lib/algorithms.dart
index 5ff0bb3..4d3ae8b 100644
--- a/packages/collection/lib/algorithms.dart
+++ b/packages/collection/lib/algorithms.dart
@@ -2,300 +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.
 
-/**
- * Operations on collections.
- */
+/// Import `collection.dart` instead.
+@Deprecated("Will be removed in collection 2.0.0.")
 library dart.pkg.collection.algorithms;
 
-import "dart:math" show Random;
-
-/** Version of [binarySearch] optimized for comparable keys */
-int _comparableBinarySearch(List<Comparable> list, Comparable key) {
-  int min = 0;
-  int max = list.length;
-  while (min < max) {
-    int mid = min + ((max - min) >> 1);
-    var element = list[mid];
-    int comp = element.compareTo(key);
-    if (comp == 0) return mid;
-    if (comp < 0) {
-      min = mid + 1;
-    } else {
-      max = mid;
-    }
-  }
-  return -1;
-}
-
-/**
- * Returns a position of the [key] in [sortedList], if it is there.
- *
- * If the list isn't sorted according to the [compare] function, the result
- * is unpredictable.
- *
- * If [compare] is omitted, it defaults to calling [Comparable.compareTo] on
- * the objects.
- *
- * Returns -1 if [key] is not in the list by default.
- */
-int binarySearch(List sortedList, var key,
-                 { int compare(var a, var b) }) {
-  if (compare == null) {
-    return _comparableBinarySearch(sortedList, key);
-  }
-  int min = 0;
-  int max = sortedList.length;
-  while (min < max) {
-    int mid = min + ((max - min) >> 1);
-    var element = sortedList[mid];
-    int comp = compare(element, key);
-    if (comp == 0) return mid;
-    if (comp < 0) {
-      min = mid + 1;
-    } else {
-      max = mid;
-    }
-  }
-  return -1;
-}
-
-
-/**
- * Shuffles a list randomly.
- *
- * A sub-range of a list can be shuffled by providing [start] and [end].
- */
-void shuffle(List list, [int start = 0, int end = null]) {
-  Random random = new Random();
-  if (end == null) end = list.length;
-  int length = end - start;
-  while (length > 1) {
-    int pos = random.nextInt(length);
-    length--;
-    var tmp1 = list[start + pos];
-    list[start + pos] = list[start + length];
-    list[start + length] = tmp1;
-  }
-}
-
-
-/**
- * Reverses a list, or a part of a list, in-place.
- */
-void reverse(List list, [int start = 0, int end = null]) {
-  if (end == null) end = list.length;
-  _reverse(list, start, end);
-}
-
-// Internal helper function that assumes valid arguments.
-void _reverse(List list, int start, int end) {
-  for (int i = start, j = end - 1; i < j; i++, j--) {
-    var tmp = list[i];
-    list[i] = list[j];
-    list[j] = tmp;
-  }
-}
-
-/**
- * Sort a list using insertion sort.
- *
- * Insertion sort is a simple sorting algorithm. For `n` elements it does on
- * the order of `n * log(n)` comparisons but up to `n` squared moves. The
- * sorting is performed in-place, without using extra memory.
- *
- * For short lists the many moves have less impact than the simple algorithm,
- * and it is often the favored sorting algorithm for short lists.
- *
- * This insertion sort is stable: Equal elements end up in the same order
- * as they started in.
- */
-void insertionSort(List list,
-                   { int compare(a, b),
-                     int start: 0,
-                     int end: null }) {
-  // If the same method could have both positional and named optional
-  // parameters, this should be (list, [start, end], {compare}).
-  if (end == null) end = list.length;
-  if (compare == null) compare = Comparable.compare;
-  _insertionSort(list, compare, start, end, start + 1);
-}
-
-/**
- * Internal helper function that assumes arguments correct.
- *
- * Assumes that the elements up to [sortedUntil] (not inclusive) are
- * already sorted. The [sortedUntil] values should always be at least
- * `start + 1`.
- */
-void _insertionSort(List list, int compare(a, b), int start, int end,
-                    int sortedUntil) {
-  for (int pos = sortedUntil; pos < end; pos++) {
-    int min = start;
-    int max = pos;
-    var element = list[pos];
-    while (min < max) {
-      int mid = min + ((max - min) >> 1);
-      int comparison = compare(element, list[mid]);
-      if (comparison < 0) {
-        max = mid;
-      } else {
-        min = mid + 1;
-      }
-    }
-    list.setRange(min + 1, pos + 1, list, min);
-    list[min] = element;
-  }
-}
-
-/** Limit below which merge sort defaults to insertion sort. */
-const int _MERGE_SORT_LIMIT = 32;
-
-/**
- * Sorts a list, or a range of a list, using the merge sort algorithm.
- *
- * Merge-sorting works by splitting the job into two parts, sorting each
- * recursively, and then merging the two sorted parts.
- *
- * This takes on the order of `n * log(n)` comparisons and moves to sort
- * `n` elements, but requires extra space of about the same size as the list
- * being sorted.
- *
- * This merge sort is stable: Equal elements end up in the same order
- * as they started in.
- */
-void mergeSort(List list, {int start: 0, int end: null, int compare(a, b)}) {
-  if (end == null) end = list.length;
-  if (compare == null) compare = Comparable.compare;
-  int length = end - start;
-  if (length < 2) return;
-  if (length < _MERGE_SORT_LIMIT) {
-    _insertionSort(list, compare, start, end, start + 1);
-    return;
-  }
-  // Special case the first split instead of directly calling
-  // _mergeSort, because the _mergeSort requires its target to
-  // be different from its source, and it requires extra space
-  // of the same size as the list to sort.
-  // This split allows us to have only half as much extra space,
-  // and it ends up in the original place.
-  int middle = start + ((end - start) >> 1);
-  int firstLength = middle - start;
-  int secondLength = end - middle;
-  // secondLength is always the same as firstLength, or one greater.
-  List scratchSpace = new List(secondLength);
-  _mergeSort(list, compare, middle, end, scratchSpace, 0);
-  int firstTarget = end - firstLength;
-  _mergeSort(list, compare, start, middle, list, firstTarget);
-  _merge(compare,
-         list, firstTarget, end,
-         scratchSpace, 0, secondLength,
-         list, start);
-}
-
-/**
- * Performs an insertion sort into a potentially different list than the
- * one containing the original values.
- *
- * It will work in-place as well.
- */
-void _movingInsertionSort(List list, int compare(a, b), int start, int end,
-                          List target, int targetOffset) {
-  int length = end - start;
-  if (length == 0) return;
-  target[targetOffset] = list[start];
-  for (int i = 1; i < length; i++) {
-    var element = list[start + i];
-    int min = targetOffset;
-    int max = targetOffset + i;
-    while (min < max) {
-      int mid = min + ((max - min) >> 1);
-      if (compare(element, target[mid]) < 0) {
-        max = mid;
-      } else {
-        min = mid + 1;
-      }
-    }
-    target.setRange(min + 1, targetOffset + i + 1,
-                    target, min);
-    target[min] = element;
-  }
-}
-
-/**
- * Sorts [list] from [start] to [end] into [target] at [targetOffset].
- *
- * The `target` list must be able to contain the range from `start` to `end`
- * after `targetOffset`.
- *
- * Allows target to be the same list as [list], as long as it's not
- * overlapping the `start..end` range.
- */
-void _mergeSort(List list, int compare(a, b), int start, int end,
-                List target, int targetOffset) {
-  int length = end - start;
-  if (length < _MERGE_SORT_LIMIT) {
-    _movingInsertionSort(list, compare, start, end, target, targetOffset);
-    return;
-  }
-  int middle = start + (length >> 1);
-  int firstLength = middle - start;
-  int secondLength = end - middle;
-  // Here secondLength >= firstLength (differs by at most one).
-  int targetMiddle = targetOffset + firstLength;
-  // Sort the second half into the end of the target area.
-  _mergeSort(list, compare, middle, end,
-             target, targetMiddle);
-  // Sort the first half into the end of the source area.
-  _mergeSort(list, compare, start, middle,
-             list, middle);
-  // Merge the two parts into the target area.
-  _merge(compare,
-         list, middle, middle + firstLength,
-         target, targetMiddle, targetMiddle + secondLength,
-         target, targetOffset);
-}
-
-/**
- * Merges two lists into a target list.
- *
- * One of the input lists may be positioned at the end of the target
- * list.
- *
- * For equal object, elements from [firstList] are always preferred.
- * This allows the merge to be stable if the first list contains elements
- * that started out earlier than the ones in [secondList]
- */
-void _merge(int compare(a, b),
-            List firstList, int firstStart, int firstEnd,
-            List secondList, int secondStart, int secondEnd,
-            List target, int targetOffset) {
-  // No empty lists reaches here.
-  assert(firstStart < firstEnd);
-  assert(secondStart < secondEnd);
-  int cursor1 = firstStart;
-  int cursor2 = secondStart;
-  var firstElement = firstList[cursor1++];
-  var secondElement = secondList[cursor2++];
-  while (true) {
-    if (compare(firstElement, secondElement) <= 0) {
-      target[targetOffset++] = firstElement;
-      if (cursor1 == firstEnd) break;  // Flushing second list after loop.
-      firstElement = firstList[cursor1++];
-    } else {
-      target[targetOffset++] = secondElement;
-      if (cursor2 != secondEnd) {
-        secondElement = secondList[cursor2++];
-        continue;
-      }
-      // Second list empties first. Flushing first list here.
-      target[targetOffset++] = firstElement;
-      target.setRange(targetOffset, targetOffset + (firstEnd - cursor1),
-          firstList, cursor1);
-      return;
-    }
-  }
-  // First list empties first. Reached by break above.
-  target[targetOffset++] = secondElement;
-  target.setRange(targetOffset, targetOffset + (secondEnd - cursor2),
-      secondList, cursor2);
-}
+export "src/algorithms.dart";
diff --git a/packages/collection/lib/collection.dart b/packages/collection/lib/collection.dart
index 6d451b8..70f9fbc 100644
--- a/packages/collection/lib/collection.dart
+++ b/packages/collection/lib/collection.dart
@@ -2,26 +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.
 
-/**
- * Exports all the individual parts of the collection-helper library.
- *
- * The sub-libraries of this package are:
- *
- * - `algorithms.dart`: Algorithms that work on lists (shuffle, binary search
- *                      and various sorting algorithms).
- * - `equality.dart`: Different notions of equality of collections.
- * - `iterable_zip.dart`: Combining multiple iterables into one.
- * - `priority_queue.dart`: Priority queue type and implementations.
- * - `wrappers.dart`: Wrapper classes that delegate to a collection object.
- *                    Includes unmodifiable views of collections.
- */
-library dart.pkg.collection;
-
-export "algorithms.dart";
-export "equality.dart";
-export "iterable_zip.dart";
-export "priority_queue.dart";
+export "src/algorithms.dart";
 export "src/canonicalized_map.dart";
+export "src/combined_wrappers/combined_iterable.dart";
+export "src/combined_wrappers/combined_list.dart";
+export "src/combined_wrappers/combined_map.dart";
 export "src/comparators.dart";
+export "src/equality.dart";
+export "src/equality_map.dart";
+export "src/equality_set.dart";
+export "src/functions.dart";
+export "src/iterable_zip.dart";
+export "src/priority_queue.dart";
 export "src/queue_list.dart";
-export "wrappers.dart";
+export "src/union_set.dart";
+export "src/union_set_controller.dart";
+export "src/unmodifiable_wrappers.dart";
+export "src/wrappers.dart";
diff --git a/packages/collection/lib/equality.dart b/packages/collection/lib/equality.dart
index 5911863..0f5b51d 100644
--- a/packages/collection/lib/equality.dart
+++ b/packages/collection/lib/equality.dart
@@ -2,418 +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.
 
-/**
- * Defines equality relations on collections.
- */
+/// Import `collection.dart` instead.
+@Deprecated("Will be removed in collection 2.0.0.")
 library dart.pkg.collection.equality;
 
-import "dart:collection";
-
-const int _HASH_MASK = 0x7fffffff;
-
-/**
- * A generic equality relation on objects.
- */
-abstract class Equality<E> {
-  const factory Equality() = DefaultEquality;
-
-  /**
-   * Compare two elements for being equal.
-   *
-   * This should be a proper equality relation.
-   */
-  bool equals(E e1, E e2);
-
-  /**
-   * Get a hashcode of an element.
-   *
-   * The hashcode should be compatible with [equals], so that if
-   * `equals(a, b)` then `hash(a) == hash(b)`.
-   */
-  int hash(E e);
-
-  /**
-   * Test whether an object is a valid argument to [equals] and [hash].
-   *
-   * Some implementations may be restricted to only work on specific types
-   * of objects.
-   */
-  bool isValidKey(Object o);
-}
-
-/**
- * Equality of objects that compares only the natural equality of the objects.
- *
- * This equality uses the objects' own [Object.==] and [Object.hashCode] for
- * the equality.
- */
-class DefaultEquality implements Equality {
-  const DefaultEquality();
-  bool equals(Object e1, Object e2) => e1 == e2;
-  int hash(Object e) => e.hashCode;
-  bool isValidKey(Object o) => true;
-}
-
-/**
- * Equality of objects that compares only the identity of the objects.
- */
-class IdentityEquality implements Equality {
-  const IdentityEquality();
-  bool equals(Object e1, Object e2) => identical(e1, e2);
-  int hash(Object e) => identityHashCode(e);
-  bool isValidKey(Object o) => true;
-}
-
-/**
- * Equality on iterables.
- *
- * Two iterables are equal if they have the same elements in the same order.
- */
-class IterableEquality<E> implements Equality<Iterable<E>> {
-  final Equality<E> _elementEquality;
-  const IterableEquality([Equality<E> elementEquality =
-                              const DefaultEquality()])
-      : _elementEquality = elementEquality;
-
-  bool equals(Iterable<E> elements1, Iterable<E> elements2) {
-    if (identical(elements1, elements2)) return true;
-    if (elements1 == null || elements2 == null) return false;
-    Iterator it1 = elements1.iterator;
-    Iterator it2 = elements2.iterator;
-    while (true) {
-      bool hasNext = it1.moveNext();
-      if (hasNext != it2.moveNext()) return false;
-      if (!hasNext) return true;
-      if (!_elementEquality.equals(it1.current, it2.current)) return false;
-    }
-  }
-
-  int hash(Iterable<E> elements) {
-    // Jenkins's one-at-a-time hash function.
-    int hash = 0;
-    for (E element in elements) {
-      int c = _elementEquality.hash(element);
-      hash = (hash + c) & _HASH_MASK;
-      hash = (hash + (hash << 10)) & _HASH_MASK;
-      hash ^= (hash >> 6);
-    }
-    hash = (hash + (hash << 3)) & _HASH_MASK;
-    hash ^= (hash >> 11);
-    hash = (hash + (hash << 15)) & _HASH_MASK;
-    return hash;
-  }
-
-  bool isValidKey(Object o) => o is Iterable<E>;
-}
-
-/**
- * Equality on lists.
- *
- * Two lists are equal if they have the same length and their elements
- * at each index are equal.
- *
- * This is effectively the same as [IterableEquality] except that it
- * accesses elements by index instead of through iteration.
- */
-class ListEquality<E> implements Equality<List<E>> {
-  final Equality<E> _elementEquality;
-  const ListEquality([Equality<E> elementEquality = const DefaultEquality()])
-      : _elementEquality = elementEquality;
-
-  bool equals(List<E> e1, List<E> e2) {
-    if (identical(e1, e2)) return true;
-    if (e1 == null || e2 == null) return false;
-    int length = e1.length;
-    if (length != e2.length) return false;
-    for (int i = 0; i < length; i++) {
-      if (!_elementEquality.equals(e1[i], e2[i])) return false;
-    }
-    return true;
-  }
-
-  int hash(List<E> e) {
-    // Jenkins's one-at-a-time hash function.
-    // This code is almost identical to the one in IterableEquality, except
-    // that it uses indexing instead of iterating to get the elements.
-    int hash = 0;
-    for (int i = 0; i < e.length; i++) {
-      int c = _elementEquality.hash(e[i]);
-      hash = (hash + c) & _HASH_MASK;
-      hash = (hash + (hash << 10)) & _HASH_MASK;
-      hash ^= (hash >> 6);
-    }
-    hash = (hash + (hash << 3)) & _HASH_MASK;
-    hash ^= (hash >> 11);
-    hash = (hash + (hash << 15)) & _HASH_MASK;
-    return hash;
-  }
-
-  bool isValidKey(Object o) => o is List<E>;
-}
-
-abstract class _UnorderedEquality<E, T extends Iterable<E>>
-    implements Equality<T> {
-  final Equality<E> _elementEquality;
-
-  const _UnorderedEquality(this._elementEquality);
-
-  bool equals(T e1, T e2) {
-    if (identical(e1, e2)) return true;
-    if (e1 == null || e2 == null) return false;
-    HashMap<E, int> counts = new HashMap(
-        equals: _elementEquality.equals,
-        hashCode: _elementEquality.hash,
-        isValidKey: _elementEquality.isValidKey);
-    int length = 0;
-    for (var e in e1) {
-      int count = counts[e];
-      if (count == null) count = 0;
-      counts[e] = count + 1;
-      length++;
-    }
-    for (var e in e2) {
-      int count = counts[e];
-      if (count == null || count == 0) return false;
-      counts[e] = count - 1;
-      length--;
-    }
-    return length == 0;
-  }
-
-  int hash(T e) {
-    int hash = 0;
-    for (E element in e) {
-      int c = _elementEquality.hash(element);
-      hash = (hash + c) & _HASH_MASK;
-    }
-    hash = (hash + (hash << 3)) & _HASH_MASK;
-    hash ^= (hash >> 11);
-    hash = (hash + (hash << 15)) & _HASH_MASK;
-    return hash;
-  }
-}
-
-/**
- * Equality of the elements of two iterables without considering order.
- *
- * Two iterables are considered equal if they have the same number of elements,
- * and the elements of one set can be paired with the elements
- * of the other iterable, so that each pair are equal.
- */
-class UnorderedIterableEquality<E> extends _UnorderedEquality<E, Iterable<E>> {
-  const UnorderedIterableEquality(
-      [Equality<E> elementEquality = const DefaultEquality()])
-      : super(elementEquality);
-
-  bool isValidKey(Object o) => o is Iterable<E>;
-}
-
-/**
- * Equality of sets.
- *
- * Two sets are considered equal if they have the same number of elements,
- * and the elements of one set can be paired with the elements
- * of the other set, so that each pair are equal.
- *
- * This equality behaves the same as [UnorderedIterableEquality] except that
- * it expects sets instead of iterables as arguments.
- */
-class SetEquality<E> extends _UnorderedEquality<E, Set<E>> {
-  const SetEquality(
-      [Equality<E> elementEquality = const DefaultEquality()])
-      : super(elementEquality);
-
-  bool isValidKey(Object o) => o is Set<E>;
-}
-
-/**
- *  Internal class used by [MapEquality].
- *
- *  The class represents a map entry as a single object,
- *  using a combined hashCode and equality of the key and value.
- */
-class _MapEntry {
-  final MapEquality equality;
-  final key;
-  final value;
-  _MapEntry(this.equality, this.key, this.value);
-
-  int get hashCode =>
-      (3 * equality._keyEquality.hash(key) +
-       7 * equality._valueEquality.hash(value)) & _HASH_MASK;
-
-  bool operator==(Object other) {
-    if (other is! _MapEntry) return false;
-    _MapEntry otherEntry = other;
-    return equality._keyEquality.equals(key, otherEntry.key) &&
-           equality._valueEquality.equals(value, otherEntry.value);
-
-  }
-}
-
-/**
- * Equality on maps.
- *
- * Two maps are equal if they have the same number of entries, and if the
- * entries of the two maps are pairwise equal on both key and value.
- */
-class MapEquality<K, V> implements Equality<Map<K, V>> {
-  final Equality<K> _keyEquality;
-  final Equality<V> _valueEquality;
-  const MapEquality({ Equality<K> keys : const DefaultEquality(),
-                      Equality<V> values : const DefaultEquality() })
-      : _keyEquality = keys, _valueEquality = values;
-
-  bool equals(Map<K, V> e1, Map<K, V> e2) {
-    if (identical(e1, e2)) return true;
-    if (e1 == null || e2 == null) return false;
-    int length = e1.length;
-    if (length != e2.length) return false;
-    Map<_MapEntry, int> equalElementCounts = new HashMap();
-    for (K key in e1.keys) {
-      _MapEntry entry = new _MapEntry(this, key, e1[key]);
-      int count = equalElementCounts[entry];
-      if (count == null) count = 0;
-      equalElementCounts[entry] = count + 1;
-    }
-    for (K key in e2.keys) {
-      _MapEntry entry = new _MapEntry(this, key, e2[key]);
-      int count = equalElementCounts[entry];
-      if (count == null || count == 0) return false;
-      equalElementCounts[entry] = count - 1;
-    }
-    return true;
-  }
-
-  int hash(Map<K, V> map) {
-    int hash = 0;
-    for (K key in map.keys) {
-      int keyHash = _keyEquality.hash(key);
-      int valueHash = _valueEquality.hash(map[key]);
-      hash = (hash + 3 * keyHash + 7 * valueHash) & _HASH_MASK;
-    }
-    hash = (hash + (hash << 3)) & _HASH_MASK;
-    hash ^= (hash >> 11);
-    hash = (hash + (hash << 15)) & _HASH_MASK;
-    return hash;
-  }
-
-  bool isValidKey(Object o) => o is Map<K, V>;
-}
-
-/**
- * Combines several equalities into a single equality.
- *
- * Tries each equality in order, using [Equality.isValidKey], and returns
- * the result of the first equality that applies to the argument or arguments.
- *
- * For `equals`, the first equality that matches the first argument is used,
- * and if the second argument of `equals` is not valid for that equality,
- * it returns false.
- *
- * Because the equalities are tried in order, they should generally work on
- * disjoint types. Otherwise the multi-equality may give inconsistent results
- * for `equals(e1, e2)` and `equals(e2, e1)`. This can happen if one equality
- * considers only `e1` a valid key, and not `e2`, but an equality which is
- * checked later, allows both.
- */
-class MultiEquality<E> implements Equality<E> {
-  final Iterable<Equality<E>> _equalities;
-
-  const MultiEquality(Iterable<Equality<E>> equalities)
-      : _equalities = equalities;
-
-  bool equals(E e1, E e2) {
-    for (Equality<E> eq in _equalities) {
-      if (eq.isValidKey(e1)) return eq.isValidKey(e2) && eq.equals(e1, e2);
-    }
-    return false;
-  }
-
-  int hash(E e) {
-    for (Equality<E> eq in _equalities) {
-      if (eq.isValidKey(e)) return eq.hash(e);
-    }
-    return -1;
-  }
-
-  bool isValidKey(Object o) {
-    for (Equality<E> eq in _equalities) {
-      if (eq.isValidKey(o)) return true;
-    }
-    return false;
-  }
-}
-
-/**
- * Deep equality on collections.
- *
- * Recognizes lists, sets, iterables and maps and compares their elements using
- * deep equality as well.
- *
- * Non-iterable/map objects are compared using a configurable base equality.
- *
- * Works in one of two modes: ordered or unordered.
- *
- * In ordered mode, lists and iterables are required to have equal elements
- * in the same order. In unordered mode, the order of elements in iterables
- * and lists are not important.
- *
- * A list is only equal to another list, likewise for sets and maps. All other
- * iterables are compared as iterables only.
- */
-class DeepCollectionEquality implements Equality {
-  final Equality _base;
-  final bool _unordered;
-  const DeepCollectionEquality([Equality base = const DefaultEquality()])
-      : _base = base, _unordered = false;
-
-  /**
-   * Creates a deep equality on collections where the order of lists and
-   * iterables are not considered important. That is, lists and iterables are
-   * treated as unordered iterables.
-   */
-  const DeepCollectionEquality.unordered(
-      [Equality base = const DefaultEquality()])
-      : _base = base, _unordered = true;
-
-  bool equals(e1, e2) {
-    if (e1 is Set) {
-      if (e2 is! Set) return false;
-      return new SetEquality(this).equals(e1, e2);
-    }
-    if (e1 is Map) {
-      if (e2 is! Map) return false;
-      return new MapEquality(keys: this, values: this).equals(e1, e2);
-    }
-    if (!_unordered) {
-      if (e1 is List) {
-        if (e2 is! List) return false;
-        return new ListEquality(this).equals(e1, e2);
-      }
-      if (e1 is Iterable) {
-        if (e2 is! Iterable) return false;
-        return new IterableEquality(this).equals(e1, e2);
-      }
-    } else if (e1 is Iterable) {
-      if (e2 is! Iterable) return false;
-      if (e1 is List != e2 is List) return false;
-      return new UnorderedIterableEquality(this).equals(e1, e2);
-    }
-    return _base.equals(e1, e2);
-  }
-
-  int hash(Object o) {
-    if (o is Set) return new SetEquality(this).hash(o);
-    if (o is Map) return new MapEquality(keys: this, values: this).hash(o);
-    if (!_unordered) {
-      if (o is List) return new ListEquality(this).hash(o);
-      if (o is Iterable) return new IterableEquality(this).hash(o);
-    } else if (o is Iterable) {
-      return new UnorderedIterableEquality(this).hash(o);
-    }
-    return _base.hash(o);
-  }
-
-  bool isValidKey(Object o) => o is Iterable || o is Map || _base.isValidKey(o);
-}
+export "src/equality.dart";
diff --git a/packages/collection/lib/iterable_zip.dart b/packages/collection/lib/iterable_zip.dart
index 772b07e..34e18ef 100644
--- a/packages/collection/lib/iterable_zip.dart
+++ b/packages/collection/lib/iterable_zip.dart
@@ -2,58 +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.
 
-/**
- * Zipping multiple iterables into one iterable of tuples of values.
- */
+/// Import `collection.dart` instead.
+@Deprecated("Will be removed in collection 2.0.0.")
 library dart.pkg.collection.iterable_zip;
 
-import "dart:collection" show IterableBase;
-
-/**
- * Iterable that iterates over lists of values from other iterables.
- *
- * When [iterator] is read, an [Iterator] is created for each [Iterable] in
- * the [Iterable] passed to the constructor.
- *
- * As long as all these iterators have a next value, those next values are
- * combined into a single list, which becomes the next value of this
- * [Iterable]'s [Iterator]. As soon as any of the iterators run out,
- * the zipped iterator also stops.
- */
-class IterableZip extends IterableBase<List> {
-  final Iterable<Iterable> _iterables;
-  IterableZip(Iterable<Iterable> iterables)
-      : this._iterables = iterables;
-
-  /**
-   * Returns an iterator that combines values of the iterables' iterators
-   * as long as they all have values.
-   */
-  Iterator<List> get iterator {
-    List iterators = _iterables.map((x) => x.iterator).toList(growable: false);
-    // TODO(lrn): Return an empty iterator directly if iterators is empty?
-    return new _IteratorZip(iterators);
-  }
-}
-
-class _IteratorZip implements Iterator<List> {
-  final List<Iterator> _iterators;
-  List _current;
-  _IteratorZip(List iterators) : _iterators = iterators;
-  bool moveNext() {
-    if (_iterators.isEmpty) return false;
-    for (int i = 0; i < _iterators.length; i++) {
-      if (!_iterators[i].moveNext()) {
-        _current = null;
-        return false;
-      }
-    }
-    _current = new List(_iterators.length);
-    for (int i = 0; i < _iterators.length; i++) {
-      _current[i] = _iterators[i].current;
-    }
-    return true;
-  }
-
-  List get current => _current;
-}
+export "src/iterable_zip.dart";
diff --git a/packages/collection/lib/priority_queue.dart b/packages/collection/lib/priority_queue.dart
index e1a0177..f2a4703 100644
--- a/packages/collection/lib/priority_queue.dart
+++ b/packages/collection/lib/priority_queue.dart
@@ -2,395 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Import `collection.dart` instead.
+@Deprecated("Will be removed in collection 2.0.0.")
 library dart.pkg.collection.priority_queue;
 
-import "dart:collection" show SplayTreeSet;
-
-/**
- * A priority queue is a priority based work-list of elements.
- *
- * The queue allows adding elements, and removing them again in priority order.
- */
-abstract class PriorityQueue<E> {
-  /**
-   * Number of elements in the queue.
-   */
-  int get length;
-
-  /**
-   * Whether the queue is empty.
-   */
-  bool get isEmpty;
-
-  /**
-   * Whether the queue has any elements.
-   */
-  bool get isNotEmpty;
-
-  /**
-   * Checks if [object] is in the queue.
-   *
-   * Returns true if the element is found.
-   */
-  bool contains(E object);
-
-  /**
-   * Adds element to the queue.
-   *
-   * The element will become the next to be removed by [removeFirst]
-   * when all elements with higher priority have been removed.
-   */
-  void add(E element);
-
-  /**
-   * Adds all [elements] to the queue.
-   */
-  void addAll(Iterable<E> elements);
-
-  /**
-   * Returns the next element that will be returned by [removeFirst].
-   *
-   * The element is not removed from the queue.
-   *
-   * The queue must not be empty when this method is called.
-   */
-  E get first;
-
-  /**
-   * Removes and returns the element with the highest priority.
-   *
-   * Repeatedly calling this method, without adding element in between,
-   * is guaranteed to return elements in non-decreasing order as, specified by
-   * [comparison].
-   *
-   * The queue must not be empty when this method is called.
-   */
-  E removeFirst();
-
-  /**
-   * Removes an element that compares equal to [element] in the queue.
-   *
-   * Returns true if an element is found and removed,
-   * and false if no equal element is found.
-   */
-  bool remove(E element);
-
-  /**
-   * Removes all the elements from this queue and returns them.
-   *
-   * The returned iterable has no specified order.
-   */
-  Iterable<E> removeAll();
-
-  /**
-   * Removes all the elements from this queue.
-   */
-  void clear();
-
-  /**
-   * Returns a list of the elements of this queue in priority order.
-   *
-   * The queue is not modified.
-   *
-   * The order is the order that the elements would be in if they were
-   * removed from this queue using [removeFirst].
-   */
-  List<E> toList();
-
-  /**
-   * Return a comparator based set using the comparator of this queue.
-   *
-   * The queue is not modified.
-   *
-   * The returned [Set] is currently a [SplayTreeSet],
-   * but this may change as other ordered sets are implemented.
-   *
-   * The set contains all the elements of this queue.
-   * If an element occurs more than once in the queue,
-   * the set will contain it only once.
-   */
-  Set<E> toSet();
-}
-
-/**
- * Heap based priority queue.
- *
- * The elements are kept in a heap structure,
- * where the element with the highest priority is immediately accessible,
- * and modifying a single element takes
- * logarithmic time in the number of elements on average.
- *
- * * The [add] and [removeFirst] operations take amortized logarithmic time,
- *   O(log(n)), but may occasionally take linear time when growing the capacity
- *   of the heap.
- * * The [addAll] operation works as doing repeated [add] operations.
- * * The [first] getter takes constant time, O(1).
- * * The [clear] and [removeAll] methods also take constant time, O(1).
- * * The [contains] and [remove] operations may need to search the entire
- *   queue for the elements, taking O(n) time.
- * * The [toList] operation effectively sorts the elements, taking O(n*log(n))
- *   time.
- * * The [toSet] operation effectively adds each element to the new set, taking
- *   an expected O(n*log(n)) time.
- */
-class HeapPriorityQueue<E> implements PriorityQueue<E> {
-  /**
-   * Initial capacity of a queue when created, or when added to after a [clear].
-   *
-   * Number can be any positive value. Picking a size that gives a whole
-   * number of "tree levels" in the heap is only done for aesthetic reasons.
-   */
-  static const int _INITIAL_CAPACITY = 7;
-
-  /**
-   * The comparison being used to compare the priority of elements.
-   */
-  final Comparator comparison;
-
-  /**
-   * List implementation of a heap.
-   */
-  List<E> _queue = new List<E>(_INITIAL_CAPACITY);
-
-  /**
-   * Number of elements in queue.
-   *
-   * The heap is implemented in the first [_length] entries of [_queue].
-   */
-  int _length = 0;
-
-  /**
-   * Create a new priority queue.
-   *
-   * The [comparison] is a [Comparator] used to compare the priority of
-   * elements. An element that compares as less than another element has
-   * a higher priority.
-   *
-   * If [comparison] is omitted, it defaults to [Comparable.compare].
-   */
-  HeapPriorityQueue([int comparison(E e1, E e2)])
-      : comparison = (comparison != null) ? comparison : Comparable.compare;
-
-  void add(E element) {
-    _add(element);
-  }
-
-  void addAll(Iterable<E> elements) {
-    for (E element in elements) {
-      _add(element);
-    }
-  }
-
-  void clear() {
-    _queue = const [];
-    _length = 0;
-  }
-
-  bool contains(E object) {
-    return _locate(object) >= 0;
-  }
-
-  E get first {
-    if (_length == 0) throw new StateError("No such element");
-    return _queue[0];
-  }
-
-  bool get isEmpty => _length == 0;
-
-  bool get isNotEmpty => _length != 0;
-
-  int get length => _length;
-
-  bool remove(E element) {
-    int index = _locate(element);
-    if (index < 0) return false;
-    E last = _removeLast();
-    if (index < _length) {
-      int comp = comparison(last, element);
-      if (comp <= 0) {
-        _bubbleUp(last, index);
-      } else {
-        _bubbleDown(last, index);
-      }
-    }
-    return true;
-  }
-
-  Iterable<E> removeAll() {
-    List<E> result = _queue;
-    int length = _length;
-    _queue = const [];
-    _length = 0;
-    return result.take(length);
-  }
-
-  E removeFirst() {
-    if (_length == 0) throw new StateError("No such element");
-    E result = _queue[0];
-    E last = _removeLast();
-    if (_length > 0) {
-      _bubbleDown(last, 0);
-    }
-    return result;
-  }
-
-  List<E> toList() {
-    List<E> list = new List<E>()..length = _length;
-    list.setRange(0, _length, _queue);
-    list.sort(comparison);
-    return list;
-  }
-
-  Set<E> toSet() {
-    Set<E> set = new SplayTreeSet<E>(comparison);
-    for (int i = 0; i < _length; i++) {
-      set.add(_queue[i]);
-    }
-    return set;
-  }
-
-  /**
-   * Returns some representation of the queue.
-   *
-   * The format isn't significant, and may change in the future.
-   */
-  String toString() {
-    return _queue.take(_length).toString();
-  }
-
-  /**
-   * Add element to the queue.
-   *
-   * Grows the capacity if the backing list is full.
-   */
-  void _add(E element) {
-    if (_length == _queue.length) _grow();
-    _bubbleUp(element, _length++);
-  }
-
-  /**
-   * Find the index of an object in the heap.
-   *
-   * Returns -1 if the object is not found.
-   */
-  int _locate(E object) {
-    if (_length == 0) return -1;
-    // Count positions from one instead of zero. This gives the numbers
-    // some nice properties. For example, all right children are odd,
-    // their left sibling is even, and the parent is found by shifting
-    // right by one.
-    // Valid range for position is [1.._length], inclusive.
-    int position = 1;
-    // Pre-order depth first search, omit child nodes if the current
-    // node has lower priority than [object], because all nodes lower
-    // in the heap will also have lower priority.
-    do {
-      int index = position - 1;
-      E element = _queue[index];
-      int comp = comparison(element, object);
-      if (comp == 0) return index;
-      if (comp < 0) {
-        // Element may be in subtree.
-        // Continue with the left child, if it is there.
-        int leftChildPosition = position * 2;
-        if (leftChildPosition <= _length) {
-          position = leftChildPosition;
-          continue;
-        }
-      }
-      // Find the next right sibling or right ancestor sibling.
-      do {
-        while (position.isOdd) {
-          // While position is a right child, go to the parent.
-          position >>= 1;
-        }
-        // Then go to the right sibling of the left-child.
-        position += 1;
-      } while (position > _length);  // Happens if last element is a left child.
-    } while (position != 1);  // At root again. Happens for right-most element.
-    return -1;
-  }
-
-  E _removeLast() {
-    int newLength = _length - 1;
-    E last = _queue[newLength];
-    _queue[newLength] = null;
-    _length = newLength;
-    return last;
-  }
-
-  /**
-   * Place [element] in heap at [index] or above.
-   *
-   * Put element into the empty cell at `index`.
-   * While the `element` has higher priority than the
-   * parent, swap it with the parent.
-   */
-  void _bubbleUp(E element, int index) {
-    while (index > 0) {
-      int parentIndex = (index - 1) ~/ 2;
-      E parent = _queue[parentIndex];
-      if (comparison(element, parent) > 0) break;
-      _queue[index] = parent;
-      index = parentIndex;
-    }
-    _queue[index] = element;
-  }
-
-  /**
-   * Place [element] in heap at [index] or above.
-   *
-   * Put element into the empty cell at `index`.
-   * While the `element` has lower priority than either child,
-   * swap it with the highest priority child.
-   */
-  void _bubbleDown(E element, int index) {
-    int rightChildIndex = index * 2 + 2;
-    while (rightChildIndex < _length) {
-      int leftChildIndex = rightChildIndex - 1;
-      E leftChild = _queue[leftChildIndex];
-      E rightChild = _queue[rightChildIndex];
-      int comp = comparison(leftChild, rightChild);
-      int minChildIndex;
-      E minChild;
-      if (comp < 0) {
-        minChild = leftChild;
-        minChildIndex = leftChildIndex;
-      } else {
-        minChild = rightChild;
-        minChildIndex = rightChildIndex;
-      }
-      comp = comparison(element, minChild);
-      if (comp <= 0) {
-        _queue[index] = element;
-        return;
-      }
-      _queue[index] = minChild;
-      index = minChildIndex;
-      rightChildIndex = index * 2 + 2;
-    }
-    int leftChildIndex = rightChildIndex - 1;
-    if (leftChildIndex < _length) {
-      E child = _queue[leftChildIndex];
-      int comp = comparison(element, child);
-      if (comp > 0) {
-        _queue[index] = child;
-        index = leftChildIndex;
-      }
-    }
-    _queue[index] = element;
-  }
-
-  /**
-   * Grows the capacity of the list holding the heap.
-   *
-   * Called when the list is full.
-   */
-  void _grow() {
-    int newCapacity = _queue.length * 2 + 1;
-    if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY;
-    List<E> newQueue = new List<E>(newCapacity);
-    newQueue.setRange(0, _length, _queue);
-    _queue = newQueue;
-  }
-}
+export "src/priority_queue.dart";
diff --git a/packages/collection/lib/src/algorithms.dart b/packages/collection/lib/src/algorithms.dart
new file mode 100644
index 0000000..567230c
--- /dev/null
+++ b/packages/collection/lib/src/algorithms.dart
@@ -0,0 +1,283 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:math" as math;
+
+import "utils.dart";
+
+/// Returns a position of the [value] in [sortedList], if it is there.
+///
+/// If the list isn't sorted according to the [compare] function, the result
+/// is unpredictable.
+///
+/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
+/// the objects. If any object is not [Comparable], this throws a [CastError].
+///
+/// Returns -1 if [value] is not in the list by default.
+int binarySearch<T>(List<T> sortedList, T value, {int compare(T a, T b)}) {
+  compare ??= defaultCompare<T>();
+  int min = 0;
+  int max = sortedList.length;
+  while (min < max) {
+    int mid = min + ((max - min) >> 1);
+    var element = sortedList[mid];
+    int comp = compare(element, value);
+    if (comp == 0) return mid;
+    if (comp < 0) {
+      min = mid + 1;
+    } else {
+      max = mid;
+    }
+  }
+  return -1;
+}
+
+/// Returns the first position in [sortedList] that does not compare less than
+/// [value].
+///
+/// If the list isn't sorted according to the [compare] function, the result
+/// is unpredictable.
+///
+/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
+/// the objects. If any object is not [Comparable], this throws a [CastError].
+///
+/// Returns [sortedList.length] if all the items in [sortedList] compare less
+/// than [value].
+int lowerBound<T>(List<T> sortedList, T value, {int compare(T a, T b)}) {
+  compare ??= defaultCompare<T>();
+  int min = 0;
+  int max = sortedList.length;
+  while (min < max) {
+    int mid = min + ((max - min) >> 1);
+    var element = sortedList[mid];
+    int comp = compare(element, value);
+    if (comp < 0) {
+      min = mid + 1;
+    } else {
+      max = mid;
+    }
+  }
+  return min;
+}
+
+/// Shuffles a list randomly.
+///
+/// A sub-range of a list can be shuffled by providing [start] and [end].
+void shuffle(List list, [int start = 0, int end = null]) {
+  var random = new math.Random();
+  if (end == null) end = list.length;
+  int length = end - start;
+  while (length > 1) {
+    int pos = random.nextInt(length);
+    length--;
+    var tmp1 = list[start + pos];
+    list[start + pos] = list[start + length];
+    list[start + length] = tmp1;
+  }
+}
+
+/// Reverses a list, or a part of a list, in-place.
+void reverse(List list, [int start = 0, int end = null]) {
+  if (end == null) end = list.length;
+  _reverse(list, start, end);
+}
+
+/// Internal helper function that assumes valid arguments.
+void _reverse(List list, int start, int end) {
+  for (int i = start, j = end - 1; i < j; i++, j--) {
+    var tmp = list[i];
+    list[i] = list[j];
+    list[j] = tmp;
+  }
+}
+
+/// Sort a list between [start] (inclusive) and [end] (exclusive) using
+/// insertion sort.
+///
+/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
+/// the objects. If any object is not [Comparable], this throws a [CastError].
+///
+/// Insertion sort is a simple sorting algorithm. For `n` elements it does on
+/// the order of `n * log(n)` comparisons but up to `n` squared moves. The
+/// sorting is performed in-place, without using extra memory.
+///
+/// For short lists the many moves have less impact than the simple algorithm,
+/// and it is often the favored sorting algorithm for short lists.
+///
+/// This insertion sort is stable: Equal elements end up in the same order
+/// as they started in.
+void insertionSort<T>(List<T> list,
+    {int compare(T a, T b), int start: 0, int end}) {
+  // If the same method could have both positional and named optional
+  // parameters, this should be (list, [start, end], {compare}).
+  compare ??= defaultCompare<T>();
+  end ??= list.length;
+
+  for (int pos = start + 1; pos < end; pos++) {
+    int min = start;
+    int max = pos;
+    var element = list[pos];
+    while (min < max) {
+      int mid = min + ((max - min) >> 1);
+      int comparison = compare(element, list[mid]);
+      if (comparison < 0) {
+        max = mid;
+      } else {
+        min = mid + 1;
+      }
+    }
+    list.setRange(min + 1, pos + 1, list, min);
+    list[min] = element;
+  }
+}
+
+/// Limit below which merge sort defaults to insertion sort.
+const int _MERGE_SORT_LIMIT = 32;
+
+/// Sorts a list between [start] (inclusive) and [end] (exclusive) using the
+/// merge sort algorithm.
+///
+/// If [compare] is omitted, this defaults to calling [Comparable.compareTo] on
+/// the objects. If any object is not [Comparable], this throws a [CastError].
+///
+/// Merge-sorting works by splitting the job into two parts, sorting each
+/// recursively, and then merging the two sorted parts.
+///
+/// This takes on the order of `n * log(n)` comparisons and moves to sort
+/// `n` elements, but requires extra space of about the same size as the list
+/// being sorted.
+///
+/// This merge sort is stable: Equal elements end up in the same order
+/// as they started in.
+void mergeSort<T>(List<T> list,
+    {int start: 0, int end, int compare(T a, T b)}) {
+  end ??= list.length;
+  compare ??= defaultCompare<T>();
+
+  int length = end - start;
+  if (length < 2) return;
+  if (length < _MERGE_SORT_LIMIT) {
+    insertionSort(list, compare: compare, start: start, end: end);
+    return;
+  }
+  // Special case the first split instead of directly calling
+  // _mergeSort, because the _mergeSort requires its target to
+  // be different from its source, and it requires extra space
+  // of the same size as the list to sort.
+  // This split allows us to have only half as much extra space,
+  // and it ends up in the original place.
+  int middle = start + ((end - start) >> 1);
+  int firstLength = middle - start;
+  int secondLength = end - middle;
+  // secondLength is always the same as firstLength, or one greater.
+  var scratchSpace = new List<T>(secondLength);
+  _mergeSort(list, compare, middle, end, scratchSpace, 0);
+  int firstTarget = end - firstLength;
+  _mergeSort(list, compare, start, middle, list, firstTarget);
+  _merge(compare, list, firstTarget, end, scratchSpace, 0, secondLength, list,
+      start);
+}
+
+/// Performs an insertion sort into a potentially different list than the
+/// one containing the original values.
+///
+/// It will work in-place as well.
+void _movingInsertionSort<T>(List<T> list, int compare(T a, T b), int start,
+    int end, List<T> target, int targetOffset) {
+  int length = end - start;
+  if (length == 0) return;
+  target[targetOffset] = list[start];
+  for (int i = 1; i < length; i++) {
+    var element = list[start + i];
+    int min = targetOffset;
+    int max = targetOffset + i;
+    while (min < max) {
+      int mid = min + ((max - min) >> 1);
+      if (compare(element, target[mid]) < 0) {
+        max = mid;
+      } else {
+        min = mid + 1;
+      }
+    }
+    target.setRange(min + 1, targetOffset + i + 1, target, min);
+    target[min] = element;
+  }
+}
+
+/// Sorts [list] from [start] to [end] into [target] at [targetOffset].
+///
+/// The `target` list must be able to contain the range from `start` to `end`
+/// after `targetOffset`.
+///
+/// Allows target to be the same list as [list], as long as it's not
+/// overlapping the `start..end` range.
+void _mergeSort<T>(List<T> list, int compare(T a, T b), int start, int end,
+    List<T> target, int targetOffset) {
+  int length = end - start;
+  if (length < _MERGE_SORT_LIMIT) {
+    _movingInsertionSort(list, compare, start, end, target, targetOffset);
+    return;
+  }
+  int middle = start + (length >> 1);
+  int firstLength = middle - start;
+  int secondLength = end - middle;
+  // Here secondLength >= firstLength (differs by at most one).
+  int targetMiddle = targetOffset + firstLength;
+  // Sort the second half into the end of the target area.
+  _mergeSort(list, compare, middle, end, target, targetMiddle);
+  // Sort the first half into the end of the source area.
+  _mergeSort(list, compare, start, middle, list, middle);
+  // Merge the two parts into the target area.
+  _merge(compare, list, middle, middle + firstLength, target, targetMiddle,
+      targetMiddle + secondLength, target, targetOffset);
+}
+
+/// Merges two lists into a target list.
+///
+/// One of the input lists may be positioned at the end of the target
+/// list.
+///
+/// For equal object, elements from [firstList] are always preferred.
+/// This allows the merge to be stable if the first list contains elements
+/// that started out earlier than the ones in [secondList]
+void _merge<T>(
+    int compare(T a, T b),
+    List<T> firstList,
+    int firstStart,
+    int firstEnd,
+    List<T> secondList,
+    int secondStart,
+    int secondEnd,
+    List<T> target,
+    int targetOffset) {
+  // No empty lists reaches here.
+  assert(firstStart < firstEnd);
+  assert(secondStart < secondEnd);
+  int cursor1 = firstStart;
+  int cursor2 = secondStart;
+  var firstElement = firstList[cursor1++];
+  var secondElement = secondList[cursor2++];
+  while (true) {
+    if (compare(firstElement, secondElement) <= 0) {
+      target[targetOffset++] = firstElement;
+      if (cursor1 == firstEnd) break; // Flushing second list after loop.
+      firstElement = firstList[cursor1++];
+    } else {
+      target[targetOffset++] = secondElement;
+      if (cursor2 != secondEnd) {
+        secondElement = secondList[cursor2++];
+        continue;
+      }
+      // Second list empties first. Flushing first list here.
+      target[targetOffset++] = firstElement;
+      target.setRange(targetOffset, targetOffset + (firstEnd - cursor1),
+          firstList, cursor1);
+      return;
+    }
+  }
+  // First list empties first. Reached by break above.
+  target[targetOffset++] = secondElement;
+  target.setRange(
+      targetOffset, targetOffset + (secondEnd - cursor2), secondList, cursor2);
+}
diff --git a/packages/collection/lib/src/canonicalized_map.dart b/packages/collection/lib/src/canonicalized_map.dart
index 7ee3f86..a8af43a 100644
--- a/packages/collection/lib/src/canonicalized_map.dart
+++ b/packages/collection/lib/src/canonicalized_map.dart
@@ -2,56 +2,53 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library dart.pkg.collection.canonicalized_map;
-
 import 'dart:collection';
 
 import 'utils.dart';
 
-/**
- * A map whose keys are converted to canonical values of type `C`.
- *
- * This is useful for using case-insensitive String keys, for example. It's more
- * efficient than a [LinkedHashMap] with a custom equality operator because it
- * only canonicalizes each key once, rather than doing so for each comparison.
- *
- * By default, `null` is allowed as a key. It can be forbidden via the
- * `isValidKey` parameter.
- */
-class CanonicalizedMap<C, K, V> implements Map<K, V> {
-  final Function _canonicalize;
+typedef C _Canonicalize<C, K>(K key);
 
-  final Function _isValidKeyFn;
+typedef bool _IsValidKey(Object key);
+
+/// A map whose keys are converted to canonical values of type `C`.
+///
+/// This is useful for using case-insensitive String keys, for example. It's
+/// more efficient than a [LinkedHashMap] with a custom equality operator
+/// because it only canonicalizes each key once, rather than doing so for each
+/// comparison.
+///
+/// By default, `null` is allowed as a key. It can be forbidden via the
+/// `isValidKey` parameter.
+class CanonicalizedMap<C, K, V> implements Map<K, V> {
+  final _Canonicalize<C, K> _canonicalize;
+
+  final _IsValidKey _isValidKeyFn;
 
   final _base = new Map<C, Pair<K, V>>();
 
-  /**
-   * Creates an empty canonicalized map.
-   *
-   * The [canonicalize] function should return the canonical value for the given
-   * key. Keys with the same canonical value are considered equivalent.
-   *
-   * The [isValidKey] function is called before calling [canonicalize] for
-   * methods that take arbitrary objects. It can be used to filter out keys that
-   * can't be canonicalized.
-   */
+  /// Creates an empty canonicalized map.
+  ///
+  /// The [canonicalize] function should return the canonical value for the
+  /// given key. Keys with the same canonical value are considered equivalent.
+  ///
+  /// The [isValidKey] function is called before calling [canonicalize] for
+  /// methods that take arbitrary objects. It can be used to filter out keys
+  /// that can't be canonicalized.
   CanonicalizedMap(C canonicalize(K key), {bool isValidKey(Object key)})
       : _canonicalize = canonicalize,
         _isValidKeyFn = isValidKey;
 
-  /**
-   * Creates a canonicalized map that is initialized with the key/value pairs of
-   * [other].
-   *
-   * The [canonicalize] function should return the canonical value for the given
-   * key. Keys with the same canonical value are considered equivalent.
-   *
-   * The [isValidKey] function is called before calling [canonicalize] for
-   * methods that take arbitrary objects. It can be used to filter out keys that
-   * can't be canonicalized.
-   */
+  /// Creates a canonicalized map that is initialized with the key/value pairs
+  /// of [other].
+  ///
+  /// The [canonicalize] function should return the canonical value for the
+  /// given key. Keys with the same canonical value are considered equivalent.
+  ///
+  /// The [isValidKey] function is called before calling [canonicalize] for
+  /// methods that take arbitrary objects. It can be used to filter out keys
+  /// that can't be canonicalized.
   CanonicalizedMap.from(Map<K, V> other, C canonicalize(K key),
-                        {bool isValidKey(Object key)})
+      {bool isValidKey(Object key)})
       : _canonicalize = canonicalize,
         _isValidKeyFn = isValidKey {
     addAll(other);
@@ -59,11 +56,12 @@
 
   V operator [](Object key) {
     if (!_isValidKey(key)) return null;
-    var pair = _base[_canonicalize(key)];
+    var pair = _base[_canonicalize(key as K)];
     return pair == null ? null : pair.last;
   }
 
   void operator []=(K key, V value) {
+    if (!_isValidKey(key)) return;
     _base[_canonicalize(key)] = new Pair(key, value);
   }
 
@@ -77,7 +75,7 @@
 
   bool containsKey(Object key) {
     if (!_isValidKey(key)) return false;
-    return _base.containsKey(_canonicalize(key));
+    return _base.containsKey(_canonicalize(key as K));
   }
 
   bool containsValue(Object value) =>
@@ -96,13 +94,14 @@
   int get length => _base.length;
 
   V putIfAbsent(K key, V ifAbsent()) {
-    return _base.putIfAbsent(_canonicalize(key),
-        () => new Pair(key, ifAbsent())).last;
+    return _base
+        .putIfAbsent(_canonicalize(key), () => new Pair(key, ifAbsent()))
+        .last;
   }
 
   V remove(Object key) {
     if (!_isValidKey(key)) return null;
-    var pair = _base.remove(_canonicalize(key));
+    var pair = _base.remove(_canonicalize(key as K));
     return pair == null ? null : pair.last;
   }
 
@@ -110,6 +109,7 @@
 
   String toString() => Maps.mapToString(this);
 
-  bool _isValidKey(Object key) => (key == null || key is K) &&
+  bool _isValidKey(Object key) =>
+      (key == null || key is K) &&
       (_isValidKeyFn == null || _isValidKeyFn(key));
 }
diff --git a/packages/collection/lib/src/combined_wrappers/combined_iterable.dart b/packages/collection/lib/src/combined_wrappers/combined_iterable.dart
new file mode 100644
index 0000000..511876e
--- /dev/null
+++ b/packages/collection/lib/src/combined_wrappers/combined_iterable.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+/// A view of several iterables combined sequentially into a single iterable.
+///
+/// All methods and accessors treat the [CombinedIterableView] as if it were a
+/// single concatenated iterable, but the underlying implementation is based on
+/// lazily accessing individual iterable instances. This means that if the
+/// underlying iterables change, the [CombinedIterableView] will reflect those
+/// changes.
+class CombinedIterableView<T> extends IterableBase<T> {
+  /// The iterables that this combines.
+  final Iterable<Iterable<T>> _iterables;
+
+  /// Creates a combined view of [iterables].
+  const CombinedIterableView(this._iterables);
+
+  Iterator<T> get iterator =>
+      new _CombinedIterator<T>(_iterables.map((i) => i.iterator).iterator);
+
+  // Special cased contains/isEmpty/length since many iterables have an
+  // efficient implementation instead of running through the entire iterator.
+
+  bool contains(Object element) => _iterables.any((i) => i.contains(element));
+
+  bool get isEmpty => _iterables.every((i) => i.isEmpty);
+
+  int get length => _iterables.fold(0, (length, i) => length + i.length);
+}
+
+/// The iterator for [CombinedIterableView].
+///
+/// This moves through each iterable's iterators in sequence.
+class _CombinedIterator<T> implements Iterator<T> {
+  /// The iterators that this combines.
+  ///
+  /// Because this comes from a call to [Iterable.map], it's lazy and will
+  /// avoid instantiating unnecessary iterators.
+  final Iterator<Iterator<T>> _iterators;
+
+  _CombinedIterator(this._iterators);
+
+  T get current => _iterators.current?.current;
+
+  bool moveNext() {
+    var current = _iterators.current;
+    if (current != null && current.moveNext()) {
+      return true;
+    }
+    return _iterators.moveNext() && moveNext();
+  }
+}
diff --git a/packages/collection/lib/src/combined_wrappers/combined_list.dart b/packages/collection/lib/src/combined_wrappers/combined_list.dart
new file mode 100644
index 0000000..d2e0349
--- /dev/null
+++ b/packages/collection/lib/src/combined_wrappers/combined_list.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+/// A view of several lists combined into a single list.
+///
+/// All methods and accessors treat the [CombinedListView] list as if it were a
+/// single concatenated list, but the underlying implementation is based on
+/// lazily accessing individual list instances. This means that if the
+/// underlying lists change, the [CombinedListView] will reflect those changes.
+///
+/// The index operator (`[]`) and [length] property of a [CombinedListView] are
+/// both `O(lists)` rather than `O(1)`. A [CombinedListView] is unmodifiable.
+class CombinedListView<T> extends ListBase<T>
+    implements UnmodifiableListView<T> {
+  static void _throw() {
+    throw new UnsupportedError('Cannot modify an unmodifiable List');
+  }
+
+  /// The lists that this combines.
+  final List<List<T>> _lists;
+
+  /// Creates a combined view of [lists].
+  CombinedListView(this._lists);
+
+  set length(int length) {
+    _throw();
+  }
+
+  int get length => _lists.fold(0, (length, list) => length + list.length);
+
+  T operator [](int index) {
+    var initialIndex = index;
+    for (var i = 0; i < _lists.length; i++) {
+      var list = _lists[i];
+      if (index < list.length) {
+        return list[index];
+      }
+      index -= list.length;
+    }
+    throw new RangeError.index(initialIndex, this, 'index', null, length);
+  }
+
+  void operator []=(int index, T value) {
+    _throw();
+  }
+
+  void clear() {
+    _throw();
+  }
+
+  bool remove(Object element) {
+    _throw();
+    return null;
+  }
+
+  void removeWhere(bool filter(T element)) {
+    _throw();
+  }
+
+  void retainWhere(bool filter(T element)) {
+    _throw();
+  }
+}
diff --git a/packages/collection/lib/src/combined_wrappers/combined_map.dart b/packages/collection/lib/src/combined_wrappers/combined_map.dart
new file mode 100644
index 0000000..8c2760b
--- /dev/null
+++ b/packages/collection/lib/src/combined_wrappers/combined_map.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'combined_iterable.dart';
+
+/// Returns a new map that represents maps flattened into a single map.
+///
+/// All methods and accessors treat the new map as-if it were a single
+/// concatenated map, but the underlying implementation is based on lazily
+/// accessing individual map instances. In the occasion where a key occurs in
+/// multiple maps the first value is returned.
+///
+/// The resulting map has an index operator (`[]`) and `length` property that
+/// are both `O(maps)`, rather than `O(1)`, and the map is unmodifiable - but
+/// underlying changes to these maps are still accessible from the resulting
+/// map.
+class CombinedMapView<K, V> extends UnmodifiableMapBase<K, V> {
+  final Iterable<Map<K, V>> _maps;
+
+  /// Create a new combined view into multiple maps.
+  ///
+  /// The iterable is accessed lazily so it should be collection type like
+  /// [List] or [Set] rather than a lazy iterable produced by `map()` et al.
+  CombinedMapView(this._maps);
+
+  V operator [](Object key) {
+    for (var map in _maps) {
+      // Avoid two hash lookups on a positive hit.
+      var value = map[key];
+      if (value != null || map.containsKey(value)) {
+        return value;
+      }
+    }
+    return null;
+  }
+
+  /// The keys of [this].
+  ///
+  /// The returned iterable has efficient `length` and `contains` operations,
+  /// based on [length] and [containsKey] of the individual maps.
+  ///
+  /// The order of iteration is defined by the individual `Map` implementations,
+  /// but must be consistent between changes to the maps.
+  ///
+  /// Unlike most [Map] implementations, modifying an individual map while
+  /// iterating the keys will _sometimes_ throw. This behavior may change in
+  /// the future.
+  Iterable<K> get keys => new CombinedIterableView<K>(_maps.map((m) => m.keys));
+}
diff --git a/packages/collection/lib/src/comparators.dart b/packages/collection/lib/src/comparators.dart
index 05615ba..5fc55b2 100644
--- a/packages/collection/lib/src/comparators.dart
+++ b/packages/collection/lib/src/comparators.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a

 // BSD-style license that can be found in the LICENSE file.

 

-library dart.pkg.collection.comparators;

-

 // Character constants.

-const int _zero         = 0x30;

-const int _upperCaseA   = 0x41;

-const int _upperCaseZ   = 0x5a;

-const int _lowerCaseA   = 0x61;

-const int _lowerCaseZ   = 0x7a;

+const int _zero = 0x30;

+const int _upperCaseA = 0x41;

+const int _upperCaseZ = 0x5a;

+const int _lowerCaseA = 0x61;

+const int _lowerCaseZ = 0x7a;

 const int _asciiCaseBit = 0x20;

 

 /// Checks if strings [a] and [b] differ only on the case of ASCII letters.

@@ -36,8 +34,8 @@
     if (aChar ^ bChar != _asciiCaseBit) return false;

     // If it's possible, then check if either character is actually an ASCII

     // letter.

-    int aCharUpperCase = aChar | _asciiCaseBit;

-    if (_upperCaseA <= aCharUpperCase && aCharUpperCase <= _upperCaseZ) {

+    int aCharLowerCase = aChar | _asciiCaseBit;

+    if (_lowerCaseA <= aCharLowerCase && aCharLowerCase <= _lowerCaseZ) {

       continue;

     }

     return false;

@@ -45,7 +43,6 @@
   return true;

 }

 

-

 /// Hash code for a string which is compatible with [equalsIgnoreAsciiCase].

 ///

 /// The hash code is unaffected by changing the case of ASCII letters, but

@@ -71,7 +68,6 @@
   return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));

 }

 

-

 /// Compares [a] and [b] lexically, converting ASCII letters to upper case.

 ///

 /// Comparison treats all lower-case ASCII letters as upper-case letters,

@@ -109,7 +105,6 @@
   return defaultResult.sign;

 }

 

-

 /// Compares [a] and [b] lexically, converting ASCII letters to lower case.

 ///

 /// Comparison treats all upper-case ASCII letters as lower-case letters,

@@ -147,7 +142,7 @@
   return defaultResult.sign;

 }

 

-/// Compares strings [a] and [b] according to [natural sort ordering].

+/// Compares strings [a] and [b] according to [natural sort ordering][].

 ///

 /// A natural sort ordering is a lexical ordering where embedded

 /// numerals (digit sequences) are treated as a single unit and ordered by

@@ -177,7 +172,7 @@
 }

 

 /// Compares strings [a] and [b] according to lower-case

-/// [natural sort ordering].

+/// [natural sort ordering][].

 ///

 /// ASCII letters are converted to lower case before being compared, like

 /// for [compareAsciiLowerCase], then the result is compared like for

@@ -214,7 +209,7 @@
 }

 

 /// Compares strings [a] and [b] according to upper-case

-/// [natural sort ordering].

+/// [natural sort ordering][].

 ///

 /// ASCII letters are converted to upper case before being compared, like

 /// for [compareAsciiUpperCase], then the result is compared like for

@@ -260,8 +255,7 @@
 /// is a digit, and if so, the the one with the digit is the greater number.

 ///

 /// Otherwise just returns the difference between [aChar] and [bChar].

-int _compareNaturally(

-    String a, String b, int index, int aChar, int bChar) {

+int _compareNaturally(String a, String b, int index, int aChar, int bChar) {

   assert(aChar != bChar);

   var aIsDigit = _isDigit(aChar);

   var bIsDigit = _isDigit(bChar);

@@ -304,14 +298,14 @@
   if (aChar == _zero) {

     do {

       aIndex++;

-      if (aIndex == a.length) return -1;  // number in a is zero, b is not.

+      if (aIndex == a.length) return -1; // number in a is zero, b is not.

       aChar = a.codeUnitAt(aIndex);

     } while (aChar == _zero);

     if (!_isDigit(aChar)) return -1;

   } else if (bChar == _zero) {

     do {

       bIndex++;

-      if (bIndex == b.length) return 1;  // number in b is zero, a is not.

+      if (bIndex == b.length) return 1; // number in b is zero, a is not.

       bChar = b.codeUnitAt(bIndex);

     } while (bChar == _zero);

     if (!_isDigit(bChar)) return 1;

@@ -345,7 +339,7 @@
       // bChar is non-digit, so a has longer number.

       return 1;

     } else if (bIsDigit) {

-      return -1;  // b has longer number.

+      return -1; // b has longer number.

     } else {

       // Neither is digit, so numbers had same numerical value.

       // Fall back on number of leading zeros

diff --git a/packages/collection/lib/src/empty_unmodifiable_set.dart b/packages/collection/lib/src/empty_unmodifiable_set.dart
new file mode 100644
index 0000000..ea00959
--- /dev/null
+++ b/packages/collection/lib/src/empty_unmodifiable_set.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'unmodifiable_wrappers.dart';
+
+// Unfortunately, we can't use UnmodifiableSetMixin here, since const classes
+// can't use mixins.
+/// An unmodifiable, empty set that can have a const constructor.
+class EmptyUnmodifiableSet<E> extends IterableBase<E>
+    implements UnmodifiableSetView<E> {
+  static T _throw<T>() {
+    throw new UnsupportedError("Cannot modify an unmodifiable Set");
+  }
+
+  Iterator<E> get iterator => new Iterable<E>.empty().iterator;
+  int get length => 0;
+
+  const EmptyUnmodifiableSet();
+
+  bool contains(Object element) => false;
+  bool containsAll(Iterable<Object> other) => other.isEmpty;
+  E lookup(Object element) => null;
+  Set<E> toSet() => new Set();
+  Set<E> union(Set<E> other) => new Set.from(other);
+  Set<E> intersection(Set<Object> other) => new Set();
+  Set<E> difference(Set<Object> other) => new Set();
+
+  bool add(E value) => _throw();
+  void addAll(Iterable<E> elements) => _throw();
+  void clear() => _throw();
+  bool remove(Object element) => _throw();
+  void removeAll(Iterable<Object> elements) => _throw();
+  void removeWhere(bool test(E element)) => _throw();
+  void retainWhere(bool test(E element)) => _throw();
+  void retainAll(Iterable<Object> elements) => _throw();
+}
diff --git a/packages/collection/lib/src/equality.dart b/packages/collection/lib/src/equality.dart
new file mode 100644
index 0000000..2c6c272
--- /dev/null
+++ b/packages/collection/lib/src/equality.dart
@@ -0,0 +1,465 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+
+import "comparators.dart";
+
+const int _HASH_MASK = 0x7fffffff;
+
+/// A generic equality relation on objects.
+abstract class Equality<E> {
+  const factory Equality() = DefaultEquality<E>;
+
+  /// Compare two elements for being equal.
+  ///
+  /// This should be a proper equality relation.
+  bool equals(E e1, E e2);
+
+  /// Get a hashcode of an element.
+  ///
+  /// The hashcode should be compatible with [equals], so that if
+  /// `equals(a, b)` then `hash(a) == hash(b)`.
+  int hash(E e);
+
+  /// Test whether an object is a valid argument to [equals] and [hash].
+  ///
+  /// Some implementations may be restricted to only work on specific types
+  /// of objects.
+  bool isValidKey(Object o);
+}
+
+typedef F _GetKey<E, F>(E object);
+
+/// Equality of objects based on derived values.
+///
+/// For example, given the class:
+/// ```dart
+/// abstract class Employee {
+///   int get employmentId;
+/// }
+/// ```
+///
+/// The following [Equality] considers employees with the same IDs to be equal:
+/// ```dart
+/// new EqualityBy((Employee e) => e.employmentId);
+/// ```
+///
+/// It's also possible to pass an additional equality instance that should be
+/// used to compare the value itself.
+class EqualityBy<E, F> implements Equality<E> {
+  // Returns a derived value F from an object E.
+  final _GetKey<E, F> _getKey;
+
+  // Determines equality between two values of F.
+  final Equality<F> _inner;
+
+  EqualityBy(F getKey(E object), [Equality<F> inner = const DefaultEquality()])
+      : _getKey = getKey,
+        _inner = inner;
+
+  bool equals(E e1, E e2) => _inner.equals(_getKey(e1), _getKey(e2));
+
+  int hash(E e) => _inner.hash(_getKey(e));
+
+  bool isValidKey(Object o) {
+    if (o is E) {
+      final value = _getKey(o);
+      return value is F && _inner.isValidKey(value);
+    }
+    return false;
+  }
+}
+
+/// Equality of objects that compares only the natural equality of the objects.
+///
+/// This equality uses the objects' own [Object.==] and [Object.hashCode] for
+/// the equality.
+class DefaultEquality<E> implements Equality<E> {
+  const DefaultEquality();
+  bool equals(E e1, E e2) => e1 == e2;
+  int hash(E e) => e.hashCode;
+  bool isValidKey(Object o) => true;
+}
+
+/// Equality of objects that compares only the identity of the objects.
+class IdentityEquality<E> implements Equality<E> {
+  const IdentityEquality();
+  bool equals(E e1, E e2) => identical(e1, e2);
+  int hash(E e) => identityHashCode(e);
+  bool isValidKey(Object o) => true;
+}
+
+/// Equality on iterables.
+///
+/// Two iterables are equal if they have the same elements in the same order.
+///
+/// The [equals] and [hash] methods accepts `null` values,
+/// even if the [isValidKey] returns `false` for `null`.
+/// The [hash] of `null` is `null.hashCode`.
+class IterableEquality<E> implements Equality<Iterable<E>> {
+  final Equality<E> _elementEquality;
+  const IterableEquality(
+      [Equality<E> elementEquality = const DefaultEquality()])
+      : _elementEquality = elementEquality;
+
+  bool equals(Iterable<E> elements1, Iterable<E> elements2) {
+    if (identical(elements1, elements2)) return true;
+    if (elements1 == null || elements2 == null) return false;
+    var it1 = elements1.iterator;
+    var it2 = elements2.iterator;
+    while (true) {
+      bool hasNext = it1.moveNext();
+      if (hasNext != it2.moveNext()) return false;
+      if (!hasNext) return true;
+      if (!_elementEquality.equals(it1.current, it2.current)) return false;
+    }
+  }
+
+  int hash(Iterable<E> elements) {
+    if (elements == null) return null.hashCode;
+    // Jenkins's one-at-a-time hash function.
+    int hash = 0;
+    for (E element in elements) {
+      int c = _elementEquality.hash(element);
+      hash = (hash + c) & _HASH_MASK;
+      hash = (hash + (hash << 10)) & _HASH_MASK;
+      hash ^= (hash >> 6);
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is Iterable<E>;
+}
+
+/// Equality on lists.
+///
+/// Two lists are equal if they have the same length and their elements
+/// at each index are equal.
+///
+/// This is effectively the same as [IterableEquality] except that it
+/// accesses elements by index instead of through iteration.
+///
+/// The [equals] and [hash] methods accepts `null` values,
+/// even if the [isValidKey] returns `false` for `null`.
+/// The [hash] of `null` is `null.hashCode`.
+class ListEquality<E> implements Equality<List<E>> {
+  final Equality<E> _elementEquality;
+  const ListEquality([Equality<E> elementEquality = const DefaultEquality()])
+      : _elementEquality = elementEquality;
+
+  bool equals(List<E> list1, List<E> list2) {
+    if (identical(list1, list2)) return true;
+    if (list1 == null || list2 == null) return false;
+    int length = list1.length;
+    if (length != list2.length) return false;
+    for (int i = 0; i < length; i++) {
+      if (!_elementEquality.equals(list1[i], list2[i])) return false;
+    }
+    return true;
+  }
+
+  int hash(List<E> list) {
+    if (list == null) return null.hashCode;
+    // Jenkins's one-at-a-time hash function.
+    // This code is almost identical to the one in IterableEquality, except
+    // that it uses indexing instead of iterating to get the elements.
+    int hash = 0;
+    for (int i = 0; i < list.length; i++) {
+      int c = _elementEquality.hash(list[i]);
+      hash = (hash + c) & _HASH_MASK;
+      hash = (hash + (hash << 10)) & _HASH_MASK;
+      hash ^= (hash >> 6);
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is List<E>;
+}
+
+abstract class _UnorderedEquality<E, T extends Iterable<E>>
+    implements Equality<T> {
+  final Equality<E> _elementEquality;
+
+  const _UnorderedEquality(this._elementEquality);
+
+  bool equals(T elements1, T elements2) {
+    if (identical(elements1, elements2)) return true;
+    if (elements1 == null || elements2 == null) return false;
+    HashMap<E, int> counts = new HashMap(
+        equals: _elementEquality.equals,
+        hashCode: _elementEquality.hash,
+        isValidKey: _elementEquality.isValidKey);
+    int length = 0;
+    for (var e in elements1) {
+      int count = counts[e];
+      if (count == null) count = 0;
+      counts[e] = count + 1;
+      length++;
+    }
+    for (var e in elements2) {
+      int count = counts[e];
+      if (count == null || count == 0) return false;
+      counts[e] = count - 1;
+      length--;
+    }
+    return length == 0;
+  }
+
+  int hash(T elements) {
+    if (elements == null) return null.hashCode;
+    int hash = 0;
+    for (E element in elements) {
+      int c = _elementEquality.hash(element);
+      hash = (hash + c) & _HASH_MASK;
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+}
+
+/// Equality of the elements of two iterables without considering order.
+///
+/// Two iterables are considered equal if they have the same number of elements,
+/// and the elements of one set can be paired with the elements
+/// of the other iterable, so that each pair are equal.
+class UnorderedIterableEquality<E> extends _UnorderedEquality<E, Iterable<E>> {
+  const UnorderedIterableEquality(
+      [Equality<E> elementEquality = const DefaultEquality()])
+      : super(elementEquality);
+
+  bool isValidKey(Object o) => o is Iterable<E>;
+}
+
+/// Equality of sets.
+///
+/// Two sets are considered equal if they have the same number of elements,
+/// and the elements of one set can be paired with the elements
+/// of the other set, so that each pair are equal.
+///
+/// This equality behaves the same as [UnorderedIterableEquality] except that
+/// it expects sets instead of iterables as arguments.
+///
+/// The [equals] and [hash] methods accepts `null` values,
+/// even if the [isValidKey] returns `false` for `null`.
+/// The [hash] of `null` is `null.hashCode`.
+class SetEquality<E> extends _UnorderedEquality<E, Set<E>> {
+  const SetEquality([Equality<E> elementEquality = const DefaultEquality()])
+      : super(elementEquality);
+
+  bool isValidKey(Object o) => o is Set<E>;
+}
+
+/// Internal class used by [MapEquality].
+///
+/// The class represents a map entry as a single object,
+/// using a combined hashCode and equality of the key and value.
+class _MapEntry {
+  final MapEquality equality;
+  final key;
+  final value;
+  _MapEntry(this.equality, this.key, this.value);
+
+  int get hashCode =>
+      (3 * equality._keyEquality.hash(key) +
+          7 * equality._valueEquality.hash(value)) &
+      _HASH_MASK;
+
+  bool operator ==(Object other) {
+    if (other is! _MapEntry) return false;
+    _MapEntry otherEntry = other;
+    return equality._keyEquality.equals(key, otherEntry.key) &&
+        equality._valueEquality.equals(value, otherEntry.value);
+  }
+}
+
+/// Equality on maps.
+///
+/// Two maps are equal if they have the same number of entries, and if the
+/// entries of the two maps are pairwise equal on both key and value.
+///
+/// The [equals] and [hash] methods accepts `null` values,
+/// even if the [isValidKey] returns `false` for `null`.
+/// The [hash] of `null` is `null.hashCode`.
+class MapEquality<K, V> implements Equality<Map<K, V>> {
+  final Equality<K> _keyEquality;
+  final Equality<V> _valueEquality;
+  const MapEquality(
+      {Equality<K> keys: const DefaultEquality(),
+      Equality<V> values: const DefaultEquality()})
+      : _keyEquality = keys,
+        _valueEquality = values;
+
+  bool equals(Map<K, V> map1, Map<K, V> map2) {
+    if (identical(map1, map2)) return true;
+    if (map1 == null || map2 == null) return false;
+    int length = map1.length;
+    if (length != map2.length) return false;
+    Map<_MapEntry, int> equalElementCounts = new HashMap();
+    for (K key in map1.keys) {
+      _MapEntry entry = new _MapEntry(this, key, map1[key]);
+      int count = equalElementCounts[entry];
+      if (count == null) count = 0;
+      equalElementCounts[entry] = count + 1;
+    }
+    for (K key in map2.keys) {
+      _MapEntry entry = new _MapEntry(this, key, map2[key]);
+      int count = equalElementCounts[entry];
+      if (count == null || count == 0) return false;
+      equalElementCounts[entry] = count - 1;
+    }
+    return true;
+  }
+
+  int hash(Map<K, V> map) {
+    if (map == null) return null.hashCode;
+    int hash = 0;
+    for (K key in map.keys) {
+      int keyHash = _keyEquality.hash(key);
+      int valueHash = _valueEquality.hash(map[key]);
+      hash = (hash + 3 * keyHash + 7 * valueHash) & _HASH_MASK;
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is Map<K, V>;
+}
+
+/// Combines several equalities into a single equality.
+///
+/// Tries each equality in order, using [Equality.isValidKey], and returns
+/// the result of the first equality that applies to the argument or arguments.
+///
+/// For `equals`, the first equality that matches the first argument is used,
+/// and if the second argument of `equals` is not valid for that equality,
+/// it returns false.
+///
+/// Because the equalities are tried in order, they should generally work on
+/// disjoint types. Otherwise the multi-equality may give inconsistent results
+/// for `equals(e1, e2)` and `equals(e2, e1)`. This can happen if one equality
+/// considers only `e1` a valid key, and not `e2`, but an equality which is
+/// checked later, allows both.
+class MultiEquality<E> implements Equality<E> {
+  final Iterable<Equality<E>> _equalities;
+
+  const MultiEquality(Iterable<Equality<E>> equalities)
+      : _equalities = equalities;
+
+  bool equals(E e1, E e2) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(e1)) return eq.isValidKey(e2) && eq.equals(e1, e2);
+    }
+    return false;
+  }
+
+  int hash(E e) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(e)) return eq.hash(e);
+    }
+    return 0;
+  }
+
+  bool isValidKey(Object o) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(o)) return true;
+    }
+    return false;
+  }
+}
+
+/// Deep equality on collections.
+///
+/// Recognizes lists, sets, iterables and maps and compares their elements using
+/// deep equality as well.
+///
+/// Non-iterable/map objects are compared using a configurable base equality.
+///
+/// Works in one of two modes: ordered or unordered.
+///
+/// In ordered mode, lists and iterables are required to have equal elements
+/// in the same order. In unordered mode, the order of elements in iterables
+/// and lists are not important.
+///
+/// A list is only equal to another list, likewise for sets and maps. All other
+/// iterables are compared as iterables only.
+class DeepCollectionEquality implements Equality {
+  final Equality _base;
+  final bool _unordered;
+  const DeepCollectionEquality([Equality base = const DefaultEquality()])
+      : _base = base,
+        _unordered = false;
+
+  /// Creates a deep equality on collections where the order of lists and
+  /// iterables are not considered important. That is, lists and iterables are
+  /// treated as unordered iterables.
+  const DeepCollectionEquality.unordered(
+      [Equality base = const DefaultEquality()])
+      : _base = base,
+        _unordered = true;
+
+  bool equals(e1, e2) {
+    if (e1 is Set) {
+      if (e2 is! Set) return false;
+      return new SetEquality(this).equals(e1, e2);
+    }
+    if (e1 is Map) {
+      if (e2 is! Map) return false;
+      return new MapEquality(keys: this, values: this).equals(e1, e2);
+    }
+    if (!_unordered) {
+      if (e1 is List) {
+        if (e2 is! List) return false;
+        return new ListEquality(this).equals(e1, e2);
+      }
+      if (e1 is Iterable) {
+        if (e2 is! Iterable) return false;
+        return new IterableEquality(this).equals(e1, e2);
+      }
+    } else if (e1 is Iterable) {
+      if (e2 is! Iterable) return false;
+      if (e1 is List != e2 is List) return false;
+      return new UnorderedIterableEquality(this).equals(e1, e2);
+    }
+    return _base.equals(e1, e2);
+  }
+
+  int hash(Object o) {
+    if (o is Set) return new SetEquality(this).hash(o);
+    if (o is Map) return new MapEquality(keys: this, values: this).hash(o);
+    if (!_unordered) {
+      if (o is List) return new ListEquality(this).hash(o);
+      if (o is Iterable) return new IterableEquality(this).hash(o);
+    } else if (o is Iterable) {
+      return new UnorderedIterableEquality(this).hash(o);
+    }
+    return _base.hash(o);
+  }
+
+  bool isValidKey(Object o) => o is Iterable || o is Map || _base.isValidKey(o);
+}
+
+/// String equality that's insensitive to differences in ASCII case.
+///
+/// Non-ASCII characters are compared as-is, with no conversion.
+class CaseInsensitiveEquality implements Equality<String> {
+  const CaseInsensitiveEquality();
+
+  bool equals(String string1, String string2) =>
+      equalsIgnoreAsciiCase(string1, string2);
+
+  int hash(String string) => hashIgnoreAsciiCase(string);
+
+  bool isValidKey(Object object) => object is String;
+}
diff --git a/packages/collection/lib/src/equality_map.dart b/packages/collection/lib/src/equality_map.dart
new file mode 100644
index 0000000..14f074c
--- /dev/null
+++ b/packages/collection/lib/src/equality_map.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'equality.dart';
+import 'wrappers.dart';
+
+/// A [Map] whose key equality is determined by an [Equality] object.
+class EqualityMap<K, V> extends DelegatingMap<K, V> {
+  /// Creates a map with equality based on [equality].
+  EqualityMap(Equality<K> equality)
+      : super(new LinkedHashMap(
+            equals: equality.equals,
+            hashCode: equality.hash,
+            isValidKey: equality.isValidKey));
+
+  /// Creates a map with equality based on [equality] that contains all
+  /// key-value pairs of [other].
+  ///
+  /// If [other] has multiple keys that are equivalent according to [equality],
+  /// the last one reached during iteration takes precedence.
+  EqualityMap.from(Equality<K> equality, Map<K, V> other)
+      : super(new LinkedHashMap(
+            equals: equality.equals,
+            hashCode: equality.hash,
+            isValidKey: equality.isValidKey)) {
+    addAll(other);
+  }
+}
diff --git a/packages/collection/lib/src/equality_set.dart b/packages/collection/lib/src/equality_set.dart
new file mode 100644
index 0000000..6f6a426
--- /dev/null
+++ b/packages/collection/lib/src/equality_set.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'equality.dart';
+import 'wrappers.dart';
+
+/// A [Map] whose key equality is determined by an [Equality] object.
+class EqualitySet<E> extends DelegatingSet<E> {
+  /// Creates a set with equality based on [equality].
+  EqualitySet(Equality<E> equality)
+      : super(new LinkedHashSet(
+            equals: equality.equals,
+            hashCode: equality.hash,
+            isValidKey: equality.isValidKey));
+
+  /// Creates a set with equality based on [equality] that contains all
+  /// elements in [other].
+  ///
+  /// If [other] has multiple values that are equivalent according to
+  /// [equality], the first one reached during iteration takes precedence.
+  EqualitySet.from(Equality<E> equality, Iterable<E> other)
+      : super(new LinkedHashSet(
+            equals: equality.equals,
+            hashCode: equality.hash,
+            isValidKey: equality.isValidKey)) {
+    addAll(other);
+  }
+}
diff --git a/packages/collection/lib/src/functions.dart b/packages/collection/lib/src/functions.dart
new file mode 100644
index 0000000..933de82
--- /dev/null
+++ b/packages/collection/lib/src/functions.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' as math;
+import 'dart:collection';
+
+import 'utils.dart';
+
+// TODO(nweiz): When sdk#26488 is fixed, use overloads to ensure that if [key]
+// or [value] isn't passed, `K2`/`V2` defaults to `K1`/`V1`, respectively.
+/// Creates a new map from [map] with new keys and values.
+///
+/// The return values of [key] are used as the keys and the return values of
+/// [value] are used as the values for the new map.
+Map<K2, V2> mapMap<K1, V1, K2, V2>(Map<K1, V1> map,
+    {K2 key(K1 key, V1 value), V2 value(K1 key, V1 value)}) {
+  key ??= (mapKey, _) => mapKey as K2;
+  value ??= (_, mapValue) => mapValue as V2;
+
+  var result = <K2, V2>{};
+  map.forEach((mapKey, mapValue) {
+    result[key(mapKey, mapValue)] = value(mapKey, mapValue);
+  });
+  return result;
+}
+
+/// Returns a new map with all key/value pairs in both [map1] and [map2].
+///
+/// If there are keys that occur in both maps, the [value] function is used to
+/// select the value that goes into the resulting map based on the two original
+/// values. If [value] is omitted, the value from [map2] is used.
+Map<K, V> mergeMaps<K, V>(Map<K, V> map1, Map<K, V> map2,
+    {V value(V value1, V value2)}) {
+  var result = new Map<K, V>.from(map1);
+  if (value == null) return result..addAll(map2);
+
+  map2.forEach((key, mapValue) {
+    result[key] =
+        result.containsKey(key) ? value(result[key], mapValue) : mapValue;
+  });
+  return result;
+}
+
+/// Groups the elements in [values] by the value returned by [key].
+///
+/// Returns a map from keys computed by [key] to a list of all values for which
+/// [key] returns that key. The values appear in the list in the same relative
+/// order as in [values].
+Map<T, List<S>> groupBy<S, T>(Iterable<S> values, T key(S element)) {
+  var map = <T, List<S>>{};
+  for (var element in values) {
+    var list = map.putIfAbsent(key(element), () => []);
+    list.add(element);
+  }
+  return map;
+}
+
+/// Returns the element of [values] for which [orderBy] returns the minimum
+/// value.
+///
+/// The values returned by [orderBy] are compared using the [compare] function.
+/// If [compare] is omitted, values must implement [Comparable<T>] and they are
+/// compared using their [Comparable.compareTo].
+S minBy<S, T>(Iterable<S> values, T orderBy(S element),
+    {int compare(T value1, T value2)}) {
+  compare ??= defaultCompare<T>();
+
+  S minValue;
+  T minOrderBy;
+  for (var element in values) {
+    var elementOrderBy = orderBy(element);
+    if (minOrderBy == null || compare(elementOrderBy, minOrderBy) < 0) {
+      minValue = element;
+      minOrderBy = elementOrderBy;
+    }
+  }
+  return minValue;
+}
+
+/// Returns the element of [values] for which [orderBy] returns the maximum
+/// value.
+///
+/// The values returned by [orderBy] are compared using the [compare] function.
+/// If [compare] is omitted, values must implement [Comparable<T>] and they are
+/// compared using their [Comparable.compareTo].
+S maxBy<S, T>(Iterable<S> values, T orderBy(S element),
+    {int compare(T value1, T value2)}) {
+  compare ??= defaultCompare<T>();
+
+  S maxValue;
+  T maxOrderBy;
+  for (var element in values) {
+    var elementOrderBy = orderBy(element);
+    if (maxOrderBy == null || compare(elementOrderBy, maxOrderBy) > 0) {
+      maxValue = element;
+      maxOrderBy = elementOrderBy;
+    }
+  }
+  return maxValue;
+}
+
+/// Returns the [transitive closure][] of [graph].
+///
+/// [transitive closure]: https://en.wikipedia.org/wiki/Transitive_closure
+///
+/// Interprets [graph] as a directed graph with a vertex for each key and edges
+/// from each key to the values that the key maps to.
+///
+/// Assumes that every vertex in the graph has a key to represent it, even if
+/// that vertex has no outgoing edges. This isn't checked, but if it's not
+/// satisfied, the function may crash or provide unexpected output. For example,
+/// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is.
+Map<T, Set<T>> transitiveClosure<T>(Map<T, Iterable<T>> graph) {
+  // This uses [Warshall's algorithm][], modified not to add a vertex from each
+  // node to itself.
+  //
+  // [Warshall's algorithm]: https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Applications_and_generalizations.
+  var result = <T, Set<T>>{};
+  graph.forEach((vertex, edges) {
+    result[vertex] = new Set<T>.from(edges);
+  });
+
+  // Lists are faster to iterate than maps, so we create a list since we're
+  // iterating repeatedly.
+  var keys = graph.keys.toList();
+  for (var vertex1 in keys) {
+    for (var vertex2 in keys) {
+      for (var vertex3 in keys) {
+        if (result[vertex2].contains(vertex1) &&
+            result[vertex1].contains(vertex3)) {
+          result[vertex2].add(vertex3);
+        }
+      }
+    }
+  }
+
+  return result;
+}
+
+/// Returns the [strongly connected components][] of [graph], in topological
+/// order.
+///
+/// [strongly connected components]: https://en.wikipedia.org/wiki/Strongly_connected_component
+///
+/// Interprets [graph] as a directed graph with a vertex for each key and edges
+/// from each key to the values that the key maps to.
+///
+/// Assumes that every vertex in the graph has a key to represent it, even if
+/// that vertex has no outgoing edges. This isn't checked, but if it's not
+/// satisfied, the function may crash or provide unexpected output. For example,
+/// `{"a": ["b"]}` is not valid, but `{"a": ["b"], "b": []}` is.
+List<Set<T>> stronglyConnectedComponents<T>(Map<T, Iterable<T>> graph) {
+  // This uses [Tarjan's algorithm][].
+  //
+  // [Tarjan's algorithm]: https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+  var index = 0;
+  var stack = <T>[];
+  var result = <Set<T>>[];
+
+  // The order of these doesn't matter, so we use un-linked implementations to
+  // avoid unnecessary overhead.
+  var indices = new HashMap<T, int>();
+  var lowLinks = new HashMap<T, int>();
+  var onStack = new HashSet<T>();
+
+  strongConnect(T vertex) {
+    indices[vertex] = index;
+    lowLinks[vertex] = index;
+    index++;
+
+    stack.add(vertex);
+    onStack.add(vertex);
+
+    for (var successor in graph[vertex]) {
+      if (!indices.containsKey(successor)) {
+        strongConnect(successor);
+        lowLinks[vertex] = math.min(lowLinks[vertex], lowLinks[successor]);
+      } else if (onStack.contains(successor)) {
+        lowLinks[vertex] = math.min(lowLinks[vertex], lowLinks[successor]);
+      }
+    }
+
+    if (lowLinks[vertex] == indices[vertex]) {
+      var component = new Set<T>();
+      T neighbor;
+      do {
+        neighbor = stack.removeLast();
+        onStack.remove(neighbor);
+        component.add(neighbor);
+      } while (neighbor != vertex);
+      result.add(component);
+    }
+  }
+
+  for (var vertex in graph.keys) {
+    if (!indices.containsKey(vertex)) strongConnect(vertex);
+  }
+
+  // Tarjan's algorithm produces a reverse-topological sort, so we reverse it to
+  // get a normal topological sort.
+  return result.reversed.toList();
+}
diff --git a/packages/collection/lib/src/iterable_zip.dart b/packages/collection/lib/src/iterable_zip.dart
new file mode 100644
index 0000000..b983437
--- /dev/null
+++ b/packages/collection/lib/src/iterable_zip.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+
+/// Iterable that iterates over lists of values from other iterables.
+///
+/// When [iterator] is read, an [Iterator] is created for each [Iterable] in
+/// the [Iterable] passed to the constructor.
+///
+/// As long as all these iterators have a next value, those next values are
+/// combined into a single list, which becomes the next value of this
+/// [Iterable]'s [Iterator]. As soon as any of the iterators run out,
+/// the zipped iterator also stops.
+class IterableZip<T> extends IterableBase<List<T>> {
+  final Iterable<Iterable<T>> _iterables;
+
+  IterableZip(Iterable<Iterable<T>> iterables) : this._iterables = iterables;
+
+  /// Returns an iterator that combines values of the iterables' iterators
+  /// as long as they all have values.
+  Iterator<List<T>> get iterator {
+    var iterators = _iterables.map((x) => x.iterator).toList(growable: false);
+    // TODO(lrn): Return an empty iterator directly if iterators is empty?
+    return new _IteratorZip<T>(iterators);
+  }
+}
+
+class _IteratorZip<T> implements Iterator<List<T>> {
+  final List<Iterator<T>> _iterators;
+  List<T> _current;
+
+  _IteratorZip(List<Iterator<T>> iterators) : _iterators = iterators;
+
+  bool moveNext() {
+    if (_iterators.isEmpty) return false;
+    for (int i = 0; i < _iterators.length; i++) {
+      if (!_iterators[i].moveNext()) {
+        _current = null;
+        return false;
+      }
+    }
+    _current = new List(_iterators.length);
+    for (int i = 0; i < _iterators.length; i++) {
+      _current[i] = _iterators[i].current;
+    }
+    return true;
+  }
+
+  List<T> get current => _current;
+}
diff --git a/packages/collection/lib/src/priority_queue.dart b/packages/collection/lib/src/priority_queue.dart
new file mode 100644
index 0000000..89c3128
--- /dev/null
+++ b/packages/collection/lib/src/priority_queue.dart
@@ -0,0 +1,360 @@
+// 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:collection";
+
+import "utils.dart";
+
+/// A priority queue is a priority based work-list of elements.
+///
+/// The queue allows adding elements, and removing them again in priority order.
+abstract class PriorityQueue<E> {
+  /// Creates an empty [PriorityQueue].
+  ///
+  /// The created [PriorityQueue] is a plain [HeapPriorityQueue].
+  ///
+  /// The [comparison] is a [Comparator] used to compare the priority of
+  /// elements. An element that compares as less than another element has
+  /// a higher priority.
+  ///
+  /// If [comparison] is omitted, it defaults to [Comparable.compare]. If this
+  /// is the case, `E` must implement [Comparable], and this is checked at
+  /// runtime for every comparison.
+  factory PriorityQueue([int comparison(E e1, E e2)]) = HeapPriorityQueue<E>;
+
+  /// Number of elements in the queue.
+  int get length;
+
+  /// Whether the queue is empty.
+  bool get isEmpty;
+
+  /// Whether the queue has any elements.
+  bool get isNotEmpty;
+
+  /// Checks if [object] is in the queue.
+  ///
+  /// Returns true if the element is found.
+  bool contains(E object);
+
+  /// Adds element to the queue.
+  ///
+  /// The element will become the next to be removed by [removeFirst]
+  /// when all elements with higher priority have been removed.
+  void add(E element);
+
+  /// Adds all [elements] to the queue.
+  void addAll(Iterable<E> elements);
+
+  /// Returns the next element that will be returned by [removeFirst].
+  ///
+  /// The element is not removed from the queue.
+  ///
+  /// The queue must not be empty when this method is called.
+  E get first;
+
+  /// Removes and returns the element with the highest priority.
+  ///
+  /// Repeatedly calling this method, without adding element in between,
+  /// is guaranteed to return elements in non-decreasing order as, specified by
+  /// [comparison].
+  ///
+  /// The queue must not be empty when this method is called.
+  E removeFirst();
+
+  /// Removes an element that compares equal to [element] in the queue.
+  ///
+  /// Returns true if an element is found and removed,
+  /// and false if no equal element is found.
+  bool remove(E element);
+
+  /// Removes all the elements from this queue and returns them.
+  ///
+  /// The returned iterable has no specified order.
+  Iterable<E> removeAll();
+
+  /// Removes all the elements from this queue.
+  void clear();
+
+  /// Returns a list of the elements of this queue in priority order.
+  ///
+  /// The queue is not modified.
+  ///
+  /// The order is the order that the elements would be in if they were
+  /// removed from this queue using [removeFirst].
+  List<E> toList();
+
+  /// Return a comparator based set using the comparator of this queue.
+  ///
+  /// The queue is not modified.
+  ///
+  /// The returned [Set] is currently a [SplayTreeSet],
+  /// but this may change as other ordered sets are implemented.
+  ///
+  /// The set contains all the elements of this queue.
+  /// If an element occurs more than once in the queue,
+  /// the set will contain it only once.
+  Set<E> toSet();
+}
+
+/// Heap based priority queue.
+///
+/// The elements are kept in a heap structure,
+/// where the element with the highest priority is immediately accessible,
+/// and modifying a single element takes
+/// logarithmic time in the number of elements on average.
+///
+/// * The [add] and [removeFirst] operations take amortized logarithmic time,
+///   O(log(n)), but may occasionally take linear time when growing the capacity
+///   of the heap.
+/// * The [addAll] operation works as doing repeated [add] operations.
+/// * The [first] getter takes constant time, O(1).
+/// * The [clear] and [removeAll] methods also take constant time, O(1).
+/// * The [contains] and [remove] operations may need to search the entire
+///   queue for the elements, taking O(n) time.
+/// * The [toList] operation effectively sorts the elements, taking O(n*log(n))
+///   time.
+/// * The [toSet] operation effectively adds each element to the new set, taking
+///   an expected O(n*log(n)) time.
+class HeapPriorityQueue<E> implements PriorityQueue<E> {
+  /// Initial capacity of a queue when created, or when added to after a
+  /// [clear].
+  ///
+  /// Number can be any positive value. Picking a size that gives a whole
+  /// number of "tree levels" in the heap is only done for aesthetic reasons.
+  static const int _INITIAL_CAPACITY = 7;
+
+  /// The comparison being used to compare the priority of elements.
+  final Comparator<E> comparison;
+
+  /// List implementation of a heap.
+  List<E> _queue = new List<E>(_INITIAL_CAPACITY);
+
+  /// Number of elements in queue.
+  ///
+  /// The heap is implemented in the first [_length] entries of [_queue].
+  int _length = 0;
+
+  /// Create a new priority queue.
+  ///
+  /// The [comparison] is a [Comparator] used to compare the priority of
+  /// elements. An element that compares as less than another element has
+  /// a higher priority.
+  ///
+  /// If [comparison] is omitted, it defaults to [Comparable.compare]. If this
+  /// is the case, `E` must implement [Comparable], and this is checked at
+  /// runtime for every comparison.
+  HeapPriorityQueue([int comparison(E e1, E e2)])
+      : comparison = comparison ?? defaultCompare<E>();
+
+  void add(E element) {
+    _add(element);
+  }
+
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) {
+      _add(element);
+    }
+  }
+
+  void clear() {
+    _queue = const [];
+    _length = 0;
+  }
+
+  bool contains(E object) {
+    return _locate(object) >= 0;
+  }
+
+  E get first {
+    if (_length == 0) throw new StateError("No such element");
+    return _queue[0];
+  }
+
+  bool get isEmpty => _length == 0;
+
+  bool get isNotEmpty => _length != 0;
+
+  int get length => _length;
+
+  bool remove(E element) {
+    int index = _locate(element);
+    if (index < 0) return false;
+    E last = _removeLast();
+    if (index < _length) {
+      int comp = comparison(last, element);
+      if (comp <= 0) {
+        _bubbleUp(last, index);
+      } else {
+        _bubbleDown(last, index);
+      }
+    }
+    return true;
+  }
+
+  Iterable<E> removeAll() {
+    List<E> result = _queue;
+    int length = _length;
+    _queue = const [];
+    _length = 0;
+    return result.take(length);
+  }
+
+  E removeFirst() {
+    if (_length == 0) throw new StateError("No such element");
+    E result = _queue[0];
+    E last = _removeLast();
+    if (_length > 0) {
+      _bubbleDown(last, 0);
+    }
+    return result;
+  }
+
+  List<E> toList() {
+    List<E> list = new List<E>()..length = _length;
+    list.setRange(0, _length, _queue);
+    list.sort(comparison);
+    return list;
+  }
+
+  Set<E> toSet() {
+    Set<E> set = new SplayTreeSet<E>(comparison);
+    for (int i = 0; i < _length; i++) {
+      set.add(_queue[i]);
+    }
+    return set;
+  }
+
+  /// Returns some representation of the queue.
+  ///
+  /// The format isn't significant, and may change in the future.
+  String toString() {
+    return _queue.take(_length).toString();
+  }
+
+  /// Add element to the queue.
+  ///
+  /// Grows the capacity if the backing list is full.
+  void _add(E element) {
+    if (_length == _queue.length) _grow();
+    _bubbleUp(element, _length++);
+  }
+
+  /// Find the index of an object in the heap.
+  ///
+  /// Returns -1 if the object is not found.
+  int _locate(E object) {
+    if (_length == 0) return -1;
+    // Count positions from one instead of zero. This gives the numbers
+    // some nice properties. For example, all right children are odd,
+    // their left sibling is even, and the parent is found by shifting
+    // right by one.
+    // Valid range for position is [1.._length], inclusive.
+    int position = 1;
+    // Pre-order depth first search, omit child nodes if the current
+    // node has lower priority than [object], because all nodes lower
+    // in the heap will also have lower priority.
+    do {
+      int index = position - 1;
+      E element = _queue[index];
+      int comp = comparison(element, object);
+      if (comp == 0) return index;
+      if (comp < 0) {
+        // Element may be in subtree.
+        // Continue with the left child, if it is there.
+        int leftChildPosition = position * 2;
+        if (leftChildPosition <= _length) {
+          position = leftChildPosition;
+          continue;
+        }
+      }
+      // Find the next right sibling or right ancestor sibling.
+      do {
+        while (position.isOdd) {
+          // While position is a right child, go to the parent.
+          position >>= 1;
+        }
+        // Then go to the right sibling of the left-child.
+        position += 1;
+      } while (position > _length); // Happens if last element is a left child.
+    } while (position != 1); // At root again. Happens for right-most element.
+    return -1;
+  }
+
+  E _removeLast() {
+    int newLength = _length - 1;
+    E last = _queue[newLength];
+    _queue[newLength] = null;
+    _length = newLength;
+    return last;
+  }
+
+  /// Place [element] in heap at [index] or above.
+  ///
+  /// Put element into the empty cell at `index`.
+  /// While the `element` has higher priority than the
+  /// parent, swap it with the parent.
+  void _bubbleUp(E element, int index) {
+    while (index > 0) {
+      int parentIndex = (index - 1) ~/ 2;
+      E parent = _queue[parentIndex];
+      if (comparison(element, parent) > 0) break;
+      _queue[index] = parent;
+      index = parentIndex;
+    }
+    _queue[index] = element;
+  }
+
+  /// Place [element] in heap at [index] or above.
+  ///
+  /// Put element into the empty cell at `index`.
+  /// While the `element` has lower priority than either child,
+  /// swap it with the highest priority child.
+  void _bubbleDown(E element, int index) {
+    int rightChildIndex = index * 2 + 2;
+    while (rightChildIndex < _length) {
+      int leftChildIndex = rightChildIndex - 1;
+      E leftChild = _queue[leftChildIndex];
+      E rightChild = _queue[rightChildIndex];
+      int comp = comparison(leftChild, rightChild);
+      int minChildIndex;
+      E minChild;
+      if (comp < 0) {
+        minChild = leftChild;
+        minChildIndex = leftChildIndex;
+      } else {
+        minChild = rightChild;
+        minChildIndex = rightChildIndex;
+      }
+      comp = comparison(element, minChild);
+      if (comp <= 0) {
+        _queue[index] = element;
+        return;
+      }
+      _queue[index] = minChild;
+      index = minChildIndex;
+      rightChildIndex = index * 2 + 2;
+    }
+    int leftChildIndex = rightChildIndex - 1;
+    if (leftChildIndex < _length) {
+      E child = _queue[leftChildIndex];
+      int comp = comparison(element, child);
+      if (comp > 0) {
+        _queue[index] = child;
+        index = leftChildIndex;
+      }
+    }
+    _queue[index] = element;
+  }
+
+  /// Grows the capacity of the list holding the heap.
+  ///
+  /// Called when the list is full.
+  void _grow() {
+    int newCapacity = _queue.length * 2 + 1;
+    if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY;
+    List<E> newQueue = new List<E>(newCapacity);
+    newQueue.setRange(0, _length, _queue);
+    _queue = newQueue;
+  }
+}
diff --git a/packages/collection/lib/src/queue_list.dart b/packages/collection/lib/src/queue_list.dart
index 0ef888f..73c1f66 100644
--- a/packages/collection/lib/src/queue_list.dart
+++ b/packages/collection/lib/src/queue_list.dart
@@ -4,9 +4,7 @@
 
 import 'dart:collection';
 
-/**
- * A class that efficiently implements both [Queue] and [List].
- */
+/// A class that efficiently implements both [Queue] and [List].
 // TODO(nweiz): Currently this code is copied almost verbatim from
 // dart:collection. The only changes are to implement List and to remove methods
 // that are redundant with ListMixin. Remove or simplify it when issue 21330 is
@@ -17,13 +15,13 @@
   int _head;
   int _tail;
 
-  /**
-   * Create an empty queue.
-   *
-   * If [initialCapacity] is given, prepare the queue for at least that many
-   * elements.
-   */
-  QueueList([int initialCapacity]) : _head = 0, _tail = 0 {
+  /// Create an empty queue.
+  ///
+  /// If [initialCapacity] is given, prepare the queue for at least that many
+  /// elements.
+  QueueList([int initialCapacity])
+      : _head = 0,
+        _tail = 0 {
     if (initialCapacity == null || initialCapacity < _INITIAL_CAPACITY) {
       initialCapacity = _INITIAL_CAPACITY;
     } else if (!_isPowerOf2(initialCapacity)) {
@@ -33,15 +31,13 @@
     _table = new List<E>(initialCapacity);
   }
 
-  /**
-   * Create a queue initially containing the elements of [source].
-   */
+  /// Create a queue initially containing the elements of [source].
   factory QueueList.from(Iterable<E> source) {
     if (source is List) {
       int length = source.length;
       QueueList<E> queue = new QueueList(length + 1);
       assert(queue._table.length > length);
-      List sourceList = source;
+      var sourceList = source;
       queue._table.setRange(0, length, sourceList, 0);
       queue._tail = length;
       return queue;
@@ -58,7 +54,7 @@
 
   void addAll(Iterable<E> elements) {
     if (elements is List) {
-      List list = elements;
+      var list = elements;
       int addCount = list.length;
       int length = this.length;
       if (length + addCount >= _table.length) {
@@ -88,7 +84,9 @@
 
   // Queue interface.
 
-  void addLast(E element) { _add(element); }
+  void addLast(E element) {
+    _add(element);
+  }
 
   void addFirst(E element) {
     _head = (_head - 1) & (_table.length - 1);
@@ -131,7 +129,7 @@
     int newTail = _tail + delta; // [delta] is negative.
     if (newTail >= 0) {
       _table.fillRange(newTail, _tail, null);
-    } else { 
+    } else {
       newTail += _table.length;
       _table.fillRange(0, _tail, null);
       _table.fillRange(newTail, _table.length, null);
@@ -147,7 +145,7 @@
     return _table[(_head + index) & (_table.length - 1)];
   }
 
-  void operator[]=(int index, E value) {
+  void operator []=(int index, E value) {
     if (index < 0 || index >= length) {
       throw new RangeError("Index $index must be in the range [0..$length).");
     }
@@ -157,40 +155,34 @@
 
   // Internal helper functions.
 
-  /**
-   * Whether [number] is a power of two.
-   *
-   * Only works for positive numbers.
-   */
+  /// Whether [number] is a power of two.
+  ///
+  /// Only works for positive numbers.
   static bool _isPowerOf2(int number) => (number & (number - 1)) == 0;
 
-  /**
-   * Rounds [number] up to the nearest power of 2.
-   *
-   * If [number] is a power of 2 already, it is returned.
-   *
-   * Only works for positive numbers.
-   */
+  /// Rounds [number] up to the nearest power of 2.
+  ///
+  /// If [number] is a power of 2 already, it is returned.
+  ///
+  /// Only works for positive numbers.
   static int _nextPowerOf2(int number) {
     assert(number > 0);
     number = (number << 1) - 1;
-    for(;;) {
+    for (;;) {
       int nextNumber = number & (number - 1);
       if (nextNumber == 0) return number;
       number = nextNumber;
     }
   }
 
-  /** Adds element at end of queue. Used by both [add] and [addAll]. */
+  /// Adds element at end of queue. Used by both [add] and [addAll].
   void _add(E element) {
     _table[_tail] = element;
     _tail = (_tail + 1) & (_table.length - 1);
     if (_head == _tail) _grow();
   }
 
-  /**
-   * Grow the table when full.
-   */
+  /// Grow the table when full.
   void _grow() {
     List<E> newTable = new List<E>(_table.length * 2);
     int split = _table.length - _head;
@@ -215,7 +207,7 @@
     }
   }
 
-  /** Grows the table even if it is not full. */
+  /// Grows the table even if it is not full.
   void _preGrow(int newElementCount) {
     assert(newElementCount >= length);
 
diff --git a/packages/collection/lib/src/typed_wrappers.dart b/packages/collection/lib/src/typed_wrappers.dart
new file mode 100644
index 0000000..242dc17
--- /dev/null
+++ b/packages/collection/lib/src/typed_wrappers.dart
@@ -0,0 +1,346 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+import "dart:math" as math;
+
+import "wrappers.dart";
+
+typedef F _UnaryFunction<E, F>(E argument);
+
+/// The base class for delegating, type-asserting iterables.
+///
+/// Subclasses can provide a [_base] that should be delegated to. Unlike
+/// [TypeSafeIterable], this allows the base to be created on demand.
+abstract class _TypeSafeIterableBase<E> implements Iterable<E> {
+  /// The base iterable to which operations are delegated.
+  Iterable get _base;
+
+  _TypeSafeIterableBase();
+
+  bool any(bool test(E element)) => _base.any(_validate(test));
+
+  bool contains(Object element) => _base.contains(element);
+
+  E elementAt(int index) => _base.elementAt(index) as E;
+
+  bool every(bool test(E element)) => _base.every(_validate(test));
+
+  Iterable<T> expand<T>(Iterable<T> f(E element)) => _base.expand(_validate(f));
+
+  E get first => _base.first as E;
+
+  E firstWhere(bool test(E element), {E orElse()}) =>
+      _base.firstWhere(_validate(test), orElse: orElse) as E;
+
+  T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
+      _base.fold(initialValue,
+          (previousValue, element) => combine(previousValue, element as E));
+
+  void forEach(void f(E element)) => _base.forEach(_validate(f));
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterator<E> get iterator => _base.map((element) => element as E).iterator;
+
+  String join([String separator = ""]) => _base.join(separator);
+
+  E get last => _base.last as E;
+
+  E lastWhere(bool test(E element), {E orElse()}) =>
+      _base.lastWhere(_validate(test), orElse: orElse) as E;
+
+  int get length => _base.length;
+
+  Iterable<T> map<T>(T f(E element)) => _base.map(_validate(f));
+
+  E reduce(E combine(E value, E element)) =>
+      _base.reduce((value, element) => combine(value as E, element as E)) as E;
+
+  E get single => _base.single as E;
+
+  E singleWhere(bool test(E element)) =>
+      _base.singleWhere(_validate(test)) as E;
+
+  Iterable<E> skip(int n) => new TypeSafeIterable<E>(_base.skip(n));
+
+  Iterable<E> skipWhile(bool test(E value)) =>
+      new TypeSafeIterable<E>(_base.skipWhile(_validate(test)));
+
+  Iterable<E> take(int n) => new TypeSafeIterable<E>(_base.take(n));
+
+  Iterable<E> takeWhile(bool test(E value)) =>
+      new TypeSafeIterable<E>(_base.takeWhile(_validate(test)));
+
+  List<E> toList({bool growable: true}) =>
+      new TypeSafeList<E>(_base.toList(growable: growable));
+
+  Set<E> toSet() => new TypeSafeSet<E>(_base.toSet());
+
+  Iterable<E> where(bool test(E element)) =>
+      new TypeSafeIterable<E>(_base.where(_validate(test)));
+
+  String toString() => _base.toString();
+
+  /// Returns a version of [function] that asserts that its argument is an
+  /// instance of `E`.
+  _UnaryFunction<dynamic, F> _validate<F>(F function(E value)) =>
+      (value) => function(value as E);
+}
+
+/// An [Iterable] that asserts the types of values in a base iterable.
+///
+/// This is instantiated using [DelegatingIterable.typed].
+class TypeSafeIterable<E> extends _TypeSafeIterableBase<E>
+    implements DelegatingIterable<E> {
+  final Iterable _base;
+
+  TypeSafeIterable(Iterable base) : _base = base;
+}
+
+/// A [List] that asserts the types of values in a base list.
+///
+/// This is instantiated using [DelegatingList.typed].
+class TypeSafeList<E> extends TypeSafeIterable<E> implements DelegatingList<E> {
+  TypeSafeList(List base) : super(base);
+
+  /// A [List]-typed getter for [_base].
+  List get _listBase => _base;
+
+  E operator [](int index) => _listBase[index] as E;
+
+  void operator []=(int index, E value) {
+    _listBase[index] = value;
+  }
+
+  void add(E value) {
+    _listBase.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _listBase.addAll(iterable);
+  }
+
+  Map<int, E> asMap() => new TypeSafeMap<int, E>(_listBase.asMap());
+
+  void clear() {
+    _listBase.clear();
+  }
+
+  void fillRange(int start, int end, [E fillValue]) {
+    _listBase.fillRange(start, end, fillValue);
+  }
+
+  Iterable<E> getRange(int start, int end) =>
+      new TypeSafeIterable<E>(_listBase.getRange(start, end));
+
+  int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
+
+  void insert(int index, E element) {
+    _listBase.insert(index, element);
+  }
+
+  void insertAll(int index, Iterable<E> iterable) {
+    _listBase.insertAll(index, iterable);
+  }
+
+  int lastIndexOf(E element, [int start]) =>
+      _listBase.lastIndexOf(element, start);
+
+  void set length(int newLength) {
+    _listBase.length = newLength;
+  }
+
+  bool remove(Object value) => _listBase.remove(value);
+
+  E removeAt(int index) => _listBase.removeAt(index) as E;
+
+  E removeLast() => _listBase.removeLast() as E;
+
+  void removeRange(int start, int end) {
+    _listBase.removeRange(start, end);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _listBase.removeWhere(_validate(test));
+  }
+
+  void replaceRange(int start, int end, Iterable<E> iterable) {
+    _listBase.replaceRange(start, end, iterable);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _listBase.retainWhere(_validate(test));
+  }
+
+  Iterable<E> get reversed => new TypeSafeIterable<E>(_listBase.reversed);
+
+  void setAll(int index, Iterable<E> iterable) {
+    _listBase.setAll(index, iterable);
+  }
+
+  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
+    _listBase.setRange(start, end, iterable, skipCount);
+  }
+
+  void shuffle([math.Random random]) {
+    _listBase.shuffle(random);
+  }
+
+  void sort([int compare(E a, E b)]) {
+    if (compare == null) {
+      _listBase.sort();
+    } else {
+      _listBase.sort((a, b) => compare(a as E, b as E));
+    }
+  }
+
+  List<E> sublist(int start, [int end]) =>
+      new TypeSafeList<E>(_listBase.sublist(start, end));
+}
+
+/// A [Set] that asserts the types of values in a base set.
+///
+/// This is instantiated using [DelegatingSet.typed].
+class TypeSafeSet<E> extends TypeSafeIterable<E> implements DelegatingSet<E> {
+  TypeSafeSet(Set base) : super(base);
+
+  /// A [Set]-typed getter for [_base].
+  Set get _setBase => _base;
+
+  bool add(E value) => _setBase.add(value);
+
+  void addAll(Iterable<E> elements) {
+    _setBase.addAll(elements);
+  }
+
+  void clear() {
+    _setBase.clear();
+  }
+
+  bool containsAll(Iterable<Object> other) => _setBase.containsAll(other);
+
+  Set<E> difference(Set<Object> other) =>
+      new TypeSafeSet<E>(_setBase.difference(other));
+
+  Set<E> intersection(Set<Object> other) =>
+      new TypeSafeSet<E>(_setBase.intersection(other));
+
+  E lookup(Object element) => _setBase.lookup(element) as E;
+
+  bool remove(Object value) => _setBase.remove(value);
+
+  void removeAll(Iterable<Object> elements) {
+    _setBase.removeAll(elements);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _setBase.removeWhere(_validate(test));
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    _setBase.retainAll(elements);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _setBase.retainWhere(_validate(test));
+  }
+
+  Set<E> union(Set<E> other) => new TypeSafeSet<E>(_setBase.union(other));
+}
+
+/// A [Queue] that asserts the types of values in a base queue.
+///
+/// This is instantiated using [DelegatingQueue.typed].
+class TypeSafeQueue<E> extends TypeSafeIterable<E>
+    implements DelegatingQueue<E> {
+  TypeSafeQueue(Queue queue) : super(queue);
+
+  /// A [Queue]-typed getter for [_base].
+  Queue get _baseQueue => _base;
+
+  void add(E value) {
+    _baseQueue.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _baseQueue.addAll(iterable);
+  }
+
+  void addFirst(E value) {
+    _baseQueue.addFirst(value);
+  }
+
+  void addLast(E value) {
+    _baseQueue.addLast(value);
+  }
+
+  void clear() {
+    _baseQueue.clear();
+  }
+
+  bool remove(Object object) => _baseQueue.remove(object);
+
+  void removeWhere(bool test(E element)) {
+    _baseQueue.removeWhere(_validate(test));
+  }
+
+  void retainWhere(bool test(E element)) {
+    _baseQueue.retainWhere(_validate(test));
+  }
+
+  E removeFirst() => _baseQueue.removeFirst() as E;
+
+  E removeLast() => _baseQueue.removeLast() as E;
+}
+
+/// A [Map] that asserts the types of keys and values in a base map.
+///
+/// This is instantiated using [DelegatingMap.typed].
+class TypeSafeMap<K, V> implements DelegatingMap<K, V> {
+  /// The base map to which operations are delegated.
+  final Map _base;
+
+  TypeSafeMap(Map base) : _base = base;
+
+  V operator [](Object key) => _base[key] as V;
+
+  void operator []=(K key, V value) {
+    _base[key] = value;
+  }
+
+  void addAll(Map<K, V> other) {
+    _base.addAll(other);
+  }
+
+  void clear() {
+    _base.clear();
+  }
+
+  bool containsKey(Object key) => _base.containsKey(key);
+
+  bool containsValue(Object value) => _base.containsValue(value);
+
+  void forEach(void f(K key, V value)) {
+    _base.forEach((key, value) => f(key as K, value as V));
+  }
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterable<K> get keys => new TypeSafeIterable<K>(_base.keys);
+
+  int get length => _base.length;
+
+  V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent) as V;
+
+  V remove(Object key) => _base.remove(key) as V;
+
+  Iterable<V> get values => new TypeSafeIterable<V>(_base.values);
+
+  String toString() => _base.toString();
+}
diff --git a/packages/collection/lib/src/union_set.dart b/packages/collection/lib/src/union_set.dart
new file mode 100644
index 0000000..5d88b6b
--- /dev/null
+++ b/packages/collection/lib/src/union_set.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'unmodifiable_wrappers.dart';
+
+/// A single set that provides a view of the union over a set of sets.
+///
+/// Since this is just a view, it reflects all changes in the underlying sets.
+///
+/// If an element is in multiple sets and the outer set is ordered, the version
+/// in the earliest inner set is preferred. Component sets are assumed to use
+/// `==` and `hashCode` for equality.
+class UnionSet<E> extends SetBase<E> with UnmodifiableSetMixin<E> {
+  /// The set of sets that this provides a view of.
+  final Set<Set<E>> _sets;
+
+  /// Whether the sets in [_sets] are guaranteed to be disjoint.
+  final bool _disjoint;
+
+  /// Creates a new set that's a view of the union of all sets in [sets].
+  ///
+  /// If any sets in [sets] change, this [UnionSet] reflects that change. If a
+  /// new set is added to [sets], this [UnionSet] reflects that as well.
+  ///
+  /// If [disjoint] is `true`, then all component sets must be disjoint. That
+  /// is, that they contain no elements in common. This makes many operations
+  /// including [length] more efficient. If the component sets turn out not to
+  /// be disjoint, some operations may behave inconsistently.
+  UnionSet(this._sets, {bool disjoint: false}) : _disjoint = disjoint;
+
+  /// Creates a new set that's a view of the union of all sets in [sets].
+  ///
+  /// If any sets in [sets] change, this [UnionSet] reflects that change.
+  /// However, unlike [new UnionSet], this creates a copy of its parameter, so
+  /// changes in [sets] aren't reflected in this [UnionSet].
+  ///
+  /// If [disjoint] is `true`, then all component sets must be disjoint. That
+  /// is, that they contain no elements in common. This makes many operations
+  /// including [length] more efficient. If the component sets turn out not to
+  /// be disjoint, some operations may behave inconsistently.
+  UnionSet.from(Iterable<Set<E>> sets, {bool disjoint: false})
+      : this(sets.toSet(), disjoint: disjoint);
+
+  int get length => _disjoint
+      ? _sets.fold(0, (length, set) => length + set.length)
+      : _iterable.length;
+
+  Iterator<E> get iterator => _iterable.iterator;
+
+  /// Returns an iterable over the contents of all the sets in [this].
+  Iterable<E> get _iterable =>
+      _disjoint ? _sets.expand((set) => set) : _dedupIterable;
+
+  /// Returns an iterable over the contents of all the sets in [this] that
+  /// de-duplicates elements.
+  ///
+  /// If the sets aren't guaranteed to be disjoint, this keeps track of the
+  /// elements we've already emitted so that we can de-duplicate them.
+  Iterable<E> get _dedupIterable {
+    var seen = new Set<E>();
+    return _sets.expand((set) => set).where((element) {
+      if (seen.contains(element)) return false;
+      seen.add(element);
+      return true;
+    });
+  }
+
+  bool contains(Object element) => _sets.any((set) => set.contains(element));
+
+  E lookup(Object element) {
+    if (element == null) return null;
+
+    return _sets
+        .map((set) => set.lookup(element))
+        .firstWhere((result) => result != null, orElse: () => null);
+  }
+
+  Set<E> toSet() {
+    var result = new Set<E>();
+    for (var set in _sets) {
+      result.addAll(set);
+    }
+    return result;
+  }
+}
diff --git a/packages/collection/lib/src/union_set_controller.dart b/packages/collection/lib/src/union_set_controller.dart
new file mode 100644
index 0000000..1d0eb74
--- /dev/null
+++ b/packages/collection/lib/src/union_set_controller.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'union_set.dart';
+
+/// A controller that exposes a view of the union of a collection of sets.
+///
+/// This is a convenience class for creating a [UnionSet] whose contents change
+/// over the lifetime of a class. For example:
+///
+/// ```dart
+/// class Engine {
+///   Set<Test> get activeTests => _activeTestsGroup.set;
+///   final _activeTestsGroup = new UnionSetController<Test>();
+///
+///   void addSuite(Suite suite) {
+///     _activeTestsGroup.add(suite.tests);
+///     _runSuite(suite);
+///     _activeTestsGroup.remove(suite.tests);
+///   }
+/// }
+/// ```
+class UnionSetController<E> {
+  /// The [UnionSet] that provides a view of the union of sets in [this].
+  UnionSet<E> get set => _set;
+  UnionSet<E> _set;
+
+  /// The sets whose union is exposed through [set].
+  final _sets = new Set<Set<E>>();
+
+  /// Creates a set of sets that provides a view of the union of those sets.
+  ///
+  /// If [disjoint] is `true`, this assumes that all component sets are
+  /// disjoint—that is, that they contain no elements in common. This makes
+  /// many operations including [length] more efficient.
+  UnionSetController({bool disjoint: false}) {
+    _set = new UnionSet<E>(_sets, disjoint: disjoint);
+  }
+
+  /// Adds the contents of [component] to [set].
+  ///
+  /// If the contents of [component] change over time, [set] will change
+  /// accordingly.
+  void add(Set<E> component) {
+    _sets.add(component);
+  }
+
+  /// Removes the contents of [component] to [set].
+  ///
+  /// If another set in [this] has overlapping elements with [component], those
+  /// elements will remain in [set].
+  bool remove(Set<E> component) => _sets.remove(component);
+}
diff --git a/packages/collection/lib/src/unmodifiable_wrappers.dart b/packages/collection/lib/src/unmodifiable_wrappers.dart
index efe3c9d..1b4d2e4 100644
--- a/packages/collection/lib/src/unmodifiable_wrappers.dart
+++ b/packages/collection/lib/src/unmodifiable_wrappers.dart
@@ -2,236 +2,170 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Wrappers that prevent a List, Set, or Map object from being modified.
- *
- * The [Set] and [Map] wrappers allow reading from the wrapped collection,
- * but prohibit writing.
- *
- * The [List] wrapper prevents changes to the length of the wrapped list,
- * but allows changes to the contents.
- */
-library collection.unmodifiable_wrappers;
-
-import '../wrappers.dart';
-
 export "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
 
-/**
- * A fixed-length list.
- *
- * A `NonGrowableListView` contains a [List] object and ensures that
- * its length does not change.
- * Methods that would change the length of the list,
- * such as [add] and [remove], throw an [UnsupportedError].
- * All other methods work directly on the underlying list.
- *
- * This class _does_ allow changes to the contents of the wrapped list.
- * You can, for example, [sort] the list.
- * Permitted operations defer to the wrapped list.
- */
+import 'wrappers.dart';
+import 'empty_unmodifiable_set.dart';
+
+/// A fixed-length list.
+///
+/// A `NonGrowableListView` contains a [List] object and ensures that
+/// its length does not change.
+/// Methods that would change the length of the list,
+/// such as [add] and [remove], throw an [UnsupportedError].
+/// All other methods work directly on the underlying list.
+///
+/// This class _does_ allow changes to the contents of the wrapped list.
+/// You can, for example, [sort] the list.
+/// Permitted operations defer to the wrapped list.
 class NonGrowableListView<E> extends DelegatingList<E>
-                             with NonGrowableListMixin<E> {
+    with NonGrowableListMixin<E> {
   NonGrowableListView(List<E> listBase) : super(listBase);
 }
 
-/**
- * Mixin class that implements a throwing version of all list operations that
- * change the List's length.
- */
+/// Mixin class that implements a throwing version of all list operations that
+/// change the List's length.
 abstract class NonGrowableListMixin<E> implements List<E> {
-  static _throw() {
+  static T _throw<T>() {
     throw new UnsupportedError(
         "Cannot change the length of a fixed-length list");
   }
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void set length(int newLength) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   bool add(E value) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void addAll(Iterable<E> iterable) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void insert(int index, E element) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void insertAll(int index, Iterable<E> iterable) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   bool remove(Object value) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   E removeAt(int index) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   E removeLast() => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void removeWhere(bool test(E element)) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void retainWhere(bool test(E element)) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void removeRange(int start, int end) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void replaceRange(int start, int end, Iterable<E> iterable) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the length of the list are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the length of the list are disallowed.
   void clear() => _throw();
 }
 
-/**
- * An unmodifiable set.
- *
- * An UnmodifiableSetView contains a [Set] object and ensures
- * that it does not change.
- * Methods that would change the set,
- * such as [add] and [remove], throw an [UnsupportedError].
- * Permitted operations defer to the wrapped set.
- */
+/// An unmodifiable set.
+///
+/// An UnmodifiableSetView contains a [Set] object and ensures
+/// that it does not change.
+/// Methods that would change the set,
+/// such as [add] and [remove], throw an [UnsupportedError].
+/// Permitted operations defer to the wrapped set.
 class UnmodifiableSetView<E> extends DelegatingSet<E>
-                             with UnmodifiableSetMixin<E> {
+    with UnmodifiableSetMixin<E> {
   UnmodifiableSetView(Set<E> setBase) : super(setBase);
+
+  /// An unmodifiable empty set.
+  ///
+  /// This is the same as `new UnmodifiableSetView(new Set())`, except that it
+  /// can be used in const contexts.
+  const factory UnmodifiableSetView.empty() = EmptyUnmodifiableSet<E>;
 }
 
-/**
- * Mixin class that implements a throwing version of all set operations that
- * change the Set.
- */
+/// Mixin class that implements a throwing version of all set operations that
+/// change the Set.
 abstract class UnmodifiableSetMixin<E> implements Set<E> {
-  _throw() {
+  static T _throw<T>() {
     throw new UnsupportedError("Cannot modify an unmodifiable Set");
   }
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   bool add(E value) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void addAll(Iterable<E> elements) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   bool remove(Object value) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void removeAll(Iterable elements) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void retainAll(Iterable elements) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void removeWhere(bool test(E element)) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void retainWhere(bool test(E element)) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the set are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the set are disallowed.
   void clear() => _throw();
 }
 
-/**
- * Mixin class that implements a throwing version of all map operations that
- * change the Map.
- */
+/// Mixin class that implements a throwing version of all map operations that
+/// change the Map.
 abstract class UnmodifiableMapMixin<K, V> implements Map<K, V> {
-  static _throw() {
+  static T _throw<T>() {
     throw new UnsupportedError("Cannot modify an unmodifiable Map");
   }
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
   void operator []=(K key, V value) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
   V putIfAbsent(K key, V ifAbsent()) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
   void addAll(Map<K, V> other) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
   V remove(Object key) => _throw();
 
-  /**
-   * Throws an [UnsupportedError];
-   * operations that change the map are disallowed.
-   */
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
   void clear() => _throw();
 }
diff --git a/packages/collection/lib/src/utils.dart b/packages/collection/lib/src/utils.dart
index c9c7537..194f99c 100644
--- a/packages/collection/lib/src/utils.dart
+++ b/packages/collection/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library dart.pkg.collection.utils;
-
 /// A pair of values.
 class Pair<E, F> {
   E first;
@@ -11,3 +9,7 @@
 
   Pair(this.first, this.last);
 }
+
+/// Returns a [Comparator] that asserts that its first argument is comparable.
+Comparator<T> defaultCompare<T>() =>
+    (value1, value2) => (value1 as Comparable).compareTo(value2);
diff --git a/packages/collection/lib/src/wrappers.dart b/packages/collection/lib/src/wrappers.dart
new file mode 100644
index 0000000..555296d
--- /dev/null
+++ b/packages/collection/lib/src/wrappers.dart
@@ -0,0 +1,605 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+import "dart:math" as math;
+
+import "typed_wrappers.dart";
+import "unmodifiable_wrappers.dart";
+
+typedef K _KeyForValue<K, V>(V value);
+
+/// A base class for delegating iterables.
+///
+/// Subclasses can provide a [_base] that should be delegated to. Unlike
+/// [DelegatingIterable], this allows the base to be created on demand.
+abstract class _DelegatingIterableBase<E> implements Iterable<E> {
+  Iterable<E> get _base;
+
+  const _DelegatingIterableBase();
+
+  bool any(bool test(E element)) => _base.any(test);
+
+  bool contains(Object element) => _base.contains(element);
+
+  E elementAt(int index) => _base.elementAt(index);
+
+  bool every(bool test(E element)) => _base.every(test);
+
+  Iterable<T> expand<T>(Iterable<T> f(E element)) => _base.expand(f);
+
+  E get first => _base.first;
+
+  E firstWhere(bool test(E element), {E orElse()}) =>
+      _base.firstWhere(test, orElse: orElse);
+
+  T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
+      _base.fold(initialValue, combine);
+
+  void forEach(void f(E element)) => _base.forEach(f);
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterator<E> get iterator => _base.iterator;
+
+  String join([String separator = ""]) => _base.join(separator);
+
+  E get last => _base.last;
+
+  E lastWhere(bool test(E element), {E orElse()}) =>
+      _base.lastWhere(test, orElse: orElse);
+
+  int get length => _base.length;
+
+  Iterable<T> map<T>(T f(E element)) => _base.map(f);
+
+  E reduce(E combine(E value, E element)) => _base.reduce(combine);
+
+  E get single => _base.single;
+
+  E singleWhere(bool test(E element)) => _base.singleWhere(test);
+
+  Iterable<E> skip(int n) => _base.skip(n);
+
+  Iterable<E> skipWhile(bool test(E value)) => _base.skipWhile(test);
+
+  Iterable<E> take(int n) => _base.take(n);
+
+  Iterable<E> takeWhile(bool test(E value)) => _base.takeWhile(test);
+
+  List<E> toList({bool growable: true}) => _base.toList(growable: growable);
+
+  Set<E> toSet() => _base.toSet();
+
+  Iterable<E> where(bool test(E element)) => _base.where(test);
+
+  String toString() => _base.toString();
+}
+
+/// An [Iterable] that delegates all operations to a base iterable.
+///
+/// This class can be used to hide non-`Iterable` methods of an iterable object,
+/// or it can be extended to add extra functionality on top of an existing
+/// iterable object.
+class DelegatingIterable<E> extends _DelegatingIterableBase<E> {
+  final Iterable<E> _base;
+
+  /// Creates a wrapper that forwards operations to [base].
+  const DelegatingIterable(Iterable<E> base) : _base = base;
+
+  /// Creates a wrapper that asserts the types of values in [base].
+  ///
+  /// This soundly converts an [Iterable] without a generic type to an
+  /// `Iterable<E>` by asserting that its elements are instances of `E` whenever
+  /// they're accessed. If they're not, it throws a [CastError].
+  ///
+  /// This forwards all operations to [base], so any changes in [base] will be
+  /// reflected in [this]. If [base] is already an `Iterable<E>`, it's returned
+  /// unmodified.
+  static Iterable<E> typed<E>(Iterable base) =>
+      base is Iterable<E> ? base : new TypeSafeIterable<E>(base);
+}
+
+/// A [List] that delegates all operations to a base list.
+///
+/// This class can be used to hide non-`List` methods of a list object, or it
+/// can be extended to add extra functionality on top of an existing list
+/// object.
+class DelegatingList<E> extends DelegatingIterable<E> implements List<E> {
+  const DelegatingList(List<E> base) : super(base);
+
+  /// Creates a wrapper that asserts the types of values in [base].
+  ///
+  /// This soundly converts a [List] without a generic type to a `List<E>` by
+  /// asserting that its elements are instances of `E` whenever they're
+  /// accessed. If they're not, it throws a [CastError]. Note that even if an
+  /// operation throws a [CastError], it may still mutate the underlying
+  /// collection.
+  ///
+  /// This forwards all operations to [base], so any changes in [base] will be
+  /// reflected in [this]. If [base] is already a `List<E>`, it's returned
+  /// unmodified.
+  static List<E> typed<E>(List base) =>
+      base is List<E> ? base : new TypeSafeList<E>(base);
+
+  List<E> get _listBase => _base;
+
+  E operator [](int index) => _listBase[index];
+
+  void operator []=(int index, E value) {
+    _listBase[index] = value;
+  }
+
+  void add(E value) {
+    _listBase.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _listBase.addAll(iterable);
+  }
+
+  Map<int, E> asMap() => _listBase.asMap();
+
+  void clear() {
+    _listBase.clear();
+  }
+
+  void fillRange(int start, int end, [E fillValue]) {
+    _listBase.fillRange(start, end, fillValue);
+  }
+
+  Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
+
+  int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
+
+  void insert(int index, E element) {
+    _listBase.insert(index, element);
+  }
+
+  void insertAll(int index, Iterable<E> iterable) {
+    _listBase.insertAll(index, iterable);
+  }
+
+  int lastIndexOf(E element, [int start]) =>
+      _listBase.lastIndexOf(element, start);
+
+  void set length(int newLength) {
+    _listBase.length = newLength;
+  }
+
+  bool remove(Object value) => _listBase.remove(value);
+
+  E removeAt(int index) => _listBase.removeAt(index);
+
+  E removeLast() => _listBase.removeLast();
+
+  void removeRange(int start, int end) {
+    _listBase.removeRange(start, end);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _listBase.removeWhere(test);
+  }
+
+  void replaceRange(int start, int end, Iterable<E> iterable) {
+    _listBase.replaceRange(start, end, iterable);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _listBase.retainWhere(test);
+  }
+
+  Iterable<E> get reversed => _listBase.reversed;
+
+  void setAll(int index, Iterable<E> iterable) {
+    _listBase.setAll(index, iterable);
+  }
+
+  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
+    _listBase.setRange(start, end, iterable, skipCount);
+  }
+
+  void shuffle([math.Random random]) {
+    _listBase.shuffle(random);
+  }
+
+  void sort([int compare(E a, E b)]) {
+    _listBase.sort(compare);
+  }
+
+  List<E> sublist(int start, [int end]) => _listBase.sublist(start, end);
+}
+
+/// A [Set] that delegates all operations to a base set.
+///
+/// This class can be used to hide non-`Set` methods of a set object, or it can
+/// be extended to add extra functionality on top of an existing set object.
+class DelegatingSet<E> extends DelegatingIterable<E> implements Set<E> {
+  const DelegatingSet(Set<E> base) : super(base);
+
+  /// Creates a wrapper that asserts the types of values in [base].
+  ///
+  /// This soundly converts a [Set] without a generic type to a `Set<E>` by
+  /// asserting that its elements are instances of `E` whenever they're
+  /// accessed. If they're not, it throws a [CastError]. Note that even if an
+  /// operation throws a [CastError], it may still mutate the underlying
+  /// collection.
+  ///
+  /// This forwards all operations to [base], so any changes in [base] will be
+  /// reflected in [this]. If [base] is already a `Set<E>`, it's returned
+  /// unmodified.
+  static Set<E> typed<E>(Set base) =>
+      base is Set<E> ? base : new TypeSafeSet<E>(base);
+
+  Set<E> get _setBase => _base;
+
+  bool add(E value) => _setBase.add(value);
+
+  void addAll(Iterable<E> elements) {
+    _setBase.addAll(elements);
+  }
+
+  void clear() {
+    _setBase.clear();
+  }
+
+  bool containsAll(Iterable<Object> other) => _setBase.containsAll(other);
+
+  Set<E> difference(Set<Object> other) => _setBase.difference(other);
+
+  Set<E> intersection(Set<Object> other) => _setBase.intersection(other);
+
+  E lookup(Object element) => _setBase.lookup(element);
+
+  bool remove(Object value) => _setBase.remove(value);
+
+  void removeAll(Iterable<Object> elements) {
+    _setBase.removeAll(elements);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _setBase.removeWhere(test);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    _setBase.retainAll(elements);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _setBase.retainWhere(test);
+  }
+
+  Set<E> union(Set<E> other) => _setBase.union(other);
+
+  Set<E> toSet() => new DelegatingSet<E>(_setBase.toSet());
+}
+
+/// A [Queue] that delegates all operations to a base queue.
+///
+/// This class can be used to hide non-`Queue` methods of a queue object, or it
+/// can be extended to add extra functionality on top of an existing queue
+/// object.
+class DelegatingQueue<E> extends DelegatingIterable<E> implements Queue<E> {
+  const DelegatingQueue(Queue<E> queue) : super(queue);
+
+  /// Creates a wrapper that asserts the types of values in [base].
+  ///
+  /// This soundly converts a [Queue] without a generic type to a `Queue<E>` by
+  /// asserting that its elements are instances of `E` whenever they're
+  /// accessed. If they're not, it throws a [CastError]. Note that even if an
+  /// operation throws a [CastError], it may still mutate the underlying
+  /// collection.
+  ///
+  /// This forwards all operations to [base], so any changes in [base] will be
+  /// reflected in [this]. If [base] is already a `Queue<E>`, it's returned
+  /// unmodified.
+  static Queue<E> typed<E>(Queue base) =>
+      base is Queue<E> ? base : new TypeSafeQueue<E>(base);
+
+  Queue<E> get _baseQueue => _base;
+
+  void add(E value) {
+    _baseQueue.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _baseQueue.addAll(iterable);
+  }
+
+  void addFirst(E value) {
+    _baseQueue.addFirst(value);
+  }
+
+  void addLast(E value) {
+    _baseQueue.addLast(value);
+  }
+
+  void clear() {
+    _baseQueue.clear();
+  }
+
+  bool remove(Object object) => _baseQueue.remove(object);
+
+  void removeWhere(bool test(E element)) {
+    _baseQueue.removeWhere(test);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _baseQueue.retainWhere(test);
+  }
+
+  E removeFirst() => _baseQueue.removeFirst();
+
+  E removeLast() => _baseQueue.removeLast();
+}
+
+/// A [Map] that delegates all operations to a base map.
+///
+/// This class can be used to hide non-`Map` methods of an object that extends
+/// `Map`, or it can be extended to add extra functionality on top of an
+/// existing map object.
+class DelegatingMap<K, V> implements Map<K, V> {
+  final Map<K, V> _base;
+
+  const DelegatingMap(Map<K, V> base) : _base = base;
+
+  /// Creates a wrapper that asserts the types of keys and values in [base].
+  ///
+  /// This soundly converts a [Map] without generic types to a `Map<K, V>` by
+  /// asserting that its keys are instances of `E` and its values are instances
+  /// of `V` whenever they're accessed. If they're not, it throws a [CastError].
+  /// Note that even if an operation throws a [CastError], it may still mutate
+  /// the underlying collection.
+  ///
+  /// This forwards all operations to [base], so any changes in [base] will be
+  /// reflected in [this]. If [base] is already a `Map<K, V>`, it's returned
+  /// unmodified.
+  static Map<K, V> typed<K, V>(Map base) =>
+      base is Map<K, V> ? base : new TypeSafeMap<K, V>(base);
+
+  V operator [](Object key) => _base[key];
+
+  void operator []=(K key, V value) {
+    _base[key] = value;
+  }
+
+  void addAll(Map<K, V> other) {
+    _base.addAll(other);
+  }
+
+  void clear() {
+    _base.clear();
+  }
+
+  bool containsKey(Object key) => _base.containsKey(key);
+
+  bool containsValue(Object value) => _base.containsValue(value);
+
+  void forEach(void f(K key, V value)) {
+    _base.forEach(f);
+  }
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterable<K> get keys => _base.keys;
+
+  int get length => _base.length;
+
+  V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
+
+  V remove(Object key) => _base.remove(key);
+
+  Iterable<V> get values => _base.values;
+
+  String toString() => _base.toString();
+}
+
+/// An unmodifiable [Set] view of the keys of a [Map].
+///
+/// The set delegates all operations to the underlying map.
+///
+/// A `Map` can only contain each key once, so its keys can always
+/// be viewed as a `Set` without any loss, even if the [Map.keys]
+/// getter only shows an [Iterable] view of the keys.
+///
+/// Note that [lookup] is not supported for this set.
+class MapKeySet<E> extends _DelegatingIterableBase<E>
+    with UnmodifiableSetMixin<E> {
+  final Map<E, dynamic> _baseMap;
+
+  MapKeySet(Map<E, dynamic> base) : _baseMap = base;
+
+  Iterable<E> get _base => _baseMap.keys;
+
+  bool contains(Object element) => _baseMap.containsKey(element);
+
+  bool get isEmpty => _baseMap.isEmpty;
+
+  bool get isNotEmpty => _baseMap.isNotEmpty;
+
+  int get length => _baseMap.length;
+
+  String toString() => "{${_base.join(', ')}}";
+
+  bool containsAll(Iterable<Object> other) => other.every(contains);
+
+  /// Returns a new set with the the elements of [this] that are not in [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] that are
+  /// not elements of [other] according to `other.contains`.
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<E> difference(Set<Object> other) =>
+      where((element) => !other.contains(element)).toSet();
+
+  /// Returns a new set which is the intersection between [this] and [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] that are
+  /// also elements of [other] according to `other.contains`.
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<E> intersection(Set<Object> other) => where(other.contains).toSet();
+
+  /// Throws an [UnsupportedError] since there's no corresponding method for
+  /// [Map]s.
+  E lookup(Object element) =>
+      throw new UnsupportedError("MapKeySet doesn't support lookup().");
+
+  /// Returns a new set which contains all the elements of [this] and [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] and all
+  /// the elements of [other].
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<E> union(Set<E> other) => toSet()..addAll(other);
+}
+
+/// Creates a modifiable [Set] view of the values of a [Map].
+///
+/// The `Set` view assumes that the keys of the `Map` can be uniquely determined
+/// from the values. The `keyForValue` function passed to the constructor finds
+/// the key for a single value. The `keyForValue` function should be consistent
+/// with equality. If `value1 == value2` then `keyForValue(value1)` and
+/// `keyForValue(value2)` should be considered equal keys by the underlying map,
+/// and vice versa.
+///
+/// Modifying the set will modify the underlying map based on the key returned
+/// by `keyForValue`.
+///
+/// If the `Map` contents are not compatible with the `keyForValue` function,
+/// the set will not work consistently, and may give meaningless responses or do
+/// inconsistent updates.
+///
+/// This set can, for example, be used on a map from database record IDs to the
+/// records. It exposes the records as a set, and allows for writing both
+/// `recordSet.add(databaseRecord)` and `recordMap[id]`.
+///
+/// Effectively, the map will act as a kind of index for the set.
+class MapValueSet<K, V> extends _DelegatingIterableBase<V> implements Set<V> {
+  final Map<K, V> _baseMap;
+  final _KeyForValue<K, V> _keyForValue;
+
+  /// Creates a new [MapValueSet] based on [base].
+  ///
+  /// [keyForValue] returns the key in the map that should be associated with
+  /// the given value. The set's notion of equality is identical to the equality
+  /// of the return values of [keyForValue].
+  MapValueSet(Map<K, V> base, K keyForValue(V value))
+      : _baseMap = base,
+        _keyForValue = keyForValue;
+
+  Iterable<V> get _base => _baseMap.values;
+
+  bool contains(Object element) {
+    if (element != null && element is! V) return false;
+    var key = _keyForValue(element as V);
+
+    return _baseMap.containsKey(key);
+  }
+
+  bool get isEmpty => _baseMap.isEmpty;
+
+  bool get isNotEmpty => _baseMap.isNotEmpty;
+
+  int get length => _baseMap.length;
+
+  String toString() => toSet().toString();
+
+  bool add(V value) {
+    K key = _keyForValue(value);
+    bool result = false;
+    _baseMap.putIfAbsent(key, () {
+      result = true;
+      return value;
+    });
+    return result;
+  }
+
+  void addAll(Iterable<V> elements) => elements.forEach(add);
+
+  void clear() => _baseMap.clear();
+
+  bool containsAll(Iterable<Object> other) => other.every(contains);
+
+  /// Returns a new set with the the elements of [this] that are not in [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] that are
+  /// not elements of [other] according to `other.contains`.
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<V> difference(Set<Object> other) =>
+      where((element) => !other.contains(element)).toSet();
+
+  /// Returns a new set which is the intersection between [this] and [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] that are
+  /// also elements of [other] according to `other.contains`.
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<V> intersection(Set<Object> other) => where(other.contains).toSet();
+
+  V lookup(Object element) {
+    if (element != null && element is! V) return null;
+    var key = _keyForValue(element as V);
+
+    return _baseMap[key];
+  }
+
+  bool remove(Object element) {
+    if (element != null && element is! V) return false;
+    var key = _keyForValue(element as V);
+
+    if (!_baseMap.containsKey(key)) return false;
+    _baseMap.remove(key);
+    return true;
+  }
+
+  void removeAll(Iterable<Object> elements) => elements.forEach(remove);
+
+  void removeWhere(bool test(V element)) {
+    var toRemove = [];
+    _baseMap.forEach((key, value) {
+      if (test(value)) toRemove.add(key);
+    });
+    toRemove.forEach(_baseMap.remove);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    var valuesToRetain = new Set<V>.identity();
+    for (var element in elements) {
+      if (element != null && element is! V) continue;
+      var key = _keyForValue(element as V);
+
+      if (!_baseMap.containsKey(key)) continue;
+      valuesToRetain.add(_baseMap[key]);
+    }
+
+    var keysToRemove = [];
+    _baseMap.forEach((k, v) {
+      if (!valuesToRetain.contains(v)) keysToRemove.add(k);
+    });
+    keysToRemove.forEach(_baseMap.remove);
+  }
+
+  void retainWhere(bool test(V element)) =>
+      removeWhere((element) => !test(element));
+
+  /// Returns a new set which contains all the elements of [this] and [other].
+  ///
+  /// That is, the returned set contains all the elements of this [Set] and all
+  /// the elements of [other].
+  ///
+  /// Note that the returned set will use the default equality operation, which
+  /// may be different than the equality operation [this] uses.
+  Set<V> union(Set<V> other) => toSet()..addAll(other);
+}
diff --git a/packages/collection/lib/wrappers.dart b/packages/collection/lib/wrappers.dart
index 30c736e..13031f5 100644
--- a/packages/collection/lib/wrappers.dart
+++ b/packages/collection/lib/wrappers.dart
@@ -2,569 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Delegating wrappers for [Iterable], [List], [Set], [Queue] and [Map].
- *
- * Also adds unmodifiable views for `Set` and `Map`, and a fixed length
- * view for `List`. The unmodifiable list view from `dart:collection` is
- * exported as well, just for completeness.
- */
+/// Import `collection.dart` instead.
+@Deprecated("Will be removed in collection 2.0.0.")
 library dart.pkg.collection.wrappers;
 
-import "dart:collection";
-import "dart:math" show Random;
-
-import "src/unmodifiable_wrappers.dart";
-
 export "src/canonicalized_map.dart";
 export "src/unmodifiable_wrappers.dart";
-
-/**
- * A base class for delegating iterables.
- *
- * Subclasses can provide a [_base] that should be delegated to. Unlike
- * [DelegatingIterable], this allows the base to be created on demand.
- */
-abstract class _DelegatingIterableBase<E> implements Iterable<E> {
-  Iterable<E> get _base;
-
-  const _DelegatingIterableBase();
-
-  bool any(bool test(E element)) => _base.any(test);
-
-  bool contains(Object element) => _base.contains(element);
-
-  E elementAt(int index) => _base.elementAt(index);
-
-  bool every(bool test(E element)) => _base.every(test);
-
-  Iterable expand(Iterable f(E element)) => _base.expand(f);
-
-  E get first => _base.first;
-
-  E firstWhere(bool test(E element), {E orElse()}) =>
-      _base.firstWhere(test, orElse: orElse);
-
-  fold(initialValue, combine(previousValue, E element)) =>
-      _base.fold(initialValue, combine);
-
-  void forEach(void f(E element)) => _base.forEach(f);
-
-  bool get isEmpty => _base.isEmpty;
-
-  bool get isNotEmpty => _base.isNotEmpty;
-
-  Iterator<E> get iterator => _base.iterator;
-
-  String join([String separator = ""]) => _base.join(separator);
-
-  E get last => _base.last;
-
-  E lastWhere(bool test(E element), {E orElse()}) =>
-      _base.lastWhere(test, orElse: orElse);
-
-  int get length => _base.length;
-
-  Iterable map(f(E element)) => _base.map(f);
-
-  E reduce(E combine(E value, E element)) => _base.reduce(combine);
-
-  E get single => _base.single;
-
-  E singleWhere(bool test(E element)) => _base.singleWhere(test);
-
-  Iterable<E> skip(int n) => _base.skip(n);
-
-  Iterable<E> skipWhile(bool test(E value)) => _base.skipWhile(test);
-
-  Iterable<E> take(int n) => _base.take(n);
-
-  Iterable<E> takeWhile(bool test(E value)) => _base.takeWhile(test);
-
-  List<E> toList({bool growable: true}) => _base.toList(growable: growable);
-
-  Set<E> toSet() => _base.toSet();
-
-  Iterable<E> where(bool test(E element)) => _base.where(test);
-
-  String toString() => _base.toString();
-}
-
-/**
- * Creates an [Iterable] that delegates all operations to a base iterable.
- *
- * This class can be used hide non-`Iterable` methods of an iterable object,
- * or it can be extended to add extra functionality on top of an existing
- * iterable object.
- */
-class DelegatingIterable<E> extends _DelegatingIterableBase<E> {
-  final Iterable<E> _base;
-
-  /**
-   * Create a wrapper that forwards operations to [base].
-   */
-  const DelegatingIterable(Iterable<E> base) : _base = base;
-}
-
-
-/**
- * Creates a [List] that delegates all operations to a base list.
- *
- * This class can be used hide non-`List` methods of a list object,
- * or it can be extended to add extra functionality on top of an existing
- * list object.
- */
-class DelegatingList<E> extends DelegatingIterable<E> implements List<E> {
-  const DelegatingList(List<E> base) : super(base);
-
-  List<E> get _listBase => _base;
-
-  E operator [](int index) => _listBase[index];
-
-  void operator []=(int index, E value) {
-    _listBase[index] = value;
-  }
-
-  void add(E value) {
-    _listBase.add(value);
-  }
-
-  void addAll(Iterable<E> iterable) {
-    _listBase.addAll(iterable);
-  }
-
-  Map<int, E> asMap() => _listBase.asMap();
-
-  void clear() {
-    _listBase.clear();
-  }
-
-  void fillRange(int start, int end, [E fillValue]) {
-    _listBase.fillRange(start, end, fillValue);
-  }
-
-  Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
-
-  int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
-
-  void insert(int index, E element) {
-    _listBase.insert(index, element);
-  }
-
-  void insertAll(int index, Iterable<E> iterable) {
-    _listBase.insertAll(index, iterable);
-  }
-
-  int lastIndexOf(E element, [int start]) =>
-      _listBase.lastIndexOf(element, start);
-
-  void set length(int newLength) {
-    _listBase.length = newLength;
-  }
-
-  bool remove(Object value) => _listBase.remove(value);
-
-  E removeAt(int index) => _listBase.removeAt(index);
-
-  E removeLast() => _listBase.removeLast();
-
-  void removeRange(int start, int end) {
-    _listBase.removeRange(start, end);
-  }
-
-  void removeWhere(bool test(E element)) {
-    _listBase.removeWhere(test);
-  }
-
-  void replaceRange(int start, int end, Iterable<E> iterable) {
-    _listBase.replaceRange(start, end, iterable);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _listBase.retainWhere(test);
-  }
-
-  Iterable<E> get reversed => _listBase.reversed;
-
-  void setAll(int index, Iterable<E> iterable) {
-    _listBase.setAll(index, iterable);
-  }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    _listBase.setRange(start, end, iterable, skipCount);
-  }
-
-  void shuffle([Random random]) {
-    _listBase.shuffle(random);
-  }
-
-  void sort([int compare(E a, E b)]) {
-    _listBase.sort(compare);
-  }
-
-  List<E> sublist(int start, [int end]) => _listBase.sublist(start, end);
-}
-
-
-/**
- * Creates a [Set] that delegates all operations to a base set.
- *
- * This class can be used hide non-`Set` methods of a set object,
- * or it can be extended to add extra functionality on top of an existing
- * set object.
- */
-class DelegatingSet<E> extends DelegatingIterable<E> implements Set<E> {
-  const DelegatingSet(Set<E> base) : super(base);
-
-  Set<E> get _setBase => _base;
-
-  bool add(E value) => _setBase.add(value);
-
-  void addAll(Iterable<E> elements) {
-    _setBase.addAll(elements);
-  }
-
-  void clear() {
-    _setBase.clear();
-  }
-
-  bool containsAll(Iterable<Object> other) => _setBase.containsAll(other);
-
-  Set<E> difference(Set<E> other) => _setBase.difference(other);
-
-  Set<E> intersection(Set<Object> other) => _setBase.intersection(other);
-
-  E lookup(Object element) => _setBase.lookup(element);
-
-  bool remove(Object value) => _setBase.remove(value);
-
-  void removeAll(Iterable<Object> elements) {
-    _setBase.removeAll(elements);
-  }
-
-  void removeWhere(bool test(E element)) {
-    _setBase.removeWhere(test);
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    _setBase.retainAll(elements);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _setBase.retainWhere(test);
-  }
-
-  Set<E> union(Set<E> other) => _setBase.union(other);
-
-  Set<E> toSet() => new DelegatingSet<E>(_setBase.toSet());
-}
-
-/**
- * Creates a [Queue] that delegates all operations to a base queue.
- *
- * This class can be used hide non-`Queue` methods of a queue object,
- * or it can be extended to add extra functionality on top of an existing
- * queue object.
- */
-class DelegatingQueue<E> extends DelegatingIterable<E> implements Queue<E> {
-  const DelegatingQueue(Queue<E> queue) : super(queue);
-
-  Queue<E> get _baseQueue => _base;
-
-  void add(E value) {
-    _baseQueue.add(value);
-  }
-
-  void addAll(Iterable<E> iterable) {
-    _baseQueue.addAll(iterable);
-  }
-
-  void addFirst(E value) {
-    _baseQueue.addFirst(value);
-  }
-
-  void addLast(E value) {
-    _baseQueue.addLast(value);
-  }
-
-  void clear() {
-    _baseQueue.clear();
-  }
-
-  bool remove(Object object) => _baseQueue.remove(object);
-
-  void removeWhere(bool test(E element)) { _baseQueue.removeWhere(test); }
-
-  void retainWhere(bool test(E element)) { _baseQueue.retainWhere(test); }
-
-  E removeFirst() => _baseQueue.removeFirst();
-
-  E removeLast() => _baseQueue.removeLast();
-}
-
-/**
- * Creates a [Map] that delegates all operations to a base map.
- *
- * This class can be used hide non-`Map` methods of an object that extends
- * `Map`, or it can be extended to add extra functionality on top of an existing
- * map object.
- */
-class DelegatingMap<K, V> implements Map<K, V> {
-  final Map<K, V> _base;
-
-  const DelegatingMap(Map<K, V> base) : _base = base;
-
-  V operator [](Object key) => _base[key];
-
-  void operator []=(K key, V value) {
-    _base[key] = value;
-  }
-
-  void addAll(Map<K, V> other) {
-    _base.addAll(other);
-  }
-
-  void clear() {
-    _base.clear();
-  }
-
-  bool containsKey(Object key) => _base.containsKey(key);
-
-  bool containsValue(Object value) => _base.containsValue(value);
-
-  void forEach(void f(K key, V value)) {
-    _base.forEach(f);
-  }
-
-  bool get isEmpty => _base.isEmpty;
-
-  bool get isNotEmpty => _base.isNotEmpty;
-
-  Iterable<K> get keys => _base.keys;
-
-  int get length => _base.length;
-
-  V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
-
-  V remove(Object key) => _base.remove(key);
-
-  Iterable<V> get values => _base.values;
-
-  String toString() => _base.toString();
-}
-
-/**
- * An unmodifiable [Set] view of the keys of a [Map].
- *
- * The set delegates all operations to the underlying map.
- *
- * A `Map` can only contain each key once, so its keys can always
- * be viewed as a `Set` without any loss, even if the [Map.keys]
- * getter only shows an [Iterable] view of the keys.
- *
- * Note that [lookup] is not supported for this set.
- */
-class MapKeySet<E> extends _DelegatingIterableBase<E>
-    with UnmodifiableSetMixin<E> {
-  final Map<E, dynamic> _baseMap;
-
-  MapKeySet(Map<E, dynamic> base) : _baseMap = base;
-
-  Iterable<E> get _base => _baseMap.keys;
-
-  bool contains(Object element) => _baseMap.containsKey(element);
-
-  bool get isEmpty => _baseMap.isEmpty;
-
-  bool get isNotEmpty => _baseMap.isNotEmpty;
-
-  int get length => _baseMap.length;
-
-  String toString() => "{${_base.join(', ')}}";
-
-  bool containsAll(Iterable<Object> other) => other.every(contains);
-
-  /**
-   * Returns a new set with the the elements of [this] that are not in [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that are
-   * not elements of [other] according to `other.contains`.
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<E> difference(Set<E> other) =>
-      where((element) => !other.contains(element)).toSet();
-
-  /**
-   * Returns a new set which is the intersection between [this] and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that are
-   * also elements of [other] according to `other.contains`.
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<E> intersection(Set<Object> other) => where(other.contains).toSet();
-
-  /**
-   * Throws an [UnsupportedError] since there's no corresponding method for
-   * [Map]s.
-   */
-  E lookup(E element) => throw new UnsupportedError(
-      "MapKeySet doesn't support lookup().");
-
-  /**
-   * Returns a new set which contains all the elements of [this] and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] and all
-   * the elements of [other].
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<E> union(Set<E> other) => toSet()..addAll(other);
-}
-
-/**
- * Creates a modifiable [Set] view of the values of a [Map].
- * 
- * The `Set` view assumes that the keys of the `Map` can be uniquely determined
- * from the values. The `keyForValue` function passed to the constructor finds
- * the key for a single value. The `keyForValue` function should be consistent
- * with equality. If `value1 == value2` then `keyForValue(value1)` and
- * `keyForValue(value2)` should be considered equal keys by the underlying map,
- * and vice versa.
- *
- * Modifying the set will modify the underlying map based on the key returned by
- * `keyForValue`.
- *
- * If the `Map` contents are not compatible with the `keyForValue` function, the
- * set will not work consistently, and may give meaningless responses or do
- * inconsistent updates.
- *
- * This set can, for example, be used on a map from database record IDs to the
- * records. It exposes the records as a set, and allows for writing both
- * `recordSet.add(databaseRecord)` and `recordMap[id]`.
- *
- * Effectively, the map will act as a kind of index for the set.
- */
-class MapValueSet<K, V> extends _DelegatingIterableBase<V> implements Set<V> {
-  final Map<K, V> _baseMap;
-  final Function _keyForValue;
-
-  /**
-   * Creates a new [MapValueSet] based on [base].
-   *
-   * [keyForValue] returns the key in the map that should be associated with the
-   * given value. The set's notion of equality is identical to the equality of
-   * the return values of [keyForValue].
-   */
-  MapValueSet(Map<K, V> base, K keyForValue(V value))
-      : _baseMap = base,
-        _keyForValue = keyForValue;
-
-  Iterable<V> get _base => _baseMap.values;
-
-  bool contains(Object element) {
-    if (element != null && element is! V) return false;
-    return _baseMap.containsKey(_keyForValue(element));
-  }
-
-  bool get isEmpty => _baseMap.isEmpty;
-
-  bool get isNotEmpty => _baseMap.isNotEmpty;
-
-  int get length => _baseMap.length;
-
-  String toString() => toSet().toString();
-
-  bool add(V value) {
-    K key = _keyForValue(value);
-    bool result = false;
-    _baseMap.putIfAbsent(key, () {
-      result = true;
-      return value;
-    });
-    return result;
-  }
-
-  void addAll(Iterable<V> elements) => elements.forEach(add);
-
-  void clear() => _baseMap.clear();
-
-  bool containsAll(Iterable<Object> other) => other.every(contains);
-
-  /**
-   * Returns a new set with the the elements of [this] that are not in [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that are
-   * not elements of [other] according to `other.contains`.
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<V> difference(Set<V> other) =>
-      where((element) => !other.contains(element)).toSet();
-
-  /**
-   * Returns a new set which is the intersection between [this] and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that are
-   * also elements of [other] according to `other.contains`.
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<V> intersection(Set<Object> other) => where(other.contains).toSet();
-
-  V lookup(Object element) => _baseMap[_keyForValue(element)];
-
-  bool remove(Object value) {
-    if (value != null && value is! V) return false;
-    var key = _keyForValue(value);
-    if (!_baseMap.containsKey(key)) return false;
-    _baseMap.remove(key);
-    return true;
-  }
-
-  void removeAll(Iterable<Object> elements) => elements.forEach(remove);
-
-  void removeWhere(bool test(V element)) {
-    var toRemove = [];
-    _baseMap.forEach((key, value) {
-      if (test(value)) toRemove.add(key);
-    });
-    toRemove.forEach(_baseMap.remove);
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    var valuesToRetain = new Set<V>.identity();
-    for (var element in elements) {
-      if (element != null && element is! V) continue;
-      var key = _keyForValue(element);
-      if (!_baseMap.containsKey(key)) continue;
-      valuesToRetain.add(_baseMap[key]);
-    }
-
-    var keysToRemove = [];
-    _baseMap.forEach((k, v) {
-      if (!valuesToRetain.contains(v)) keysToRemove.add(k);
-    });
-    keysToRemove.forEach(_baseMap.remove);
-  }
-
-  void retainWhere(bool test(V element)) =>
-      removeWhere((element) => !test(element));
-
-  /**
-   * Returns a new set which contains all the elements of [this] and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] and all
-   * the elements of [other].
-   *
-   * Note that the returned set will use the default equality operation, which
-   * may be different than the equality operation [this] uses.
-   */
-  Set<V> union(Set<V> other) => toSet()..addAll(other);
-}
+export "src/wrappers.dart";
diff --git a/packages/collection/pubspec.yaml b/packages/collection/pubspec.yaml
index 3642321..5d88529 100644
--- a/packages/collection/pubspec.yaml
+++ b/packages/collection/pubspec.yaml
@@ -1,9 +1,9 @@
 name: collection
-version: 1.2.0
+version: 1.14.3
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: https://www.github.com/dart-lang/collection
 environment:
-  sdk: '>=1.5.0 <2.0.0'
+  sdk: '>=1.21.0 <2.0.0'
 dev_dependencies:
   test: '^0.12.0'
diff --git a/packages/collection/test/algorithms_test.dart b/packages/collection/test/algorithms_test.dart
index 61fbf5b..dbd2633 100644
--- a/packages/collection/test/algorithms_test.dart
+++ b/packages/collection/test/algorithms_test.dart
@@ -43,18 +43,19 @@
       if (count == 10) fail("Shuffle didn't change order.");
     } while (true);
   });
-  test("Shuffle sublist", (){
+  test("Shuffle sublist", () {
     List l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
     List c = l.toList();
     shuffle(l, 4, 12);
-    expect(const IterableEquality().equals(l.getRange(0, 4),
-                                           c.getRange(0, 4)), isTrue);
-    expect(const IterableEquality().equals(l.getRange(12, 16),
-                                           c.getRange(12, 16)), isTrue);
-    expect(const UnorderedIterableEquality().equals(l.getRange(4, 12),
-                                                    c.getRange(4, 12)),
-           isTrue);
-
+    expect(const IterableEquality().equals(l.getRange(0, 4), c.getRange(0, 4)),
+        isTrue);
+    expect(
+        const IterableEquality().equals(l.getRange(12, 16), c.getRange(12, 16)),
+        isTrue);
+    expect(
+        const UnorderedIterableEquality()
+            .equals(l.getRange(4, 12), c.getRange(4, 12)),
+        isTrue);
   });
 
   test("binsearch0", () {
@@ -78,7 +79,7 @@
   });
 
   test("binsearchCompare0", () {
-    expect(binarySearch([], new C(2), compare: compareC), equals(-1));
+    expect(binarySearch(<C>[], new C(2), compare: compareC), equals(-1));
   });
 
   test("binsearchCompare1", () {
@@ -99,12 +100,66 @@
     expect(binarySearch(l3, new C(12), compare: compareC), equals(-1));
   });
 
+  test("lowerbound0", () {
+    expect(lowerBound([], 2), equals(0));
+  });
+
+  test("lowerbound1", () {
+    expect(lowerBound([5], 2), equals(0));
+    expect(lowerBound([5], 5), equals(0));
+    expect(lowerBound([5], 7), equals(1));
+  });
+
+  test("lowerbound3", () {
+    expect(lowerBound([0, 5, 10], -1), equals(0));
+    expect(lowerBound([0, 5, 10], 0), equals(0));
+    expect(lowerBound([0, 5, 10], 2), equals(1));
+    expect(lowerBound([0, 5, 10], 5), equals(1));
+    expect(lowerBound([0, 5, 10], 7), equals(2));
+    expect(lowerBound([0, 5, 10], 10), equals(2));
+    expect(lowerBound([0, 5, 10], 12), equals(3));
+  });
+
+  test("lowerboundRepeat", () {
+    expect(lowerBound([5, 5, 5], 5), equals(0));
+    expect(lowerBound([0, 5, 5, 5, 10], 5), equals(1));
+  });
+
+  test("lowerboundCompare0", () {
+    expect(lowerBound(<C>[], new C(2), compare: compareC), equals(0));
+  });
+
+  test("lowerboundCompare1", () {
+    var l1 = [new C(5)];
+    expect(lowerBound(l1, new C(2), compare: compareC), equals(0));
+    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
+    expect(lowerBound(l1, new C(7), compare: compareC), equals(1));
+  });
+
+  test("lowerboundCompare3", () {
+    var l3 = [new C(0), new C(5), new C(10)];
+    expect(lowerBound(l3, new C(-1), compare: compareC), equals(0));
+    expect(lowerBound(l3, new C(0), compare: compareC), equals(0));
+    expect(lowerBound(l3, new C(2), compare: compareC), equals(1));
+    expect(lowerBound(l3, new C(5), compare: compareC), equals(1));
+    expect(lowerBound(l3, new C(7), compare: compareC), equals(2));
+    expect(lowerBound(l3, new C(10), compare: compareC), equals(2));
+    expect(lowerBound(l3, new C(12), compare: compareC), equals(3));
+  });
+
+  test("lowerboundCompareRepeat", () {
+    var l1 = [new C(5), new C(5), new C(5)];
+    var l2 = [new C(0), new C(5), new C(5), new C(5), new C(10)];
+    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
+    expect(lowerBound(l2, new C(5), compare: compareC), equals(1));
+  });
+
   test("insertionSortRandom", () {
     Random random = new Random();
     for (int i = 0; i < 25; i++) {
       List list = new List(i);
       for (int j = 0; j < i; j++) {
-        list[j] = random.nextInt(25);  // Expect some equal elements.
+        list[j] = random.nextInt(25); // Expect some equal elements.
       }
       insertionSort(list);
       for (int j = 1; j < i; j++) {
@@ -142,7 +197,7 @@
     for (int i = 0; i < 250; i += 1) {
       List list = new List(i);
       for (int j = 0; j < i; j++) {
-        list[j] = random.nextInt(i);  // Expect some equal elements.
+        list[j] = random.nextInt(i); // Expect some equal elements.
       }
       mergeSort(list);
       for (int j = 1; j < i; j++) {
@@ -260,6 +315,7 @@
   final int id;
   C(this.id);
 }
+
 int compareC(C one, C other) => one.id - other.id;
 
 class OC implements Comparable<OC> {
diff --git a/packages/collection/test/canonicalized_map_test.dart b/packages/collection/test/canonicalized_map_test.dart
index f5f009b..437e44f 100644
--- a/packages/collection/test/canonicalized_map_test.dart
+++ b/packages/collection/test/canonicalized_map_test.dart
@@ -10,7 +10,7 @@
     var map;
     setUp(() {
       map = new CanonicalizedMap<int, String, String>(int.parse,
-          isValidKey: new RegExp(r"^\d+$").hasMatch);
+          isValidKey: (s) => new RegExp(r"^\d+$").hasMatch(s));
     });
 
     test("canonicalizes keys on set and get", () {
@@ -22,33 +22,28 @@
       expect(map["foo"], isNull);
     });
 
+    test("set affects nothing for uncanonicalizable key", () {
+      map["foo"] = "value";
+      expect(map["foo"], isNull);
+      expect(map.containsKey("foo"), isFalse);
+      expect(map.length, equals(0));
+    });
+
     test("canonicalizes keys for addAll", () {
-      map.addAll({
-        "1": "value 1",
-        "2": "value 2",
-        "3": "value 3"
-      });
+      map.addAll({"1": "value 1", "2": "value 2", "3": "value 3"});
       expect(map["01"], equals("value 1"));
       expect(map["02"], equals("value 2"));
       expect(map["03"], equals("value 3"));
     });
 
     test("uses the final value for addAll collisions", () {
-      map.addAll({
-        "1": "value 1",
-        "01": "value 2",
-        "001": "value 3"
-      });
+      map.addAll({"1": "value 1", "01": "value 2", "001": "value 3"});
       expect(map.length, equals(1));
       expect(map["0001"], equals("value 3"));
     });
 
     test("clear clears the map", () {
-      map.addAll({
-        "1": "value 1",
-        "2": "value 2",
-        "3": "value 3"
-      });
+      map.addAll({"1": "value 1", "2": "value 2", "3": "value 3"});
       expect(map, isNot(isEmpty));
       map.clear();
       expect(map, isEmpty);
@@ -66,8 +61,8 @@
 
     test("canonicalizes keys for putIfAbsent", () {
       map["1"] = "value";
-      expect(map.putIfAbsent("01", () => throw "shouldn't run"),
-             equals("value"));
+      expect(
+          map.putIfAbsent("01", () => throw "shouldn't run"), equals("value"));
       expect(map.putIfAbsent("2", () => "new value"), equals("new value"));
     });
 
@@ -130,12 +125,8 @@
     });
 
     test("values returns all values in the map", () {
-      map.addAll({
-        "1": "value 1",
-        "01": "value 01",
-        "2": "value 2",
-        "03": "value 03"
-      });
+      map.addAll(
+          {"1": "value 1", "01": "value 01", "2": "value 2", "03": "value 03"});
 
       expect(map.values, equals(["value 01", "value 2", "value 03"]));
     });
@@ -143,22 +134,16 @@
 
   group("CanonicalizedMap.from", () {
     test("canonicalizes its keys", () {
-      var map = new CanonicalizedMap.from({
-        "1": "value 1",
-        "2": "value 2",
-        "3": "value 3"
-      }, int.parse);
+      var map = new CanonicalizedMap.from(
+          {"1": "value 1", "2": "value 2", "3": "value 3"}, int.parse);
       expect(map["01"], equals("value 1"));
       expect(map["02"], equals("value 2"));
       expect(map["03"], equals("value 3"));
     });
 
     test("uses the final value for collisions", () {
-      var map = new CanonicalizedMap.from({
-        "1": "value 1",
-        "01": "value 2",
-        "001": "value 3"
-      }, int.parse);
+      var map = new CanonicalizedMap.from(
+          {"1": "value 1", "01": "value 2", "001": "value 3"}, int.parse);
       expect(map.length, equals(1));
       expect(map["0001"], equals("value 3"));
     });
diff --git a/packages/collection/test/combined_wrapper/iterable_test.dart b/packages/collection/test/combined_wrapper/iterable_test.dart
new file mode 100644
index 0000000..3301821
--- /dev/null
+++ b/packages/collection/test/combined_wrapper/iterable_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var iterable1 = new Iterable.generate(3);
+  var iterable2 = new Iterable.generate(3, (i) => i + 3);
+  var iterable3 = new Iterable.generate(3, (i) => i + 6);
+
+  test('should combine multiple iterables when iterating', () {
+    var combined = new CombinedIterableView([iterable1, iterable2, iterable3]);
+    expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
+  });
+
+  test('should combine multiple iterables with some empty ones', () {
+    var combined =
+        new CombinedIterableView([iterable1, [], iterable2, [], iterable3, []]);
+    expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
+  });
+
+  test('should function as an empty iterable when no iterables are passed', () {
+    var empty = new CombinedIterableView([]);
+    expect(empty, isEmpty);
+  });
+
+  test('should function as an empty iterable with all empty iterables', () {
+    var empty = new CombinedIterableView([[], [], []]);
+    expect(empty, isEmpty);
+  });
+
+  test('should reflect changes from the underlying iterables', () {
+    var list1 = [];
+    var list2 = [];
+    var combined = new CombinedIterableView([list1, list2]);
+    expect(combined, isEmpty);
+    list1.addAll([1, 2]);
+    list2.addAll([3, 4]);
+    expect(combined, [1, 2, 3, 4]);
+    expect(combined.last, 4);
+    expect(combined.first, 1);
+  });
+
+  test('should reflect changes from the iterable of iterables', () {
+    var iterables = <Iterable>[];
+    var combined = new CombinedIterableView(iterables);
+    expect(combined, isEmpty);
+    expect(combined, hasLength(0));
+
+    iterables.add(iterable1);
+    expect(combined, isNotEmpty);
+    expect(combined, hasLength(3));
+
+    iterables.clear();
+    expect(combined, isEmpty);
+    expect(combined, hasLength(0));
+  });
+}
diff --git a/packages/collection/test/combined_wrapper/list_test.dart b/packages/collection/test/combined_wrapper/list_test.dart
new file mode 100644
index 0000000..1a00f32
--- /dev/null
+++ b/packages/collection/test/combined_wrapper/list_test.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+
+import '../unmodifiable_collection_test.dart' as common;
+
+void main() {
+  var list1 = [1, 2, 3];
+  var list2 = [4, 5, 6];
+  var list3 = [7, 8, 9];
+  var concat = []..addAll(list1)..addAll(list2)..addAll(list3);
+
+  // In every way possible this should test the same as an UnmodifiableListView.
+  common.testUnmodifiableList(
+      concat, new CombinedListView([list1, list2, list3]), 'combineLists');
+
+  common.testUnmodifiableList(concat,
+      new CombinedListView([list1, [], list2, [], list3, []]), 'combineLists');
+
+  test('should function as an empty list when no lists are passed', () {
+    var empty = new CombinedListView([]);
+    expect(empty, isEmpty);
+    expect(empty.length, 0);
+    expect(() => empty[0], throwsRangeError);
+  });
+
+  test('should function as an empty list when only empty lists are passed', () {
+    var empty = new CombinedListView([[], [], []]);
+    expect(empty, isEmpty);
+    expect(empty.length, 0);
+    expect(() => empty[0], throwsRangeError);
+  });
+
+  test('should reflect underlying changes back to the combined list', () {
+    var backing1 = <int>[];
+    var backing2 = <int>[];
+    var combined = new CombinedListView([backing1, backing2]);
+    expect(combined, isEmpty);
+    backing1.addAll(list1);
+    expect(combined, list1);
+    backing2.addAll(list2);
+    expect(combined, backing1.toList()..addAll(backing2));
+  });
+
+  test('should reflect underlying changes from the list of lists', () {
+    var listOfLists = <List<int>>[];
+    var combined = new CombinedListView(listOfLists);
+    expect(combined, isEmpty);
+    listOfLists.add(list1);
+    expect(combined, list1);
+    listOfLists.add(list2);
+    expect(combined, []..addAll(list1)..addAll(list2));
+    listOfLists.clear();
+    expect(combined, isEmpty);
+  });
+
+  test('should reflect underlying changes with a single list', () {
+    var backing1 = <int>[];
+    var combined = new CombinedListView([backing1]);
+    expect(combined, isEmpty);
+    backing1.addAll(list1);
+    expect(combined, list1);
+  });
+}
diff --git a/packages/collection/test/combined_wrapper/map_test.dart b/packages/collection/test/combined_wrapper/map_test.dart
new file mode 100644
index 0000000..832fe36
--- /dev/null
+++ b/packages/collection/test/combined_wrapper/map_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+
+import '../unmodifiable_collection_test.dart' as common;
+
+void main() {
+  var map1 = const {1: 1, 2: 2, 3: 3};
+  var map2 = const {4: 4, 5: 5, 6: 6};
+  var map3 = const {7: 7, 8: 8, 9: 9};
+  var concat = {}..addAll(map1)..addAll(map2)..addAll(map3);
+
+  // In every way possible this should test the same as an UnmodifiableMapView.
+  common.testReadMap(
+      concat, new CombinedMapView([map1, map2, map3]), 'CombinedMapView');
+
+  common.testReadMap(
+      concat,
+      new CombinedMapView([map1, {}, map2, {}, map3, {}]),
+      'CombinedMapView (some empty)');
+
+  test('should function as an empty map when no maps are passed', () {
+    var empty = new CombinedMapView([]);
+    expect(empty, isEmpty);
+    expect(empty.length, 0);
+  });
+
+  test('should function as an empty map when only empty maps are passed', () {
+    var empty = new CombinedMapView([{}, {}, {}]);
+    expect(empty, isEmpty);
+    expect(empty.length, 0);
+  });
+
+  test('should reflect underlying changes back to the combined map', () {
+    var backing1 = <int, int>{};
+    var backing2 = <int, int>{};
+    var combined = new CombinedMapView([backing1, backing2]);
+    expect(combined, isEmpty);
+    backing1.addAll(map1);
+    expect(combined, map1);
+    backing2.addAll(map2);
+    expect(combined, new Map.from(backing1)..addAll(backing2));
+  });
+
+  test('should reflect underlying changes with a single map', () {
+    var backing1 = <int, int>{};
+    var combined = new CombinedMapView([backing1]);
+    expect(combined, isEmpty);
+    backing1.addAll(map1);
+    expect(combined, map1);
+  });
+}
diff --git a/packages/collection/test/comparators_test.dart b/packages/collection/test/comparators_test.dart
index 4acdc2c..aa868d9 100644
--- a/packages/collection/test/comparators_test.dart
+++ b/packages/collection/test/comparators_test.dart
@@ -57,63 +57,63 @@
     "~"
   ];
 
-  sortedBy(compare) => strings.toList()..shuffle()..sort(compare);
+  sortedBy(compare) => strings.toList()
+    ..shuffle()
+    ..sort(compare);
 
   test("String.compareTo", () {
     expect(sortedBy(null), strings);
   });
   test("compareAsciiLowerCase", () {
-    expect(sortedBy(compareAsciiLowerCase),
-           sortedBy((a, b) {
-             int delta = a.toLowerCase().compareTo(b.toLowerCase());
-             if (delta != 0) return delta;
-             if (a == b) return 0;
-             return a.compareTo(b);
-           }));
+    expect(sortedBy(compareAsciiLowerCase), sortedBy((a, b) {
+      int delta = a.toLowerCase().compareTo(b.toLowerCase());
+      if (delta != 0) return delta;
+      if (a == b) return 0;
+      return a.compareTo(b);
+    }));
   });
   test("compareAsciiUpperCase", () {
-    expect(sortedBy(compareAsciiUpperCase),
-           sortedBy((a, b) {
-             int delta = a.toUpperCase().compareTo(b.toUpperCase());
-             if (delta != 0) return delta;
-             if (a == b) return 0;
-             return a.compareTo(b);
-           }));
+    expect(sortedBy(compareAsciiUpperCase), sortedBy((a, b) {
+      int delta = a.toUpperCase().compareTo(b.toUpperCase());
+      if (delta != 0) return delta;
+      if (a == b) return 0;
+      return a.compareTo(b);
+    }));
   });
 
   // Replace any digit sequence by ("0", value, length) as char codes.
   // This will sort alphabetically (by charcode) the way digits sort
   // numerically, and the leading 0 means it sorts like a digit
   // compared to non-digits.
-  replaceNumbers(string) => string.replaceAllMapped(new RegExp(r"\d+"), (m) {
-    var digits = m[0];
-    return new String.fromCharCodes([0x30, int.parse(digits), digits.length]);
-  });
+  replaceNumbers(String string) =>
+      string.replaceAllMapped(new RegExp(r"\d+"), (m) {
+        var digits = m[0];
+        return new String.fromCharCodes(
+            [0x30, int.parse(digits), digits.length]);
+      });
 
   test("compareNatural", () {
     expect(sortedBy(compareNatural),
-           sortedBy((a, b) => replaceNumbers(a).compareTo(replaceNumbers(b))));
+        sortedBy((a, b) => replaceNumbers(a).compareTo(replaceNumbers(b))));
   });
 
   test("compareAsciiLowerCaseNatural", () {
-    expect(sortedBy(compareAsciiLowerCaseNatural),
-           sortedBy((a, b) {
-             int delta = replaceNumbers(a.toLowerCase()).compareTo(
-                             replaceNumbers(b.toLowerCase()));
-             if (delta != 0) return delta;
-             if (a == b) return 0;
-             return a.compareTo(b);
-           }));
+    expect(sortedBy(compareAsciiLowerCaseNatural), sortedBy((a, b) {
+      int delta = replaceNumbers(a.toLowerCase())
+          .compareTo(replaceNumbers(b.toLowerCase()));
+      if (delta != 0) return delta;
+      if (a == b) return 0;
+      return a.compareTo(b);
+    }));
   });
 
   test("compareAsciiUpperCaseNatural", () {
-    expect(sortedBy(compareAsciiUpperCaseNatural),
-           sortedBy((a, b) {
-             int delta = replaceNumbers(a.toUpperCase()).compareTo(
-                             replaceNumbers(b.toUpperCase()));
-             if (delta != 0) return delta;
-             if (a == b) return 0;
-             return a.compareTo(b);
-           }));
+    expect(sortedBy(compareAsciiUpperCaseNatural), sortedBy((a, b) {
+      int delta = replaceNumbers(a.toUpperCase())
+          .compareTo(replaceNumbers(b.toUpperCase()));
+      if (delta != 0) return delta;
+      if (a == b) return 0;
+      return a.compareTo(b);
+    }));
   });
 }
diff --git a/packages/collection/test/equality_map_test.dart b/packages/collection/test/equality_map_test.dart
new file mode 100644
index 0000000..8225efd
--- /dev/null
+++ b/packages/collection/test/equality_map_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test("uses the given equality", () {
+    var map = new EqualityMap(const IterableEquality());
+    expect(map, isEmpty);
+
+    map[[1, 2, 3]] = 1;
+    expect(map, containsPair([1, 2, 3], 1));
+
+    map[[1, 2, 3]] = 2;
+    expect(map, containsPair([1, 2, 3], 2));
+
+    map[[2, 3, 4]] = 3;
+    expect(map, containsPair([1, 2, 3], 2));
+    expect(map, containsPair([2, 3, 4], 3));
+  });
+
+  test("EqualityMap.from() prefers the lattermost equivalent key", () {
+    var map = new EqualityMap.from(const IterableEquality(), {
+      [1, 2, 3]: 1,
+      [2, 3, 4]: 2,
+      [1, 2, 3]: 3,
+      [2, 3, 4]: 4,
+      [1, 2, 3]: 5,
+      [1, 2, 3]: 6,
+    });
+
+    expect(map, containsPair([1, 2, 3], 6));
+    expect(map, containsPair([2, 3, 4], 4));
+  });
+}
diff --git a/packages/collection/test/equality_set_test.dart b/packages/collection/test/equality_set_test.dart
new file mode 100644
index 0000000..a326b31
--- /dev/null
+++ b/packages/collection/test/equality_set_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test("uses the given equality", () {
+    var set = new EqualitySet(const IterableEquality());
+    expect(set, isEmpty);
+
+    var list1 = [1, 2, 3];
+    expect(set.add(list1), isTrue);
+    expect(set, contains([1, 2, 3]));
+    expect(set, contains(same(list1)));
+
+    var list2 = [1, 2, 3];
+    expect(set.add(list2), isFalse);
+    expect(set, contains([1, 2, 3]));
+    expect(set, contains(same(list1)));
+    expect(set, isNot(contains(same(list2))));
+
+    var list3 = [2, 3, 4];
+    expect(set.add(list3), isTrue);
+    expect(set, contains(same(list1)));
+    expect(set, contains(same(list3)));
+  });
+
+  test("EqualitySet.from() prefers the lattermost equivalent value", () {
+    var list1 = [1, 2, 3];
+    var list2 = [2, 3, 4];
+    var list3 = [1, 2, 3];
+    var list4 = [2, 3, 4];
+    var list5 = [1, 2, 3];
+    var list6 = [1, 2, 3];
+
+    var set = new EqualitySet.from(
+        const IterableEquality(), [list1, list2, list3, list4, list5, list6]);
+
+    expect(set, contains(same(list1)));
+    expect(set, contains(same(list2)));
+    expect(set, isNot(contains(same(list3))));
+    expect(set, isNot(contains(same(list4))));
+    expect(set, isNot(contains(same(list5))));
+    expect(set, isNot(contains(same(list6))));
+  });
+}
diff --git a/packages/collection/test/equality_test.dart b/packages/collection/test/equality_test.dart
index e609608..63399c1 100644
--- a/packages/collection/test/equality_test.dart
+++ b/packages/collection/test/equality_test.dart
@@ -32,31 +32,27 @@
   });
 
   test("ListEquality", () {
-    expect(const ListEquality().equals(list1, list2),
-           isTrue);
+    expect(const ListEquality().equals(list1, list2), isTrue);
     Equality listId = const ListEquality(const IdentityEquality());
     expect(listId.equals(list1, list2), isFalse);
   });
 
   test("ListInequality length", () {
     var list4 = [o(1), o(2), o(3), o(4), o(5), o(6)];
-    expect(const ListEquality().equals(list1, list4),
-           isFalse);
+    expect(const ListEquality().equals(list1, list4), isFalse);
     expect(const ListEquality(const IdentityEquality()).equals(list1, list4),
-           isFalse);
+        isFalse);
   });
 
   test("ListInequality value", () {
     var list5 = [o(1), o(2), o(3), o(4), o(6)];
-    expect(const ListEquality().equals(list1, list5),
-           isFalse);
+    expect(const ListEquality().equals(list1, list5), isFalse);
     expect(const ListEquality(const IdentityEquality()).equals(list1, list5),
-           isFalse);
+        isFalse);
   });
 
   test("UnorderedIterableEquality", () {
-    expect(const UnorderedIterableEquality().equals(list1, list3),
-           isTrue);
+    expect(const UnorderedIterableEquality().equals(list1, list3), isTrue);
     Equality uniterId =
         const UnorderedIterableEquality(const IdentityEquality());
     expect(uniterId.equals(list1, list3), isFalse);
@@ -64,20 +60,20 @@
 
   test("UnorderedIterableInequality length", () {
     var list6 = [o(1), o(3), o(5), o(4), o(2), o(1)];
-    expect(const UnorderedIterableEquality().equals(list1, list6),
-           isFalse);
-    expect(const UnorderedIterableEquality(const IdentityEquality())
-               .equals(list1, list6),
-           isFalse);
+    expect(const UnorderedIterableEquality().equals(list1, list6), isFalse);
+    expect(
+        const UnorderedIterableEquality(const IdentityEquality())
+            .equals(list1, list6),
+        isFalse);
   });
 
   test("UnorderedIterableInequality values", () {
     var list7 = [o(1), o(3), o(5), o(4), o(6)];
-    expect(const UnorderedIterableEquality().equals(list1, list7),
-           isFalse);
-    expect(const UnorderedIterableEquality(const IdentityEquality())
-               .equals(list1, list7),
-           isFalse);
+    expect(const UnorderedIterableEquality().equals(list1, list7), isFalse);
+    expect(
+        const UnorderedIterableEquality(const IdentityEquality())
+            .equals(list1, list7),
+        isFalse);
   });
 
   test("SetEquality", () {
@@ -92,73 +88,145 @@
     var list8 = [o(1), o(3), o(5), o(4), o(2), o(6)];
     var set1 = new HashSet.from(list1);
     var set2 = new LinkedHashSet.from(list8);
-    expect(const SetEquality().equals(set1, set2),
-           isFalse);
+    expect(const SetEquality().equals(set1, set2), isFalse);
     expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
-           isFalse);
+        isFalse);
   });
 
   test("SetInequality value", () {
     var list7 = [o(1), o(3), o(5), o(4), o(6)];
     var set1 = new HashSet.from(list1);
     var set2 = new LinkedHashSet.from(list7);
-    expect(const SetEquality().equals(set1, set2),
-           isFalse);
+    expect(const SetEquality().equals(set1, set2), isFalse);
     expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
-           isFalse);
+        isFalse);
   });
 
-  var map1a = {"x": [o(1), o(2), o(3)], "y": [true, false, null]};
-  var map1b = {"x": [o(4), o(5), o(6)], "y": [false, true, null]};
-  var map2a = {"x": [o(3), o(2), o(1)], "y": [false, true, null]};
-  var map2b = {"x": [o(6), o(5), o(4)], "y": [null, false, true]};
+  var map1a = {
+    "x": [o(1), o(2), o(3)],
+    "y": [true, false, null]
+  };
+  var map1b = {
+    "x": [o(4), o(5), o(6)],
+    "y": [false, true, null]
+  };
+  var map2a = {
+    "x": [o(3), o(2), o(1)],
+    "y": [false, true, null]
+  };
+  var map2b = {
+    "x": [o(6), o(5), o(4)],
+    "y": [null, false, true]
+  };
   var l1 = [map1a, map1b];
   var l2 = [map2a, map2b];
-  var s1 = new Set.from(l1);
-  var s2 = new Set.from([map2b, map2a]);
+  var s1 = new Set<Map>.from(l1);
+  var s2 = new Set<Map>.from([map2b, map2a]);
 
   test("RecursiveEquality", () {
     const unordered = const UnorderedIterableEquality();
-    expect(unordered.equals(map1a["x"], map2a["x"]),
-        isTrue);
-    expect(unordered.equals(map1a["y"], map2a["y"]),
-        isTrue);
-    expect(unordered.equals(map1b["x"], map2b["x"]),
-        isTrue);
-    expect(unordered.equals(map1b["y"], map2b["y"]),
-        isTrue);
+    expect(unordered.equals(map1a["x"], map2a["x"]), isTrue);
+    expect(unordered.equals(map1a["y"], map2a["y"]), isTrue);
+    expect(unordered.equals(map1b["x"], map2b["x"]), isTrue);
+    expect(unordered.equals(map1b["y"], map2b["y"]), isTrue);
     const mapval = const MapEquality(values: unordered);
-    expect(
-        mapval.equals(map1a, map2a),
-        isTrue);
-    expect(mapval.equals(map1b, map2b),
-        isTrue);
+    expect(mapval.equals(map1a, map2a), isTrue);
+    expect(mapval.equals(map1b, map2b), isTrue);
     const listmapval = const ListEquality(mapval);
-    expect(listmapval.equals(l1, l2),
-        isTrue);
-    const setmapval = const SetEquality(mapval);
-    expect(setmapval.equals(s1, s2),
-        isTrue);
+    expect(listmapval.equals(l1, l2), isTrue);
+    const setmapval = const SetEquality<Map>(mapval);
+    expect(setmapval.equals(s1, s2), isTrue);
   });
 
   test("DeepEquality", () {
     var colleq = const DeepCollectionEquality.unordered();
-    expect(colleq.equals(map1a["x"], map2a["x"]),
-        isTrue);
-    expect(colleq.equals(map1a["y"], map2a["y"]),
-        isTrue);
-    expect(colleq.equals(map1b["x"], map2b["x"]),
-        isTrue);
-    expect(colleq.equals(map1b["y"], map2b["y"]),
-        isTrue);
-    expect(colleq.equals(map1a, map2a),
-        isTrue);
-    expect(colleq.equals(map1b, map2b),
-        isTrue);
-    expect(colleq.equals(l1, l2),
-        isTrue);
-    expect(colleq.equals(s1, s2),
-        isTrue);
+    expect(colleq.equals(map1a["x"], map2a["x"]), isTrue);
+    expect(colleq.equals(map1a["y"], map2a["y"]), isTrue);
+    expect(colleq.equals(map1b["x"], map2b["x"]), isTrue);
+    expect(colleq.equals(map1b["y"], map2b["y"]), isTrue);
+    expect(colleq.equals(map1a, map2a), isTrue);
+    expect(colleq.equals(map1b, map2b), isTrue);
+    expect(colleq.equals(l1, l2), isTrue);
+    expect(colleq.equals(s1, s2), isTrue);
+  });
+
+  test("CaseInsensitiveEquality", () {
+    var equality = const CaseInsensitiveEquality();
+    expect(equality.equals("foo", "foo"), isTrue);
+    expect(equality.equals("fOo", "FoO"), isTrue);
+    expect(equality.equals("FoO", "fOo"), isTrue);
+    expect(equality.equals("foo", "bar"), isFalse);
+    expect(equality.equals("fÕÕ", "fõõ"), isFalse);
+
+    expect(equality.hash("foo"), equals(equality.hash("foo")));
+    expect(equality.hash("fOo"), equals(equality.hash("FoO")));
+    expect(equality.hash("FoO"), equals(equality.hash("fOo")));
+    expect(equality.hash("foo"), isNot(equals(equality.hash("bar"))));
+    expect(equality.hash("fÕÕ"), isNot(equals(equality.hash("fõõ"))));
+  });
+
+  group("EqualityBy should use a derived value for ", () {
+    var firstEquality = new EqualityBy<List<String>, String>((e) => e.first);
+    var firstInsensitiveEquality = new EqualityBy<List<String>, String>(
+        (e) => e.first, const CaseInsensitiveEquality());
+    var firstObjectEquality = new EqualityBy<List<Object>, Object>(
+        (e) => e.first, const IterableEquality());
+
+    test("equality", () {
+      expect(firstEquality.equals(["foo", "foo"], ["foo", "bar"]), isTrue);
+      expect(firstEquality.equals(["foo", "foo"], ["bar", "bar"]), isFalse);
+    });
+
+    test("equality with an inner equality", () {
+      expect(firstInsensitiveEquality.equals(["fOo"], ["FoO"]), isTrue);
+      expect(firstInsensitiveEquality.equals(["foo"], ["ffõõ"]), isFalse);
+    });
+
+    test("hash", () {
+      expect(firstEquality.hash(["foo", "bar"]), "foo".hashCode);
+    });
+
+    test("hash with an inner equality", () {
+      expect(firstInsensitiveEquality.hash(["fOo"]),
+          const CaseInsensitiveEquality().hash("foo"));
+    });
+
+    test("isValidKey", () {
+      expect(firstEquality.isValidKey(["foo"]), isTrue);
+      expect(firstEquality.isValidKey("foo"), isFalse);
+      expect(firstEquality.isValidKey([1]), isFalse);
+    });
+
+    test('isValidKey with an inner equality', () {
+      expect(firstObjectEquality.isValidKey([[]]), isTrue);
+      expect(firstObjectEquality.isValidKey([{}]), isFalse);
+    });
+  });
+
+  test("Equality accepts null", () {
+    var ie = new IterableEquality();
+    var le = new ListEquality();
+    var se = new SetEquality();
+    var me = new MapEquality();
+    expect(ie.equals(null, null), true);
+    expect(ie.equals([], null), false);
+    expect(ie.equals(null, []), false);
+    expect(ie.hash(null), null.hashCode);
+
+    expect(le.equals(null, null), true);
+    expect(le.equals([], null), false);
+    expect(le.equals(null, []), false);
+    expect(le.hash(null), null.hashCode);
+
+    expect(se.equals(null, null), true);
+    expect(se.equals(new Set(), null), false);
+    expect(se.equals(null, new Set()), false);
+    expect(se.hash(null), null.hashCode);
+
+    expect(me.equals(null, null), true);
+    expect(me.equals({}, null), false);
+    expect(me.equals(null, {}), false);
+    expect(me.hash(null), null.hashCode);
   });
 }
 
@@ -170,6 +238,6 @@
   final Comparable id;
   const Element(this.id);
   int get hashCode => id.hashCode;
-  bool operator==(Object other) => other is Element && id == other.id;
+  bool operator ==(Object other) => other is Element && id == other.id;
   int compareTo(other) => id.compareTo(other.id);
 }
diff --git a/packages/collection/test/functions_test.dart b/packages/collection/test/functions_test.dart
new file mode 100644
index 0000000..d75f8cf
--- /dev/null
+++ b/packages/collection/test/functions_test.dart
@@ -0,0 +1,332 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:test/test.dart";
+
+import "package:collection/collection.dart";
+
+void main() {
+  group("mapMap()", () {
+    test("with an empty map returns an empty map", () {
+      expect(
+          mapMap({},
+              key: expectAsync2((_, __) {}, count: 0),
+              value: expectAsync2((_, __) {}, count: 0)),
+          isEmpty);
+    });
+
+    test("with no callbacks, returns a copy of the map", () {
+      var map = {"foo": 1, "bar": 2};
+      var result = mapMap(map);
+      expect(result, equals({"foo": 1, "bar": 2}));
+
+      // The resulting map should be a copy.
+      result["foo"] = 3;
+      expect(map, equals({"foo": 1, "bar": 2}));
+    });
+
+    test("maps the map's keys", () {
+      expect(mapMap({"foo": 1, "bar": 2}, key: (key, value) => key[value]),
+          equals({"o": 1, "r": 2}));
+    });
+
+    test("maps the map's values", () {
+      expect(mapMap({"foo": 1, "bar": 2}, value: (key, value) => key[value]),
+          equals({"foo": "o", "bar": "r"}));
+    });
+
+    test("maps both the map's keys and values", () {
+      expect(
+          mapMap({"foo": 1, "bar": 2},
+              key: (key, value) => "$key$value",
+              value: (key, value) => key[value]),
+          equals({"foo1": "o", "bar2": "r"}));
+    });
+  });
+
+  group("mergeMaps()", () {
+    test("with empty maps returns an empty map", () {
+      expect(mergeMaps({}, {}, value: expectAsync2((_, __) {}, count: 0)),
+          isEmpty);
+    });
+
+    test("returns a map with all values in both input maps", () {
+      expect(mergeMaps({"foo": 1, "bar": 2}, {"baz": 3, "qux": 4}),
+          equals({"foo": 1, "bar": 2, "baz": 3, "qux": 4}));
+    });
+
+    test("the second map's values win by default", () {
+      expect(mergeMaps({"foo": 1, "bar": 2}, {"bar": 3, "baz": 4}),
+          equals({"foo": 1, "bar": 3, "baz": 4}));
+    });
+
+    test("uses the callback to merge values", () {
+      expect(
+          mergeMaps({"foo": 1, "bar": 2}, {"bar": 3, "baz": 4},
+              value: (value1, value2) => value1 + value2),
+          equals({"foo": 1, "bar": 5, "baz": 4}));
+    });
+  });
+
+  group("groupBy()", () {
+    test("returns an empty map for an empty iterable", () {
+      expect(groupBy([], expectAsync1((_) {}, count: 0)), isEmpty);
+    });
+
+    test("groups elements by the function's return value", () {
+      expect(
+          groupBy(["foo", "bar", "baz", "bop", "qux"], (string) => string[1]),
+          equals({
+            "o": ["foo", "bop"],
+            "a": ["bar", "baz"],
+            "u": ["qux"]
+          }));
+    });
+  });
+
+  group("minBy()", () {
+    test("returns null for an empty iterable", () {
+      expect(
+          minBy([], expectAsync1((_) {}, count: 0),
+              compare: expectAsync2((_, __) {}, count: 0)),
+          isNull);
+    });
+
+    test(
+        "returns the element for which the ordering function returns the "
+        "smallest value", () {
+      expect(
+          minBy([
+            {"foo": 3},
+            {"foo": 5},
+            {"foo": 4},
+            {"foo": 1},
+            {"foo": 2}
+          ], (map) => map["foo"]),
+          equals({"foo": 1}));
+    });
+
+    test("uses a custom comparator if provided", () {
+      expect(
+          minBy([
+            {"foo": 3},
+            {"foo": 5},
+            {"foo": 4},
+            {"foo": 1},
+            {"foo": 2}
+          ], (map) => map,
+              compare: (map1, map2) => map1["foo"].compareTo(map2["foo"])),
+          equals({"foo": 1}));
+    });
+  });
+
+  group("maxBy()", () {
+    test("returns null for an empty iterable", () {
+      expect(
+          maxBy([], expectAsync1((_) {}, count: 0),
+              compare: expectAsync2((_, __) {}, count: 0)),
+          isNull);
+    });
+
+    test(
+        "returns the element for which the ordering function returns the "
+        "largest value", () {
+      expect(
+          maxBy([
+            {"foo": 3},
+            {"foo": 5},
+            {"foo": 4},
+            {"foo": 1},
+            {"foo": 2}
+          ], (map) => map["foo"]),
+          equals({"foo": 5}));
+    });
+
+    test("uses a custom comparator if provided", () {
+      expect(
+          maxBy([
+            {"foo": 3},
+            {"foo": 5},
+            {"foo": 4},
+            {"foo": 1},
+            {"foo": 2}
+          ], (map) => map,
+              compare: (map1, map2) => map1["foo"].compareTo(map2["foo"])),
+          equals({"foo": 5}));
+    });
+  });
+
+  group("transitiveClosure()", () {
+    test("returns an empty map for an empty graph", () {
+      expect(transitiveClosure({}), isEmpty);
+    });
+
+    test("returns the input when there are no transitive connections", () {
+      expect(
+          transitiveClosure({
+            "foo": ["bar"],
+            "bar": [],
+            "bang": ["qux", "zap"],
+            "qux": [],
+            "zap": []
+          }),
+          equals({
+            "foo": ["bar"],
+            "bar": [],
+            "bang": ["qux", "zap"],
+            "qux": [],
+            "zap": []
+          }));
+    });
+
+    test("flattens transitive connections", () {
+      expect(
+          transitiveClosure({
+            "qux": [],
+            "bar": ["baz"],
+            "baz": ["qux"],
+            "foo": ["bar"]
+          }),
+          equals({
+            "foo": ["bar", "baz", "qux"],
+            "bar": ["baz", "qux"],
+            "baz": ["qux"],
+            "qux": []
+          }));
+    });
+
+    test("handles loops", () {
+      expect(
+          transitiveClosure({
+            "foo": ["bar"],
+            "bar": ["baz"],
+            "baz": ["foo"]
+          }),
+          equals({
+            "foo": ["bar", "baz", "foo"],
+            "bar": ["baz", "foo", "bar"],
+            "baz": ["foo", "bar", "baz"]
+          }));
+    });
+  });
+
+  group("stronglyConnectedComponents()", () {
+    test("returns an empty list for an empty graph", () {
+      expect(stronglyConnectedComponents({}), isEmpty);
+    });
+
+    test("returns one set for a singleton graph", () {
+      expect(
+          stronglyConnectedComponents({"a": []}),
+          equals([
+            new Set.from(["a"])
+          ]));
+    });
+
+    test("returns two sets for a two-element tree", () {
+      expect(
+          stronglyConnectedComponents({
+            "a": ["b"],
+            "b": []
+          }),
+          equals([
+            new Set.from(["a"]),
+            new Set.from(["b"])
+          ]));
+    });
+
+    test("returns one set for a two-element loop", () {
+      expect(
+          stronglyConnectedComponents({
+            "a": ["b"],
+            "b": ["a"]
+          }),
+          equals([
+            new Set.from(["a", "b"])
+          ]));
+    });
+
+    test("returns individual vertices for a tree", () {
+      expect(
+          stronglyConnectedComponents({
+            "foo": ["bar"],
+            "bar": ["baz", "bang"],
+            "baz": ["qux"],
+            "bang": ["zap"],
+            "qux": [],
+            "zap": []
+          }),
+          equals([
+            // This is expected to return *a* topological ordering, but this isn't
+            // the only valid one. If the function implementation changes in the
+            // future, this test may need to be updated.
+            new Set.from(["foo"]),
+            new Set.from(["bar"]),
+            new Set.from(["bang"]),
+            new Set.from(["zap"]),
+            new Set.from(["baz"]),
+            new Set.from(["qux"])
+          ]));
+    });
+
+    test("returns a single set for a fully cyclic graph", () {
+      expect(
+          stronglyConnectedComponents({
+            "foo": ["bar"],
+            "bar": ["baz"],
+            "baz": ["bang"],
+            "bang": ["foo"]
+          }),
+          equals([
+            new Set.from(["foo", "bar", "baz", "bang"])
+          ]));
+    });
+
+    test("returns separate sets for each strongly connected component", () {
+      // https://en.wikipedia.org/wiki/Strongly_connected_component#/media/File:Scc.png
+      expect(
+          stronglyConnectedComponents({
+            "a": ["b"],
+            "b": ["c", "e", "f"],
+            "c": ["d", "g"],
+            "d": ["c", "h"],
+            "e": ["a", "f"],
+            "f": ["g"],
+            "g": ["f"],
+            "h": ["g", "d"]
+          }),
+          equals([
+            // This is expected to return *a* topological ordering, but this isn't
+            // the only valid one. If the function implementation changes in the
+            // future, this test may need to be updated.
+            new Set.from(["a", "b", "e"]),
+            new Set.from(["c", "d", "h"]),
+            new Set.from(["f", "g"]),
+          ]));
+    });
+
+    test("always returns components in topological order", () {
+      expect(
+          stronglyConnectedComponents({
+            "bar": ["baz", "bang"],
+            "zap": [],
+            "baz": ["qux"],
+            "qux": [],
+            "foo": ["bar"],
+            "bang": ["zap"]
+          }),
+          equals([
+            // This is expected to return *a* topological ordering, but this isn't
+            // the only valid one. If the function implementation changes in the
+            // future, this test may need to be updated.
+            new Set.from(["foo"]),
+            new Set.from(["bar"]),
+            new Set.from(["bang"]),
+            new Set.from(["zap"]),
+            new Set.from(["baz"]),
+            new Set.from(["qux"])
+          ]));
+    });
+  });
+}
diff --git a/packages/collection/test/ignore_ascii_case_test.dart b/packages/collection/test/ignore_ascii_case_test.dart
new file mode 100644
index 0000000..6aee455
--- /dev/null
+++ b/packages/collection/test/ignore_ascii_case_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests case-ignoring compare and equality.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+main() {
+  test("equality ignore ASCII case", () {
+    var strings = [
+      "0@`aopz[{",
+      "0@`aopz[{",
+      "0@`Aopz[{",
+      "0@`aOpz[{",
+      "0@`AOpz[{",
+      "0@`aoPz[{",
+      "0@`AoPz[{",
+      "0@`aOPz[{",
+      "0@`AOPz[{",
+      "0@`aopZ[{",
+      "0@`AopZ[{",
+      "0@`aOpZ[{",
+      "0@`AOpZ[{",
+      "0@`aoPZ[{",
+      "0@`AoPZ[{",
+      "0@`aOPZ[{",
+      "0@`AOPZ[{",
+    ];
+
+    for (var s1 in strings) {
+      for (var s2 in strings) {
+        var reason = "$s1 =?= $s2";
+        expect(equalsIgnoreAsciiCase(s1, s2), true, reason: reason);
+        expect(hashIgnoreAsciiCase(s1), hashIgnoreAsciiCase(s2),
+            reason: reason);
+      }
+    }
+
+    var upperCaseLetters = "@`abcdefghijklmnopqrstuvwxyz[{åÅ";
+    var lowerCaseLetters = "@`ABCDEFGHIJKLMNOPQRSTUVWXYZ[{åÅ";
+    expect(equalsIgnoreAsciiCase(upperCaseLetters, lowerCaseLetters), true);
+
+    testChars(char1, char2, areEqual) {
+      expect(equalsIgnoreAsciiCase(char1, char2), areEqual,
+          reason: "$char1 ${areEqual ? "=" : "!"}= $char2");
+    }
+
+    for (int i = 0; i < upperCaseLetters.length; i++) {
+      for (int j = 0; i < upperCaseLetters.length; i++) {
+        testChars(upperCaseLetters[i], upperCaseLetters[j], i == j);
+        testChars(lowerCaseLetters[i], upperCaseLetters[j], i == j);
+        testChars(upperCaseLetters[i], lowerCaseLetters[j], i == j);
+        testChars(lowerCaseLetters[i], lowerCaseLetters[j], i == j);
+      }
+    }
+  });
+}
diff --git a/packages/collection/test/iterable_zip_test.dart b/packages/collection/test/iterable_zip_test.dart
index cc8ac76..d4d5484 100644
--- a/packages/collection/test/iterable_zip_test.dart
+++ b/packages/collection/test/iterable_zip_test.dart
@@ -3,9 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:collection";
-import "package:collection/iterable_zip.dart";
+
 import "package:test/test.dart";
 
+import "package:collection/collection.dart";
+
 /// Iterable like [base] except that it throws when value equals [errorValue].
 Iterable iterError(Iterable base, int errorValue) {
   return base.map((x) => x == errorValue ? throw "BAD" : x);
@@ -13,40 +15,103 @@
 
 main() {
   test("Basic", () {
-    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [4, 5, 6],
+          [7, 8, 9]
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Uneven length 1", () {
-    expect(new IterableZip([[1, 2, 3, 99, 100], [4, 5, 6], [7, 8, 9]]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3, 99, 100],
+          [4, 5, 6],
+          [7, 8, 9]
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Uneven length 2", () {
-    expect(new IterableZip([[1, 2, 3], [4, 5, 6, 99, 100], [7, 8, 9]]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [4, 5, 6, 99, 100],
+          [7, 8, 9]
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Uneven length 3", () {
-    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9, 99, 100]]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [4, 5, 6],
+          [7, 8, 9, 99, 100]
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Uneven length 3", () {
-    expect(new IterableZip([[1, 2, 3, 98], [4, 5, 6], [7, 8, 9, 99, 100]]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3, 98],
+          [4, 5, 6],
+          [7, 8, 9, 99, 100]
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Empty 1", () {
-    expect(new IterableZip([[], [4, 5, 6], [7, 8, 9]]), equals([]));
+    expect(
+        new IterableZip([
+          [],
+          [4, 5, 6],
+          [7, 8, 9]
+        ]),
+        equals([]));
   });
 
   test("Empty 2", () {
-    expect(new IterableZip([[1, 2, 3], [], [7, 8, 9]]), equals([]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [],
+          [7, 8, 9]
+        ]),
+        equals([]));
   });
 
   test("Empty 3", () {
-    expect(new IterableZip([[1, 2, 3], [4, 5, 6], []]), equals([]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [4, 5, 6],
+          []
+        ]),
+        equals([]));
   });
 
   test("Empty source", () {
@@ -54,59 +119,98 @@
   });
 
   test("Single Source", () {
-    expect(new IterableZip([[1, 2, 3]]), equals([[1], [2], [3]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3]
+        ]),
+        equals([
+          [1],
+          [2],
+          [3]
+        ]));
   });
 
   test("Not-lists", () {
     // Use other iterables than list literals.
     Iterable it1 = [1, 2, 3, 4, 5, 6].where((x) => x < 4);
     Set it2 = new LinkedHashSet()..add(4)..add(5)..add(6);
-    Iterable it3 = (new LinkedHashMap()..[7] = 0 ..[8] = 0 ..[9] = 0).keys;
+    Iterable it3 = (new LinkedHashMap()
+          ..[7] = 0
+          ..[8] = 0
+          ..[9] = 0)
+        .keys;
     Iterable<Iterable> allIts =
         new Iterable.generate(3, (i) => [it1, it2, it3][i]);
-    expect(new IterableZip(allIts),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip(allIts),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 
   test("Error 1", () {
-    expect(() => new IterableZip([iterError([1, 2, 3], 2),
-                                  [4, 5, 6],
-                                  [7, 8, 9]]).toList(),
-           throwsA(equals("BAD")));
+    expect(
+        () => new IterableZip([
+              iterError([1, 2, 3], 2),
+              [4, 5, 6],
+              [7, 8, 9]
+            ]).toList(),
+        throwsA(equals("BAD")));
   });
 
   test("Error 2", () {
-    expect(() => new IterableZip([[1, 2, 3],
-                                  iterError([4, 5, 6], 5),
-                                  [7, 8, 9]]).toList(),
-           throwsA(equals("BAD")));
+    expect(
+        () => new IterableZip([
+              [1, 2, 3],
+              iterError([4, 5, 6], 5),
+              [7, 8, 9]
+            ]).toList(),
+        throwsA(equals("BAD")));
   });
 
   test("Error 3", () {
-    expect(() => new IterableZip([[1, 2, 3],
-                                  [4, 5, 6],
-                                  iterError([7, 8, 9], 8)]).toList(),
-           throwsA(equals("BAD")));
+    expect(
+        () => new IterableZip([
+              [1, 2, 3],
+              [4, 5, 6],
+              iterError([7, 8, 9], 8)
+            ]).toList(),
+        throwsA(equals("BAD")));
   });
 
   test("Error at end", () {
-    expect(() => new IterableZip([[1, 2, 3],
-                                  iterError([4, 5, 6], 6),
-                                  [7, 8, 9]]).toList(),
-           throwsA(equals("BAD")));
+    expect(
+        () => new IterableZip([
+              [1, 2, 3],
+              iterError([4, 5, 6], 6),
+              [7, 8, 9]
+            ]).toList(),
+        throwsA(equals("BAD")));
   });
 
   test("Error before first end", () {
-    expect(() => new IterableZip([iterError([1, 2, 3, 4], 4),
-                                  [4, 5, 6],
-                                  [7, 8, 9]]).toList(),
-           throwsA(equals("BAD")));
+    expect(
+        () => new IterableZip([
+              iterError([1, 2, 3, 4], 4),
+              [4, 5, 6],
+              [7, 8, 9]
+            ]).toList(),
+        throwsA(equals("BAD")));
   });
 
   test("Error after first end", () {
-    expect(new IterableZip([[1, 2, 3],
-                            [4, 5, 6],
-                            iterError([7, 8, 9, 10], 10)]),
-           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+    expect(
+        new IterableZip([
+          [1, 2, 3],
+          [4, 5, 6],
+          iterError([7, 8, 9, 10], 10)
+        ]),
+        equals([
+          [1, 4, 7],
+          [2, 5, 8],
+          [3, 6, 9]
+        ]));
   });
 }
diff --git a/packages/collection/test/priority_queue_test.dart b/packages/collection/test/priority_queue_test.dart
index 264bf94..0e493e5 100644
--- a/packages/collection/test/priority_queue_test.dart
+++ b/packages/collection/test/priority_queue_test.dart
@@ -4,45 +4,46 @@
 
 /// Tests priority queue implementations utilities.
 
-import "package:collection/priority_queue.dart";
 import "package:test/test.dart";
 
+import "package:collection/src/priority_queue.dart";
+
 void main() {
+  testDefault();
   testInt(() => new HeapPriorityQueue<int>());
   testCustom((comparator) => new HeapPriorityQueue<C>(comparator));
 }
 
+void testDefault() {
+  test('new PriorityQueue() returns a HeapPriorityQueue', () {
+    expect(
+        new PriorityQueue<int>(), new isInstanceOf<HeapPriorityQueue<int>>());
+  });
+  testInt(() => new PriorityQueue<int>());
+  testCustom((comparator) => new PriorityQueue<C>(comparator));
+}
+
 void testInt(PriorityQueue<int> create()) {
   for (int count in [1, 5, 127, 128]) {
-    testQueue("int:$count",
-              create,
-              new List<int>.generate(count, (x) => x),
-              count);
+    testQueue(
+        "int:$count", create, new List<int>.generate(count, (x) => x), count);
   }
 }
 
 void testCustom(PriorityQueue<C> create(comparator)) {
   for (int count in [1, 5, 127, 128]) {
-    testQueue("Custom:$count/null",
-              () => create(null),
-              new List<C>.generate(count, (x) => new C(x)),
-              new C(count));
-    testQueue("Custom:$count/compare",
-              () => create(compare),
-              new List<C>.generate(count, (x) => new C(x)),
-              new C(count));
-    testQueue("Custom:$count/compareNeg",
-              () => create(compareNeg),
-              new List<C>.generate(count, (x) => new C(count - x)),
-              new C(0));
+    testQueue("Custom:$count/null", () => create(null),
+        new List<C>.generate(count, (x) => new C(x)), new C(count));
+    testQueue("Custom:$count/compare", () => create(compare),
+        new List<C>.generate(count, (x) => new C(x)), new C(count));
+    testQueue("Custom:$count/compareNeg", () => create(compareNeg),
+        new List<C>.generate(count, (x) => new C(count - x)), new C(0));
   }
 }
 
-/**
- * Test that a queue behaves correctly.
- *
- * The elements must be in priority order, from highest to lowest.
- */
+/// Test that a queue behaves correctly.
+///
+/// The elements must be in priority order, from highest to lowest.
 void testQueue(String name, PriorityQueue create(), List elements, notElement) {
   test(name, () => testQueueBody(create, elements, notElement));
 }
@@ -51,8 +52,12 @@
   PriorityQueue q = create();
   expect(q.isEmpty, isTrue);
   expect(q, hasLength(0));
-  expect(() { q.first; }, throwsStateError);
-  expect(() { q.removeFirst(); }, throwsStateError);
+  expect(() {
+    q.first;
+  }, throwsStateError);
+  expect(() {
+    q.removeFirst();
+  }, throwsStateError);
 
   // Tests removeFirst, first, contains, toList and toSet.
   void testElements() {
@@ -108,6 +113,7 @@
     if (mid + 1 < max) addRec(mid + 1, max);
     if (mid > min) addRec(min, mid);
   }
+
   addRec(0, elements.length);
   testElements();
 
@@ -150,17 +156,16 @@
   expect(q.isEmpty, isTrue);
 }
 
-
 // Custom class.
 // Class is comparable, comparators match normal and inverse order.
 int compare(C c1, C c2) => c1.value - c2.value;
 int compareNeg(C c1, C c2) => c2.value - c1.value;
 
-class C implements Comparable {
+class C implements Comparable<C> {
   final int value;
   const C(this.value);
   int get hashCode => value;
-  bool operator==(Object other) => other is C && value == other.value;
+  bool operator ==(Object other) => other is C && value == other.value;
   int compareTo(C other) => value - other.value;
   String toString() => "C($value)";
 }
diff --git a/packages/collection/test/queue_list_test.dart b/packages/collection/test/queue_list_test.dart
index cbe518f..9e6d199 100644
--- a/packages/collection/test/queue_list_test.dart
+++ b/packages/collection/test/queue_list_test.dart
@@ -69,7 +69,8 @@
       expect(queue, equals([2, 3]));
     });
 
-    test("removes an element from the beginning of a queue with an internal "
+    test(
+        "removes an element from the beginning of a queue with an internal "
         "gap", () {
       var queue = withInternalGap();
       expect(queue.removeFirst(), equals(1));
@@ -167,7 +168,8 @@
       expect(() => queue[-1], throwsRangeError);
     });
 
-    test("throws a RangeError if the index is greater than or equal to the "
+    test(
+        "throws a RangeError if the index is greater than or equal to the "
         "length", () {
       var queue = new QueueList.from([1, 2, 3]);
       expect(() => queue[3], throwsRangeError);
@@ -176,7 +178,7 @@
 
   group("[]=", () {
     test("sets individual entries in the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = new QueueList<dynamic>.from([1, 2, 3]);
       queue[0] = "a";
       queue[1] = "b";
       queue[2] = "c";
@@ -202,7 +204,8 @@
       }, throwsRangeError);
     });
 
-    test("throws a RangeError if the index is greater than or equal to the "
+    test(
+        "throws a RangeError if the index is greater than or equal to the "
         "length", () {
       var queue = new QueueList.from([1, 2, 3]);
       expect(() {
@@ -271,5 +274,5 @@
 
 /// Returns a matcher that expects that a closure throws a
 /// [ConcurrentModificationError].
-final throwsConcurrentModificationError = throwsA(
-    new isInstanceOf<ConcurrentModificationError>());
+final throwsConcurrentModificationError =
+    throwsA(new isInstanceOf<ConcurrentModificationError>());
diff --git a/packages/collection/test/typed_wrapper/iterable_test.dart b/packages/collection/test/typed_wrapper/iterable_test.dart
new file mode 100644
index 0000000..5de9651
--- /dev/null
+++ b/packages/collection/test/typed_wrapper/iterable_test.dart
@@ -0,0 +1,354 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    var emptyWrapper;
+    var singleWrapper;
+    setUp(() {
+      wrapper =
+          DelegatingIterable.typed<int>(<Object>[1, 2, 3, 4, 5].map((i) => i));
+      emptyWrapper = DelegatingIterable.typed<int>(<Object>[].map((i) => i));
+      singleWrapper = DelegatingIterable.typed<int>(<Object>[1].map((i) => i));
+    });
+
+    test("any()", () {
+      expect(wrapper.any((i) => i > 3), isTrue);
+      expect(wrapper.any((i) => i > 5), isFalse);
+    });
+
+    test("contains()", () {
+      expect(wrapper.contains(2), isTrue);
+      expect(wrapper.contains(6), isFalse);
+      expect(wrapper.contains("foo"), isFalse);
+    });
+
+    test("elementAt()", () {
+      expect(wrapper.elementAt(1), equals(2));
+      expect(wrapper.elementAt(4), equals(5));
+      expect(() => wrapper.elementAt(5), throwsRangeError);
+      expect(() => wrapper.elementAt(-1), throwsRangeError);
+    });
+
+    test("every()", () {
+      expect(wrapper.every((i) => i < 6), isTrue);
+      expect(wrapper.every((i) => i > 3), isFalse);
+    });
+
+    test("expand()", () {
+      expect(wrapper.expand((i) => [i]), equals([1, 2, 3, 4, 5]));
+      expect(wrapper.expand((i) => [i, i]),
+          equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]));
+    });
+
+    test("first", () {
+      expect(wrapper.first, equals(1));
+      expect(() => emptyWrapper.first, throwsStateError);
+    });
+
+    test("firstWhere()", () {
+      expect(wrapper.firstWhere((i) => i > 3), equals(4));
+      expect(() => wrapper.firstWhere((i) => i > 5), throwsStateError);
+      expect(wrapper.firstWhere((i) => i > 5, orElse: () => -1), equals(-1));
+    });
+
+    test("fold()", () {
+      expect(wrapper.fold("", (previous, i) => previous + i.toString()),
+          equals("12345"));
+      expect(emptyWrapper.fold(null, (previous, i) => previous + i), isNull);
+    });
+
+    test("forEach()", () {
+      var results = [];
+      wrapper.forEach(results.add);
+      expect(results, equals([1, 2, 3, 4, 5]));
+
+      emptyWrapper.forEach(expectAsync1((_) {}, count: 0));
+    });
+
+    test("isEmpty", () {
+      expect(wrapper.isEmpty, isFalse);
+      expect(emptyWrapper.isEmpty, isTrue);
+    });
+
+    test("isNotEmpty", () {
+      expect(wrapper.isNotEmpty, isTrue);
+      expect(emptyWrapper.isNotEmpty, isFalse);
+    });
+
+    test("iterator", () {
+      var iterator = wrapper.iterator;
+      expect(iterator.current, isNull);
+      expect(iterator.moveNext(), isTrue);
+      expect(iterator.current, equals(1));
+      expect(iterator.moveNext(), isTrue);
+      expect(iterator.current, equals(2));
+      expect(iterator.moveNext(), isTrue);
+      expect(iterator.current, equals(3));
+      expect(iterator.moveNext(), isTrue);
+      expect(iterator.current, equals(4));
+      expect(iterator.moveNext(), isTrue);
+      expect(iterator.current, equals(5));
+      expect(iterator.moveNext(), isFalse);
+      expect(iterator.current, isNull);
+    });
+
+    test("join()", () {
+      expect(wrapper.join(), "12345");
+      expect(wrapper.join("-"), "1-2-3-4-5");
+    });
+
+    test("last", () {
+      expect(wrapper.last, equals(5));
+      expect(() => emptyWrapper.last, throwsStateError);
+    });
+
+    test("lastWhere()", () {
+      expect(wrapper.lastWhere((i) => i > 3), equals(5));
+      expect(() => wrapper.lastWhere((i) => i > 5), throwsStateError);
+      expect(wrapper.lastWhere((i) => i > 5, orElse: () => -1), equals(-1));
+    });
+
+    test("length", () {
+      expect(wrapper.length, equals(5));
+      expect(emptyWrapper.length, equals(0));
+    });
+
+    test("map()", () {
+      expect(wrapper.map((i) => i + 1), equals([2, 3, 4, 5, 6]));
+      expect(wrapper.map((i) => i / 2), equals([0.5, 1.0, 1.5, 2.0, 2.5]));
+    });
+
+    test("reduce()", () {
+      expect(wrapper.reduce((value, i) => value + i), equals(15));
+      expect(
+          () => emptyWrapper.reduce((value, i) => value + i), throwsStateError);
+    });
+
+    test("single", () {
+      expect(() => wrapper.single, throwsStateError);
+      expect(singleWrapper.single, equals(1));
+    });
+
+    test("singleWhere()", () {
+      expect(() => wrapper.singleWhere((i) => i.isOdd), throwsStateError);
+      expect(singleWrapper.singleWhere((i) => i.isOdd), equals(1));
+      expect(
+          () => singleWrapper.singleWhere((i) => i.isEven), throwsStateError);
+    });
+
+    test("skip()", () {
+      expect(wrapper.skip(3), equals([4, 5]));
+      expect(wrapper.skip(10), isEmpty);
+      expect(() => wrapper.skip(-1), throwsRangeError);
+    });
+
+    test("skipWhile()", () {
+      expect(wrapper.skipWhile((i) => i < 3), equals([3, 4, 5]));
+      expect(wrapper.skipWhile((i) => i < 10), isEmpty);
+    });
+
+    test("take()", () {
+      expect(wrapper.take(3), equals([1, 2, 3]));
+      expect(wrapper.take(10), equals([1, 2, 3, 4, 5]));
+      expect(() => wrapper.take(-1), throwsRangeError);
+    });
+
+    test("takeWhile()", () {
+      expect(wrapper.takeWhile((i) => i < 3), equals([1, 2]));
+      expect(wrapper.takeWhile((i) => i < 10), equals([1, 2, 3, 4, 5]));
+    });
+
+    test("toList()", () {
+      expect(wrapper.toList(), equals([1, 2, 3, 4, 5]));
+      expect(wrapper.toList(growable: false), equals([1, 2, 3, 4, 5]));
+      expect(
+          () => wrapper.toList(growable: false).add(6), throwsUnsupportedError);
+    });
+
+    test("toSet()", () {
+      expect(wrapper.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
+      expect(DelegatingIterable.typed<int>(<Object>[1, 1, 2, 2]).toSet(),
+          unorderedEquals([1, 2]));
+    });
+
+    test("where()", () {
+      expect(wrapper.where((i) => i.isOdd), equals([1, 3, 5]));
+      expect(wrapper.where((i) => i.isEven), equals([2, 4]));
+    });
+
+    test("toString()", () {
+      expect(wrapper.toString(), equals("(1, 2, 3, 4, 5)"));
+      expect(emptyWrapper.toString(), equals("()"));
+    });
+  });
+
+  group("with invalid types", () {
+    var wrapper;
+    var singleWrapper;
+    setUp(() {
+      wrapper = DelegatingIterable
+          .typed<int>(<Object>["foo", "bar", "baz"].map((element) => element));
+      singleWrapper = DelegatingIterable
+          .typed<int>(<Object>["foo"].map((element) => element));
+    });
+
+    group("throws a CastError for", () {
+      test("any()", () {
+        expect(() => wrapper.any(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("elementAt()", () {
+        expect(() => wrapper.elementAt(1), throwsCastError);
+      });
+
+      test("every()", () {
+        expect(() => wrapper.every(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("expand()", () {
+        var lazy = wrapper.expand(expectAsync1((_) => [], count: 0));
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("first", () {
+        expect(() => wrapper.first, throwsCastError);
+      });
+
+      test("firstWhere()", () {
+        expect(() => wrapper.firstWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("fold()", () {
+        expect(
+            () => wrapper.fold(null, expectAsync2((_, __) => null, count: 0)),
+            throwsCastError);
+      });
+
+      test("forEach()", () {
+        expect(() => wrapper.forEach(expectAsync1((_) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("iterator", () {
+        var iterator = wrapper.iterator;
+        expect(iterator.current, isNull);
+        expect(() => iterator.moveNext(), throwsCastError);
+      });
+
+      test("last", () {
+        expect(() => wrapper.last, throwsCastError);
+      });
+
+      test("lastWhere()", () {
+        expect(() => wrapper.lastWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("map()", () {
+        var lazy = wrapper.map(expectAsync1((_) => null, count: 0));
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("reduce()", () {
+        expect(() => wrapper.reduce(expectAsync2((_, __) => null, count: 0)),
+            throwsCastError);
+      });
+
+      test("single", () {
+        expect(() => singleWrapper.single, throwsCastError);
+      });
+
+      test("singleWhere()", () {
+        expect(() {
+          singleWrapper.singleWhere(expectAsync1((_) => false, count: 0));
+        }, throwsCastError);
+      });
+
+      test("skip()", () {
+        var lazy = wrapper.skip(1);
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("skipWhile()", () {
+        var lazy = wrapper.skipWhile(expectAsync1((_) => false, count: 0));
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("take()", () {
+        var lazy = wrapper.take(1);
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("takeWhile()", () {
+        var lazy = wrapper.takeWhile(expectAsync1((_) => false, count: 0));
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("toList()", () {
+        var list = wrapper.toList();
+        expect(() => list.first, throwsCastError);
+      });
+
+      test("toSet()", () {
+        var asSet = wrapper.toSet();
+        expect(() => asSet.first, throwsCastError);
+      });
+
+      test("where()", () {
+        var lazy = wrapper.where(expectAsync1((_) => false, count: 0));
+        expect(() => lazy.first, throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("contains()", () {
+        expect(wrapper.contains(1), isFalse);
+        expect(wrapper.contains("foo"), isTrue);
+      });
+
+      test("elementAt()", () {
+        expect(() => wrapper.elementAt(-1), throwsRangeError);
+        expect(() => wrapper.elementAt(10), throwsRangeError);
+      });
+
+      test("isEmpty", () {
+        expect(wrapper.isEmpty, isFalse);
+      });
+
+      test("isNotEmpty", () {
+        expect(wrapper.isNotEmpty, isTrue);
+      });
+
+      test("join()", () {
+        expect(wrapper.join(), "foobarbaz");
+      });
+
+      test("length", () {
+        expect(wrapper.length, equals(3));
+      });
+
+      test("single", () {
+        expect(() => wrapper.single, throwsStateError);
+      });
+
+      test("skip()", () {
+        expect(() => wrapper.skip(-1), throwsRangeError);
+      });
+
+      test("toString()", () {
+        expect(wrapper.toString(), equals("(foo, bar, baz)"));
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+}
diff --git a/packages/collection/test/typed_wrapper/list_test.dart b/packages/collection/test/typed_wrapper/list_test.dart
new file mode 100644
index 0000000..e39375e
--- /dev/null
+++ b/packages/collection/test/typed_wrapper/list_test.dart
@@ -0,0 +1,421 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' as math;
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    var emptyWrapper;
+    setUp(() {
+      wrapper = DelegatingList.typed<int>(<Object>[1, 2, 3, 4, 5]);
+      emptyWrapper = DelegatingList.typed<int>(<Object>[]);
+    });
+
+    test("[]", () {
+      expect(wrapper[0], equals(1));
+      expect(wrapper[1], equals(2));
+      expect(() => wrapper[-1], throwsRangeError);
+      expect(() => wrapper[10], throwsRangeError);
+    });
+
+    test("[]=", () {
+      wrapper[1] = 10;
+      wrapper[3] = 15;
+      expect(wrapper, equals([1, 10, 3, 15, 5]));
+      expect(() => wrapper[-1] = 10, throwsRangeError);
+      expect(() => wrapper[10] = 10, throwsRangeError);
+    });
+
+    test("add()", () {
+      wrapper.add(6);
+      wrapper.add(7);
+      expect(wrapper, equals([1, 2, 3, 4, 5, 6, 7]));
+    });
+
+    test("addAll()", () {
+      wrapper.addAll([6, 7, 8]);
+      expect(wrapper, equals([1, 2, 3, 4, 5, 6, 7, 8]));
+    });
+
+    test("asMap()", () {
+      expect(wrapper.asMap(), equals({0: 1, 1: 2, 2: 3, 3: 4, 4: 5}));
+    });
+
+    test("clear()", () {
+      wrapper.clear();
+      expect(wrapper, isEmpty);
+    });
+
+    test("fillRange()", () {
+      wrapper.fillRange(2, 4);
+      expect(wrapper, equals([1, 2, null, null, 5]));
+
+      wrapper.fillRange(1, 2, 7);
+      expect(wrapper, equals([1, 7, null, null, 5]));
+
+      expect(() => wrapper.fillRange(-1, 2), throwsRangeError);
+      expect(() => wrapper.fillRange(1, 10), throwsRangeError);
+      expect(() => wrapper.fillRange(4, 2), throwsRangeError);
+      expect(() => wrapper.fillRange(10, 12), throwsRangeError);
+    });
+
+    test("getRange()", () {
+      expect(wrapper.getRange(2, 4), equals([3, 4]));
+      expect(wrapper.getRange(1, 2), equals([2]));
+
+      expect(() => wrapper.getRange(-1, 2), throwsRangeError);
+      expect(() => wrapper.getRange(1, 10), throwsRangeError);
+      expect(() => wrapper.getRange(4, 2), throwsRangeError);
+      expect(() => wrapper.getRange(10, 12), throwsRangeError);
+    });
+
+    test("indexOf()", () {
+      expect(wrapper.indexOf(4), equals(3));
+      expect(wrapper.indexOf(10), equals(-1));
+      expect(wrapper.indexOf(4, 2), equals(3));
+      expect(wrapper.indexOf(4, 4), equals(-1));
+    });
+
+    test("insert()", () {
+      wrapper.insert(3, 10);
+      expect(wrapper, equals([1, 2, 3, 10, 4, 5]));
+
+      wrapper.insert(0, 15);
+      expect(wrapper, equals([15, 1, 2, 3, 10, 4, 5]));
+
+      expect(() => wrapper.insert(-1, 0), throwsRangeError);
+      expect(() => wrapper.insert(10, 0), throwsRangeError);
+    });
+
+    test("insertAll()", () {
+      wrapper.insertAll(3, [10, 11, 12]);
+      expect(wrapper, equals([1, 2, 3, 10, 11, 12, 4, 5]));
+
+      wrapper.insertAll(0, [15, 16, 17]);
+      expect(wrapper, equals([15, 16, 17, 1, 2, 3, 10, 11, 12, 4, 5]));
+
+      expect(() => wrapper.insertAll(-1, []), throwsRangeError);
+      expect(() => wrapper.insertAll(100, []), throwsRangeError);
+    });
+
+    test("lastIndexOf()", () {
+      expect(wrapper.lastIndexOf(4), equals(3));
+      expect(wrapper.lastIndexOf(10), equals(-1));
+      expect(wrapper.lastIndexOf(4, 4), equals(3));
+      expect(wrapper.lastIndexOf(4, 2), equals(-1));
+    });
+
+    test("length=", () {
+      wrapper.length = 10;
+      expect(wrapper, equals([1, 2, 3, 4, 5, null, null, null, null, null]));
+
+      wrapper.length = 3;
+      expect(wrapper, equals([1, 2, 3]));
+    });
+
+    test("remove()", () {
+      expect(wrapper.remove(3), isTrue);
+      expect(wrapper, equals([1, 2, 4, 5]));
+
+      expect(wrapper.remove(3), isFalse);
+      expect(wrapper.remove("foo"), isFalse);
+    });
+
+    test("removeAt()", () {
+      expect(wrapper.removeAt(3), equals(4));
+      expect(wrapper, equals([1, 2, 3, 5]));
+
+      expect(() => wrapper.removeAt(-1), throwsRangeError);
+      expect(() => wrapper.removeAt(10), throwsRangeError);
+    });
+
+    test("removeLast()", () {
+      expect(wrapper.removeLast(), equals(5));
+      expect(wrapper, equals([1, 2, 3, 4]));
+
+      // See sdk#26087. We want this to pass with the current implementation and
+      // with the fix.
+      expect(() => emptyWrapper.removeLast(),
+          anyOf(throwsStateError, throwsRangeError));
+    });
+
+    test("removeRange()", () {
+      wrapper.removeRange(2, 4);
+      expect(wrapper, equals([1, 2, 5]));
+
+      expect(() => wrapper.removeRange(-1, 2), throwsRangeError);
+      expect(() => wrapper.removeRange(1, 10), throwsRangeError);
+      expect(() => wrapper.removeRange(4, 2), throwsRangeError);
+      expect(() => wrapper.removeRange(10, 12), throwsRangeError);
+    });
+
+    test("removeWhere()", () {
+      wrapper.removeWhere((i) => i.isOdd);
+      expect(wrapper, equals([2, 4]));
+    });
+
+    test("replaceRange()", () {
+      wrapper.replaceRange(2, 4, [10, 11, 12]);
+      expect(wrapper, equals([1, 2, 10, 11, 12, 5]));
+
+      expect(() => wrapper.replaceRange(-1, 2, []), throwsRangeError);
+      expect(() => wrapper.replaceRange(1, 10, []), throwsRangeError);
+      expect(() => wrapper.replaceRange(4, 2, []), throwsRangeError);
+      expect(() => wrapper.replaceRange(10, 12, []), throwsRangeError);
+    });
+
+    test("retainWhere()", () {
+      wrapper.retainWhere((i) => i.isOdd);
+      expect(wrapper, equals([1, 3, 5]));
+    });
+
+    test("reversed", () {
+      expect(wrapper.reversed, equals([5, 4, 3, 2, 1]));
+    });
+
+    test("setAll()", () {
+      wrapper.setAll(2, [10, 11]);
+      expect(wrapper, equals([1, 2, 10, 11, 5]));
+
+      expect(() => wrapper.setAll(-1, []), throwsRangeError);
+      expect(() => wrapper.setAll(10, []), throwsRangeError);
+    });
+
+    test("setRange()", () {
+      wrapper.setRange(2, 4, [10, 11, 12]);
+      expect(wrapper, equals([1, 2, 10, 11, 5]));
+
+      wrapper.setRange(2, 4, [10, 11, 12], 1);
+      expect(wrapper, equals([1, 2, 11, 12, 5]));
+
+      expect(() => wrapper.setRange(-1, 2, []), throwsRangeError);
+      expect(() => wrapper.setRange(1, 10, []), throwsRangeError);
+      expect(() => wrapper.setRange(4, 2, []), throwsRangeError);
+      expect(() => wrapper.setRange(10, 12, []), throwsRangeError);
+      expect(() => wrapper.setRange(2, 4, []), throwsStateError);
+    });
+
+    test("shuffle()", () {
+      wrapper.shuffle(new math.Random(1234));
+      expect(wrapper, equals([1, 2, 3, 4, 5]..shuffle(new math.Random(1234))));
+    });
+
+    test("sort()", () {
+      wrapper.sort((a, b) => b.compareTo(a));
+      expect(wrapper, equals([5, 4, 3, 2, 1]));
+
+      wrapper.sort();
+      expect(wrapper, equals([1, 2, 3, 4, 5]));
+    });
+
+    test("sublist()", () {
+      expect(wrapper.sublist(2), equals([3, 4, 5]));
+      expect(wrapper.sublist(2, 4), equals([3, 4]));
+    });
+  });
+
+  group("with invalid types", () {
+    var inner;
+    var wrapper;
+    setUp(() {
+      inner = <Object>["foo", "bar", "baz"];
+      wrapper = DelegatingList.typed<int>(inner);
+    });
+
+    group("throws a CastError for", () {
+      test("[]", () {
+        expect(() => wrapper[0], throwsCastError);
+      });
+
+      test("asMap()", () {
+        var map = wrapper.asMap();
+        expect(() => map[1], throwsCastError);
+      });
+
+      test("getRange()", () {
+        var lazy = wrapper.getRange(1, 2);
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("removeAt()", () {
+        expect(() => wrapper.removeAt(2), throwsCastError);
+      });
+
+      test("removeLast()", () {
+        expect(() => wrapper.removeLast(), throwsCastError);
+      });
+
+      test("removeWhere()", () {
+        expect(() => wrapper.removeWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("retainWhere()", () {
+        expect(() => wrapper.retainWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("reversed", () {
+        var lazy = wrapper.reversed;
+        expect(() => lazy.first, throwsCastError);
+      });
+
+      test("sort()", () {
+        expect(() => wrapper.sort(expectAsync2((_, __) => 0, count: 0)),
+            throwsCastError);
+      });
+
+      test("sublist()", () {
+        var list = wrapper.sublist(1);
+        expect(() => list[0], throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("[]", () {
+        expect(() => wrapper[-1], throwsRangeError);
+        expect(() => wrapper[10], throwsRangeError);
+      });
+
+      test("[]=", () {
+        wrapper[1] = 10;
+        expect(inner, equals(["foo", 10, "baz"]));
+        expect(() => wrapper[-1] = 10, throwsRangeError);
+        expect(() => wrapper[10] = 10, throwsRangeError);
+      });
+
+      test("add()", () {
+        wrapper.add(6);
+        wrapper.add(7);
+        expect(inner, equals(["foo", "bar", "baz", 6, 7]));
+      });
+
+      test("addAll()", () {
+        wrapper.addAll([6, 7, 8]);
+        expect(inner, equals(["foo", "bar", "baz", 6, 7, 8]));
+      });
+
+      test("clear()", () {
+        wrapper.clear();
+        expect(wrapper, isEmpty);
+      });
+
+      test("fillRange()", () {
+        wrapper.fillRange(1, 3, 7);
+        expect(inner, equals(["foo", 7, 7]));
+
+        expect(() => wrapper.fillRange(-1, 2), throwsRangeError);
+        expect(() => wrapper.fillRange(1, 10), throwsRangeError);
+        expect(() => wrapper.fillRange(4, 2), throwsRangeError);
+        expect(() => wrapper.fillRange(10, 12), throwsRangeError);
+      });
+
+      test("getRange()", () {
+        expect(() => wrapper.getRange(-1, 2), throwsRangeError);
+        expect(() => wrapper.getRange(1, 10), throwsRangeError);
+        expect(() => wrapper.getRange(4, 2), throwsRangeError);
+        expect(() => wrapper.getRange(10, 12), throwsRangeError);
+      });
+
+      test("indexOf()", () {
+        expect(wrapper.indexOf(4), equals(-1));
+      });
+
+      test("insert()", () {
+        wrapper.insert(0, 15);
+        expect(inner, equals([15, "foo", "bar", "baz"]));
+
+        expect(() => wrapper.insert(-1, 0), throwsRangeError);
+        expect(() => wrapper.insert(10, 0), throwsRangeError);
+      });
+
+      test("insertAll()", () {
+        wrapper.insertAll(0, [15, 16, 17]);
+        expect(inner, equals([15, 16, 17, "foo", "bar", "baz"]));
+
+        expect(() => wrapper.insertAll(-1, []), throwsRangeError);
+        expect(() => wrapper.insertAll(100, []), throwsRangeError);
+      });
+
+      test("lastIndexOf()", () {
+        expect(wrapper.lastIndexOf(4), equals(-1));
+      });
+
+      test("length=", () {
+        wrapper.length = 5;
+        expect(inner, equals(["foo", "bar", "baz", null, null]));
+
+        wrapper.length = 1;
+        expect(inner, equals(["foo"]));
+      });
+
+      test("remove()", () {
+        expect(wrapper.remove(3), isFalse);
+        expect(wrapper.remove("foo"), isTrue);
+        expect(inner, equals(["bar", "baz"]));
+      });
+
+      test("removeAt()", () {
+        expect(() => wrapper.removeAt(-1), throwsRangeError);
+        expect(() => wrapper.removeAt(10), throwsRangeError);
+      });
+
+      test("removeRange()", () {
+        wrapper.removeRange(1, 3);
+        expect(inner, equals(["foo"]));
+
+        expect(() => wrapper.removeRange(-1, 2), throwsRangeError);
+        expect(() => wrapper.removeRange(1, 10), throwsRangeError);
+        expect(() => wrapper.removeRange(4, 2), throwsRangeError);
+        expect(() => wrapper.removeRange(10, 12), throwsRangeError);
+      });
+
+      test("replaceRange()", () {
+        wrapper.replaceRange(1, 2, [10, 11, 12]);
+        expect(inner, equals(["foo", 10, 11, 12, "baz"]));
+
+        expect(() => wrapper.replaceRange(-1, 2, []), throwsRangeError);
+        expect(() => wrapper.replaceRange(1, 10, []), throwsRangeError);
+        expect(() => wrapper.replaceRange(4, 2, []), throwsRangeError);
+        expect(() => wrapper.replaceRange(10, 12, []), throwsRangeError);
+      });
+
+      test("setAll()", () {
+        wrapper.setAll(1, [10, 11]);
+        expect(inner, equals(["foo", 10, 11]));
+
+        expect(() => wrapper.setAll(-1, []), throwsRangeError);
+        expect(() => wrapper.setAll(10, []), throwsRangeError);
+      });
+
+      test("setRange()", () {
+        wrapper.setRange(1, 2, [10, 11, 12]);
+        expect(inner, equals(["foo", 10, "baz"]));
+
+        expect(() => wrapper.setRange(-1, 2, []), throwsRangeError);
+        expect(() => wrapper.setRange(1, 10, []), throwsRangeError);
+        expect(() => wrapper.setRange(4, 2, []), throwsRangeError);
+        expect(() => wrapper.setRange(10, 12, []), throwsRangeError);
+        expect(() => wrapper.setRange(1, 2, []), throwsStateError);
+      });
+
+      test("shuffle()", () {
+        wrapper.shuffle(new math.Random(1234));
+        expect(inner,
+            equals(["foo", "bar", "baz"]..shuffle(new math.Random(1234))));
+      });
+
+      test("sort()", () {
+        wrapper.sort();
+        expect(inner, equals(["bar", "baz", "foo"]));
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+}
diff --git a/packages/collection/test/typed_wrapper/map_test.dart b/packages/collection/test/typed_wrapper/map_test.dart
new file mode 100644
index 0000000..b81f430
--- /dev/null
+++ b/packages/collection/test/typed_wrapper/map_test.dart
@@ -0,0 +1,327 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    var emptyWrapper;
+    setUp(() {
+      wrapper = DelegatingMap.typed<String, int>(
+          <Object, Object>{"foo": 1, "bar": 2, "baz": 3, "bang": 4});
+      emptyWrapper = DelegatingMap.typed<String, int>(<Object, Object>{});
+    });
+
+    test("[]", () {
+      expect(wrapper["foo"], equals(1));
+      expect(wrapper["bar"], equals(2));
+      expect(wrapper["qux"], isNull);
+      expect(wrapper[1], isNull);
+    });
+
+    test("[]=", () {
+      wrapper["foo"] = 5;
+      expect(wrapper, equals({"foo": 5, "bar": 2, "baz": 3, "bang": 4}));
+
+      wrapper["qux"] = 6;
+      expect(
+          wrapper, equals({"foo": 5, "bar": 2, "baz": 3, "bang": 4, "qux": 6}));
+    });
+
+    test("addAll()", () {
+      wrapper.addAll({"bar": 5, "qux": 6});
+      expect(
+          wrapper, equals({"foo": 1, "bar": 5, "baz": 3, "bang": 4, "qux": 6}));
+    });
+
+    test("clear()", () {
+      wrapper.clear();
+      expect(wrapper, isEmpty);
+    });
+
+    test("containsKey()", () {
+      expect(wrapper.containsKey("foo"), isTrue);
+      expect(wrapper.containsKey("qux"), isFalse);
+      expect(wrapper.containsKey(1), isFalse);
+    });
+
+    test("containsValue()", () {
+      expect(wrapper.containsValue(1), isTrue);
+      expect(wrapper.containsValue(7), isFalse);
+      expect(wrapper.containsValue("foo"), isFalse);
+    });
+
+    test("forEach()", () {
+      var results = [];
+      wrapper.forEach((key, value) => results.add([key, value]));
+      expect(
+          results,
+          unorderedEquals([
+            ["foo", 1],
+            ["bar", 2],
+            ["baz", 3],
+            ["bang", 4]
+          ]));
+
+      emptyWrapper.forEach(expectAsync2((_, __) {}, count: 0));
+    });
+
+    test("isEmpty", () {
+      expect(wrapper.isEmpty, isFalse);
+      expect(emptyWrapper.isEmpty, isTrue);
+    });
+
+    test("isNotEmpty", () {
+      expect(wrapper.isNotEmpty, isTrue);
+      expect(emptyWrapper.isNotEmpty, isFalse);
+    });
+
+    test("keys", () {
+      expect(wrapper.keys, unorderedEquals(["foo", "bar", "baz", "bang"]));
+      expect(emptyWrapper.keys, isEmpty);
+    });
+
+    test("length", () {
+      expect(wrapper.length, equals(4));
+      expect(emptyWrapper.length, equals(0));
+    });
+
+    test("putIfAbsent()", () {
+      expect(wrapper.putIfAbsent("foo", expectAsync1((_) => null, count: 0)),
+          equals(1));
+
+      expect(wrapper.putIfAbsent("qux", () => 6), equals(6));
+      expect(
+          wrapper, equals({"foo": 1, "bar": 2, "baz": 3, "bang": 4, "qux": 6}));
+    });
+
+    test("remove()", () {
+      expect(wrapper.remove("foo"), equals(1));
+      expect(wrapper, equals({"bar": 2, "baz": 3, "bang": 4}));
+
+      expect(wrapper.remove("foo"), isNull);
+      expect(wrapper.remove(3), isNull);
+    });
+
+    test("values", () {
+      expect(wrapper.values, unorderedEquals([1, 2, 3, 4]));
+      expect(emptyWrapper.values, isEmpty);
+    });
+
+    test("toString()", () {
+      expect(
+          wrapper.toString(),
+          allOf([
+            startsWith("{"),
+            contains("foo: 1"),
+            contains("bar: 2"),
+            contains("baz: 3"),
+            contains("bang: 4"),
+            endsWith("}")
+          ]));
+    });
+  });
+
+  group("with invalid key types", () {
+    var inner;
+    var wrapper;
+    setUp(() {
+      inner = <Object, Object>{1: 1, 2: 2, 3: 3, 4: 4};
+      wrapper = DelegatingMap.typed<String, int>(inner);
+    });
+
+    group("throws a CastError for", () {
+      test("forEach()", () {
+        expect(() => wrapper.forEach(expectAsync2((_, __) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("keys", () {
+        var lazy = wrapper.keys;
+        expect(() => lazy.first, throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("[]", () {
+        expect(wrapper["foo"], isNull);
+        expect(wrapper[1], equals(1));
+        expect(wrapper[7], isNull);
+      });
+
+      test("[]=", () {
+        wrapper["foo"] = 5;
+        expect(inner, equals({"foo": 5, 1: 1, 2: 2, 3: 3, 4: 4}));
+      });
+
+      test("addAll()", () {
+        wrapper.addAll({"foo": 1, "bar": 2});
+        expect(inner, equals({"foo": 1, "bar": 2, 1: 1, 2: 2, 3: 3, 4: 4}));
+      });
+
+      test("clear()", () {
+        wrapper.clear();
+        expect(wrapper, isEmpty);
+      });
+
+      test("containsKey()", () {
+        expect(wrapper.containsKey(1), isTrue);
+        expect(wrapper.containsKey(7), isFalse);
+        expect(wrapper.containsKey("foo"), isFalse);
+      });
+
+      test("containsValue()", () {
+        expect(wrapper.containsValue(1), isTrue);
+        expect(wrapper.containsValue(7), isFalse);
+        expect(wrapper.containsValue("foo"), isFalse);
+      });
+
+      test("isEmpty", () {
+        expect(wrapper.isEmpty, isFalse);
+      });
+
+      test("isNotEmpty", () {
+        expect(wrapper.isNotEmpty, isTrue);
+      });
+
+      test("length", () {
+        expect(wrapper.length, equals(4));
+      });
+
+      test("putIfAbsent()", () {
+        expect(wrapper.putIfAbsent("foo", () => 1), equals(1));
+        expect(inner, equals({"foo": 1, 1: 1, 2: 2, 3: 3, 4: 4}));
+      });
+
+      test("remove()", () {
+        expect(wrapper.remove(1), equals(1));
+        expect(inner, equals({2: 2, 3: 3, 4: 4}));
+
+        expect(wrapper.remove("foo"), isNull);
+        expect(wrapper.remove(7), isNull);
+      });
+
+      test("values", () {
+        expect(wrapper.values, unorderedEquals([1, 2, 3, 4]));
+      });
+
+      test("toString()", () {
+        expect(
+            wrapper.toString(),
+            allOf([
+              startsWith("{"),
+              contains("1: 1"),
+              contains("2: 2"),
+              contains("3: 3"),
+              contains("4: 4"),
+              endsWith("}")
+            ]));
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+
+  group("with invalid value types", () {
+    var inner;
+    var wrapper;
+    setUp(() {
+      inner = <Object, Object>{"foo": "bar", "baz": "bang"};
+      wrapper = DelegatingMap.typed<String, int>(inner);
+    });
+
+    group("throws a CastError for", () {
+      test("forEach()", () {
+        expect(() => wrapper.forEach(expectAsync2((_, __) {}, count: 0)),
+            throwsCastError);
+      });
+
+      test("[]", () {
+        expect(() => wrapper["foo"], throwsCastError);
+        expect(wrapper["qux"], isNull);
+      });
+
+      test("putIfAbsent()", () {
+        expect(() => wrapper.putIfAbsent("foo", () => 1), throwsCastError);
+      });
+
+      test("remove()", () {
+        expect(() => wrapper.remove("foo"), throwsCastError);
+      });
+
+      test("values", () {
+        var lazy = wrapper.values;
+        expect(() => lazy.first, throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("[]=", () {
+        wrapper["foo"] = 5;
+        expect(inner, equals({"foo": 5, "baz": "bang"}));
+      });
+
+      test("addAll()", () {
+        wrapper.addAll({"foo": 1, "qux": 2});
+        expect(inner, equals({"foo": 1, "baz": "bang", "qux": 2}));
+      });
+
+      test("clear()", () {
+        wrapper.clear();
+        expect(wrapper, isEmpty);
+      });
+
+      test("containsKey()", () {
+        expect(wrapper.containsKey("foo"), isTrue);
+        expect(wrapper.containsKey(1), isFalse);
+        expect(wrapper.containsKey("qux"), isFalse);
+      });
+
+      test("containsValue()", () {
+        expect(wrapper.containsValue("bar"), isTrue);
+        expect(wrapper.containsValue(1), isFalse);
+        expect(wrapper.containsValue("foo"), isFalse);
+      });
+
+      test("isEmpty", () {
+        expect(wrapper.isEmpty, isFalse);
+      });
+
+      test("isNotEmpty", () {
+        expect(wrapper.isNotEmpty, isTrue);
+      });
+
+      test("keys", () {
+        expect(wrapper.keys, unorderedEquals(["foo", "baz"]));
+      });
+
+      test("length", () {
+        expect(wrapper.length, equals(2));
+      });
+
+      test("putIfAbsent()", () {
+        expect(wrapper.putIfAbsent("qux", () => 1), equals(1));
+        expect(inner, equals({"foo": "bar", "baz": "bang", "qux": 1}));
+      });
+
+      test("remove()", () {
+        expect(wrapper.remove("qux"), isNull);
+        expect(wrapper.remove(7), isNull);
+      });
+
+      test("toString()", () {
+        expect(
+            wrapper.toString(),
+            allOf([
+              startsWith("{"),
+              contains("foo: bar"),
+              contains("baz: bang"),
+              endsWith("}")
+            ]));
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+}
diff --git a/packages/collection/test/typed_wrapper/queue_test.dart b/packages/collection/test/typed_wrapper/queue_test.dart
new file mode 100644
index 0000000..ba16e52
--- /dev/null
+++ b/packages/collection/test/typed_wrapper/queue_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    var emptyWrapper;
+    setUp(() {
+      wrapper =
+          DelegatingQueue.typed<int>(new Queue<Object>.from([1, 2, 3, 4, 5]));
+      emptyWrapper = DelegatingQueue.typed<int>(new Queue<Object>());
+    });
+
+    test("add()", () {
+      wrapper.add(6);
+      wrapper.add(7);
+      expect(wrapper, equals([1, 2, 3, 4, 5, 6, 7]));
+    });
+
+    test("addAll()", () {
+      wrapper.addAll([6, 7, 8]);
+      expect(wrapper, equals([1, 2, 3, 4, 5, 6, 7, 8]));
+    });
+
+    test("addFirst()", () {
+      wrapper.addFirst(6);
+      wrapper.addFirst(7);
+      expect(wrapper, equals([7, 6, 1, 2, 3, 4, 5]));
+    });
+
+    test("addLast()", () {
+      wrapper.addLast(6);
+      wrapper.addLast(7);
+      expect(wrapper, equals([1, 2, 3, 4, 5, 6, 7]));
+    });
+
+    test("clear()", () {
+      wrapper.clear();
+      expect(wrapper, isEmpty);
+    });
+
+    test("remove()", () {
+      expect(wrapper.remove(3), isTrue);
+      expect(wrapper, equals([1, 2, 4, 5]));
+
+      expect(wrapper.remove(3), isFalse);
+      expect(wrapper.remove("foo"), isFalse);
+    });
+
+    test("removeWhere()", () {
+      wrapper.removeWhere((i) => i.isOdd);
+      expect(wrapper, equals([2, 4]));
+    });
+
+    test("retainWhere()", () {
+      wrapper.retainWhere((i) => i.isOdd);
+      expect(wrapper, equals([1, 3, 5]));
+    });
+
+    test("removeLast()", () {
+      expect(wrapper.removeLast(), equals(5));
+      expect(wrapper, equals([1, 2, 3, 4]));
+
+      expect(() => emptyWrapper.removeLast(), throwsStateError);
+    });
+
+    test("removeFirst()", () {
+      expect(wrapper.removeFirst(), equals(1));
+      expect(wrapper, equals([2, 3, 4, 5]));
+
+      expect(() => emptyWrapper.removeFirst(), throwsStateError);
+    });
+  });
+
+  group("with invalid types", () {
+    var inner;
+    var wrapper;
+    setUp(() {
+      inner = new Queue<Object>.from(["foo", "bar", "baz"]);
+      wrapper = DelegatingQueue.typed<int>(inner);
+    });
+
+    group("throws a CastError for", () {
+      test("removeLast()", () {
+        expect(() => wrapper.removeLast(), throwsCastError);
+      });
+
+      test("removeFirst()", () {
+        expect(() => wrapper.removeFirst(), throwsCastError);
+      });
+
+      test("removeWhere()", () {
+        expect(() => wrapper.removeWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("retainWhere()", () {
+        expect(() => wrapper.retainWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("add()", () {
+        wrapper.add(6);
+        wrapper.add(7);
+        expect(inner, equals(["foo", "bar", "baz", 6, 7]));
+      });
+
+      test("addAll()", () {
+        wrapper.addAll([6, 7, 8]);
+        expect(inner, equals(["foo", "bar", "baz", 6, 7, 8]));
+      });
+
+      test("addFirst()", () {
+        wrapper.addFirst(6);
+        wrapper.addFirst(7);
+        expect(inner, equals([7, 6, "foo", "bar", "baz"]));
+      });
+
+      test("addLast()", () {
+        wrapper.addLast(6);
+        wrapper.addLast(7);
+        expect(inner, equals(["foo", "bar", "baz", 6, 7]));
+      });
+
+      test("clear()", () {
+        wrapper.clear();
+        expect(wrapper, isEmpty);
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+}
diff --git a/packages/collection/test/typed_wrapper/set_test.dart b/packages/collection/test/typed_wrapper/set_test.dart
new file mode 100644
index 0000000..2cc96be
--- /dev/null
+++ b/packages/collection/test/typed_wrapper/set_test.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+import '../utils.dart';
+
+void main() {
+  group("with valid types, forwards", () {
+    var wrapper;
+    setUp(() {
+      wrapper = DelegatingSet.typed<int>(new Set<Object>.from([1, 2, 3, 4, 5]));
+    });
+
+    test("add()", () {
+      wrapper.add(1);
+      wrapper.add(6);
+      expect(wrapper, unorderedEquals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("addAll()", () {
+      wrapper.addAll([1, 6, 7]);
+      expect(wrapper, unorderedEquals([1, 2, 3, 4, 5, 6, 7]));
+    });
+
+    test("clear()", () {
+      wrapper.clear();
+      expect(wrapper, isEmpty);
+    });
+
+    test("containsAll()", () {
+      expect(wrapper.containsAll([1, 3, 5]), isTrue);
+      expect(wrapper.containsAll([1, 3, 6]), isFalse);
+      expect(wrapper.containsAll([1, 3, "foo"]), isFalse);
+    });
+
+    test("difference()", () {
+      expect(wrapper.difference(new Set.from([1, 3, 6])),
+          unorderedEquals([2, 4, 5]));
+    });
+
+    test("intersection()", () {
+      expect(wrapper.intersection(new Set.from([1, 3, 6, "foo"])),
+          unorderedEquals([1, 3]));
+    });
+
+    test("lookup()", () {
+      expect(wrapper.lookup(1), equals(1));
+      expect(wrapper.lookup(7), isNull);
+      expect(wrapper.lookup("foo"), isNull);
+    });
+
+    test("remove()", () {
+      expect(wrapper.remove(3), isTrue);
+      expect(wrapper, unorderedEquals([1, 2, 4, 5]));
+
+      expect(wrapper.remove(3), isFalse);
+      expect(wrapper.remove("foo"), isFalse);
+    });
+
+    test("removeAll()", () {
+      wrapper.removeAll([1, 3, 6, "foo"]);
+      expect(wrapper, unorderedEquals([2, 4, 5]));
+    });
+
+    test("removeWhere()", () {
+      wrapper.removeWhere((i) => i.isOdd);
+      expect(wrapper, unorderedEquals([2, 4]));
+    });
+
+    test("retainAll()", () {
+      wrapper.retainAll([1, 3, 6, "foo"]);
+      expect(wrapper, unorderedEquals([1, 3]));
+    });
+
+    test("retainWhere()", () {
+      wrapper.retainWhere((i) => i.isOdd);
+      expect(wrapper, unorderedEquals([1, 3, 5]));
+    });
+
+    test("union()", () {
+      expect(wrapper.union(new Set.from([5, 6, 7])),
+          unorderedEquals([1, 2, 3, 4, 5, 6, 7]));
+    });
+  });
+
+  group("with invalid types", () {
+    var inner;
+    var wrapper;
+    setUp(() {
+      inner = new Set<Object>.from(["foo", "bar", "baz"]);
+      wrapper = DelegatingSet.typed<int>(inner);
+    });
+
+    group("throws a CastError for", () {
+      test("difference()", () {
+        var result = wrapper.difference(new Set.from([1, 3, 6]));
+        expect(() => result.first, throwsCastError);
+      });
+
+      test("intersection()", () {
+        var result = wrapper.intersection(new Set.from([1, 3, 6, "foo"]));
+        expect(() => result.first, throwsCastError);
+      });
+
+      test("lookup()", () {
+        expect(() => wrapper.lookup("foo"), throwsCastError);
+      });
+
+      test("removeWhere()", () {
+        expect(() => wrapper.removeWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("retainWhere()", () {
+        expect(() => wrapper.retainWhere(expectAsync1((_) => false, count: 0)),
+            throwsCastError);
+      });
+
+      test("union()", () {
+        var result = wrapper.union(new Set.from([5, 6, 7]));
+        expect(() => result.first, throwsCastError);
+      });
+    });
+
+    group("doesn't throw a CastError for", () {
+      test("add()", () {
+        wrapper.add(6);
+        expect(inner, unorderedEquals(["foo", "bar", "baz", 6]));
+      });
+
+      test("addAll()", () {
+        wrapper.addAll([6, 7]);
+        expect(inner, unorderedEquals(["foo", "bar", "baz", 6, 7]));
+      });
+
+      test("clear()", () {
+        wrapper.clear();
+        expect(wrapper, isEmpty);
+      });
+
+      test("containsAll()", () {
+        expect(wrapper.containsAll(["foo", "bar"]), isTrue);
+        expect(wrapper.containsAll(["foo", "bar", 1]), isFalse);
+      });
+
+      test("lookup()", () {
+        expect(wrapper.lookup(1), isNull);
+        expect(wrapper.lookup("zap"), isNull);
+      });
+
+      test("remove()", () {
+        expect(wrapper.remove("foo"), isTrue);
+        expect(inner, unorderedEquals(["bar", "baz"]));
+
+        expect(wrapper.remove(3), isFalse);
+        expect(wrapper.remove("foo"), isFalse);
+      });
+
+      test("removeAll()", () {
+        wrapper.removeAll([1, "foo", "baz"]);
+        expect(inner, unorderedEquals(["bar"]));
+      });
+
+      test("retainAll()", () {
+        wrapper.retainAll([1, "foo", "baz"]);
+        expect(inner, unorderedEquals(["foo", "baz"]));
+      });
+    });
+  }, skip: "Re-enable this when test can run DDC (test#414).");
+}
diff --git a/packages/collection/test/union_set_controller_test.dart b/packages/collection/test/union_set_controller_test.dart
new file mode 100644
index 0000000..aa8c1c9
--- /dev/null
+++ b/packages/collection/test/union_set_controller_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:test/test.dart";
+
+import "package:collection/collection.dart";
+
+void main() {
+  var controller;
+  var innerSet;
+  setUp(() {
+    innerSet = new Set.from([1, 2, 3]);
+    controller = new UnionSetController<int>()..add(innerSet);
+  });
+
+  test("exposes a union set", () {
+    expect(controller.set, unorderedEquals([1, 2, 3]));
+
+    controller.add(new Set.from([3, 4, 5]));
+    expect(controller.set, unorderedEquals([1, 2, 3, 4, 5]));
+
+    controller.remove(innerSet);
+    expect(controller.set, unorderedEquals([3, 4, 5]));
+  });
+
+  test("exposes a disjoint union set", () {
+    expect(controller.set, unorderedEquals([1, 2, 3]));
+
+    controller.add(new Set.from([4, 5, 6]));
+    expect(controller.set, unorderedEquals([1, 2, 3, 4, 5, 6]));
+
+    controller.remove(innerSet);
+    expect(controller.set, unorderedEquals([4, 5, 6]));
+  });
+}
diff --git a/packages/collection/test/union_set_test.dart b/packages/collection/test/union_set_test.dart
new file mode 100644
index 0000000..f2a792a
--- /dev/null
+++ b/packages/collection/test/union_set_test.dart
@@ -0,0 +1,222 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:test/test.dart";
+
+import "package:collection/collection.dart";
+
+void main() {
+  group("with an empty outer set", () {
+    var set;
+    setUp(() {
+      set = new UnionSet<int>(new Set());
+    });
+
+    test("length returns 0", () {
+      expect(set.length, equals(0));
+    });
+
+    test("contains() returns false", () {
+      expect(set.contains(0), isFalse);
+      expect(set.contains(null), isFalse);
+      expect(set.contains("foo"), isFalse);
+    });
+
+    test("lookup() returns null", () {
+      expect(set.lookup(0), isNull);
+      expect(set.lookup(null), isNull);
+      expect(set.lookup("foo"), isNull);
+    });
+
+    test("toSet() returns an empty set", () {
+      expect(set.toSet(), isEmpty);
+      expect(set.toSet(), isNot(same(set)));
+    });
+
+    test("map() doesn't run on any elements", () {
+      expect(set.map(expectAsync1((_) {}, count: 0)), isEmpty);
+    });
+  });
+
+  group("with multiple disjoint sets", () {
+    var set;
+    setUp(() {
+      set = new UnionSet<int>.from([
+        new Set.from([1, 2]),
+        new Set.from([3, 4]),
+        new Set.from([5]),
+        new Set()
+      ], disjoint: true);
+    });
+
+    test("length returns the total length", () {
+      expect(set.length, equals(5));
+    });
+
+    test("contains() returns whether any set contains the element", () {
+      expect(set.contains(1), isTrue);
+      expect(set.contains(4), isTrue);
+      expect(set.contains(5), isTrue);
+      expect(set.contains(6), isFalse);
+    });
+
+    test("lookup() returns elements that are in any set", () {
+      expect(set.lookup(1), equals(1));
+      expect(set.lookup(4), equals(4));
+      expect(set.lookup(5), equals(5));
+      expect(set.lookup(6), isNull);
+    });
+
+    test("toSet() returns the union of all the sets", () {
+      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
+      expect(set.toSet(), isNot(same(set)));
+    });
+
+    test("map() maps the elements", () {
+      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
+    });
+  });
+
+  group("with multiple overlapping sets", () {
+    var set;
+    setUp(() {
+      set = new UnionSet<int>.from([
+        new Set.from([1, 2, 3]),
+        new Set.from([3, 4]),
+        new Set.from([5, 1]),
+        new Set()
+      ]);
+    });
+
+    test("length returns the total length", () {
+      expect(set.length, equals(5));
+    });
+
+    test("contains() returns whether any set contains the element", () {
+      expect(set.contains(1), isTrue);
+      expect(set.contains(4), isTrue);
+      expect(set.contains(5), isTrue);
+      expect(set.contains(6), isFalse);
+    });
+
+    test("lookup() returns elements that are in any set", () {
+      expect(set.lookup(1), equals(1));
+      expect(set.lookup(4), equals(4));
+      expect(set.lookup(5), equals(5));
+      expect(set.lookup(6), isNull);
+    });
+
+    test("lookup() returns the first element in an ordered context", () {
+      var duration1 = new Duration(seconds: 0);
+      var duration2 = new Duration(seconds: 0);
+      expect(duration1, equals(duration2));
+      expect(duration1, isNot(same(duration2)));
+
+      var set = new UnionSet.from([
+        new Set.from([duration1]),
+        new Set.from([duration2])
+      ]);
+
+      expect(set.lookup(new Duration(seconds: 0)), same(duration1));
+    });
+
+    test("toSet() returns the union of all the sets", () {
+      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
+      expect(set.toSet(), isNot(same(set)));
+    });
+
+    test("map() maps the elements", () {
+      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
+    });
+  });
+
+  group("after an inner set was modified", () {
+    var set;
+    setUp(() {
+      var innerSet = new Set<int>.from([3, 7]);
+      set = new UnionSet<int>.from([
+        new Set.from([1, 2]),
+        new Set.from([5]),
+        innerSet
+      ]);
+
+      innerSet.add(4);
+      innerSet.remove(7);
+    });
+
+    test("length returns the total length", () {
+      expect(set.length, equals(5));
+    });
+
+    test("contains() returns true for a new element", () {
+      expect(set.contains(4), isTrue);
+    });
+
+    test("contains() returns false for a removed element", () {
+      expect(set.contains(7), isFalse);
+    });
+
+    test("lookup() returns a new element", () {
+      expect(set.lookup(4), equals(4));
+    });
+
+    test("lookup() doesn't returns a removed element", () {
+      expect(set.lookup(7), isNull);
+    });
+
+    test("toSet() returns the union of all the sets", () {
+      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
+      expect(set.toSet(), isNot(same(set)));
+    });
+
+    test("map() maps the elements", () {
+      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
+    });
+  });
+
+  group("after the outer set was modified", () {
+    var set;
+    setUp(() {
+      var innerSet = new Set.from([6]);
+      var outerSet = new Set<Set<int>>.from([
+        new Set.from([1, 2]),
+        new Set.from([5]),
+        innerSet
+      ]);
+
+      set = new UnionSet<int>(outerSet);
+      outerSet.remove(innerSet);
+      outerSet.add(new Set.from([3, 4]));
+    });
+
+    test("length returns the total length", () {
+      expect(set.length, equals(5));
+    });
+
+    test("contains() returns true for a new element", () {
+      expect(set.contains(4), isTrue);
+    });
+
+    test("contains() returns false for a removed element", () {
+      expect(set.contains(6), isFalse);
+    });
+
+    test("lookup() returns a new element", () {
+      expect(set.lookup(4), equals(4));
+    });
+
+    test("lookup() doesn't returns a removed element", () {
+      expect(set.lookup(6), isNull);
+    });
+
+    test("toSet() returns the union of all the sets", () {
+      expect(set.toSet(), unorderedEquals([1, 2, 3, 4, 5]));
+      expect(set.toSet(), isNot(same(set)));
+    });
+
+    test("map() maps the elements", () {
+      expect(set.map((i) => i * 2), unorderedEquals([2, 4, 6, 8, 10]));
+    });
+  });
+}
diff --git a/packages/collection/test/unmodifiable_collection_test.dart b/packages/collection/test/unmodifiable_collection_test.dart
index 6c722d0..91ad8ad 100644
--- a/packages/collection/test/unmodifiable_collection_test.dart
+++ b/packages/collection/test/unmodifiable_collection_test.dart
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:collection/wrappers.dart";
 import "package:test/test.dart";
 
+import "package:collection/collection.dart";
+
 // Test unmodifiable collection views.
 // The collections should pass through the operations that are allowed,
 // an throw on the ones that aren't without affecting the original.
@@ -34,6 +35,8 @@
 
   Set aSet = new Set();
   testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "empty");
+  aSet = new Set();
+  testUnmodifiableSet(aSet, const UnmodifiableSetView.empty(), "const empty");
   aSet = new Set.from([42]);
   testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "single-42");
   aSet = new Set.from([7]);
@@ -91,8 +94,8 @@
   });
 
   test("$name - expand", () {
-    expect(wrapped.expand((x) => [x, x]),
-           equals(original.expand((x) => [x, x])));
+    expect(
+        wrapped.expand((x) => [x, x]), equals(original.expand((x) => [x, x])));
   });
 
   test("$name - first", () {
@@ -108,21 +111,25 @@
       expect(() => wrapped.firstWhere((_) => true), throws);
     } else {
       expect(wrapped.firstWhere((_) => true),
-             equals(original.firstWhere((_) => true)));
+          equals(original.firstWhere((_) => true)));
     }
     expect(() => wrapped.firstWhere((_) => false), throws);
   });
 
   test("$name - fold", () {
     expect(wrapped.fold(0, (x, y) => x + y),
-           equals(original.fold(0, (x, y) => x + y)));
+        equals(original.fold(0, (x, y) => x + y)));
   });
 
   test("$name - forEach", () {
     int wrapCtr = 0;
     int origCtr = 0;
-    wrapped.forEach((x) { wrapCtr += x; });
-    original.forEach((x) { origCtr += x; });
+    wrapped.forEach((x) {
+      wrapCtr += x;
+    });
+    original.forEach((x) {
+      origCtr += x;
+    });
     expect(wrapCtr, equals(origCtr));
   });
 
@@ -162,7 +169,7 @@
       expect(() => wrapped.lastWhere((_) => true), throws);
     } else {
       expect(wrapped.lastWhere((_) => true),
-             equals(original.lastWhere((_) => true)));
+          equals(original.lastWhere((_) => true)));
     }
     expect(() => wrapped.lastWhere((_) => false), throws);
   });
@@ -172,8 +179,7 @@
   });
 
   test("$name - map", () {
-    expect(wrapped.map((x) => "[$x]"),
-           equals(original.map((x) => "[$x]")));
+    expect(wrapped.map((x) => "[$x]"), equals(original.map((x) => "[$x]")));
   });
 
   test("$name - reduce", () {
@@ -181,7 +187,7 @@
       expect(() => wrapped.reduce((x, y) => x + y), throws);
     } else {
       expect(wrapped.reduce((x, y) => x + y),
-             equals(original.reduce((x, y) => x + y)));
+          equals(original.reduce((x, y) => x + y)));
     }
   });
 
@@ -198,7 +204,7 @@
       expect(() => wrapped.singleWhere((_) => true), throws);
     } else {
       expect(wrapped.singleWhere((_) => true),
-             equals(original.singleWhere((_) => true)));
+          equals(original.singleWhere((_) => true)));
     }
     expect(() => wrapped.singleWhere((_) => false), throws);
   });
@@ -211,11 +217,11 @@
 
   test("$name - skipWhile", () {
     expect(wrapped.skipWhile((x) => true),
-           orderedEquals(original.skipWhile((x) => true)));
+        orderedEquals(original.skipWhile((x) => true)));
     expect(wrapped.skipWhile((x) => false),
-           orderedEquals(original.skipWhile((x) => false)));
+        orderedEquals(original.skipWhile((x) => false)));
     expect(wrapped.skipWhile((x) => x != 42),
-           orderedEquals(original.skipWhile((x) => x != 42)));
+        orderedEquals(original.skipWhile((x) => x != 42)));
   });
 
   test("$name - take", () {
@@ -226,17 +232,17 @@
 
   test("$name - takeWhile", () {
     expect(wrapped.takeWhile((x) => true),
-           orderedEquals(original.takeWhile((x) => true)));
+        orderedEquals(original.takeWhile((x) => true)));
     expect(wrapped.takeWhile((x) => false),
-           orderedEquals(original.takeWhile((x) => false)));
+        orderedEquals(original.takeWhile((x) => false)));
     expect(wrapped.takeWhile((x) => x != 42),
-           orderedEquals(original.takeWhile((x) => x != 42)));
+        orderedEquals(original.takeWhile((x) => x != 42)));
   });
 
   test("$name - toList", () {
     expect(wrapped.toList(), orderedEquals(original.toList()));
     expect(wrapped.toList(growable: false),
-           orderedEquals(original.toList(growable: false)));
+        orderedEquals(original.toList(growable: false)));
   });
 
   test("$name - toSet", () {
@@ -244,12 +250,12 @@
   });
 
   test("$name - where", () {
-    expect(wrapped.where((x) => true),
-           orderedEquals(original.where((x) => true)));
+    expect(
+        wrapped.where((x) => true), orderedEquals(original.where((x) => true)));
     expect(wrapped.where((x) => false),
-           orderedEquals(original.where((x) => false)));
+        orderedEquals(original.where((x) => false)));
     expect(wrapped.where((x) => x != 42),
-           orderedEquals(original.where((x) => x != 42)));
+        orderedEquals(original.where((x) => x != 42)));
   });
 }
 
@@ -268,7 +274,9 @@
 
   test("$name - []", () {
     if (original.isEmpty) {
-      expect(() { wrapped[0]; }, throwsRangeError);
+      expect(() {
+        wrapped[0];
+      }, throwsRangeError);
     } else {
       expect(wrapped[0], equals(original[0]));
     }
@@ -286,17 +294,16 @@
     int len = original.length;
     expect(wrapped.getRange(0, len), equals(original.getRange(0, len)));
     expect(wrapped.getRange(len ~/ 2, len),
-           equals(original.getRange(len ~/ 2, len)));
-    expect(wrapped.getRange(0, len ~/ 2),
-           equals(original.getRange(0, len ~/ 2)));
+        equals(original.getRange(len ~/ 2, len)));
+    expect(
+        wrapped.getRange(0, len ~/ 2), equals(original.getRange(0, len ~/ 2)));
   });
 
   test("$name - sublist", () {
     int len = original.length;
     expect(wrapped.sublist(0), equals(original.sublist(0)));
     expect(wrapped.sublist(len ~/ 2), equals(original.sublist(len ~/ 2)));
-    expect(wrapped.sublist(0, len ~/ 2),
-           equals(original.sublist(0, len ~/ 2)));
+    expect(wrapped.sublist(0, len ~/ 2), equals(original.sublist(0, len ~/ 2)));
   });
 
   test("$name - asMap", () {
@@ -315,21 +322,25 @@
     });
   }
 
-  testThrows("$name - []= throws", () { wrapped[0] = 42; });
+  testThrows("$name - []= throws", () {
+    wrapped[0] = 42;
+  });
 
-  testThrows("$name - sort throws", () { wrapped.sort(); });
+  testThrows("$name - sort throws", () {
+    wrapped.sort();
+  });
 
   testThrows("$name - fillRange throws", () {
     wrapped.fillRange(0, wrapped.length, 42);
   });
 
   testThrows("$name - setRange throws", () {
-      wrapped.setRange(0, wrapped.length,
-                    new Iterable.generate(wrapped.length, (i) => i));
+    wrapped.setRange(
+        0, wrapped.length, new Iterable.generate(wrapped.length, (i) => i));
   });
 
   testThrows("$name - setAll throws", () {
-      wrapped.setAll(0, new Iterable.generate(wrapped.length, (i) => i));
+    wrapped.setAll(0, new Iterable.generate(wrapped.length, (i) => i));
   });
 }
 
@@ -343,7 +354,9 @@
       expect(original[0], equals(originalFirst + 1));
       original[0] = originalFirst;
     } else {
-      expect(() { wrapped[0] = 42; }, throws);
+      expect(() {
+        wrapped[0] = 42;
+      }, throws);
     }
   });
 
@@ -456,21 +469,21 @@
     expect(wrapped.intersection(new Set()), isEmpty);
     expect(wrapped.intersection(copy), unorderedEquals(original));
     expect(wrapped.intersection(new Set.from([42])),
-            new Set.from(original.contains(42) ? [42] : []));
+        new Set.from(original.contains(42) ? [42] : []));
   });
 
   test("$name - union", () {
     expect(wrapped.union(new Set()), unorderedEquals(original));
     expect(wrapped.union(copy), unorderedEquals(original));
     expect(wrapped.union(new Set.from([42])),
-           equals(original.union(new Set.from([42]))));
+        equals(original.union(new Set.from([42]))));
   });
 
   test("$name - difference", () {
     expect(wrapped.difference(new Set()), unorderedEquals(original));
     expect(wrapped.difference(copy), isEmpty);
     expect(wrapped.difference(new Set.from([42])),
-           equals(original.difference(new Set.from([42]))));
+        equals(original.difference(new Set.from([42]))));
   });
 }
 
@@ -557,8 +570,12 @@
   test("$name forEach", () {
     int origCnt = 0;
     int wrapCnt = 0;
-    wrapped.forEach((k, v) { wrapCnt += 1 << k + 3 * v; });
-    original.forEach((k, v) { origCnt += 1 << k + 3 * v; });
+    wrapped.forEach((k, v) {
+      wrapCnt += 1 << k + 3 * v;
+    });
+    original.forEach((k, v) {
+      origCnt += 1 << k + 3 * v;
+    });
     expect(wrapCnt, equals(origCnt));
   });
 
@@ -582,27 +599,27 @@
     });
   }
 
- testThrows("$name operator[]= throws", () {
-   wrapped[0] = 42;
- });
+  testThrows("$name operator[]= throws", () {
+    wrapped[0] = 42;
+  });
 
- testThrows("$name putIfAbsent throws", () {
-   wrapped.putIfAbsent(0, () => 42);
- });
+  testThrows("$name putIfAbsent throws", () {
+    wrapped.putIfAbsent(0, () => 42);
+  });
 
- testThrows("$name addAll throws", () {
-   wrapped.addAll(new Map()..[42] = 42);
- });
+  testThrows("$name addAll throws", () {
+    wrapped.addAll(new Map()..[42] = 42);
+  });
 
- testThrows("$name addAll empty throws", () {
-   wrapped.addAll(new Map());
- });
+  testThrows("$name addAll empty throws", () {
+    wrapped.addAll(new Map());
+  });
 
- testThrows("$name remove throws", () {
-   wrapped.remove(0);
- });
+  testThrows("$name remove throws", () {
+    wrapped.remove(0);
+  });
 
- testThrows("$name clear throws", () {
-   wrapped.clear();
- });
+  testThrows("$name clear throws", () {
+    wrapped.clear();
+  });
 }
diff --git a/packages/collection/test/utils.dart b/packages/collection/test/utils.dart
new file mode 100644
index 0000000..d8ab082
--- /dev/null
+++ b/packages/collection/test/utils.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:test/test.dart";
+
+final Matcher throwsCastError = throwsA(new isInstanceOf<CastError>());
diff --git a/packages/collection/test/wrapper_test.dart b/packages/collection/test/wrapper_test.dart
index e3043a2..9067426 100644
--- a/packages/collection/test/wrapper_test.dart
+++ b/packages/collection/test/wrapper_test.dart
@@ -23,10 +23,8 @@
   expect(i1.namedArguments, equals(i2.namedArguments), reason: name);
 }
 
-/**
- * Utility class to record a member access and a member access on a wrapped
- * object, and compare them for equality.
- */
+/// Utility class to record a member access and a member access on a wrapped
+/// object, and compare them for equality.
 abstract class Expector {
   getWrappedObject(action(Invocation i));
   // Hack to test assignment ([]=) because it doesn't return the result
@@ -35,12 +33,14 @@
   var equals;
 
   noSuchMethod(Invocation m) => new _Equals(equals = getWrappedObject((m2) {
-    testInvocations(m, m2);
-  }));
+        testInvocations(m, m2);
+      }));
 
-  toString() => new _Equals(equals = getWrappedObject((m2) {
-    testInvocations(TO_STRING_INVOCATION, m2);
-  }));
+  // dartanalyzer complains if this method is named `toString()`, since, if it
+  // truly overrides Object's `toString()`, it should return a String.
+  asString() => new _Equals(equals = getWrappedObject((m2) {
+        testInvocations(TO_STRING_INVOCATION, m2);
+      }));
 }
 
 // An object with a field called "equals", only introduced into the
@@ -56,12 +56,13 @@
   static const int SETTER = 0x02;
   final Symbol memberName;
   final List positionalArguments;
-  final Map namedArguments;
+  final Map<Symbol, dynamic> namedArguments;
   final int _type;
-  const SyntheticInvocation(this.memberName,
-                            this.positionalArguments,
-                            this.namedArguments,
-                            this._type);
+  const SyntheticInvocation(this.memberName, this.positionalArguments,
+      this.namedArguments, this._type);
+
+  List<Type> get typeArguments => const <Type>[];
+
   bool get isMethod => _type == METHOD;
 
   bool get isGetter => _type == GETTER;
@@ -79,13 +80,12 @@
 }
 
 const TO_STRING_INVOCATION = const SyntheticInvocation(
-  #toString, const[], const{}, SyntheticInvocation.METHOD);
+    #toString, const [], const {}, SyntheticInvocation.METHOD);
 
 // LikeNSM, but has types Iterable, Set and List to allow it as
 // argument to DelegatingIterable/Set/List.
 class IterableNSM extends NSM implements Iterable, Set, List, Queue {
   IterableNSM(action(Invocation i)) : super(action);
-  noSuchMethod(Invocation i) => super.noSuchMethod(i);  // Silence warnings
   toString() => super.noSuchMethod(TO_STRING_INVOCATION);
 }
 
@@ -120,7 +120,6 @@
 // Like NSM but implements Map to allow as argument for DelegatingMap.
 class MapNSM extends NSM implements Map {
   MapNSM(action(Invocation i)) : super(action);
-  noSuchMethod(Invocation i) => super.noSuchMethod(i);
   toString() => super.noSuchMethod(TO_STRING_INVOCATION);
 }
 
@@ -150,8 +149,10 @@
     // expectation (which doesn't have the interface implemented or
     // its default values).
     expect.firstWhere(func1, orElse: null).equals.firstWhere(func1);
-    expect.firstWhere(func1, orElse: func0).equals.
-           firstWhere(func1, orElse: func0);
+    expect
+        .firstWhere(func1, orElse: func0)
+        .equals
+        .firstWhere(func1, orElse: func0);
     expect.fold(null, func2).equals.fold(null, func2);
     expect.forEach(func1).equals.forEach(func1);
     expect.isEmpty.equals.isEmpty;
@@ -161,8 +162,10 @@
     expect.join("X").equals.join("X");
     expect.last.equals.last;
     expect.lastWhere(func1, orElse: null).equals.lastWhere(func1);
-    expect.lastWhere(func1, orElse: func0).equals.
-           lastWhere(func1, orElse: func0);
+    expect
+        .lastWhere(func1, orElse: func0)
+        .equals
+        .lastWhere(func1, orElse: func0);
     expect.length.equals.length;
     expect.map(func1).equals.map(func1);
     expect.reduce(func2).equals.reduce(func2);
@@ -176,7 +179,7 @@
     expect.toList(growable: true).equals.toList(growable: true);
     expect.toList(growable: false).equals.toList(growable: false);
     expect.toSet().equals.toSet();
-    expect.toString().equals.toString();
+    expect.asString().equals.toString();
     expect.where(func1).equals.where(func1);
   }
 
@@ -262,7 +265,7 @@
     expect.putIfAbsent(val, func0).equals.putIfAbsent(val, func0);
     expect.remove(val).equals.remove(val);
     expect.values.equals.values;
-    expect.toString().equals.toString();
+    expect.asString().equals.toString();
   }
 
   // Runs tests of Set behavior.
@@ -338,17 +341,17 @@
 
       test(".lastWhere", () {
         expect(set.lastWhere((element) => element is String), equals("bar"));
-        expect(set.lastWhere((element) => element.startsWith("f")),
-            equals("foo"));
-        expect(() => set.lastWhere((element) => element is int),
-            throwsStateError);
+        expect(
+            set.lastWhere((element) => element.startsWith("f")), equals("foo"));
+        expect(
+            () => set.lastWhere((element) => element is int), throwsStateError);
         expect(set.lastWhere((element) => element is int, orElse: () => "baz"),
             equals("baz"));
       });
 
       test(".map", () {
-        expect(set.map((element) => element.substring(1)),
-            equals(["oo", "ar"]));
+        expect(
+            set.map((element) => element.substring(1)), equals(["oo", "ar"]));
       });
 
       test(".reduce", () {
@@ -359,8 +362,7 @@
       test(".singleWhere", () {
         expect(() => set.singleWhere((element) => element == "baz"),
             throwsStateError);
-        expect(set.singleWhere((element) => element == "foo"),
-            "foo");
+        expect(set.singleWhere((element) => element == "foo"), "foo");
         expect(() => set.singleWhere((element) => element is String),
             throwsStateError);
       });
@@ -376,8 +378,7 @@
             equals(["bar"]));
         expect(set.skipWhile((element) => element.startsWith("z")),
             equals(["foo", "bar"]));
-        expect(set.skipWhile((element) => element is String),
-            equals([]));
+        expect(set.skipWhile((element) => element is String), equals([]));
       });
 
       test(".take", () {
@@ -389,8 +390,7 @@
       test(".takeWhile", () {
         expect(set.takeWhile((element) => element.startsWith("f")),
             equals(["foo"]));
-        expect(set.takeWhile((element) => element.startsWith("z")),
-            equals([]));
+        expect(set.takeWhile((element) => element.startsWith("z")), equals([]));
         expect(set.takeWhile((element) => element is String),
             equals(["foo", "bar"]));
       });
@@ -407,11 +407,11 @@
       });
 
       test(".where", () {
-        expect(set.where((element) => element.startsWith("f")),
-            equals(["foo"]));
+        expect(
+            set.where((element) => element.startsWith("f")), equals(["foo"]));
         expect(set.where((element) => element.startsWith("z")), equals([]));
-        expect(set.where((element) => element is String),
-            equals(["foo", "bar"]));
+        expect(
+            set.where((element) => element is String), equals(["foo", "bar"]));
       });
 
       test(".containsAll", () {
@@ -531,8 +531,8 @@
 
     setUp(() {
       map = new Map<String, String>();
-      set = new MapValueSet<String, String>(map,
-          (string) => string.substring(0, 1));
+      set = new MapValueSet<String, String>(
+          map, (string) => string.substring(0, 1));
     });
 
     testTwoElementSet(() {
@@ -643,8 +643,8 @@
           equals: (value1, value2) =>
               value1.toLowerCase() == value2.toLowerCase(),
           hashCode: (value) => value.toLowerCase().hashCode);
-      set = new MapValueSet<String, String>(map,
-          (string) => string.substring(0, 1));
+      set = new MapValueSet<String, String>(
+          map, (string) => string.substring(0, 1));
 
       map["f"] = "foo";
       map["B"] = "bar";
diff --git a/packages/csslib/.analysis_options b/packages/csslib/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/csslib/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/csslib/.classpath b/packages/csslib/.classpath
deleted file mode 100644
index fb50116..0000000
--- a/packages/csslib/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/packages/csslib/.project b/packages/csslib/.project
deleted file mode 100644
index 081cd0c..0000000
--- a/packages/csslib/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>csslib</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/packages/csslib/CHANGELOG.md b/packages/csslib/CHANGELOG.md
index b4ee9e1..e23bdf8 100644
--- a/packages/csslib/CHANGELOG.md
+++ b/packages/csslib/CHANGELOG.md
@@ -1,3 +1,63 @@
+## 0.13.6
+
+* Adds support for `@viewport`.
+* Adds support for `-webkit-calc()` and `-moz-calc()`.
+* Adds support for querying media features without specifying an expression. For
+  example: `@media (transform-3d) { ... }`.
+* Prevents exception being thrown for invalid dimension terms, and instead
+  issues an error.
+
+## 0.13.5
+
+* Adds support for `@-moz-document`.
+* Adds support for `@supports`.
+
+## 0.13.4
+
+* Parses CSS 2.1 pseudo-elements as pseudo-elements instead of pseudo-classes.
+* Supports signed decimal numbers with no integer part.
+* Fixes parsing hexadecimal numbers when followed by an identifier.
+* Fixes parsing strings which contain unicode-range character sequences.
+
+## 0.13.3+1
+
+* Fixes analyzer error.
+
+## 0.13.3
+
+* Adds support for shadow host selectors `:host()` and `:host-context()`.
+* Adds support for shadow-piercing descendant combinator `>>>` and its alias
+  `/deep/` for backwards compatibility.
+* Adds support for non-functional IE filter properties (i.e. `filter: FlipH`).
+* Fixes emitted CSS for `@page` directive when body includes declarations and
+  page-margin boxes.
+* Exports `Message` from `parser.dart` so it's no longer necessary to import
+  `src/messages.dart` to use the parser API.
+
+## 0.13.2+2
+
+* Fix static warnings.
+
+## 0.13.2+1
+
+* Fix new strong mode error.
+
+## 0.13.2
+
+* Relax type of TreeNode.visit, to allow returning values from visitors.
+
+## 0.13.1
+
+* Fix two checked mode bugs introduced in 0.13.0.
+
+## 0.13.0
+
+ * **BREAKING** Fix all [strong mode][] errors and warnings.
+   This involved adding more precise on some public APIs, which
+   is why it may break users.
+
+[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+
 ## 0.12.2
 
  * Fix to handle calc functions however, the expressions are treated as a
diff --git a/packages/csslib/example/call_parser.dart b/packages/csslib/example/call_parser.dart
index 7179a17..9a993ea 100644
--- a/packages/csslib/example/call_parser.dart
+++ b/packages/csslib/example/call_parser.dart
@@ -16,7 +16,7 @@
  * tests (by default) will ensure that the CSS is really valid.
  */
 StyleSheet parseCss(String cssInput,
-    {List errors, css.PreprocessorOptions opts}) {
+    {List<css.Message> errors, css.PreprocessorOptions opts}) {
   return css.parse(cssInput,
       errors: errors, options: opts == null ? _default : opts);
 }
@@ -27,7 +27,7 @@
     (emitCss..visitTree(ss, pretty: true)).toString();
 
 main() {
-  var errors = [];
+  var errors = <css.Message>[];
 
   // Parse a simple stylesheet.
   print('1. Good CSS, parsed CSS emitted:');
@@ -40,7 +40,8 @@
       '}'
       '#div {'
       'color : #00F578; border-color: #878787;'
-      '}', errors: errors);
+      '}',
+      errors: errors);
 
   if (!errors.isEmpty) {
     print("Got ${errors.length} errors.\n");
@@ -54,9 +55,11 @@
   // Parse a stylesheet with errors
   print('2. Catch severe syntax errors:');
   print('   ===========================');
-  var stylesheetError = parseCss('.foo #%^&*asdf{ '
+  var stylesheetError = parseCss(
+      '.foo #%^&*asdf{ '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
-      '}', errors: errors);
+      '}',
+      errors: errors);
 
   if (!errors.isEmpty) {
     print("Got ${errors.length} errors.\n");
diff --git a/packages/csslib/lib/css.dart b/packages/csslib/lib/css.dart
index 590e835..e7ef534 100644
--- a/packages/csslib/lib/css.dart
+++ b/packages/csslib/lib/css.dart
@@ -10,9 +10,8 @@
 import 'package:source_span/source_span.dart';
 
 import 'parser.dart';
-import 'visitor.dart';
 import 'src/messages.dart';
-import 'src/options.dart';
+import 'visitor.dart';
 
 void main(List<String> arguments) {
   // TODO(jmesserly): fix this to return a proper exit code
@@ -39,7 +38,7 @@
     var file = new SourceFile(contents, url: path.toUri(inputPath));
 
     // Parse the CSS.
-    var tree = _time(
+    StyleSheet tree = _time(
         'Parse $filename', () => new Parser(file, contents).parse(), verbose);
 
     _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose)
@@ -76,8 +75,6 @@
   buf.write(' -- ');
   if (duration < 10) buf.write(' ');
   if (duration < 100) buf.write(' ');
-  buf
-    ..write(duration)
-    ..write(' ms');
+  buf..write(duration)..write(' ms');
   print(buf.toString());
 }
diff --git a/packages/csslib/lib/parser.dart b/packages/csslib/lib/parser.dart
index b3a22d6..cd4f6c0 100644
--- a/packages/csslib/lib/parser.dart
+++ b/packages/csslib/lib/parser.dart
@@ -8,10 +8,11 @@
 
 import 'package:source_span/source_span.dart';
 
-import "visitor.dart";
+import 'visitor.dart';
 import 'src/messages.dart';
 import 'src/options.dart';
 
+export 'src/messages.dart' show Message;
 export 'src/options.dart';
 
 part 'src/analyzer.dart';
@@ -22,6 +23,12 @@
 part 'src/tokenizer.dart';
 part 'src/tokenkind.dart';
 
+enum ClauseType {
+  none,
+  conjunction,
+  disjunction,
+}
+
 /** Used for parser lookup ahead (used for nested selectors Less support). */
 class ParserState extends TokenizerState {
   final Token peekToken;
@@ -47,8 +54,12 @@
 
 // TODO(terry): Remove nested name parameter.
 /** Parse and analyze the CSS file. */
-StyleSheet compile(input, {List<Message> errors, PreprocessorOptions options,
-    bool nested: true, bool polyfill: false, List<StyleSheet> includes: null}) {
+StyleSheet compile(input,
+    {List<Message> errors,
+    PreprocessorOptions options,
+    bool nested: true,
+    bool polyfill: false,
+    List<StyleSheet> includes: null}) {
   if (includes == null) {
     includes = [];
   }
@@ -115,9 +126,10 @@
 
   var file = new SourceFile(source);
   return (new _Parser(file, source)
-    // TODO(jmesserly): this fix should be applied to the parser. It's tricky
-    // because by the time the flag is set one token has already been fetched.
-    ..tokenizer.inSelector = true).processSelectorGroup();
+        // TODO(jmesserly): this fix should be applied to the parser. It's tricky
+        // because by the time the flag is set one token has already been fetched.
+        ..tokenizer.inSelector = true)
+      .processSelectorGroup();
 }
 
 String _inputAsString(input) {
@@ -158,19 +170,25 @@
   final _Parser _parser;
 
   // TODO(jmesserly): having file and text is redundant.
+  // TODO(rnystrom): baseUrl isn't used. Remove from API.
   Parser(SourceFile file, String text, {int start: 0, String baseUrl})
-      : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl);
+      : _parser = new _Parser(file, text, start: start);
 
   StyleSheet parse() => _parser.parse();
 }
 
+// CSS2.1 pseudo-elements which were defined with a single ':'.
+final _legacyPseudoElements = new Set<String>.from(const [
+  'after',
+  'before',
+  'first-letter',
+  'first-line',
+]);
+
 /** A simple recursive descent parser for CSS. */
 class _Parser {
   final Tokenizer tokenizer;
 
-  /** Base url of CSS file. */
-  final String _baseUrl;
-
   /**
    * File containing the source being parsed, used to report errors with
    * source-span locations.
@@ -180,9 +198,8 @@
   Token _previousToken;
   Token _peekToken;
 
-  _Parser(SourceFile file, String text, {int start: 0, String baseUrl})
+  _Parser(SourceFile file, String text, {int start: 0})
       : this.file = file,
-        _baseUrl = baseUrl,
         tokenizer = new Tokenizer(file, text, true, start) {
     _peekToken = tokenizer.next();
   }
@@ -356,29 +373,21 @@
    *    : IDENT
    */
   List<MediaQuery> processMediaQueryList() {
-    var mediaQueries = [];
+    var mediaQueries = <MediaQuery>[];
 
-    bool firstTime = true;
-    var mediaQuery;
     do {
-      mediaQuery = processMediaQuery(firstTime == true);
+      var mediaQuery = processMediaQuery();
       if (mediaQuery != null) {
         mediaQueries.add(mediaQuery);
-        firstTime = false;
-        continue;
+      } else {
+        break;
       }
-
-      // Any more more media types separated by comma.
-      if (!_maybeEat(TokenKind.COMMA)) break;
-
-      // Yep more media types start again.
-      firstTime = true;
-    } while ((!firstTime && mediaQuery != null) || firstTime);
+    } while (_maybeEat(TokenKind.COMMA));
 
     return mediaQueries;
   }
 
-  MediaQuery processMediaQuery([bool startQuery = true]) {
+  MediaQuery processMediaQuery() {
     // Grammar: [ONLY | NOT]? S* media_type S*
     //          [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]*
 
@@ -390,41 +399,39 @@
     var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen);
     if (unaryOp != -1) {
       if (isChecked) {
-        if (startQuery && unaryOp != TokenKind.MEDIA_OP_NOT ||
+        if (unaryOp != TokenKind.MEDIA_OP_NOT ||
             unaryOp != TokenKind.MEDIA_OP_ONLY) {
           _warning("Only the unary operators NOT and ONLY allowed",
               _makeSpan(start));
         }
-        if (!startQuery && unaryOp != TokenKind.MEDIA_OP_AND) {
-          _warning("Only the binary AND operator allowed", _makeSpan(start));
-        }
       }
       _next();
       start = _peekToken.span;
     }
 
     var type;
-    if (startQuery && unaryOp != TokenKind.MEDIA_OP_AND) {
-      // Get the media type.
-      if (_peekIdentifier()) type = identifier();
-    }
+    // Get the media type.
+    if (_peekIdentifier()) type = identifier();
 
-    var exprs = [];
+    var exprs = <MediaExpression>[];
 
-    if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) {
-      var andOp = false;
-      while (true) {
-        var expr = processMediaExpression(andOp);
-        if (expr == null) break;
-
-        exprs.add(expr);
+    while (true) {
+      // Parse AND if query has a media_type or previous expression.
+      var andOp = exprs.isNotEmpty || type != null;
+      if (andOp) {
         op = _peekToken.text;
         opLen = op.length;
-        andOp = TokenKind.matchMediaOperator(op, 0, opLen) ==
-            TokenKind.MEDIA_OP_AND;
-        if (!andOp) break;
+        if (TokenKind.matchMediaOperator(op, 0, opLen) !=
+            TokenKind.MEDIA_OP_AND) {
+          break;
+        }
         _next();
       }
+
+      var expr = processMediaExpression(andOp);
+      if (expr == null) break;
+
+      exprs.add(expr);
     }
 
     if (unaryOp != -1 || type != null || exprs.length > 0) {
@@ -440,17 +447,16 @@
     if (_maybeEat(TokenKind.LPAREN)) {
       if (_peekIdentifier()) {
         var feature = identifier(); // Media feature.
-        while (_maybeEat(TokenKind.COLON)) {
-          var startExpr = _peekToken.span;
-          var exprs = processExpr();
-          if (_maybeEat(TokenKind.RPAREN)) {
-            return new MediaExpression(
-                andOperator, feature, exprs, _makeSpan(startExpr));
-          } else if (isChecked) {
-            _warning("Missing parenthesis around media expression",
-                _makeSpan(start));
-            return null;
-          }
+        var exprs = _maybeEat(TokenKind.COLON)
+            ? processExpr()
+            : new Expressions(_makeSpan(_peekToken.span));
+        if (_maybeEat(TokenKind.RPAREN)) {
+          return new MediaExpression(
+              andOperator, feature, exprs, _makeSpan(start));
+        } else if (isChecked) {
+          _warning(
+              "Missing parenthesis around media expression", _makeSpan(start));
+          return null;
         }
       } else if (isChecked) {
         _warning("Missing media feature in media expression", _makeSpan(start));
@@ -474,7 +480,12 @@
    *  mixin:              '@mixin name [(args,...)] '{' declarations/ruleset '}'
    *  include:            '@include name [(@arg,@arg1)]
    *                      '@include name [(@arg...)]
-   *  content             '@content'
+   *  content:            '@content'
+   *  -moz-document:      '@-moz-document' [ <url> | url-prefix(<string>) |
+   *                          domain(<string>) | regexp(<string) ]# '{'
+   *                        declarations
+   *                      '}'
+   *  supports:           '@supports' supports_condition group_rule_body
    */
   processDirective() {
     var start = _peekToken.span;
@@ -751,11 +762,17 @@
 
       case TokenKind.DIRECTIVE_INCLUDE:
         return processInclude(_makeSpan(start));
-
       case TokenKind.DIRECTIVE_CONTENT:
         // TODO(terry): TBD
         _warning("@content not implemented.", _makeSpan(start));
         return null;
+      case TokenKind.DIRECTIVE_MOZ_DOCUMENT:
+        return processDocumentDirective();
+      case TokenKind.DIRECTIVE_SUPPORTS:
+        return processSupportsDirective();
+      case TokenKind.DIRECTIVE_VIEWPORT:
+      case TokenKind.DIRECTIVE_MS_VIEWPORT:
+        return processViewportDirective();
     }
     return null;
   }
@@ -775,7 +792,7 @@
 
     var name = identifier();
 
-    List<VarDefinitionDirective> params = [];
+    var params = <TreeNode>[];
     // Any parameters?
     if (_maybeEat(TokenKind.LPAREN)) {
       var mustHaveParam = false;
@@ -813,7 +830,7 @@
       if (declGroup.declarations.any((decl) {
         return decl is Declaration && decl is! IncludeMixinAtDeclaration;
       })) {
-        var newDecls = [];
+        var newDecls = <Declaration>[];
         productions.forEach((include) {
           // If declGroup has items that are declarations then we assume
           // this mixin is a declaration mixin not a top-level mixin.
@@ -943,7 +960,7 @@
       name = identifier();
     }
 
-    var params = [];
+    var params = <List<Expression>>[];
 
     // Any parameters?  Parameters can be multiple terms per argument e.g.,
     // 3px solid yellow, green is two parameters:
@@ -951,7 +968,7 @@
     //    2. green
     // the first has 3 terms and the second has 1 term.
     if (_maybeEat(TokenKind.LPAREN)) {
-      var terms = [];
+      var terms = <Expression>[];
       var expr;
       var keepGoing = true;
       while (keepGoing && (expr = processTerm()) != null) {
@@ -976,6 +993,134 @@
     return new IncludeDirective(name.name, params, span);
   }
 
+  DocumentDirective processDocumentDirective() {
+    var start = _peekToken.span;
+    _next(); // '@-moz-document'
+    var functions = <LiteralTerm>[];
+    do {
+      var function;
+
+      // Consume function token: IDENT '('
+      var ident = identifier();
+      _eat(TokenKind.LPAREN);
+
+      // Consume function arguments.
+      if (ident.name == 'url-prefix' || ident.name == 'domain') {
+        // @-moz-document allows the 'url-prefix' and 'domain' functions to
+        // omit quotations around their argument, contrary to the standard
+        // in which they must be strings. To support this we consume a
+        // string with optional quotation marks, then reapply quotation
+        // marks so they're present in the emitted CSS.
+        var argumentStart = _peekToken.span;
+        var value = processQuotedString(true);
+        // Don't quote the argument if it's empty. '@-moz-document url-prefix()'
+        // is a common pattern used for browser detection.
+        var argument = value.isNotEmpty ? '"$value"' : '';
+        var argumentSpan = _makeSpan(argumentStart);
+
+        _eat(TokenKind.RPAREN);
+
+        var arguments = new Expressions(_makeSpan(argumentSpan))
+          ..add(new LiteralTerm(argument, argument, argumentSpan));
+        function = new FunctionTerm(
+            ident.name, ident.name, arguments, _makeSpan(ident.span));
+      } else {
+        function = processFunction(ident);
+      }
+
+      functions.add(function);
+    } while (_maybeEat(TokenKind.COMMA));
+
+    _eat(TokenKind.LBRACE);
+    var groupRuleBody = processGroupRuleBody();
+    _eat(TokenKind.RBRACE);
+    return new DocumentDirective(functions, groupRuleBody, _makeSpan(start));
+  }
+
+  SupportsDirective processSupportsDirective() {
+    var start = _peekToken.span;
+    _next(); // '@supports'
+    var condition = processSupportsCondition();
+    _eat(TokenKind.LBRACE);
+    var groupRuleBody = processGroupRuleBody();
+    _eat(TokenKind.RBRACE);
+    return new SupportsDirective(condition, groupRuleBody, _makeSpan(start));
+  }
+
+  SupportsCondition processSupportsCondition() {
+    if (_peekKind(TokenKind.IDENTIFIER)) {
+      return processSupportsNegation();
+    }
+
+    var start = _peekToken.span;
+    var conditions = <SupportsConditionInParens>[];
+    var clauseType = ClauseType.none;
+
+    while (true) {
+      conditions.add(processSupportsConditionInParens());
+
+      var type;
+      var text = _peekToken.text.toLowerCase();
+
+      if (text == 'and') {
+        type = ClauseType.conjunction;
+      } else if (text == 'or') {
+        type = ClauseType.disjunction;
+      } else {
+        break; // Done parsing clause.
+      }
+
+      if (clauseType == ClauseType.none) {
+        clauseType = type; // First operand and operator of clause.
+      } else if (clauseType != type) {
+        _error("Operators can't be mixed without a layer of parentheses",
+            _peekToken.span);
+        break;
+      }
+
+      _next(); // Consume operator.
+    }
+
+    if (clauseType == ClauseType.conjunction) {
+      return new SupportsConjunction(conditions, _makeSpan(start));
+    } else if (clauseType == ClauseType.disjunction) {
+      return new SupportsDisjunction(conditions, _makeSpan(start));
+    } else {
+      return conditions.first;
+    }
+  }
+
+  SupportsNegation processSupportsNegation() {
+    var start = _peekToken.span;
+    var text = _peekToken.text.toLowerCase();
+    if (text != 'not') return null;
+    _next(); // 'not'
+    var condition = processSupportsConditionInParens();
+    return new SupportsNegation(condition, _makeSpan(start));
+  }
+
+  SupportsConditionInParens processSupportsConditionInParens() {
+    var start = _peekToken.span;
+    _eat(TokenKind.LPAREN);
+    // Try to parse a condition.
+    var condition = processSupportsCondition();
+    if (condition != null) {
+      _eat(TokenKind.RPAREN);
+      return new SupportsConditionInParens.nested(condition, _makeSpan(start));
+    }
+    // Otherwise, parse a declaration.
+    var declaration = processDeclaration([]);
+    _eat(TokenKind.RPAREN);
+    return new SupportsConditionInParens(declaration, _makeSpan(start));
+  }
+
+  ViewportDirective processViewportDirective() {
+    var start = _peekToken.span;
+    var name = _next().text;
+    var declarations = processDeclarations();
+    return new ViewportDirective(name, declarations, _makeSpan(start));
+  }
+
   RuleSet processRuleSet([SelectorGroup selectorGroup]) {
     if (selectorGroup == null) {
       selectorGroup = processSelectorGroup();
@@ -987,6 +1132,24 @@
     return null;
   }
 
+  List<TreeNode> processGroupRuleBody() {
+    var nodes = <TreeNode>[];
+    while (!(_peekKind(TokenKind.RBRACE) || _peekKind(TokenKind.END_OF_FILE))) {
+      var directive = processDirective();
+      if (directive != null) {
+        nodes.add(directive);
+        continue;
+      }
+      var ruleSet = processRuleSet();
+      if (ruleSet != null) {
+        nodes.add(ruleSet);
+        continue;
+      }
+      break;
+    }
+    return nodes;
+  }
+
   /**
    * Look ahead to see if what should be a declaration is really a selector.
    * If it's a selector than it's a nested selector.  This support's Less'
@@ -1041,8 +1204,8 @@
 
     if (checkBrace) _eat(TokenKind.LBRACE);
 
-    List decls = [];
-    List dartStyles = []; // List of latest styles exposed to Dart.
+    var decls = <TreeNode>[];
+    var dartStyles = []; // List of latest styles exposed to Dart.
 
     do {
       var selectorGroup = _nestedSelector();
@@ -1093,7 +1256,7 @@
   }
 
   List<DeclarationGroup> processMarginsDeclarations() {
-    List groups = [];
+    var groups = <DeclarationGroup>[];
 
     var start = _peekToken.span;
 
@@ -1203,7 +1366,7 @@
     var start = _peekToken.span;
     while (true) {
       // First item is never descendant make sure it's COMBINATOR_NONE.
-      var selectorItem = simpleSelectorSequence(simpleSequences.length == 0);
+      var selectorItem = simpleSelectorSequence(simpleSequences.isEmpty);
       if (selectorItem != null) {
         simpleSequences.add(selectorItem);
       } else {
@@ -1211,9 +1374,23 @@
       }
     }
 
-    if (simpleSequences.length > 0) {
-      return new Selector(simpleSequences, _makeSpan(start));
-    }
+    if (simpleSequences.isEmpty) return null;
+
+    return new Selector(simpleSequences, _makeSpan(start));
+  }
+
+  /// Same as [processSelector] but reports an error for each combinator.
+  ///
+  /// This is a quick fix for parsing <compound-selectors> until the parser
+  /// supports Selector Level 4 grammar:
+  /// https://drafts.csswg.org/selectors-4/#typedef-compound-selector
+  Selector processCompoundSelector() {
+    return processSelector()
+      ..simpleSelectorSequences.forEach((sequence) {
+        if (!sequence.isCombinatorNone) {
+          _error('compound selector can not contain combinator', sequence.span);
+        }
+      });
   }
 
   simpleSelectorSequence(bool forceCombinatorNone) {
@@ -1227,13 +1404,30 @@
         combinatorType = TokenKind.COMBINATOR_PLUS;
         break;
       case TokenKind.GREATER:
+        // Parse > or >>>
         _eat(TokenKind.GREATER);
-        combinatorType = TokenKind.COMBINATOR_GREATER;
+        if (_maybeEat(TokenKind.GREATER)) {
+          _eat(TokenKind.GREATER);
+          combinatorType = TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT;
+        } else {
+          combinatorType = TokenKind.COMBINATOR_GREATER;
+        }
         break;
       case TokenKind.TILDE:
         _eat(TokenKind.TILDE);
         combinatorType = TokenKind.COMBINATOR_TILDE;
         break;
+      case TokenKind.SLASH:
+        // Parse /deep/
+        _eat(TokenKind.SLASH);
+        var ate = _maybeEat(TokenKind.IDENTIFIER);
+        var tok = ate ? _previousToken : _peekToken;
+        if (!(ate && tok.text == 'deep')) {
+          _error('expected deep, but found ${tok.text}', tok.span);
+        }
+        _eat(TokenKind.SLASH);
+        combinatorType = TokenKind.COMBINATOR_DEEP;
+        break;
       case TokenKind.AMPERSAND:
         _eat(TokenKind.AMPERSAND);
         thisOperator = true;
@@ -1422,11 +1616,11 @@
     } else {
       return null;
     }
+    var name = pseudoName.name.toLowerCase();
 
     // Functional pseudo?
-
     if (_peekToken.kind == TokenKind.LPAREN) {
-      if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') {
+      if (!pseudoElement && name == 'not') {
         _eat(TokenKind.LPAREN);
 
         // Negation :   ':NOT(' S* negation_arg S* ')'
@@ -1434,6 +1628,12 @@
 
         _eat(TokenKind.RPAREN);
         return new NegationSelector(negArg, _makeSpan(start));
+      } else if (!pseudoElement && (name == 'host' || name == 'host-context')) {
+        _eat(TokenKind.LPAREN);
+        var selector = processCompoundSelector();
+        _eat(TokenKind.RPAREN);
+        var span = _makeSpan(start);
+        return new PseudoClassFunctionSelector(pseudoName, selector, span);
       } else {
         // Special parsing for expressions in pseudo functions.  Minus is used
         // as operator not identifier.
@@ -1463,14 +1663,11 @@
       }
     }
 
-    // TODO(terry): Need to handle specific pseudo class/element name and
-    // backward compatible names that are : as well as :: as well as
-    // parameters.  Current, spec uses :: for pseudo-element and : for
-    // pseudo-class.  However, CSS2.1 allows for : to specify old
-    // pseudo-elements (:first-line, :first-letter, :before and :after) any
-    // new pseudo-elements defined would require a ::.
-    return pseudoElement
-        ? new PseudoElementSelector(pseudoName, _makeSpan(start))
+    // Treat CSS2.1 pseudo-elements defined with pseudo class syntax as pseudo-
+    // elements for backwards compatibility.
+    return pseudoElement || _legacyPseudoElements.contains(name)
+        ? new PseudoElementSelector(pseudoName, _makeSpan(start),
+            isLegacy: !pseudoElement)
         : new PseudoClassSelector(pseudoName, _makeSpan(start));
   }
 
@@ -1487,7 +1684,7 @@
   processSelectorExpression() {
     var start = _peekToken.span;
 
-    var expressions = [];
+    var expressions = <Expression>[];
 
     Token termToken;
     var value;
@@ -2123,7 +2320,8 @@
           if (_peekKind(TokenKind.INTEGER)) {
             String hexText1 = _peekToken.text;
             _next();
-            if (_peekIdentifier()) {
+            // Append identifier only if there's no delimiting whitespace.
+            if (_peekIdentifier() && _previousToken.end == _peekToken.start) {
               hexText = '$hexText1${identifier().name}';
             } else {
               hexText = hexText1;
@@ -2269,14 +2467,15 @@
           }
 
           var param = expr.expressions[0];
-          var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+          var varUsage =
+              new VarUsage((param as LiteralTerm).text, [], _makeSpan(start));
           expr.expressions[0] = varUsage;
           return expr.expressions;
         }
         break;
     }
 
-    return processDimension(t, value, _makeSpan(start));
+    return t != null ? processDimension(t, value, _makeSpan(start)) : null;
   }
 
   /** Process all dimension units. */
@@ -2422,8 +2621,15 @@
    * then parse to the right paren ignoring everything in between.
    */
   processIEFilter(FileSpan startAfterProgidColon) {
-    var parens = 0;
+    // Support non-functional filters (i.e. filter: FlipH)
+    var kind = _peek();
+    if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) {
+      var tok = tokenizer.makeIEFilter(
+          startAfterProgidColon.start.offset, _peekToken.start);
+      return new LiteralTerm(tok.text, tok.text, tok.span);
+    }
 
+    var parens = 0;
     while (_peek() != TokenKind.END_OF_FILE) {
       switch (_peek()) {
         case TokenKind.LPAREN:
@@ -2467,8 +2673,7 @@
       var token = _peek();
       if (token == TokenKind.LPAREN)
         left++;
-      else if (token == TokenKind.RPAREN)
-        left--;
+      else if (token == TokenKind.RPAREN) left--;
 
       matchingParens = left == 0;
       if (!matchingParens) stringValue.write(_next().text);
@@ -2487,7 +2692,7 @@
     var start = _peekToken.span;
 
     var name = func.name;
-    if (name == 'calc') {
+    if (name == 'calc' || name == '-webkit-calc' || name == '-moz-calc') {
       // TODO(terry): Implement expression parsing properly.
       String expression = processCalcExpression();
       var calcExpr = new LiteralTerm(expression, expression, _makeSpan(start));
@@ -2508,7 +2713,6 @@
   //
   processFunction(Identifier func) {
     var start = _peekToken.span;
-
     var name = func.name;
 
     switch (name) {
@@ -2516,7 +2720,7 @@
         // URI term sucks up everything inside of quotes(' or ") or between parens
         var urlParam = processQuotedString(true);
 
-        // TODO(terry): Better error messge and checking for mismatched quotes.
+        // TODO(terry): Better error message and checking for mismatched quotes.
         if (_peek() == TokenKind.END_OF_FILE) {
           _error("problem parsing URI", _peekToken.span);
         }
@@ -2543,11 +2747,12 @@
           _error("too many parameters to var()", _peekToken.span);
         }
 
-        var paramName = expr.expressions[0].text;
+        var paramName = (expr.expressions[0] as LiteralTerm).text;
 
         // [0] - var name, [1] - OperatorComma, [2] - default value.
-        var defaultValues =
-            expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+        var defaultValues = expr.expressions.length >= 3
+            ? expr.expressions.sublist(2)
+            : <Expression>[];
         return new VarUsage(paramName, defaultValues, _makeSpan(start));
       default:
         var expr = processExpr();
@@ -2557,8 +2762,6 @@
 
         return new FunctionTerm(name, name, expr, _makeSpan(start));
     }
-
-    return null;
   }
 
   Identifier identifier() {
diff --git a/packages/csslib/lib/src/analyzer.dart b/packages/csslib/lib/src/analyzer.dart
index fc27ceb..7c7372c 100644
--- a/packages/csslib/lib/src/analyzer.dart
+++ b/packages/csslib/lib/src/analyzer.dart
@@ -243,7 +243,7 @@
     var selectors = node.selectorGroup.selectors;
 
     // Create a merged set of previous parent selectors and current selectors.
-    var newSelectors = [];
+    var newSelectors = <Selector>[];
     for (Selector selector in selectors) {
       for (Selector nestedSelector in nestedSelectors) {
         var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
@@ -262,12 +262,11 @@
   List<SimpleSelectorSequence> _mergeNestedSelector(
       List<SimpleSelectorSequence> parent,
       List<SimpleSelectorSequence> current) {
-
     // If any & operator then the parent selector will be substituted otherwise
     // the parent selector is pre-pended to the current selector.
     var hasThis = current.any((s) => s.simpleSelector.isThis);
 
-    var newSequence = [];
+    var newSequence = <SimpleSelectorSequence>[];
 
     if (!hasThis) {
       // If no & in the sector group then prefix with the parent selector.
@@ -302,7 +301,7 @@
       List<SimpleSelectorSequence> sequences) {
     if (sequences.isEmpty) return sequences;
 
-    var newSequences = [];
+    var newSequences = <SimpleSelectorSequence>[];
     var first = sequences.first;
     newSequences.add(new SimpleSelectorSequence(
         first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
@@ -592,7 +591,7 @@
    * Given a mixin's defined arguments return a cloned mixin defintion that has
    * replaced all defined arguments with user's supplied VarUsages.
    */
-  MixinDefinition transform(List callArgs) {
+  MixinDefinition transform(List<List<Expression>> callArgs) {
     // TODO(terry): Handle default arguments and varArgs.
     // Transform mixin with callArgs.
     for (var index = 0; index < _definedArgs.length; index++) {
@@ -628,11 +627,11 @@
   }
 
   /** Rip apart var def with multiple parameters. */
-  List<List<TreeNode>> _varDefsAsCallArgs(var callArg) {
-    var defArgs = [];
+  List<List<Expression>> _varDefsAsCallArgs(var callArg) {
+    var defArgs = <List<Expression>>[];
     if (callArg is List && callArg[0] is VarUsage) {
       var varDef = varDefs[callArg[0].name];
-      var expressions = varDef.expression.expressions;
+      var expressions = (varDef.expression as Expressions).expressions;
       assert(expressions.length > 1);
       for (var expr in expressions) {
         if (expr is! OperatorComma) {
@@ -746,8 +745,8 @@
         if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) {
           var index = _findInclude(currDeclGroup.declarations, node);
           if (index != -1) {
-            currDeclGroup.declarations.replaceRange(
-                index, index + 1, [new NoOp()]);
+            currDeclGroup.declarations
+                .replaceRange(index, index + 1, [new NoOp()]);
           }
           _messages.warning(
               "Using top-level mixin ${node.include.name} as a declaration",
@@ -756,11 +755,11 @@
           // We're a list of @include(s) inside of a mixin ruleset - convert
           // to a list of IncludeMixinAtDeclaration(s).
           var origRulesets = mixinDef.rulesets;
-          var rulesets = [];
+          var rulesets = <Declaration>[];
           if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
             origRulesets.forEach((ruleset) {
-              rulesets
-                  .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
+              rulesets.add(new IncludeMixinAtDeclaration(
+                  ruleset as IncludeDirective, ruleset.span));
             });
             _IncludeReplacer.replace(_styleSheet, node, rulesets);
           }
@@ -841,7 +840,7 @@
 /** @include as a top-level with ruleset(s). */
 class _IncludeReplacer extends Visitor {
   final _include;
-  final List<Declaration> _newDeclarations;
+  final List<TreeNode> _newDeclarations;
   bool _foundAndReplaced = false;
 
   /**
@@ -849,7 +848,7 @@
    * with the [newRules].
    */
   static void replace(
-      StyleSheet ss, var include, List<Declaration> newDeclarations) {
+      StyleSheet ss, var include, List<TreeNode> newDeclarations) {
     var visitor = new _IncludeReplacer(include, newDeclarations);
     visitor.visitStyleSheet(ss);
   }
diff --git a/packages/csslib/lib/src/css_printer.dart b/packages/csslib/lib/src/css_printer.dart
index a62ca47..ac26acb 100644
--- a/packages/csslib/lib/src/css_printer.dart
+++ b/packages/csslib/lib/src/css_printer.dart
@@ -54,8 +54,11 @@
 
   void visitMediaExpression(MediaExpression node) {
     emit(node.andOperator ? ' AND ' : ' ');
-    emit('(${node.mediaFeature}:');
-    visitExpressions(node.exprs);
+    emit('(${node.mediaFeature}');
+    if (node.exprs.expressions.isNotEmpty) {
+      emit(':');
+      visitExpressions(node.exprs);
+    }
     emit(')');
   }
 
@@ -68,31 +71,88 @@
     }
   }
 
-  void emitMediaQueries(queries) {
+  void emitMediaQueries(List<MediaQuery> queries) {
     var queriesLen = queries.length;
     for (var i = 0; i < queriesLen; i++) {
       var query = queries[i];
-      if (query.hasMediaType && i > 0) emit(',');
+      if (i > 0) emit(',');
       visitMediaQuery(query);
     }
   }
 
+  void visitDocumentDirective(DocumentDirective node) {
+    emit('$_newLine@-moz-document ');
+    node.functions.first.visit(this);
+    for (var function in node.functions.skip(1)) {
+      emit(',$_sp');
+      function.visit(this);
+    }
+    emit('$_sp{');
+    for (var ruleSet in node.groupRuleBody) {
+      ruleSet.visit(this);
+    }
+    emit('$_newLine}');
+  }
+
+  void visitSupportsDirective(SupportsDirective node) {
+    emit('$_newLine@supports ');
+    node.condition.visit(this);
+    emit('$_sp{');
+    for (var rule in node.groupRuleBody) {
+      rule.visit(this);
+    }
+    emit('$_newLine}');
+  }
+
+  void visitSupportsConditionInParens(SupportsConditionInParens node) {
+    emit('(');
+    node.condition.visit(this);
+    emit(')');
+  }
+
+  void visitSupportsNegation(SupportsNegation node) {
+    emit('not$_sp');
+    node.condition.visit(this);
+  }
+
+  void visitSupportsConjunction(SupportsConjunction node) {
+    node.conditions.first.visit(this);
+    for (var condition in node.conditions.skip(1)) {
+      emit('${_sp}and$_sp');
+      condition.visit(this);
+    }
+  }
+
+  void visitSupportsDisjunction(SupportsDisjunction node) {
+    node.conditions.first.visit(this);
+    for (var condition in node.conditions.skip(1)) {
+      emit('${_sp}or$_sp');
+      condition.visit(this);
+    }
+  }
+
+  void visitViewportDirective(ViewportDirective node) {
+    emit('@${node.name}$_sp{$_newLine');
+    node.declarations.visit(this);
+    emit('}');
+  }
+
   void visitMediaDirective(MediaDirective node) {
-    emit(' @media');
+    emit('$_newLine@media');
     emitMediaQueries(node.mediaQueries);
-    emit(' {');
+    emit('$_sp{');
     for (var ruleset in node.rulesets) {
       ruleset.visit(this);
     }
-    emit('$_newLine\}');
+    emit('$_newLine}');
   }
 
   void visitHostDirective(HostDirective node) {
-    emit('\n@host {');
+    emit('$_newLine@host$_sp{');
     for (var ruleset in node.rulesets) {
       ruleset.visit(this);
     }
-    emit('$_newLine\}');
+    emit('$_newLine}');
   }
 
   /**
@@ -107,16 +167,14 @@
       emit(node._ident);
       emit(node.hasPseudoPage ? ':${node._pseudoPage}' : '');
     }
-    emit(' ');
 
     var declsMargin = node._declsMargin;
     var declsMarginLength = declsMargin.length;
+    emit(' {$_newLine');
     for (var i = 0; i < declsMarginLength; i++) {
-      if (i > 0) emit(_newLine);
-      emit('{$_newLine');
       declsMargin[i].visit(this);
-      emit('}');
     }
+    emit('}');
   }
 
   /** @charset "charset encoding" */
@@ -253,12 +311,11 @@
   }
 
   void visitDeclaration(Declaration node) {
-    String importantAsString() => node.important ? '$_sp!important' : '';
-
-    emit("${node.property}: ");
+    emit('${node.property}:$_sp');
     node._expression.visit(this);
-
-    emit("${importantAsString()}");
+    if (node.important) {
+      emit('$_sp!important');
+    }
   }
 
   void visitVarDefinition(VarDefinition node) {
@@ -326,7 +383,7 @@
 
   void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) {
     emit(":${node.name}(");
-    node.expression.visit(this);
+    node.argument.visit(this);
     emit(')');
   }
 
diff --git a/packages/csslib/lib/src/messages.dart b/packages/csslib/lib/src/messages.dart
index 595bf6c..420c243 100644
--- a/packages/csslib/lib/src/messages.dart
+++ b/packages/csslib/lib/src/messages.dart
@@ -55,9 +55,7 @@
     bool colors = useColors && _ERROR_COLORS.containsKey(level);
     var levelColor = colors ? _ERROR_COLORS[level] : null;
     if (colors) output.write(levelColor);
-    output
-      ..write(_ERROR_LABEL[level])
-      ..write(' ');
+    output..write(_ERROR_LABEL[level])..write(' ');
     if (colors) output.write(NO_COLOR);
 
     if (span == null) {
diff --git a/packages/csslib/lib/src/options.dart b/packages/csslib/lib/src/options.dart
index 95e8a2f..c80370b 100644
--- a/packages/csslib/lib/src/options.dart
+++ b/packages/csslib/lib/src/options.dart
@@ -40,10 +40,16 @@
   /** File to process by the compiler. */
   final String inputFile;
 
-  const PreprocessorOptions({this.verbose: false, this.checked: false,
-      this.lessSupport: true, this.warningsAsErrors: false,
-      this.throwOnErrors: false, this.throwOnWarnings: false,
-      this.useColors: true, this.polyfill: false, this.inputFile});
+  const PreprocessorOptions(
+      {this.verbose: false,
+      this.checked: false,
+      this.lessSupport: true,
+      this.warningsAsErrors: false,
+      this.throwOnErrors: false,
+      this.throwOnWarnings: false,
+      this.useColors: true,
+      this.polyfill: false,
+      this.inputFile});
 
   PreprocessorOptions.fromArgs(ArgResults args)
       : warningsAsErrors = args['warnings_as_errors'],
diff --git a/packages/csslib/lib/src/polyfill.dart b/packages/csslib/lib/src/polyfill.dart
index b18abd1..9bdcbe2 100644
--- a/packages/csslib/lib/src/polyfill.dart
+++ b/packages/csslib/lib/src/polyfill.dart
@@ -40,14 +40,17 @@
   void processVarDefinitions(List<StyleSheet> includes) {
     for (var include in includes) {
       _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions)
-        ..visitTree(include)).varDefs;
+            ..visitTree(include))
+          .varDefs;
     }
   }
 
   void processVars(StyleSheet styleSheet) {
     // Build list of all var definitions.
-    var mainStyleSheetVarDefs = (new _VarDefAndUsage(
-        this._messages, _allVarDefinitions)..visitTree(styleSheet)).varDefs;
+    var mainStyleSheetVarDefs =
+        (new _VarDefAndUsage(this._messages, _allVarDefinitions)
+              ..visitTree(styleSheet))
+            .varDefs;
 
     // Resolve all definitions to a non-VarUsage (terminal expression).
     mainStyleSheetVarDefs.forEach((key, value) {
@@ -170,7 +173,7 @@
   }
 
   List<Expression> resolveUsageTerminal(VarUsage usage) {
-    var result = [];
+    var result = <Expression>[];
 
     var varDef = _knownVarDefs[usage.name];
     var expressions;
diff --git a/packages/csslib/lib/src/property.dart b/packages/csslib/lib/src/property.dart
index c2cf776..a2cf97c 100644
--- a/packages/csslib/lib/src/property.dart
+++ b/packages/csslib/lib/src/property.dart
@@ -79,9 +79,11 @@
    * components.
    */
   Color.createRgba(int red, int green, int blue, [num alpha])
-      : this._argb = Color.convertToHexString(Color._clamp(red, 0, 255),
-          Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255),
-          alpha != null ? Color._clamp(alpha, 0, 1) : alpha);
+      : this._argb = Color.convertToHexString(
+            Color._clamp(red, 0, 255),
+            Color._clamp(green, 0, 255),
+            Color._clamp(blue, 0, 255),
+            alpha != null ? Color._clamp(alpha, 0, 1) : alpha);
 
   /**
    * Creates a new color from a CSS color string. For more information, see
@@ -105,10 +107,12 @@
    */
   Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent,
       [num alpha])
-      : this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360,
-          Color._clamp(saturationPercent, 0, 100) / 100,
-          Color._clamp(lightnessPercent, 0, 100) / 100,
-          alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
+      : this._argb = new Hsla(
+                Color._clamp(hueDegree, 0, 360) / 360,
+                Color._clamp(saturationPercent, 0, 100) / 100,
+                Color._clamp(lightnessPercent, 0, 100) / 100,
+                alpha != null ? Color._clamp(alpha, 0, 1) : alpha)
+            .toHexArgbString();
 
   /**
    * The hslaRaw takes three values.  The [hue] degree on the color wheel; '0'
@@ -126,9 +130,12 @@
    *                opaque foreground.
    */
   Color.hslaRaw(num hue, num saturation, num lightness, [num alpha])
-      : this._argb = new Hsla(Color._clamp(hue, 0, 1),
-          Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1),
-          alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
+      : this._argb = new Hsla(
+                Color._clamp(hue, 0, 1),
+                Color._clamp(saturation, 0, 1),
+                Color._clamp(lightness, 0, 1),
+                alpha != null ? Color._clamp(alpha, 0, 1) : alpha)
+            .toHexArgbString();
 
   /**
    * Generate a real constant for pre-defined colors (no leading #).
@@ -529,10 +536,11 @@
   factory Rgba.fromColor(Color color) => color.rgba;
 
   factory Rgba.fromArgbValue(num value) {
-    return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */
-        ((value.toInt() & 0xff0000) >> 0x10), /* r */
-        ((value.toInt() & 0xff00) >> 8), /* g */
-        ((value.toInt() & 0xff))); /* b */
+    return new Rgba(
+        ((value.toInt() & 0xff000000) >> 0x18), // a
+        ((value.toInt() & 0xff0000) >> 0x10), // r
+        ((value.toInt() & 0xff00) >> 8), // g
+        ((value.toInt() & 0xff))); // b
   }
 
   factory Rgba.fromHsla(Hsla hsla) {
@@ -1029,7 +1037,12 @@
    * [FontVariant], and [lineHeight] extra space (leading) around the font in
    * pixels, if not specified it's 1.2 the font size.
    */
-  const Font({this.size, this.family, this.weight, this.style, this.variant,
+  const Font(
+      {this.size,
+      this.family,
+      this.weight,
+      this.style,
+      this.variant,
       this.lineHeight});
 
   /**
@@ -1232,4 +1245,4 @@
   num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0);
 }
 
-_mergeVal(x, y) => y != null ? y : x;
+/*=T*/ _mergeVal/*<T>*/(/*=T*/ x, /*=T*/ y) => y != null ? y : x;
diff --git a/packages/csslib/lib/src/tokenizer.dart b/packages/csslib/lib/src/tokenizer.dart
index d423104..d7677f9 100644
--- a/packages/csslib/lib/src/tokenizer.dart
+++ b/packages/csslib/lib/src/tokenizer.dart
@@ -97,7 +97,7 @@
       case TokenChar.HASH:
         return _finishToken(TokenKind.HASH);
       case TokenChar.PLUS:
-        if (maybeEatDigit()) return finishNumber();
+        if (_nextCharsAreNumber(ch)) return finishNumber();
         return _finishToken(TokenKind.PLUS);
       case TokenChar.MINUS:
         if (inSelectorExpression || unicodeRange) {
@@ -105,7 +105,7 @@
           // not part of identifier e.g., interval value range (e.g. U+400-4ff)
           // or minus operator in selector expression.
           return _finishToken(TokenKind.MINUS);
-        } else if (maybeEatDigit()) {
+        } else if (_nextCharsAreNumber(ch)) {
           return finishNumber();
         } else if (TokenizerHelpers.isIdentifierStart(ch)) {
           return finishIdentifier();
@@ -202,8 +202,13 @@
           } else {
             return _errorToken();
           }
-        } else if ((ch == UNICODE_U || ch == UNICODE_LOWER_U) &&
+        } else if (_inString &&
+            (ch == UNICODE_U || ch == UNICODE_LOWER_U) &&
             (_peekChar() == UNICODE_PLUS)) {
+          // `_inString` is misleading. We actually DON'T want to enter this
+          // block while tokenizing a string, but the parser sets this value to
+          // false while it IS consuming tokens within a string.
+          //
           // Unicode range: U+uNumber[-U+uNumber]
           //   uNumber = 0..10FFFF
           _nextChar(); // Skip +
@@ -260,7 +265,7 @@
   Token finishIdentifier() {
     // If we encounter an escape sequence, remember it so we can post-process
     // to unescape.
-    var chars = [];
+    var chars = <int>[];
 
     // backup so we can start with the first character
     int validateFrom = _index;
@@ -414,7 +419,6 @@
         }
       }
     }
-    return _errorToken();
   }
 }
 
@@ -446,7 +450,9 @@
         // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
         // http://www.w3.org/TR/CSS21/syndata.html#characters
         // Also, escaped character should be allowed.
-        c == 95 /*_*/ || c >= 0xA0 || c == 92 /*\*/);
+        c == 95 /*_*/ ||
+        c >= 0xA0 ||
+        c == 92 /*\*/);
   }
 
   /** Pseudo function expressions identifiers can't have a minus sign. */
diff --git a/packages/csslib/lib/src/tokenizer_base.dart b/packages/csslib/lib/src/tokenizer_base.dart
index 663c987..c2a448f 100644
--- a/packages/csslib/lib/src/tokenizer_base.dart
+++ b/packages/csslib/lib/src/tokenizer_base.dart
@@ -55,8 +55,7 @@
   int _index = 0;
   int _startIndex = 0;
 
-  TokenizerBase(this._file, this._text, this._inString,
-      [this._index = 0]);
+  TokenizerBase(this._file, this._text, this._inString, [this._index = 0]);
 
   Token next();
   int getIdentifierKind();
@@ -80,9 +79,9 @@
     }
   }
 
-  int _peekChar() {
-    if (_index < _text.length) {
-      return _text.codeUnitAt(_index);
+  int _peekChar([int offset = 0]) {
+    if (_index + offset < _text.length) {
+      return _text.codeUnitAt(_index + offset);
     } else {
       return 0;
     }
@@ -101,6 +100,17 @@
     }
   }
 
+  bool _nextCharsAreNumber(int first) {
+    if (TokenizerHelpers.isDigit(first)) return true;
+    var second = _peekChar();
+    if (first == TokenChar.DOT) return TokenizerHelpers.isDigit(second);
+    if (first == TokenChar.PLUS || first == TokenChar.MINUS) {
+      return TokenizerHelpers.isDigit(second) ||
+          (second == TokenChar.DOT && TokenizerHelpers.isDigit(_peekChar(1)));
+    }
+    return false;
+  }
+
   Token _finishToken(int kind) {
     return new Token(kind, _file.span(_startIndex, _index));
   }
diff --git a/packages/csslib/lib/src/tokenkind.dart b/packages/csslib/lib/src/tokenkind.dart
index 27ccb4b..14cf3c9 100644
--- a/packages/csslib/lib/src/tokenkind.dart
+++ b/packages/csslib/lib/src/tokenkind.dart
@@ -100,8 +100,10 @@
   static const int COMBINATOR_PLUS = 515; // + combinator
   static const int COMBINATOR_GREATER = 516; // > combinator
   static const int COMBINATOR_TILDE = 517; // ~ combinator
+  static const int COMBINATOR_SHADOW_PIERCING_DESCENDANT = 518; // >>>
+  static const int COMBINATOR_DEEP = 519; // /deep/ (aliases >>>)
 
-  static const int UNARY_OP_NONE = 518; // No unary operator present.
+  static const int UNARY_OP_NONE = 520; // No unary operator present.
 
   // Attribute match types:
   static const int INCLUDES = 530; // '~='
@@ -159,6 +161,10 @@
   static const int DIRECTIVE_INCLUDE = 655;
   static const int DIRECTIVE_CONTENT = 656;
   static const int DIRECTIVE_EXTEND = 657;
+  static const int DIRECTIVE_MOZ_DOCUMENT = 658;
+  static const int DIRECTIVE_SUPPORTS = 659;
+  static const int DIRECTIVE_VIEWPORT = 660;
+  static const int DIRECTIVE_MS_VIEWPORT = 661;
 
   // Media query operators
   static const int MEDIA_OP_ONLY = 665; // Unary.
@@ -216,6 +222,10 @@
     const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'},
     const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'},
     const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'},
+    const {'type': TokenKind.DIRECTIVE_MOZ_DOCUMENT, 'value': '-moz-document'},
+    const {'type': TokenKind.DIRECTIVE_SUPPORTS, 'value': 'supports'},
+    const {'type': TokenKind.DIRECTIVE_VIEWPORT, 'value': 'viewport'},
+    const {'type': TokenKind.DIRECTIVE_MS_VIEWPORT, 'value': '-ms-viewport'},
   ];
 
   static const List<Map<String, dynamic>> MEDIA_OPERATORS = const [
diff --git a/packages/csslib/lib/src/tree.dart b/packages/csslib/lib/src/tree.dart
index ba8370e..509e708 100644
--- a/packages/csslib/lib/src/tree.dart
+++ b/packages/csslib/lib/src/tree.dart
@@ -120,12 +120,28 @@
   bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE;
   bool get isCombinatorDescendant =>
       combinator == TokenKind.COMBINATOR_DESCENDANT;
+  bool get isCombinatorDeep => combinator == TokenKind.COMBINATOR_DEEP;
+  bool get isCombinatorShadowPiercingDescendant =>
+      combinator == TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT;
 
-  String get _combinatorToString => isCombinatorDescendant
-      ? ' '
-      : isCombinatorPlus
-          ? ' + '
-          : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : '';
+  String get _combinatorToString {
+    switch (combinator) {
+      case TokenKind.COMBINATOR_SHADOW_PIERCING_DESCENDANT:
+        return ' >>> ';
+      case TokenKind.COMBINATOR_DEEP:
+        return ' /deep/ ';
+      case TokenKind.COMBINATOR_DESCENDANT:
+        return ' ';
+      case TokenKind.COMBINATOR_GREATER:
+        return ' > ';
+      case TokenKind.COMBINATOR_PLUS:
+        return ' + ';
+      case TokenKind.COMBINATOR_TILDE:
+        return ' ~ ';
+      default:
+        return '';
+    }
+  }
 
   SimpleSelectorSequence clone() =>
       new SimpleSelectorSequence(simpleSelector, span, combinator);
@@ -283,23 +299,32 @@
 
 // ::pseudoElement
 class PseudoElementSelector extends SimpleSelector {
-  PseudoElementSelector(Identifier name, SourceSpan span) : super(name, span);
+  // If true, this is a CSS2.1 pseudo-element with only a single ':'.
+  final bool isLegacy;
+
+  PseudoElementSelector(Identifier name, SourceSpan span,
+      {this.isLegacy: false})
+      : super(name, span);
   visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
 
   PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
 
-  String toString() => "::$name";
+  String toString() => "${isLegacy ? ':' : '::'}$name";
 }
 
-// :pseudoClassFunction(expression)
+// :pseudoClassFunction(argument)
 class PseudoClassFunctionSelector extends PseudoClassSelector {
-  final SelectorExpression expression;
+  final TreeNode _argument; // Selector, SelectorExpression
 
-  PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span)
+  PseudoClassFunctionSelector(Identifier name, this._argument, SourceSpan span)
       : super(name, span);
 
   PseudoClassFunctionSelector clone() =>
-      new PseudoClassFunctionSelector(_name, expression, span);
+      new PseudoClassFunctionSelector(_name, _argument, span);
+
+  TreeNode get argument => _argument;
+  Selector get selector => _argument as Selector;
+  SelectorExpression get expression => _argument as SelectorExpression;
 
   visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
 }
@@ -410,6 +435,124 @@
   visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
+class DocumentDirective extends Directive {
+  final List<LiteralTerm> functions;
+  final List<TreeNode> groupRuleBody;
+
+  DocumentDirective(this.functions, this.groupRuleBody, SourceSpan span)
+      : super(span);
+
+  DocumentDirective clone() {
+    var clonedFunctions = <LiteralTerm>[];
+    for (var function in functions) {
+      clonedFunctions.add(function.clone());
+    }
+    var clonedGroupRuleBody = <TreeNode>[];
+    for (var rule in groupRuleBody) {
+      clonedGroupRuleBody.add(rule.clone());
+    }
+    return new DocumentDirective(clonedFunctions, clonedGroupRuleBody, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
+}
+
+class SupportsDirective extends Directive {
+  final SupportsCondition condition;
+  final List<TreeNode> groupRuleBody;
+
+  SupportsDirective(this.condition, this.groupRuleBody, SourceSpan span)
+      : super(span);
+
+  SupportsDirective clone() {
+    var clonedCondition = condition.clone();
+    var clonedGroupRuleBody = <TreeNode>[];
+    for (var rule in groupRuleBody) {
+      clonedGroupRuleBody.add(rule.clone());
+    }
+    return new SupportsDirective(clonedCondition, clonedGroupRuleBody, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
+}
+
+abstract class SupportsCondition extends TreeNode {
+  SupportsCondition(SourceSpan span) : super(span);
+}
+
+class SupportsConditionInParens extends SupportsCondition {
+  /// A [Declaration] or nested [SupportsCondition].
+  final TreeNode condition;
+
+  SupportsConditionInParens(Declaration declaration, SourceSpan span)
+      : condition = declaration,
+        super(span);
+
+  SupportsConditionInParens.nested(SupportsCondition condition, SourceSpan span)
+      : condition = condition,
+        super(span);
+
+  SupportsConditionInParens clone() =>
+      new SupportsConditionInParens(condition.clone(), span);
+
+  visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this);
+}
+
+class SupportsNegation extends SupportsCondition {
+  final SupportsConditionInParens condition;
+
+  SupportsNegation(this.condition, SourceSpan span) : super(span);
+
+  SupportsNegation clone() => new SupportsNegation(condition.clone(), span);
+
+  visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
+}
+
+class SupportsConjunction extends SupportsCondition {
+  final List<SupportsConditionInParens> conditions;
+
+  SupportsConjunction(this.conditions, SourceSpan span) : super(span);
+
+  SupportsConjunction clone() {
+    var clonedConditions = <SupportsCondition>[];
+    for (var condition in conditions) {
+      clonedConditions.add(condition.clone());
+    }
+    return new SupportsConjunction(clonedConditions, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
+}
+
+class SupportsDisjunction extends SupportsCondition {
+  final List<SupportsConditionInParens> conditions;
+
+  SupportsDisjunction(this.conditions, SourceSpan span) : super(span);
+
+  SupportsDisjunction clone() {
+    var clonedConditions = <SupportsCondition>[];
+    for (var condition in conditions) {
+      clonedConditions.add(condition.clone());
+    }
+    return new SupportsDisjunction(clonedConditions, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
+}
+
+class ViewportDirective extends Directive {
+  final String name;
+  final DeclarationGroup declarations;
+
+  ViewportDirective(this.name, this.declarations, SourceSpan span)
+      : super(span);
+
+  ViewportDirective clone() =>
+      new ViewportDirective(name, declarations.clone(), span);
+
+  visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
+}
+
 class ImportDirective extends Directive {
   /** import name specified. */
   final String import;
@@ -421,7 +564,7 @@
       : super(span);
 
   ImportDirective clone() {
-    var cloneMediaQueries = [];
+    var cloneMediaQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneMediaQueries.add(mediaQuery.clone());
     }
@@ -483,12 +626,13 @@
       TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
 
   MediaQuery clone() {
-    var cloneExpressions = [];
+    var cloneExpressions = <MediaExpression>[];
     for (var expr in expressions) {
       cloneExpressions.add(expr.clone());
     }
     return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
   }
+
   visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
 }
 
@@ -500,11 +644,11 @@
       : super(span);
 
   MediaDirective clone() {
-    var cloneQueries = [];
+    var cloneQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneQueries.add(mediaQuery.clone());
     }
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -520,7 +664,7 @@
   HostDirective(this.rulesets, SourceSpan span) : super(span);
 
   HostDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -540,7 +684,7 @@
       : super(span);
 
   PageDirective clone() {
-    var cloneDeclsMargin = [];
+    var cloneDeclsMargin = <DeclarationGroup>[];
     for (var declMargin in _declsMargin) {
       cloneDeclsMargin.add(declMargin.clone());
     }
@@ -599,6 +743,7 @@
     }
     return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
   }
+
   visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
@@ -635,7 +780,7 @@
   bool get isExtension => true;
 
   StyletDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -675,14 +820,14 @@
 
 class MixinDefinition extends Directive {
   final String name;
-  final List definedArgs;
+  final List<TreeNode> definedArgs;
   final bool varArgs;
 
   MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
       : super(span);
 
   MixinDefinition clone() {
-    var cloneDefinedArgs = [];
+    var cloneDefinedArgs = <TreeNode>[];
     for (var definedArg in definedArgs) {
       cloneDefinedArgs.add(definedArg.clone());
     }
@@ -694,18 +839,18 @@
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
 class MixinRulesetDirective extends MixinDefinition {
-  final List rulesets;
+  final List<TreeNode> rulesets;
 
-  MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
-      bool varArgs, this.rulesets, SourceSpan span)
+  MixinRulesetDirective(String name, List<TreeNode> args, bool varArgs,
+      this.rulesets, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinRulesetDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <VarDefinition>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
-    var clonedRulesets = [];
+    var clonedRulesets = <TreeNode>[];
     for (var ruleset in rulesets) {
       clonedRulesets.add(ruleset.clone());
     }
@@ -719,12 +864,12 @@
 class MixinDeclarationDirective extends MixinDefinition {
   final DeclarationGroup declarations;
 
-  MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
-      bool varArgs, this.declarations, SourceSpan span)
+  MixinDeclarationDirective(String name, List<TreeNode> args, bool varArgs,
+      this.declarations, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinDeclarationDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <TreeNode>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
@@ -738,16 +883,14 @@
 /** To support consuming a SASS mixin @include. */
 class IncludeDirective extends Directive {
   final String name;
-  final List<List<TreeNode>> args;
+  final List<List<Expression>> args;
 
   IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
 
   IncludeDirective clone() {
-    var cloneArgs = [];
+    var cloneArgs = <List<Expression>>[];
     for (var arg in args) {
-      for (var term in arg) {
-        cloneArgs.add(term.clone());
-      }
+      cloneArgs.add(arg.map((term) => term.clone()).toList());
     }
     return new IncludeDirective(name, cloneArgs, span);
   }
@@ -790,9 +933,9 @@
 
   bool get hasDartStyle => dartStyle != null;
 
-  Declaration clone() => new Declaration(
-      _property.clone(), _expression.clone(), dartStyle, span,
-      important: important);
+  Declaration clone() =>
+      new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
+          important: important);
 
   visit(VisitorBase visitor) => visitor.visitDeclaration(this);
 }
@@ -852,7 +995,7 @@
 
 class DeclarationGroup extends TreeNode {
   /** Can be either Declaration or RuleSet (if nested selector). */
-  final List declarations;
+  final List<TreeNode> declarations;
 
   DeclarationGroup(this.declarations, SourceSpan span) : super(span);
 
@@ -867,10 +1010,10 @@
 class MarginGroup extends DeclarationGroup {
   final int margin_sym; // TokenType for for @margin sym.
 
-  MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
+  MarginGroup(this.margin_sym, List<TreeNode> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
-      new MarginGroup(margin_sym, super.clone() as dynamic, span);
+      new MarginGroup(margin_sym, super.clone().declarations, span);
   visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
@@ -881,7 +1024,7 @@
   VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
 
   VarUsage clone() {
-    var clonedValues = [];
+    var clonedValues = <Expression>[];
     for (var expr in defaultValues) {
       clonedValues.add(expr.clone());
     }
@@ -1165,6 +1308,7 @@
     }
     return clonedExprs;
   }
+
   visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
@@ -1231,15 +1375,20 @@
   //   font-style font-variant font-weight font-size/line-height font-family
   // TODO(terry): Only px/pt for now need to handle all possible units to
   //              support calc expressions on units.
-  FontExpression(SourceSpan span, {dynamic size, List<String> family,
-      int weight, String style, String variant, LineHeight lineHeight})
+  FontExpression(SourceSpan span,
+      {dynamic size,
+      List<String> family,
+      int weight,
+      String style,
+      String variant,
+      LineHeight lineHeight})
       : font = new Font(
-          size: size is LengthTerm ? size.value : size,
-          family: family,
-          weight: weight,
-          style: style,
-          variant: variant,
-          lineHeight: lineHeight),
+            size: size is LengthTerm ? size.value : size,
+            family: family,
+            weight: weight,
+            style: style,
+            variant: variant,
+            lineHeight: lineHeight),
         super(DartStyleExpression.fontStyle, span);
 
   FontExpression merged(DartStyleExpression newFontExpr) {
@@ -1297,7 +1446,7 @@
   /** Margin expression ripped apart. */
   MarginExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.marginStyle, span,
-          new BoxEdge(left, top, right, bottom));
+            new BoxEdge(left, top, right, bottom));
 
   MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.marginStyle, span, box);
@@ -1333,7 +1482,7 @@
   /** Border expression ripped apart. */
   BorderExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.borderStyle, span,
-          new BoxEdge(left, top, right, bottom));
+            new BoxEdge(left, top, right, bottom));
 
   BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.borderStyle, span, box);
@@ -1358,7 +1507,7 @@
   BorderExpression._merge(
       BorderExpression x, BorderExpression y, SourceSpan span)
       : super(DartStyleExpression.borderStyle, span,
-          new BoxEdge.merge(x.box, y.box));
+            new BoxEdge.merge(x.box, y.box));
 
   BorderExpression clone() => new BorderExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
@@ -1410,7 +1559,7 @@
   /** Padding expression ripped apart. */
   PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.paddingStyle, span,
-          new BoxEdge(left, top, right, bottom));
+            new BoxEdge(left, top, right, bottom));
 
   PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.paddingStyle, span, box);
@@ -1435,7 +1584,7 @@
   PaddingExpression._merge(
       PaddingExpression x, PaddingExpression y, SourceSpan span)
       : super(DartStyleExpression.paddingStyle, span,
-          new BoxEdge.merge(x.box, y.box));
+            new BoxEdge.merge(x.box, y.box));
 
   PaddingExpression clone() => new PaddingExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
diff --git a/packages/csslib/lib/src/tree_base.dart b/packages/csslib/lib/src/tree_base.dart
index 095b493..3ead0bf 100644
--- a/packages/csslib/lib/src/tree_base.dart
+++ b/packages/csslib/lib/src/tree_base.dart
@@ -16,7 +16,7 @@
   TreeNode clone();
 
   /** Classic double-dispatch visitor for implementing passes. */
-  void visit(VisitorBase visitor);
+  visit(VisitorBase visitor);
 
   /** A multiline string showing the node and its children. */
   String toDebugString() {
@@ -59,16 +59,21 @@
   }
 
   String toValue(value) {
-    if (value == null) return 'null';
-    else if (value is Identifier) return value.name;
-    else return value.toString();
+    if (value == null)
+      return 'null';
+    else if (value is Identifier)
+      return value.name;
+    else
+      return value.toString();
   }
 
   void writeNode(String label, TreeNode node) {
     write('${label}: ');
     depth += 1;
-    if (node != null) node.visit(printer);
-    else writeln('null');
+    if (node != null)
+      node.visit(printer);
+    else
+      writeln('null');
     depth -= 1;
   }
 
diff --git a/packages/csslib/lib/src/tree_printer.dart b/packages/csslib/lib/src/tree_printer.dart
index 9b0a6c2..ba35dec 100644
--- a/packages/csslib/lib/src/tree_printer.dart
+++ b/packages/csslib/lib/src/tree_printer.dart
@@ -90,6 +90,57 @@
     output.depth--;
   }
 
+  void visitDocumentDirective(DocumentDirective node) {
+    heading('DocumentDirective', node);
+    output.depth++;
+    output.writeNodeList('functions', node.functions);
+    output.writeNodeList('group rule body', node.groupRuleBody);
+    output.depth--;
+  }
+
+  void visitSupportsDirective(SupportsDirective node) {
+    heading('SupportsDirective', node);
+    output.depth++;
+    output.writeNode('condition', node.condition);
+    output.writeNodeList('group rule body', node.groupRuleBody);
+    output.depth--;
+  }
+
+  void visitSupportsConditionInParens(SupportsConditionInParens node) {
+    heading('SupportsConditionInParens', node);
+    output.depth++;
+    output.writeNode('condition', node.condition);
+    output.depth--;
+  }
+
+  void visitSupportsNegation(SupportsNegation node) {
+    heading('SupportsNegation', node);
+    output.depth++;
+    output.writeNode('condition', node.condition);
+    output.depth--;
+  }
+
+  void visitSupportsConjunction(SupportsConjunction node) {
+    heading('SupportsConjunction', node);
+    output.depth++;
+    output.writeNodeList('conditions', node.conditions);
+    output.depth--;
+  }
+
+  void visitSupportsDisjunction(SupportsDisjunction node) {
+    heading('SupportsDisjunction', node);
+    output.depth++;
+    output.writeNodeList('conditions', node.conditions);
+    output.depth--;
+  }
+
+  void visitViewportDirective(ViewportDirective node) {
+    heading('ViewportDirective', node);
+    output.depth++;
+    super.visitViewportDirective(node);
+    output.depth--;
+  }
+
   void visitPageDirective(PageDirective node) {
     heading('PageDirective', node);
     output.depth++;
@@ -271,6 +322,10 @@
       output.writeValue('combinator', ">");
     } else if (node.isCombinatorTilde) {
       output.writeValue('combinator', "~");
+    } else if (node.isCombinatorShadowPiercingDescendant) {
+      output.writeValue('combinator', '>>>');
+    } else if (node.isCombinatorDeep) {
+      output.writeValue('combinator', '/deep/');
     } else {
       output.writeValue('combinator', "ERROR UNKNOWN");
     }
@@ -338,7 +393,7 @@
   void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) {
     heading('Pseudo Class Function Selector', node);
     output.depth++;
-    visitSelectorExpression(node.expression);
+    node.argument.visit(this);
     super.visitPseudoClassFunctionSelector(node);
     output.depth--;
   }
diff --git a/packages/csslib/lib/visitor.dart b/packages/csslib/lib/visitor.dart
index b6babbd..eff9e7b 100644
--- a/packages/csslib/lib/visitor.dart
+++ b/packages/csslib/lib/visitor.dart
@@ -20,6 +20,13 @@
   visitNoOp(NoOp node);
   visitTopLevelProduction(TopLevelProduction node);
   visitDirective(Directive node);
+  visitDocumentDirective(DocumentDirective node);
+  visitSupportsDirective(SupportsDirective node);
+  visitSupportsConditionInParens(SupportsConditionInParens node);
+  visitSupportsNegation(SupportsNegation node);
+  visitSupportsConjunction(SupportsConjunction node);
+  visitSupportsDisjunction(SupportsDisjunction node);
+  visitViewportDirective(ViewportDirective node);
   visitMediaExpression(MediaExpression node);
   visitMediaQuery(MediaQuery node);
   visitMediaDirective(MediaDirective node);
@@ -152,6 +159,36 @@
     }
   }
 
+  visitDocumentDirective(DocumentDirective node) {
+    _visitNodeList(node.functions);
+    _visitNodeList(node.groupRuleBody);
+  }
+
+  visitSupportsDirective(SupportsDirective node) {
+    node.condition.visit(this);
+    _visitNodeList(node.groupRuleBody);
+  }
+
+  visitSupportsConditionInParens(SupportsConditionInParens node) {
+    node.condition.visit(this);
+  }
+
+  visitSupportsNegation(SupportsNegation node) {
+    node.condition.visit(this);
+  }
+
+  visitSupportsConjunction(SupportsConjunction node) {
+    _visitNodeList(node.conditions);
+  }
+
+  visitSupportsDisjunction(SupportsDisjunction node) {
+    _visitNodeList(node.conditions);
+  }
+
+  visitViewportDirective(ViewportDirective node) {
+    node.declarations.visit(this);
+  }
+
   visitMediaDirective(MediaDirective node) {
     for (var mediaQuery in node.mediaQueries) {
       visitMediaQuery(mediaQuery);
@@ -302,8 +339,7 @@
   visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
       visitSimpleSelector(node);
 
-  visitNegationSelector(NegationSelector node) =>
-      visitSimpleSelector(node);
+  visitNegationSelector(NegationSelector node) => visitSimpleSelector(node);
 
   visitSelectorExpression(SelectorExpression node) {
     _visitNodeList(node.expressions);
diff --git a/packages/csslib/pubspec.yaml b/packages/csslib/pubspec.yaml
index 96f403e..ac5d5c5 100644
--- a/packages/csslib/pubspec.yaml
+++ b/packages/csslib/pubspec.yaml
@@ -1,6 +1,6 @@
 name: csslib
-version: 0.12.2
-author: Polymer.dart Team <web-ui-dev@dartlang.org>
+version: 0.13.7+1
+author: Dart Team <misc@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://github.com/dart-lang/csslib
 environment:
diff --git a/packages/csslib/test/big_1_test.dart b/packages/csslib/test/big_1_test.dart
index f92ea82..9a6a584 100644
--- a/packages/csslib/test/big_1_test.dart
+++ b/packages/csslib/test/big_1_test.dart
@@ -4,11 +4,12 @@
 
 library big_1_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 import 'testing.dart';
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/packages/csslib/test/compiler_test.dart b/packages/csslib/test/compiler_test.dart
index df5a44a..e64af7f 100644
--- a/packages/csslib/test/compiler_test.dart
+++ b/packages/csslib/test/compiler_test.dart
@@ -7,11 +7,12 @@
 import 'dart:convert';
 import 'package:test/test.dart';
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'testing.dart';
 
 void testClass() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -24,7 +25,7 @@
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
 
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -37,7 +38,7 @@
 }
 
 void testClass2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar .bar .no-story {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -49,7 +50,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -73,7 +74,7 @@
 }
 
 void testId() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "#elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -85,7 +86,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -99,7 +100,7 @@
 }
 
 void testElement() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -111,7 +112,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -160,7 +161,7 @@
 }
 
 void testNamespace() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -172,15 +173,15 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
   var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
 
   expect(simpleSeqs.length, 1);
-  var simpSelector = simpleSeqs[0].simpleSelector;
-  expect(simpSelector is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector.isNamespaceWildcard, false);
   expect(simpSelector.namespace, "ns1");
@@ -191,7 +192,7 @@
 }
 
 void testNamespace2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div div ns2|span .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -203,7 +204,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -211,8 +212,8 @@
 
   expect(simpleSeqs.length, 4);
 
-  var simpSelector0 = simpleSeqs[0].simpleSelector;
-  expect(simpSelector0 is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector0.namespace, "ns1");
   var elementSelector0 = simpSelector0.nameAsSimpleSelector;
@@ -225,8 +226,8 @@
   expect(simpleSeqs[1].isCombinatorDescendant, true);
   expect(simpSelector1.name, "div");
 
-  var simpSelector2 = simpleSeqs[2].simpleSelector;
-  expect(simpSelector2 is NamespaceSelector, true);
+  expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true);
+  var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[2].isCombinatorDescendant, true);
   expect(simpSelector2.namespace, "ns2");
   var elementSelector2 = simpSelector2.nameAsSimpleSelector;
@@ -241,7 +242,7 @@
 }
 
 void testSelectorGroups() {
-  var errors = [];
+  var errors = <Message>[];
   var input =
       "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
@@ -254,7 +255,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 5);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -301,8 +302,8 @@
   expect(groupSelector4.simpleSelectorSequences.length, 4);
 
   var selector40 = groupSelector4.simpleSelectorSequences[0];
-  var simpleSelector40 = selector40.simpleSelector;
-  expect(simpleSelector40 is NamespaceSelector, true);
+  expect(selector40.simpleSelector is NamespaceSelector, true);
+  var simpleSelector40 = selector40.simpleSelector as NamespaceSelector;
   expect(selector40.isCombinatorNone, true);
   expect(simpleSelector40.namespace, "ns1");
   var elementSelector = simpleSelector40.nameAsSimpleSelector;
@@ -329,7 +330,7 @@
 }
 
 void testCombinator() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -341,7 +342,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -368,8 +369,8 @@
   expect(simpleSelector2.name, "no-story");
 
   var selector3 = simpleSeqs[3];
-  var simpleSelector3 = selector3.simpleSelector;
-  expect(simpleSelector3 is NamespaceSelector, true);
+  expect(selector3.simpleSelector is NamespaceSelector, true);
+  var simpleSelector3 = selector3.simpleSelector as NamespaceSelector;
   expect(selector3.isCombinatorTilde, true);
   expect(simpleSelector3.namespace, "myNs");
   var elementSelector = simpleSelector3.nameAsSimpleSelector;
@@ -385,7 +386,7 @@
 }
 
 void testWildcard() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "* {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -397,7 +398,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -429,12 +430,14 @@
 
   expect(simpleSeqs.length, 2);
 
-  var selector0 = simpleSeqs[0];
-  var simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is ElementSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isWildcard, true);
-  expect(simpleSelector0.name, "*");
+  {
+    var selector0 = simpleSeqs[0];
+    var simpleSelector0 = selector0.simpleSelector;
+    expect(simpleSelector0 is ElementSelector, true);
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isWildcard, true);
+    expect(simpleSelector0.name, "*");
+  }
 
   var selector1 = simpleSeqs[1];
   var simpleSelector1 = selector1.simpleSelector;
@@ -461,15 +464,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, false);
-  var elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect("myNs", simpleSelector0.namespace);
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, false);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect("myNs", simpleSelector0.namespace);
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -494,15 +499,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, true);
-  expect("*", simpleSelector0.namespace);
-  elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, true);
+    expect("*", simpleSelector0.namespace);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -513,7 +520,7 @@
 
 /** Test List<int> as input to parser. */
 void testArrayOfChars() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '<![CDATA[.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
@@ -526,7 +533,9 @@
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
 
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foo {
   color: #f00;
   left: 20px;
@@ -541,7 +550,7 @@
 }
 
 void testPseudo() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = r'''
 html:lang(fr-ca) { quotes: '" ' ' "' }
@@ -588,7 +597,9 @@
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 html:lang(fr-ca) {
   quotes: '" ' ' "';
 }
@@ -643,7 +654,7 @@
 }
 
 void testHost() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '@host { '
       ':scope {'
       'white-space: nowrap;'
@@ -658,7 +669,9 @@
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 @host {
 :scope {
   white-space: nowrap;
@@ -678,13 +691,15 @@
 }
 
 void testStringEscape() {
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''a { foo: '{"text" : "a\\\""}' }''';
   var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
 
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 a {
   foo: '{"text" : "a\\\""}';
 }''');
@@ -692,7 +707,7 @@
 
 // TODO(terry): Move to emitter_test.dart when real emitter exist.
 void testEmitter() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
@@ -706,7 +721,9 @@
 
   walkTree(stylesheet);
 
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foo {
   color: #f00;
   left: 20px;
diff --git a/packages/csslib/test/declaration_test.dart b/packages/csslib/test/declaration_test.dart
index de589d7..af6fdef 100644
--- a/packages/csslib/test/declaration_test.dart
+++ b/packages/csslib/test/declaration_test.dart
@@ -4,16 +4,27 @@
 
 library declaration_test;
 
+import 'package:csslib/src/messages.dart';
+import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
+void expectCss(String css, String expected) {
+  var errors = <Message>[];
+  var styleSheet = parseCss(css, errors: errors, opts: simpleOptions);
+  expect(styleSheet, isNotNull);
+  expect(errors, isEmpty);
+  expect(prettyPrint(styleSheet), expected);
+}
+
 void testSimpleTerms() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @ import url("test.css");
 .foo {
   background-color: #191919;
+  content: "u+0041";
   width: 10PX;
   height: 22mM !important;
   border-width: 20cm;
@@ -27,6 +38,7 @@
 @import "test.css";
 .foo {
   background-color: #191919;
+  content: "u+0041";
   width: 10px;
   height: 22mm !important;
   border-width: 20cm;
@@ -57,6 +69,17 @@
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated2);
+
+  // Regression test to ensure invalid percentages don't throw an exception and
+  // instead print a useful error message when not in checked mode.
+  var css = '''
+.foo {
+  width: Infinity%;
+}''';
+  stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions);
+  expect(errors, isNotEmpty);
+  expect(errors.first.message, 'expected }, but found %');
+  expect(errors.first.span.text, '%');
 }
 
 /**
@@ -64,7 +87,7 @@
  * no quotes.  Hex values with # and letters, and functions (rgba, url, etc.)
  */
 void testDeclarations() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .more {
   color: white;
@@ -102,7 +125,7 @@
 }
 
 void testIdentifiers() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #da {
   height: 100px;
@@ -129,7 +152,7 @@
 }
 
 void testComposites() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .xyzzy {
   border: 10px 80px 90px 100px;
@@ -158,7 +181,7 @@
 }
 
 void testUnits() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #id-1 {
   transition: color 0.4s;
@@ -168,8 +191,8 @@
   right: 300px;
   bottom: 400cm;
   border-width: 2.5mm;
-  margin-top: .5in;
-  margin-left: 5pc;
+  margin-top: -.5in;
+  margin-left: +5pc;
   margin-right: 5ex;
   margin-bottom: 5ch;
   font-size: 10pt;
@@ -206,8 +229,8 @@
   right: 300px;
   bottom: 400cm;
   border-width: 2.5mm;
-  margin-top: .5in;
-  margin-left: 5pc;
+  margin-top: -.5in;
+  margin-left: +5pc;
   margin-right: 5ex;
   margin-bottom: 5ch;
   font-size: 10pt;
@@ -242,7 +265,7 @@
 }
 
 void testUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .toggle:after {
   content: '✔';
@@ -270,7 +293,7 @@
 }
 
 void testNewerCss() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @media screen,print {
   .foobar_screen {
@@ -285,6 +308,7 @@
   width: 10px;
 }
 @page bar : left { @top-left { margin: 8px; } }
+@page { @top-left { margin: 8px; } width: 10px; }
 @charset "ISO-8859-1";
 @charset 'ASCII';''';
 
@@ -306,6 +330,12 @@
   margin: 8px;
 }
 }
+@page {
+@top-left {
+  margin: 8px;
+}
+  width: 10px;
+}
 @charset "ISO-8859-1";
 @charset "ASCII";''';
 
@@ -317,7 +347,7 @@
 }
 
 void testMediaQueries() {
-  var errors = [];
+  var errors = <Message>[];
   String input = '''
 @media screen and (-webkit-min-device-pixel-ratio:0) {
   .todo-item .toggle {
@@ -369,11 +399,13 @@
 .myclass {
   height: 20px;
 }
-} @media print AND (min-resolution:300dpi) {
+}
+@media print AND (min-resolution:300dpi) {
 #anotherId {
   color: #fff;
 }
-} @media print AND (min-resolution:280dpcm) {
+}
+@media print AND (min-resolution:280dpcm) {
 #finalId {
   color: #aaa;
 }
@@ -390,13 +422,13 @@
 
   input = '''
 @media only screen and (min-device-width: 4000px) and
-    (min-device-height: 2000px), screen (another: 100px) {
+    (min-device-height: 2000px), screen AND (another: 100px) {
       html {
         font-size: 10em;
       }
     }''';
   generated = '@media ONLY screen AND (min-device-width:4000px) '
-      'AND (min-device-height:2000px), screen (another:100px) {\n'
+      'AND (min-device-height:2000px), screen AND (another:100px) {\n'
       'html {\n  font-size: 10em;\n}\n}';
 
   stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
@@ -406,14 +438,14 @@
   expect(prettyPrint(stylesheet), generated);
 
   input = '''
-@media screen,print (min-device-width: 4000px) and
-    (min-device-height: 2000px), screen (another: 100px) {
+@media screen,print AND (min-device-width: 4000px) and
+    (min-device-height: 2000px), screen AND (another: 100px) {
       html {
         font-size: 10em;
       }
     }''';
-  generated = '@media screen, print (min-device-width:4000px) AND '
-      '(min-device-height:2000px), screen (another:100px) {\n'
+  generated = '@media screen, print AND (min-device-width:4000px) AND '
+      '(min-device-height:2000px), screen AND (another:100px) {\n'
       'html {\n  font-size: 10em;\n}\n}';
 
   stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
@@ -423,19 +455,211 @@
   expect(prettyPrint(stylesheet), generated);
 
   input = '''
-@import "test.css" ONLY screen, NOT print (min-device-width: 4000px);''';
-  generated =
-      '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);';
+@import "test.css" ONLY screen, NOT print AND (min-device-width: 4000px);''';
+  generated = '@import "test.css" ONLY screen, '
+      'NOT print AND (min-device-width:4000px);';
 
   stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
 
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated);
+
+  var css = '@media (min-device-width:400px) {\n}';
+  expectCss(css, css);
+
+  css = '@media all AND (tranform-3d), (-webkit-transform-3d) {\n}';
+  expectCss(css, css);
+
+  // Test that AND operator is required between media type and expressions.
+  css = '@media screen (min-device-width:400px';
+  stylesheet = parseCss(css, errors: errors..clear(), opts: simpleOptions);
+  expect(errors, isNotEmpty);
+  expect(
+      errors.first.message, contains('expected { after media before ruleset'));
+  expect(errors.first.span.text, '(');
+}
+
+void testMozDocument() {
+  var errors = <Message>[];
+  // Test empty url-prefix, commonly used for browser detection.
+  var css = '''
+@-moz-document url-prefix() {
+  div {
+    color: #000;
+  }
+}''';
+  var expected = '''@-moz-document url-prefix() {
+div {
+  color: #000;
+}
+}''';
+  var styleSheet = parseCss(css, errors: errors);
+  expect(styleSheet, isNotNull);
+  expect(errors, isEmpty);
+  expect(prettyPrint(styleSheet), expected);
+
+  // Test url-prefix with unquoted parameter
+  css = '''
+@-moz-document url-prefix(http://www.w3.org/Style/) {
+  div {
+    color: #000;
+  }
+}''';
+  expected = '''@-moz-document url-prefix("http://www.w3.org/Style/") {
+div {
+  color: #000;
+}
+}''';
+  styleSheet = parseCss(css, errors: errors);
+  expect(styleSheet, isNotNull);
+  expect(errors, isEmpty);
+  expect(prettyPrint(styleSheet), expected);
+
+  // Test domain with unquoted parameter
+  css = '''
+@-moz-document domain(google.com) {
+  div {
+    color: #000;
+  }
+}''';
+  expected = '''@-moz-document domain("google.com") {
+div {
+  color: #000;
+}
+}''';
+  styleSheet = parseCss(css, errors: errors);
+  expect(styleSheet, isNotNull);
+  expect(errors, isEmpty);
+  expect(prettyPrint(styleSheet), expected);
+
+  // Test all document functions combined.
+  css = '@-moz-document ' +
+      'url(http://www.w3.org/), ' +
+      "url-prefix('http://www.w3.org/Style/'), " +
+      'domain("google.com"), ' +
+      'regexp("https:.*") { div { color: #000; } }';
+  expected = '@-moz-document ' +
+      'url("http://www.w3.org/"), ' +
+      'url-prefix("http://www.w3.org/Style/"), ' +
+      'domain("google.com"), ' +
+      'regexp("https:.*") {\ndiv {\n  color: #000;\n}\n}';
+  styleSheet = parseCss(css, errors: errors);
+  expect(styleSheet, isNotNull);
+  expect(errors, isEmpty);
+  expect(prettyPrint(styleSheet), expected);
+}
+
+void testSupports() {
+  // Test single declaration condition.
+  var css = '''
+@supports (-webkit-appearance: none) {
+  div {
+    -webkit-appearance: none;
+  }
+}''';
+  var expected = '''@supports (-webkit-appearance: none) {
+div {
+  -webkit-appearance: none;
+}
+}''';
+  expectCss(css, expected);
+
+  // Test negation.
+  css = '''
+@supports not ( display: flex ) {
+  body { width: 100%; }
+}''';
+  expected = '''@supports not (display: flex) {
+body {
+  width: 100%;
+}
+}''';
+  expectCss(css, expected);
+
+  // Test clause with multiple conditions.
+  css = '''
+@supports (box-shadow: 0 0 2px black inset) or
+    (-moz-box-shadow: 0 0 2px black inset) or
+    (-webkit-box-shadow: 0 0 2px black inset) or
+    (-o-box-shadow: 0 0 2px black inset) {
+  .box {
+    box-shadow: 0 0 2px black inset;
+  }
+}''';
+  expected = '@supports (box-shadow: 0 0 2px #000 inset) or ' +
+      '(-moz-box-shadow: 0 0 2px #000 inset) or ' +
+      '(-webkit-box-shadow: 0 0 2px #000 inset) or ' +
+      '(-o-box-shadow: 0 0 2px #000 inset) {\n' +
+      '.box {\n' +
+      '  box-shadow: 0 0 2px #000 inset;\n' +
+      '}\n' +
+      '}';
+  expectCss(css, expected);
+
+  // Test conjunction and disjunction together.
+  css = '''
+@supports ((transition-property: color) or (animation-name: foo)) and
+    (transform: rotate(10deg)) {
+  div {
+    transition-property: color;
+    transform: rotate(10deg);
+  }
+}''';
+
+  expected = '@supports ' +
+      '((transition-property: color) or (animation-name: foo)) and ' +
+      '(transform: rotate(10deg)) {\n' +
+      'div {\n' +
+      '  transition-property: color;\n' +
+      '  transform: rotate(10deg);\n' +
+      '}\n' +
+      '}';
+  expectCss(css, expected);
+
+  // Test that operators can't be mixed without parentheses.
+  css = '@supports (a: 1) and (b: 2) or (c: 3) {}';
+  var errors = <Message>[];
+  var styleSheet = parseCss(css, errors: errors, opts: simpleOptions);
+  expect(styleSheet, isNotNull);
+  expect(errors, isNotEmpty);
+  expect(errors.first.message,
+      "Operators can't be mixed without a layer of parentheses");
+  expect(errors.first.span.text, 'or');
+}
+
+void testViewport() {
+  // No declarations.
+  var css = '@viewport {\n}';
+  expectCss(css, css);
+
+  // All declarations.
+  css = '''
+@viewport {
+  min-width: auto;
+  max-width: 800px;
+  width: 400px;
+  min-height: 50%;
+  max-height: 200px;
+  height: 100px 200px;
+  zoom: auto;
+  min-zoom: 0.75;
+  max-zoom: 40%;
+  user-zoom: fixed;
+  orientation: landscape;
+}''';
+  expectCss(css, css);
+
+  // Vendor specific.
+  css = '''
+@-ms-viewport {
+  width: device-width;
+}''';
+  expectCss(css, css);
 }
 
 void testFontFace() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = '''
 @font-face {
@@ -527,7 +751,7 @@
 }
 
 void testCssFile() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @import 'simple.css'
 @import "test.css" print
@@ -557,6 +781,10 @@
 .test-background {
   background:  url(http://www.foo.com/bar.png);
 }
+
+.test-background-with-multiple-properties {
+  background: #000 url(http://www.foo.com/bar.png);
+}
 ''';
 
   final String generated = '@import "simple.css"; '
@@ -582,6 +810,9 @@
       '}\n'
       '.test-background {\n'
       '  background: url("http://www.foo.com/bar.png");\n'
+      '}\n'
+      '.test-background-with-multiple-properties {\n'
+      '  background: #000 url("http://www.foo.com/bar.png");\n'
       '}';
   var stylesheet = parseCss(input, errors: errors);
 
@@ -591,7 +822,7 @@
 }
 
 void testCompactEmitter() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Check !import compactly emitted.
   final String input = r'''
@@ -599,7 +830,7 @@
   color: green !important;
 }
 ''';
-  final String generated = "div { color: green!important; }";
+  final String generated = "div { color:green!important; }";
 
   var stylesheet = parseCss(input, errors: errors);
 
@@ -619,7 +850,7 @@
 }
 
 void testNotSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = r'''
 .details:not(.open-details) x-element,
@@ -709,7 +940,7 @@
 }
 
 void testIE() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = ".test {\n"
       "  filter: progid:DXImageTransform.Microsoft.gradient"
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
@@ -772,6 +1003,17 @@
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated3);
+
+  final input4 = '''
+div {
+  filter: FlipH;
+}''';
+
+  stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), input4);
 }
 
 /**
@@ -785,7 +1027,7 @@
  *        background: red\9;
  */
 void testIEDeclaration() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = '''
 .testIE-6 {
@@ -951,7 +1193,7 @@
 }
 
 void testHangs() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Bad hexvalue had caused a hang in processTerm.
   final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
@@ -1008,36 +1250,48 @@
 void testExpressionSpans() {
   final input = r'''.foo { width: 50px; }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   // This passes
   expect(decl.span.text, 'width: 50px');
   // This currently fails
-  expect(decl.expression.span.text, '50px');
+  expect((decl as Declaration).expression.span.text, '50px');
 }
 
 void simpleCalc() {
   final input = r'''.foo { height: calc(100% - 55px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'height: calc(100% - 55px)');
 }
 
 void complexCalc() {
   final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)');
 }
 
 void twoCalcs() {
   final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)');
 }
 
 void selectorWithCalcs() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .foo {
   width: calc(1em + 5 * 2em);
@@ -1061,6 +1315,20 @@
   expect(prettyPrint(stylesheet), generated);
 }
 
+void vendorPrefixedCalc() {
+  var css = '''
+.foo {
+  width: -webkit-calc((100% - 15px*1) / 1);
+}''';
+  expectCss(css, css);
+
+  css = '''
+.foo {
+  width: -moz-calc((100% - 15px*1) / 1);
+}''';
+  expectCss(css, css);
+}
+
 main() {
   test('Simple Terms', testSimpleTerms);
   test('Declarations', testDeclarations);
@@ -1070,6 +1338,9 @@
   test('Unicode', testUnicode);
   test('Newer CSS', testNewerCss);
   test('Media Queries', testMediaQueries);
+  test('Document', testMozDocument);
+  test('Supports', testSupports);
+  test('Viewport', testViewport);
   test('Font-Face', testFontFace);
   test('CSS file', testCssFile);
   test('Compact Emitter', testCompactEmitter);
@@ -1079,12 +1350,12 @@
   test('Hanging bugs', testHangs);
   test('Expression spans', testExpressionSpans,
       skip: 'expression spans are broken'
-            ' (https://github.com/dart-lang/csslib/issues/15)');
+          ' (https://github.com/dart-lang/csslib/issues/15)');
   group('calc function', () {
     test('simple calc', simpleCalc);
     test('single complex', complexCalc);
     test('two calc terms for same declaration', twoCalcs);
     test('selector with many calc declarations', selectorWithCalcs);
+    test('vendor prefixed calc', vendorPrefixedCalc);
   });
 }
-
diff --git a/packages/csslib/test/error_test.dart b/packages/csslib/test/error_test.dart
index fc9ecf6..1060d83 100644
--- a/packages/csslib/test/error_test.dart
+++ b/packages/csslib/test/error_test.dart
@@ -13,7 +13,7 @@
  * Test for unsupported font-weights values of bolder, lighter and inherit.
  */
 void testUnsupportedFontWeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // TODO(terry): Need to support bolder.
   // font-weight value bolder.
@@ -21,13 +21,17 @@
   var stylesheet = parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unknown property value bolder
 .foobar { font-weight: bolder; }
                        ^^^^^^''');
   expect(stylesheet != null, true);
 
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   font-weight: bolder;
 }''');
@@ -38,12 +42,16 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unknown property value lighter
 .foobar { font-weight: lighter; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   font-weight: lighter;
 }''');
@@ -54,12 +62,16 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unknown property value inherit
 .foobar { font-weight: inherit; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   font-weight: inherit;
 }''');
@@ -70,19 +82,23 @@
  * inherit.
  */
 void testUnsupportedLineHeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // line-height value in percentge unit.
   var input = ".foobar { line-height: 120%; }";
   var stylesheet = parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unexpected value for line-height
 .foobar { line-height: 120%; }
                        ^^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   line-height: 120%;
 }''');
@@ -93,12 +109,16 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unexpected unit for line-height
 .foobar { line-height: 20cm; }
                        ^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   line-height: 20cm;
 }''');
@@ -109,12 +129,16 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 24: Unknown property value inherit
 .foobar { line-height: inherit; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   line-height: inherit;
 }''');
@@ -122,19 +146,23 @@
 
 /** Test for bad selectors. */
 void testBadSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid id selector.
   var input = "# foo { color: #ff00ff; }";
   var stylesheet = parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 1: Not a valid ID selector expected #id
 # foo { color: #ff00ff; }
 ^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 # foo {
   color: #f0f;
 }''');
@@ -144,12 +172,16 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 1: Not a valid class selector expected .className
 . foo { color: #ff00ff; }
 ^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 . foo {
   color: #f0f;
 }''');
@@ -157,19 +189,23 @@
 
 /** Test for bad hex values. */
 void testBadHexValues() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid hex value.
   var input = ".foobar { color: #AH787; }";
   var stylesheet = parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 18: Bad hex number
 .foobar { color: #AH787; }
                  ^^^^^^''');
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   color: #AH787;
 }''');
@@ -179,13 +215,17 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 18: Unknown property value redder
 .foobar { color: redder; }
                  ^^^^^^''');
 
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   color: redder;
 }''');
@@ -195,13 +235,17 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 18: Expected hex number
 .foobar { color: # ffffff; }
                  ^''');
 
   expect(stylesheet != null, true);
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   color: # ffffff;
 }''');
@@ -211,7 +255,9 @@
   stylesheet = parseCss(input, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
+  expect(
+      errors[0].toString(),
+      r'''
 error on line 1, column 18: Expected hex number
 .foobar { color: # 123fff; }
                  ^''');
@@ -220,14 +266,16 @@
 
   // Formating is off with an extra space.  However, the entire value is bad
   // and isn't processed anyway.
-  expect(prettyPrint(stylesheet), r'''
+  expect(
+      prettyPrint(stylesheet),
+      r'''
 .foobar {
   color: # 123 fff;
 }''');
 }
 
 void testBadUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = '''
 @font-face {
   src: url(fonts/BBCBengali.ttf) format("opentype");
@@ -237,7 +285,8 @@
   parseCss(input, errors: errors);
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(),
+  expect(
+      errors[0].toString(),
       'error on line 3, column 20: unicode first range can not be greater than '
       'last\n'
       '  unicode-range: U+400-200;\n'
@@ -252,14 +301,15 @@
   parseCss(input2, errors: errors..clear());
 
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(),
+  expect(
+      errors[0].toString(),
       'error on line 3, column 20: unicode range must be less than 10FFFF\n'
       '  unicode-range: U+12FFFF;\n'
       '                   ^^^^^^');
 }
 
 void testBadNesting() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for bad declaration in a nested rule.
   final String input = '''
diff --git a/packages/csslib/test/extend_test.dart b/packages/csslib/test/extend_test.dart
index 49c8a9c..184a8b4 100644
--- a/packages/csslib/test/extend_test.dart
+++ b/packages/csslib/test/extend_test.dart
@@ -4,12 +4,13 @@
 
 library extend_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,8 @@
 }
 
 void simpleExtend() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .error {
   border: 1px red;
   background-color: #fdd;
@@ -26,7 +28,9 @@
   @extend .error;
   border-width: 3px;
 }
-''', r'''.error, .seriousError {
+''',
+      r'''
+.error, .seriousError {
   border: 1px #f00;
   background-color: #fdd;
 }
@@ -36,7 +40,8 @@
 }
 
 void complexSelectors() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .error {
   border: 1px #f00;
   background-color: #fdd;
@@ -48,7 +53,9 @@
   @extend .error;
   border-width: 3px;
 }
-''', r'''.error, .seriousError {
+''',
+      r'''
+.error, .seriousError {
   border: 1px #f00;
   background-color: #fdd;
 }
@@ -59,14 +66,17 @@
   border-width: 3px;
 }''');
 
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 a:hover {
   text-decoration: underline;
 }
 .hoverlink {
   @extend a:hover;
 }
-''', r'''a:hover, .hoverlink {
+''',
+      r'''
+a:hover, .hoverlink {
   text-decoration: underline;
 }
 .hoverlink {
@@ -74,7 +84,8 @@
 }
 
 void multipleExtends() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .error {
   border: 1px #f00;
   background-color: #fdd;
@@ -88,7 +99,9 @@
   @extend .attention;
   border-width: 3px;
 }
-''', r'''.error, .seriousError {
+''',
+      r'''
+.error, .seriousError {
   border: 1px #f00;
   background-color: #fdd;
 }
@@ -102,7 +115,8 @@
 }
 
 void chaining() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .error {
   border: 1px #f00;
   background-color: #fdd;
@@ -119,7 +133,9 @@
   left: 10%;
   right: 10%;
 }
-''', r'''.error, .seriousError, .criticalError {
+''',
+      r'''
+.error, .seriousError, .criticalError {
   border: 1px #f00;
   background-color: #fdd;
 }
@@ -136,7 +152,8 @@
 }
 
 void nestedSelectors() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 a {
   color: blue;
   &:hover {
@@ -147,7 +164,9 @@
 #fake-links .link {
   @extend a;
 }
-''', r'''a, #fake-links .link {
+''',
+      r'''
+a, #fake-links .link {
   color: #00f;
 }
 a:hover, #fake-links .link:hover {
@@ -158,7 +177,8 @@
 }
 
 void nestedMulty() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .btn {
   display: inline-block;
 }
@@ -170,7 +190,9 @@
     @extend .btn;
   }
 }
-''', r'''.btn, input[type="checkbox"].toggle-button label {
+''',
+      r'''
+.btn, input[type="checkbox"].toggle-button label {
   display: inline-block;
 }
 input[type="checkbox"].toggle-button {
@@ -181,14 +203,16 @@
 }
 
 void nWayExtends() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .btn > .btn {
   margin-left: 5px;
 }
 input.second + label {
   @extend .btn;
 }
-''', '.btn > .btn, '
+''',
+      '.btn > .btn, '
       'input.second + label > .btn, '
       '.btn > input.second + label, '
       'input.second + label > input.second + label, '
@@ -205,7 +229,8 @@
   //  input.second + label {
   //    color: blue;
   //  }
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 .btn + .btn {
   margin-left: 5px;
 }
@@ -213,7 +238,8 @@
   @extend .btn;
   color: blue;
 }
-''', '.btn + .btn, '
+''',
+      '.btn + .btn, '
       'input.second + label + .btn, '
       '.btn + input.second + label, '
       'input.second + label + input.second + label, '
diff --git a/packages/csslib/test/mixin_test.dart b/packages/csslib/test/mixin_test.dart
index c94c9c0..375054c 100644
--- a/packages/csslib/test/mixin_test.dart
+++ b/packages/csslib/test/mixin_test.dart
@@ -4,12 +4,13 @@
 
 library mixin_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -25,7 +26,8 @@
 }
 
 void topLevelMixin() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin silly-links {
   a {
     color: blue;
@@ -34,14 +36,17 @@
 }
 
 @include silly-links;
-''', r'''a {
+''',
+      r'''
+a {
   color: #00f;
   background-color: #f00;
 }''');
 }
 
 void topLevelMixinTwoIncludes() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   a {
     color: blue;
@@ -56,7 +61,9 @@
 }
 @include a;
 @include b;
-''', r'''a {
+''',
+      r'''
+a {
   color: #00f;
   background-color: #f00;
 }
@@ -68,7 +75,8 @@
 
 /** Tests top-level mixins that includes another mixin. */
 void topLevelMixinMultiRulesets() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   a {
     color: blue;
@@ -90,7 +98,9 @@
 }
 @include a;
 @include c;
-''', r'''a {
+''',
+      r'''
+a {
   color: #00f;
   background-color: #f00;
 }
@@ -105,7 +115,8 @@
 }
 
 void topLevelMixinDeeplyNestedRulesets() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   a {
     color: blue;
@@ -145,7 +156,9 @@
   @include d;
 }
 @include c;
-''', r'''a {
+''',
+      r'''
+a {
   color: #00f;
   background-color: #f00;
 }
@@ -170,7 +183,8 @@
 
 /** Tests selector groups and other combinators. */
 void topLevelMixinSelectors() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   a, b {
     color: blue;
@@ -183,7 +197,9 @@
 }
 
 @include a;
-''', r'''a, b {
+''',
+      r'''
+a, b {
   color: #00f;
   background-color: #f00;
 }
@@ -194,20 +210,24 @@
 }
 
 void declSimpleMixin() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin div-border {
   border: 2px dashed red;
 }
 div {
   @include div-border;
 }
-''', r'''div {
+''',
+      r'''
+div {
   border: 2px dashed #f00;
 }''');
 }
 
 void declMixinTwoIncludes() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin div-border {
   border: 2px dashed red;
 }
@@ -218,14 +238,17 @@
   @include div-border;
   @include div-color;
 }
-''', r'''div {
+''',
+      r'''
+div {
   border: 2px dashed #f00;
   color: #00f;
 }''');
 }
 
 void declMixinNestedIncludes() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin div-border {
   border: 2px dashed red;
 }
@@ -244,7 +267,9 @@
   @include div-border;
   @include div-color;
 }
-''', r'''div {
+''',
+      r'''
+div {
   border: 2px dashed #f00;
   padding: .5em;
   color: #00f;
@@ -253,7 +278,8 @@
 }
 
 void declMixinDeeperNestedIncludes() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin div-border {
   border: 2px dashed red;
 }
@@ -271,7 +297,9 @@
   @include div-border;
   @include div-color;
 }
-''', r'''div {
+''',
+      r'''
+div {
   border: 2px dashed #f00;
   padding: .5em;
   margin: 5px;
@@ -279,7 +307,8 @@
 }
 
 void mixinArg() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin div-border-1 {
   border: 2px dashed red;
 }
@@ -308,7 +337,9 @@
 div-4 {
   @include div-border-2;
 }
-''', r'''div-1 {
+''',
+      r'''
+div-1 {
   margin-left: 10px;
   margin-right: 100px;
   border: 2px dashed #f00;
@@ -327,7 +358,8 @@
 }
 
 void mixinArgs() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin box-shadow(@shadows...) {
   -moz-box-shadow: @shadows;
   -webkit-box-shadow: @shadows;
@@ -336,7 +368,8 @@
 
 .shadows {
   @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
-}''', r'''
+}''',
+      r'''
 .shadowed {
   -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
   -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
@@ -346,7 +379,8 @@
 }
 
 void mixinManyArgs() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin border(@border-values) {
   border: @border-values
 }
@@ -354,12 +388,14 @@
 .primary {
   @include border(3px solid green);
 }
-''', r'''
+''',
+      r'''
 .primary {
   border: 3px solid #008000;
 }''');
 
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin setup(@border-color, @border-style, @border-size, @color) {
   border: @border-size @border-style @border-color;
   color: @color;
@@ -368,14 +404,16 @@
 .primary {
   @include setup(red, solid, 5px, blue);
 }
-''', r'''
+''',
+      r'''
 .primary {
   border: 5px solid #f00;
   color: #00f;
 }''');
 
   // Test passing a declaration that is multiple parameters.
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin colors(@text, @background, @border) {
   color: @text;
   background-color: @background;
@@ -386,7 +424,9 @@
 .primary {
   @include colors(@values);
 }
-''', r'''var-values: #f00, #0f0, #00f;
+''',
+      r'''
+var-values: #f00, #0f0, #00f;
 
 .primary {
   color: #f00;
@@ -394,7 +434,8 @@
   border-color: #00f;
 }''');
 
-  compilePolyfillAndValidate(r'''
+  compilePolyfillAndValidate(
+      r'''
 @mixin colors(@text, @background, @border) {
   color: @text;
   background-color: @background;
@@ -405,7 +446,9 @@
 .primary {
   @include colors(@values);
 }
-''', r'''.primary {
+''',
+      r'''
+.primary {
   color: #f00;
   background-color: #0f0;
   border-color: #00f;
@@ -413,7 +456,7 @@
 }
 
 void badDeclarationInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   #foo-id {
@@ -441,7 +484,7 @@
 }
 
 void badTopInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin b {
   color: red;
@@ -467,7 +510,7 @@
 }
 
 void emptyMixin() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
 }
@@ -480,7 +523,8 @@
 }
   ''';
 
-  var generated = r'''div {
+  var generated = r'''
+div {
   border: 2px dashed #f00;
 }''';
 
@@ -492,7 +536,7 @@
 }
 
 void undefinedTopLevel() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -520,7 +564,7 @@
 }
 
 void undefinedDeclaration() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -546,7 +590,8 @@
 }
 
 void includeGrammar() {
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   foo { color: red }
 }
@@ -557,14 +602,17 @@
 }
 
 @include b;
-''', r'''foo {
+''',
+      r'''
+foo {
   color: #f00;
 }
 foo {
   color: #f00;
 }''');
 
-  compileAndValidate(r'''
+  compileAndValidate(
+      r'''
 @mixin a {
   color: red
 }
@@ -573,12 +621,14 @@
   @include a;
   @include a
 }
-''', r'''foo {
+''',
+      r'''
+foo {
   color: #f00;
   color: #f00;
 }''');
 
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''
 @mixin a {
   foo { color: red }
diff --git a/packages/csslib/test/nested_test.dart b/packages/csslib/test/nested_test.dart
index 1848ef1..a5cadab 100644
--- a/packages/csslib/test/nested_test.dart
+++ b/packages/csslib/test/nested_test.dart
@@ -4,12 +4,13 @@
 
 library nested_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/packages/csslib/test/selector_test.dart b/packages/csslib/test/selector_test.dart
index aefab16..66e2080 100644
--- a/packages/csslib/test/selector_test.dart
+++ b/packages/csslib/test/selector_test.dart
@@ -5,12 +5,13 @@
 library selector_test;
 
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 void testSelectorSuccesses() {
-  var errors = [];
+  var errors = <Message>[];
   var selectorAst = selector('#div .foo', errors: errors);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('#div .foo', compactOuptut(selectorAst));
@@ -45,17 +46,38 @@
   selectorAst = selector('#_privateId', errors: errors..clear());
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('#_privateId', compactOuptut(selectorAst));
+
+  selectorAst = selector(':host', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(selectorAst), ':host');
+
+  selectorAst = selector(':host(.foo)', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(selectorAst), ':host(.foo)');
+
+  selectorAst = selector(':host-context(.foo)', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(selectorAst), ':host-context(.foo)');
+
+  selectorAst = selector('.a /deep/ .b', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(selectorAst), '.a /deep/ .b');
+
+  selectorAst = selector('.x >>> .y', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(selectorAst), '.x >>> .y');
 }
 
 // TODO(terry): Move this failure case to a failure_test.dart when the analyzer
 //              and validator exit then they'll be a bunch more checks.
 void testSelectorFailures() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for invalid class name (can't start with number).
   selector('.foobar .1a-story .xyzzy', errors: errors);
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(),
+  expect(
+      errors[0].toString(),
       'error on line 1, column 9: name must start with a alpha character, but '
       'found a number\n'
       '.foobar .1a-story .xyzzy\n'
diff --git a/packages/csslib/test/testing.dart b/packages/csslib/test/testing.dart
index de2aab1..6807576 100644
--- a/packages/csslib/test/testing.dart
+++ b/packages/csslib/test/testing.dart
@@ -30,24 +30,26 @@
  * tests (by default) will ensure that the CSS is really valid.
  */
 StyleSheet parseCss(String cssInput,
-    {List<Message> errors, PreprocessorOptions opts}) => parse(cssInput,
+        {List<Message> errors, PreprocessorOptions opts}) =>
+    parse(cssInput,
         errors: errors,
-        options: opts == null
-            ? simpleOptionsWithCheckedAndWarningsAsErrors
-            : opts);
+        options:
+            opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts);
 
 /**
  * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
  * CSS will allow any property/value pairs regardless of validity; all of our
  * tests (by default) will ensure that the CSS is really valid.
  */
-StyleSheet compileCss(String cssInput, {List<Message> errors,
-    PreprocessorOptions opts, bool polyfill: false,
-    List<StyleSheet> includes: null}) => compile(cssInput,
+StyleSheet compileCss(String cssInput,
+        {List<Message> errors,
+        PreprocessorOptions opts,
+        bool polyfill: false,
+        List<StyleSheet> includes: null}) =>
+    compile(cssInput,
         errors: errors,
-        options: opts == null
-            ? simpleOptionsWithCheckedAndWarningsAsErrors
-            : opts,
+        options:
+            opts == null ? simpleOptionsWithCheckedAndWarningsAsErrors : opts,
         polyfill: polyfill,
         includes: includes);
 
diff --git a/packages/csslib/test/var_test.dart b/packages/csslib/test/var_test.dart
index d47fd78..3c53169 100644
--- a/packages/csslib/test/var_test.dart
+++ b/packages/csslib/test/var_test.dart
@@ -4,12 +4,13 @@
 
 library var_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -25,7 +26,8 @@
 }
 
 void simpleVar() {
-  final input = ''':root {
+  final input = '''
+:root {
   var-color-background: red;
   var-color-foreground: blue;
 
@@ -39,7 +41,8 @@
 }
 ''';
 
-  final generated = ''':root {
+  final generated = '''
+:root {
   var-color-background: #f00;
   var-color-foreground: #00f;
   var-c: #0f0;
@@ -51,7 +54,8 @@
   background: var(color-background);
 }''';
 
-  final generatedPolyfill = ''':root {
+  final generatedPolyfill = '''
+:root {
 }
 .testIt {
   color: #00f;
@@ -63,7 +67,8 @@
 }
 
 void expressionsVar() {
-  final input = ''':root {
+  final input = '''
+:root {
   var-color-background: red;
   var-color-foreground: blue;
 
@@ -128,7 +133,8 @@
 }
 ''';
 
-  final generated = ''':root {
+  final generated = '''
+:root {
   var-color-background: #f00;
   var-color-foreground: #00f;
   var-c: #0f0;
@@ -185,7 +191,8 @@
 
   compileAndValidate(input, generated);
 
-  var generatedPolyfill = r''':root {
+  var generatedPolyfill = r'''
+:root {
 }
 .testIt {
   color: #00f;
@@ -271,7 +278,8 @@
 }
 ''';
 
-  final generated = ''':root {
+  final generated = '''
+:root {
   var-color-background: #f00;
   var-color-foreground: #00f;
   var-a: var(b, #0a0);
@@ -309,7 +317,8 @@
 
   compileAndValidate(input, generated);
 
-  var generatedPolyfill = r''':root {
+  var generatedPolyfill = r'''
+:root {
 }
 .test {
   background-color: #ffa500;
@@ -340,8 +349,9 @@
 }
 
 void undefinedVars() {
-  final errors = [];
-  final input = ''':root {
+  final errors = <Message>[];
+  final input = '''
+:root {
   var-color-background: red;
   var-color-foreground: blue;
 
@@ -374,7 +384,8 @@
 }
 ''';
 
-  final generatedPolyfill = ''':root {
+  final generatedPolyfill = '''
+:root {
 }
 .testIt {
   color: #00f;
@@ -412,7 +423,8 @@
         '                 ^^^^^^',
   ];
 
-  var generated = r''':root {
+  var generated = r'''
+:root {
   var-color-background: #f00;
   var-color-foreground: #00f;
   var-a: var(b);
@@ -450,7 +462,8 @@
   expect(errors.length, errorStrings.length, reason: errors.toString());
   testBitMap = 0;
 
-  outer: for (var error in errors) {
+  outer:
+  for (var error in errors) {
     var errorString = error.toString();
     for (int i = 0; i < errorStrings.length; i++) {
       if (errorString == errorStrings[i]) {
@@ -465,7 +478,8 @@
 }
 
 parserVar() {
-  final input = ''':root {
+  final input = '''
+:root {
   var-color-background: red;
   var-color-foreground: blue;
 
@@ -530,7 +544,8 @@
 }
 ''';
 
-  final generated = ''':root {
+  final generated = '''
+:root {
   var-color-background: #f00;
   var-color-foreground: #00f;
   var-c: #0f0;
@@ -587,7 +602,8 @@
 
   compileAndValidate(input, generated);
 
-  var generatedPolyfill = r''':root {
+  var generatedPolyfill = r'''
+:root {
 }
 .testIt {
   color: #00f;
@@ -622,7 +638,7 @@
 }
 
 testVar() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -658,7 +674,8 @@
   color: @color-foreground;
 }
 ''';
-  final generated2 = '''var-color-background: #f00;
+  final generated2 = '''
+var-color-background: #f00;
 var-color-foreground: #00f;
 
 .test {
@@ -676,7 +693,7 @@
 }
 
 testLess() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -686,7 +703,8 @@
   color: var(color-foreground);
 }
 ''';
-  final generated = '''var-color-background: #f00;
+  final generated = '''
+var-color-background: #f00;
 var-color-foreground: #00f;
 
 .test {
@@ -711,7 +729,8 @@
   color: @color-foreground;
 }
 ''';
-  final generated2 = '''var-color-background: #f00;
+  final generated2 = '''
+var-color-background: #f00;
 var-color-foreground: #00f;
 
 .test {
@@ -729,20 +748,24 @@
 }
 
 void polyfill() {
-  compilePolyfillAndValidate(r'''
+  compilePolyfillAndValidate(
+      r'''
 @color-background: red;
 @color-foreground: blue;
 .test {
   background-color: @color-background;
   color: @color-foreground;
-}''', r'''.test {
+}''',
+      r'''
+.test {
   background-color: #f00;
   color: #00f;
 }''');
 }
 
 void testIndirects() {
-  compilePolyfillAndValidate('''
+  compilePolyfillAndValidate(
+      '''
 :root {
   var-redef: #0f0;
 
@@ -759,7 +782,9 @@
 }
 .test-1 {
   color: @redef;
-}''', r''':root {
+}''',
+      r'''
+:root {
 }
 .test {
   background-color: #fff;
@@ -772,7 +797,7 @@
 }
 
 void includes() {
-  var errors = [];
+  var errors = <Message>[];
   var file1Input = r'''
 :root {
   var-redef: #0f0;
@@ -816,7 +841,8 @@
 }
 ''';
 
-  var generated1 = r''':root {
+  var generated1 = r'''
+:root {
   var-redef: #0f0;
   var-a1: #fff;
   var-a2: var(a1);
@@ -837,7 +863,8 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet1), generated1);
 
-  var generated2 = r''':root {
+  var generated2 = r'''
+:root {
   var-redef: #0b0;
   var-b3: var(a3);
 }
@@ -853,7 +880,8 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet2), generated2);
 
-  var generatedPolyfill1 = r''':root {
+  var generatedPolyfill1 = r'''
+:root {
 }
 .test-1 {
   background-color: #fff;
@@ -869,7 +897,8 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1);
 
-  var generatedPolyfill2 = r''':root {
+  var generatedPolyfill2 = r'''
+:root {
 }
 .test-2 {
   color: #fff;
@@ -888,7 +917,8 @@
   // Make sure includes didn't change.
   expect(prettyPrint(stylesheet1), generated1);
 
-  var generatedPolyfill = r''':root {
+  var generatedPolyfill = r'''
+:root {
 }
 .test-main {
   color: #fff;
diff --git a/packages/csslib/test/visitor_test.dart b/packages/csslib/test/visitor_test.dart
index 803b106..16071c7 100644
--- a/packages/csslib/test/visitor_test.dart
+++ b/packages/csslib/test/visitor_test.dart
@@ -4,6 +4,7 @@
 
 library visitor_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
@@ -33,7 +34,7 @@
 }
 
 void testClassVisitors() {
-  var errors = [];
+  var errors = <Message>[];
   var in1 = '.foobar { }';
 
   var s = parseCss(in1, errors: errors);
@@ -59,7 +60,9 @@
     ..visitTree(s);
   expect(clsVisits.matches, true);
 
-  expect(prettyPrint(s), r'''
+  expect(
+      prettyPrint(s),
+      r'''
 .foobar1 {
 }
 .xyzzy .foo #my-div {
@@ -84,7 +87,7 @@
     (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
 
 void testPolyFill() {
-  var errors = [];
+  var errors = <Message>[];
   final input = r'''
 .foobar { }
 div.xyzzy { }
diff --git a/packages/dart_style/._.status b/packages/dart_style/._.status
new file mode 100644
index 0000000..4080994
--- /dev/null
+++ b/packages/dart_style/._.status
Binary files differ
diff --git a/packages/dart_style/._AUTHORS b/packages/dart_style/._AUTHORS
new file mode 100644
index 0000000..fa0c94c
--- /dev/null
+++ b/packages/dart_style/._AUTHORS
Binary files differ
diff --git a/packages/dart_style/._LICENSE b/packages/dart_style/._LICENSE
new file mode 100644
index 0000000..8d50f72
--- /dev/null
+++ b/packages/dart_style/._LICENSE
Binary files differ
diff --git a/packages/dart_style/._PATENTS b/packages/dart_style/._PATENTS
new file mode 100644
index 0000000..0abd44b
--- /dev/null
+++ b/packages/dart_style/._PATENTS
Binary files differ
diff --git a/packages/dart_style/lib/src/._error_listener.dart b/packages/dart_style/lib/src/._error_listener.dart
new file mode 100644
index 0000000..bcc5ac5
--- /dev/null
+++ b/packages/dart_style/lib/src/._error_listener.dart
Binary files differ
diff --git a/packages/dart_style/test/selections/._selections.stmt b/packages/dart_style/test/selections/._selections.stmt
new file mode 100644
index 0000000..9f912de
--- /dev/null
+++ b/packages/dart_style/test/selections/._selections.stmt
Binary files differ
diff --git a/packages/dart_style/test/splitting/._arrows.unit b/packages/dart_style/test/splitting/._arrows.unit
new file mode 100644
index 0000000..fa01847
--- /dev/null
+++ b/packages/dart_style/test/splitting/._arrows.unit
Binary files differ
diff --git a/packages/dart_style/test/splitting/._enums.unit b/packages/dart_style/test/splitting/._enums.unit
new file mode 100644
index 0000000..3e2969b
--- /dev/null
+++ b/packages/dart_style/test/splitting/._enums.unit
Binary files differ
diff --git a/packages/dart_style/test/splitting/._parameters.unit b/packages/dart_style/test/splitting/._parameters.unit
new file mode 100644
index 0000000..51b5117
--- /dev/null
+++ b/packages/dart_style/test/splitting/._parameters.unit
Binary files differ
diff --git a/packages/dart_style/test/splitting/._statements.stmt b/packages/dart_style/test/splitting/._statements.stmt
new file mode 100644
index 0000000..312e399
--- /dev/null
+++ b/packages/dart_style/test/splitting/._statements.stmt
Binary files differ
diff --git a/packages/dart_style/test/splitting/._strings.stmt b/packages/dart_style/test/splitting/._strings.stmt
new file mode 100644
index 0000000..e65594f
--- /dev/null
+++ b/packages/dart_style/test/splitting/._strings.stmt
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._blocks.stmt b/packages/dart_style/test/whitespace/._blocks.stmt
new file mode 100644
index 0000000..bc02ea0
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._blocks.stmt
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._constructors.unit b/packages/dart_style/test/whitespace/._constructors.unit
new file mode 100644
index 0000000..3e816c7
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._constructors.unit
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._directives.unit b/packages/dart_style/test/whitespace/._directives.unit
new file mode 100644
index 0000000..812c891
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._directives.unit
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._do.stmt b/packages/dart_style/test/whitespace/._do.stmt
new file mode 100644
index 0000000..7e57633
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._do.stmt
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._enums.unit b/packages/dart_style/test/whitespace/._enums.unit
new file mode 100644
index 0000000..bd3d96f
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._enums.unit
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._methods.unit b/packages/dart_style/test/whitespace/._methods.unit
new file mode 100644
index 0000000..1f0c542
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._methods.unit
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._script.unit b/packages/dart_style/test/whitespace/._script.unit
new file mode 100644
index 0000000..5a17885
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._script.unit
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._switch.stmt b/packages/dart_style/test/whitespace/._switch.stmt
new file mode 100644
index 0000000..3fb5c99
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._switch.stmt
Binary files differ
diff --git a/packages/dart_style/test/whitespace/._try.stmt b/packages/dart_style/test/whitespace/._try.stmt
new file mode 100644
index 0000000..4e6803c
--- /dev/null
+++ b/packages/dart_style/test/whitespace/._try.stmt
Binary files differ
diff --git a/packages/dart_to_js_script_rewriter/CHANGELOG.md b/packages/dart_to_js_script_rewriter/CHANGELOG.md
index 1737604..2e70d1f 100644
--- a/packages/dart_to_js_script_rewriter/CHANGELOG.md
+++ b/packages/dart_to_js_script_rewriter/CHANGELOG.md
@@ -1,4 +1,6 @@
-# CHANGELOG
+## 1.0.2
+
+* Updated dependencies on `html` and `dartdoc`.
 
 ## 0.1.0+4
 
diff --git a/packages/dart_to_js_script_rewriter/analysis_options.yaml b/packages/dart_to_js_script_rewriter/analysis_options.yaml
new file mode 100644
index 0000000..59964a7
--- /dev/null
+++ b/packages/dart_to_js_script_rewriter/analysis_options.yaml
@@ -0,0 +1,7 @@
+analyzer:
+  strong-mode: true
+
+linter:
+  rules:
+    - cancel_subscriptions
+    - close_sinks
\ No newline at end of file
diff --git a/packages/dart_to_js_script_rewriter/docs.yml b/packages/dart_to_js_script_rewriter/docs.yml
new file mode 100644
index 0000000..e2c97cc
--- /dev/null
+++ b/packages/dart_to_js_script_rewriter/docs.yml
@@ -0,0 +1,3 @@
+title: dart_to_js_script_rewriter
+base: github:Workiva/dart_to_js_script_rewriter/
+src: README.md
diff --git a/packages/dart_to_js_script_rewriter/pubspec.yaml b/packages/dart_to_js_script_rewriter/pubspec.yaml
index 9297619..17afbde 100644
--- a/packages/dart_to_js_script_rewriter/pubspec.yaml
+++ b/packages/dart_to_js_script_rewriter/pubspec.yaml
@@ -10,19 +10,19 @@
   - Jay Udey <jay.udey@workiva.com>
   - Max Peterson <maxwell.peterson@workiva.com>
   - Trent Grover <trent.grover@workiva.com>
-version: 1.0.1
+version: 1.0.3
 homepage: https://github.com/Workiva/dart_to_js_script_rewriter
 environment:
   sdk: ">=1.12.0 <2.0.0"
 dependencies:
   barback: "^0.15.2+7"
-  html: "^0.12.2+1"
+  html: ">=0.12.2+1 <0.14.0"
 dev_dependencies:
   browser: "^0.10.0+2"
   coverage: "^0.7.2"
   dart_dev: "^1.0.6"
   dart_style: ">=0.1.8 <0.3.0"
-  dartdoc: "^0.4.0"
+  dartdoc: ">=0.4.0 <0.10.0"
   grinder: "^0.8.0+1"
   mockito: any
   test: "^0.12.6+2"
diff --git a/packages/dart_to_js_script_rewriter/smithy.yaml b/packages/dart_to_js_script_rewriter/smithy.yaml
new file mode 100644
index 0000000..edd91a9
--- /dev/null
+++ b/packages/dart_to_js_script_rewriter/smithy.yaml
@@ -0,0 +1,12 @@
+project: dart
+language: dart
+
+# dart 1.19.1
+runner_image: drydock-prod.workiva.org/workiva/smithy-runner-generator:92530
+
+script:
+  - pub get
+
+artifacts:
+  build:
+    - ./pubspec.lock
diff --git a/packages/dart_to_js_script_rewriter/tool/dev.dart b/packages/dart_to_js_script_rewriter/tool/dev.dart
index 9341572..0e5c3ca 100644
--- a/packages/dart_to_js_script_rewriter/tool/dev.dart
+++ b/packages/dart_to_js_script_rewriter/tool/dev.dart
@@ -6,6 +6,7 @@
   List<String> directories = ['example/', 'lib/', 'test/', 'tool/'];
 
   config.analyze.entryPoints = directories;
+  config.analyze.strong = true;
   config.format.directories = directories;
   config.test
     ..platforms = ['vm']
diff --git a/packages/glob/.analysis_options b/packages/glob/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/glob/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/glob/CHANGELOG.md b/packages/glob/CHANGELOG.md
index f8c00bc..3d440e8 100644
--- a/packages/glob/CHANGELOG.md
+++ b/packages/glob/CHANGELOG.md
@@ -1,3 +1,25 @@
+## 1.1.3
+
+* Support `string_scanner` 1.0.0.
+
+## 1.1.2
+
+* Fix all strong mode errors and warnings.
+
+## 1.1.1
+
+* Fix a bug where listing an absolute glob with `caseInsensitive: false` failed.
+
+## 1.1.0
+
+* Add a `caseSensitive` named parameter to `new Glob()` that controls whether
+  the glob is case-sensitive. This defaults to `false` on Windows and `true`
+  elsewhere.
+
+  Matching case-insensitively on Windows is a behavioral change, but since it
+  more closely matches the semantics of Windows paths it's considered a bug fix
+  rather than a breaking change.
+
 ## 1.0.5
 
 * Narrow the dependency on `path`. Previously, this allowed versions that didn't
diff --git a/packages/glob/README.md b/packages/glob/README.md
index 5091a1e..300e73e 100644
--- a/packages/glob/README.md
+++ b/packages/glob/README.md
@@ -50,6 +50,9 @@
 regardless of which platform they're on. This is true even for Windows roots;
 for example, a glob matching all files in the C drive would be `C:/*`.
 
+Globs are case-sensitive by default on Posix systems and browsers, and
+case-insensitive by default on Windows.
+
 ### Match any characters in a filename: `*`
 
 The `*` character matches zero or more of any character other than `/`. This
diff --git a/packages/glob/lib/glob.dart b/packages/glob/lib/glob.dart
index 2d2a83f..ca83969 100644
--- a/packages/glob/lib/glob.dart
+++ b/packages/glob/lib/glob.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library glob;
-
 import 'dart:async';
 import 'dart:io';
 
@@ -45,6 +43,9 @@
   /// contained within a directory that matches.
   final bool recursive;
 
+  /// Whether the glob matches paths case-sensitively.
+  bool get caseSensitive => _ast.caseSensitive;
+
   /// The parsed AST of the glob.
   final AstNode _ast;
 
@@ -87,21 +88,24 @@
   /// Paths matched against the glob are interpreted according to [context]. It
   /// defaults to the system context.
   ///
-  /// If [recursive] is true, this glob will match and list not only the files
-  /// and directories it explicitly lists, but anything beneath those as well.
-  Glob(String pattern, {p.Context context, bool recursive: false})
-      : this._(
-          pattern,
-          context == null ? p.context : context,
-          recursive);
+  /// If [recursive] is true, this glob matches and lists not only the files and
+  /// directories it explicitly matches, but anything beneath those as well.
+  ///
+  /// If [caseSensitive] is true, this glob matches and lists only files whose
+  /// case matches that of the characters in the glob. Otherwise, it matches
+  /// regardless of case. This defaults to `false` when [context] is Windows and
+  /// `true` otherwise.
+  factory Glob(String pattern, {p.Context context, bool recursive: false,
+      bool caseSensitive}) {
+    context ??= p.context;
+    caseSensitive ??= context.style == p.Style.windows ? false : true;
+    if (recursive) pattern += "{,/**}";
 
-  // Internal constructor used to fake local variables for [context] and [ast].
-  Glob._(String pattern, p.Context context, bool recursive)
-      : pattern = pattern,
-        context = context,
-        recursive = recursive,
-        _ast = new Parser(pattern + (recursive ? "{,/**}" : ""), context)
-            .parse();
+    var parser = new Parser(pattern, context, caseSensitive: caseSensitive);
+    return new Glob._(pattern, context, parser.parse(), recursive);
+  }
+
+  Glob._(this.pattern, this.context, this._ast, this.recursive);
 
   /// Lists all [FileSystemEntity]s beneath [root] that match the glob.
   ///
diff --git a/packages/glob/lib/src/ast.dart b/packages/glob/lib/src/ast.dart
index 1913477..5e24e2b 100644
--- a/packages/glob/lib/src/ast.dart
+++ b/packages/glob/lib/src/ast.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library glob.ast;
-
 import 'package:path/path.dart' as p;
 import 'package:collection/collection.dart';
 
@@ -16,15 +14,20 @@
   /// The cached regular expression that this AST was compiled into.
   RegExp _regExp;
 
+  /// Whether this node matches case-sensitively or not.
+  final bool caseSensitive;
+
   /// Whether this glob could match an absolute path.
   ///
   /// Either this or [canMatchRelative] or both will be true.
-  final bool canMatchAbsolute = false;
+  bool get canMatchAbsolute => false;
 
   /// Whether this glob could match a relative path.
   ///
   /// Either this or [canMatchRelative] or both will be true.
-  final bool canMatchRelative = true;
+  bool get canMatchRelative => true;
+
+  AstNode._(this.caseSensitive);
 
   /// Returns a new glob with all the options bubbled to the top level.
   ///
@@ -35,11 +38,15 @@
   ///
   /// For example, given the glob `{foo,bar}/{click/clack}`, this would return
   /// `{foo/click,foo/clack,bar/click,bar/clack}`.
-  OptionsNode flattenOptions() => new OptionsNode([new SequenceNode([this])]);
+  OptionsNode flattenOptions() => new OptionsNode(
+      [new SequenceNode([this], caseSensitive: caseSensitive)],
+      caseSensitive: caseSensitive);
 
   /// Returns whether this glob matches [string].
   bool matches(String string) {
-    if (_regExp == null) _regExp = new RegExp('^${_toRegExp()}\$');
+    if (_regExp == null) {
+      _regExp = new RegExp('^${_toRegExp()}\$', caseSensitive: caseSensitive);
+    }
     return _regExp.hasMatch(string);
   }
 
@@ -55,11 +62,14 @@
   bool get canMatchAbsolute => nodes.first.canMatchAbsolute;
   bool get canMatchRelative => nodes.first.canMatchRelative;
 
-  SequenceNode(Iterable<AstNode> nodes)
-      : nodes = nodes.toList();
+  SequenceNode(Iterable<AstNode> nodes, {bool caseSensitive: true})
+      : nodes = nodes.toList(),
+        super._(caseSensitive);
 
   OptionsNode flattenOptions() {
-    if (nodes.isEmpty) return new OptionsNode([this]);
+    if (nodes.isEmpty) {
+      return new OptionsNode([this], caseSensitive: caseSensitive);
+    }
 
     var sequences = nodes.first.flattenOptions().options
         .map((sequence) => sequence.nodes);
@@ -76,17 +86,19 @@
 
     return new OptionsNode(sequences.map((sequence) {
       // Combine any adjacent LiteralNodes in [sequence].
-      return new SequenceNode(sequence.fold([], (combined, node) {
+      return new SequenceNode(sequence.fold/*<List<AstNode>>*/([], (combined, node) {
         if (combined.isEmpty || combined.last is! LiteralNode ||
             node is! LiteralNode) {
           return combined..add(node);
         }
 
-        combined[combined.length - 1] =
-            new LiteralNode(combined.last.text + node.text);
+        combined[combined.length - 1] = new LiteralNode(
+            // TODO(nweiz): Avoid casting when sdk#25565 is fixed.
+            (combined.last as LiteralNode).text + (node as LiteralNode).text,
+            caseSensitive: caseSensitive);
         return combined;
-      }));
-    }));
+      }), caseSensitive: caseSensitive);
+    }), caseSensitive: caseSensitive);
   }
 
   /// Splits this glob into components along its path separators.
@@ -101,27 +113,35 @@
   /// [context] is used to determine what absolute roots look like for this
   /// glob.
   List<SequenceNode> split(p.Context context) {
-    var componentsToReturn = [];
-    var currentComponent;
+    var componentsToReturn = <SequenceNode>[];
+    List<AstNode> currentComponent;
 
-    addNode(node) {
+    addNode(AstNode node) {
       if (currentComponent == null) currentComponent = [];
       currentComponent.add(node);
     }
 
     finishComponent() {
       if (currentComponent == null) return;
-      componentsToReturn.add(new SequenceNode(currentComponent));
+      componentsToReturn.add(
+          new SequenceNode(currentComponent, caseSensitive: caseSensitive));
       currentComponent = null;
     }
 
     for (var node in nodes) {
-      if (node is! LiteralNode || !node.text.contains('/')) {
+      if (node is! LiteralNode) {
         addNode(node);
         continue;
       }
 
-      var text = node.text;
+      // TODO(nweiz): Avoid casting when sdk#25565 is fixed.
+      var literal = node as LiteralNode;
+      if (!literal.text.contains('/')) {
+        addNode(literal);
+        continue;
+      }
+
+      var text = literal.text;
       if (context.style == p.Style.windows) text = text.replaceAll("/", "\\");
       var components = context.split(text);
 
@@ -139,7 +159,7 @@
             // So we switch it back here.
             root = root.replaceAll("\\", "/");
           }
-          addNode(new LiteralNode(root));
+          addNode(new LiteralNode(root, caseSensitive: caseSensitive));
         }
         finishComponent();
         components = components.skip(1);
@@ -149,14 +169,14 @@
       // For each component except the last one, add a separate sequence to
       // [sequences] containing only that component.
       for (var component in components.take(components.length - 1)) {
-        addNode(new LiteralNode(component));
+        addNode(new LiteralNode(component, caseSensitive: caseSensitive));
         finishComponent();
       }
 
       // For the final component, only end its sequence (by adding a new empty
       // sequence) if it ends with a separator.
-      addNode(new LiteralNode(components.last));
-      if (node.text.endsWith('/')) finishComponent();
+      addNode(new LiteralNode(components.last, caseSensitive: caseSensitive));
+      if (literal.text.endsWith('/')) finishComponent();
     }
 
     finishComponent();
@@ -175,7 +195,7 @@
 
 /// A node matching zero or more non-separator characters.
 class StarNode extends AstNode {
-  StarNode();
+  StarNode({bool caseSensitive: true}) : super._(caseSensitive);
 
   String _toRegExp() => '[^/]*';
 
@@ -193,7 +213,8 @@
   /// This is used to determine what absolute paths look like.
   final p.Context _context;
 
-  DoubleStarNode(this._context);
+  DoubleStarNode(this._context, {bool caseSensitive: true})
+      : super._(caseSensitive);
 
   String _toRegExp() {
     // Double star shouldn't match paths with a leading "../", since these paths
@@ -229,7 +250,7 @@
 
 /// A node matching a single non-separator character.
 class AnyCharNode extends AstNode {
-  AnyCharNode();
+  AnyCharNode({bool caseSensitive: true}) : super._(caseSensitive);
 
   String _toRegExp() => '[^/]';
 
@@ -250,8 +271,9 @@
   /// Whether this range was negated.
   final bool negated;
 
-  RangeNode(Iterable<Range> ranges, {this.negated})
-      : ranges = ranges.toSet();
+  RangeNode(Iterable<Range> ranges, {this.negated, bool caseSensitive: true})
+      : ranges = ranges.toSet(),
+        super._(caseSensitive);
 
   OptionsNode flattenOptions() {
     if (negated || ranges.any((range) => !range.isSingleton)) {
@@ -262,9 +284,10 @@
     // a separate expansion.
     return new OptionsNode(ranges.map((range) {
       return new SequenceNode([
-        new LiteralNode(new String.fromCharCodes([range.min]))
-      ]);
-    }));
+        new LiteralNode(new String.fromCharCodes([range.min]),
+            caseSensitive: caseSensitive)
+      ], caseSensitive: caseSensitive);
+    }), caseSensitive: caseSensitive);
   }
 
   String _toRegExp() {
@@ -325,11 +348,13 @@
   bool get canMatchAbsolute => options.any((node) => node.canMatchAbsolute);
   bool get canMatchRelative => options.any((node) => node.canMatchRelative);
 
-  OptionsNode(Iterable<SequenceNode> options)
-      : options = options.toList();
+  OptionsNode(Iterable<SequenceNode> options, {bool caseSensitive: true})
+      : options = options.toList(),
+        super._(caseSensitive);
 
   OptionsNode flattenOptions() => new OptionsNode(
-      options.expand((option) => option.flattenOptions().options));
+      options.expand((option) => option.flattenOptions().options),
+      caseSensitive: caseSensitive);
 
   String _toRegExp() =>
       '(?:${options.map((option) => option._toRegExp()).join("|")})';
@@ -360,7 +385,9 @@
 
   bool get canMatchRelative => !canMatchAbsolute;
 
-  LiteralNode(this.text, [this._context]);
+  LiteralNode(this.text, {p.Context context, bool caseSensitive: true})
+      : _context = context,
+        super._(caseSensitive);
 
   String _toRegExp() => regExpQuote(text);
 
diff --git a/packages/glob/lib/src/list_tree.dart b/packages/glob/lib/src/list_tree.dart
index 3667d63..3cce642 100644
--- a/packages/glob/lib/src/list_tree.dart
+++ b/packages/glob/lib/src/list_tree.dart
@@ -2,15 +2,13 @@
 // for 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 glob.list_tree;
-
 import 'dart:io';
 import 'dart:async';
 
+import 'package:async/async.dart';
 import 'package:path/path.dart' as p;
 
 import 'ast.dart';
-import 'stream_pool.dart';
 import 'utils.dart';
 
 /// The errno for a file or directory not existing on Mac and Linux.
@@ -99,7 +97,7 @@
   }
 
   /// Add the glob represented by [components] to the tree under [root].
-  void _addGlob(String root, List<AstNode> components) {
+  void _addGlob(String root, List<SequenceNode> components) {
     // The first [parent] represents the root directory itself. It may be null
     // here if this is the first option with this particular [root]. If so,
     // we'll create it below.
@@ -172,19 +170,19 @@
   /// List all entities that match this glob beneath [root].
   Stream<FileSystemEntity> list({String root, bool followLinks: true}) {
     if (root == null) root = '.';
-    var pool = new StreamPool();
+    var group = new StreamGroup<FileSystemEntity>();
     for (var rootDir in _trees.keys) {
       var dir = rootDir == '.' ? root : rootDir;
-      pool.add(_trees[rootDir].list(dir, followLinks: followLinks));
+      group.add(_trees[rootDir].list(dir, followLinks: followLinks));
     }
-    pool.closeWhenEmpty();
+    group.close();
 
-    if (!_canOverlap) return pool.stream;
+    if (!_canOverlap) return group.stream;
 
     // TODO(nweiz): Rather than filtering here, avoid double-listing directories
     // in the first place.
     var seen = new Set();
-    return pool.stream.where((entity) {
+    return group.stream.where((entity) {
       if (seen.contains(entity.path)) return false;
       seen.add(entity.path);
       return true;
@@ -195,7 +193,8 @@
   List<FileSystemEntity> listSync({String root, bool followLinks: true}) {
     if (root == null) root = '.';
 
-    var result = _trees.keys.expand((rootDir) {
+    // TODO(nweiz): Remove the explicit annotation when sdk#26139 is fixed.
+    var result = _trees.keys.expand/*<FileSystemEntity>*/((rootDir) {
       var dir = rootDir == '.' ? root : rootDir;
       return _trees[rootDir].listSync(dir, followLinks: followLinks);
     });
@@ -204,7 +203,7 @@
 
     // TODO(nweiz): Rather than filtering here, avoid double-listing directories
     // in the first place.
-    var seen = new Set();
+    var seen = new Set<String>();
     return result.where((entity) {
       if (seen.contains(entity.path)) return false;
       seen.add(entity.path);
@@ -234,6 +233,13 @@
   /// A recursive node has no children and is listed recursively.
   bool get isRecursive => children == null;
 
+  bool get _caseSensitive {
+    if (_validator != null) return _validator.caseSensitive;
+    if (children == null) return true;
+    if (children.isEmpty) return true;
+    return children.keys.first.caseSensitive;
+  }
+
   /// Whether this node doesn't itself need to be listed.
   ///
   /// If a node has no validator and all of its children are literal filenames,
@@ -241,6 +247,7 @@
   /// its children.
   bool get _isIntermediate {
     if (_validator != null) return false;
+    if (!_caseSensitive) return false;
     return children.keys.every((sequence) =>
         sequence.nodes.length == 1 && sequence.nodes.first is LiteralNode);
   }
@@ -255,9 +262,14 @@
     // If there's more than one child node and at least one of the children is
     // dynamic (that is, matches more than just a literal string), there may be
     // overlap.
-    if (children.length > 1 && children.keys.any((sequence) =>
+    if (children.length > 1) {
+      // Case-insensitivity means that even literals may match multiple entries.
+      if (!_caseSensitive) return true;
+
+      if (children.keys.any((sequence) =>
           sequence.nodes.length > 1 || sequence.nodes.single is! LiteralNode)) {
-      return true;
+        return true;
+      }
     }
 
     return children.values.any((node) => node.canOverlap);
@@ -271,7 +283,8 @@
   /// Creates a recursive node the given [validator].
   _ListTreeNode.recursive(SequenceNode validator)
       : children = null,
-        _validator = new OptionsNode([validator]);
+        _validator = new OptionsNode([validator],
+            caseSensitive: validator.caseSensitive);
 
   /// Transforms this into recursive node, folding all its children into its
   /// validator.
@@ -281,14 +294,15 @@
       var child = children[sequence];
       child.makeRecursive();
       return _join([sequence, child._validator]);
-    }));
+    }), caseSensitive: _caseSensitive);
     children = null;
   }
 
   /// Adds [validator] to this node's existing validator.
   void addOption(SequenceNode validator) {
     if (_validator == null) {
-      _validator = new OptionsNode([validator]);
+      _validator = new OptionsNode([validator],
+          caseSensitive: validator.caseSensitive);
     } else {
       _validator.options.add(validator);
     }
@@ -301,26 +315,27 @@
   Stream<FileSystemEntity> list(String dir, {bool followLinks: true}) {
     if (isRecursive) {
       return new Directory(dir).list(recursive: true, followLinks: followLinks)
-          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+          .where((entity) => _matches(p.relative(entity.path, from: dir)));
     }
 
-    var resultPool = new StreamPool();
+    var resultGroup = new StreamGroup<FileSystemEntity>();
 
     // Don't spawn extra [Directory.list] calls when we already know exactly
     // which subdirectories we're interested in.
     if (_isIntermediate) {
       children.forEach((sequence, child) {
-        resultPool.add(child.list(p.join(dir, sequence.nodes.single.text),
+        resultGroup.add(child.list(
+            p.join(dir, (sequence.nodes.single as LiteralNode).text),
             followLinks: followLinks));
       });
-      resultPool.closeWhenEmpty();
-      return resultPool.stream;
+      resultGroup.close();
+      return resultGroup.stream;
     }
 
-    var resultController = new StreamController(sync: true);
-    resultPool.add(resultController.stream);
+    var resultController = new StreamController<FileSystemEntity>(sync: true);
+    resultGroup.add(resultController.stream);
     new Directory(dir).list(followLinks: followLinks).listen((entity) {
-      var basename = entity.path.substring(dir.length + 1);
+      var basename = p.relative(entity.path, from: dir);
       if (_matches(basename)) resultController.add(entity);
 
       children.forEach((sequence, child) {
@@ -336,14 +351,16 @@
               (error.osError.errorCode == _ENOENT ||
               error.osError.errorCode == _ENOENT_WIN);
         });
-        resultPool.add(stream);
+        resultGroup.add(stream);
       });
     },
         onError: resultController.addError,
-        onDone: resultController.close);
+        onDone: () {
+          resultController.close();
+          resultGroup.close();
+        });
 
-    resultPool.closeWhenEmpty();
-    return resultPool.stream;
+    return resultGroup.stream;
   }
 
   /// Synchronously lists all entities within [dir] matching this node or its
@@ -355,7 +372,7 @@
     if (isRecursive) {
       return new Directory(dir)
           .listSync(recursive: true, followLinks: followLinks)
-          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+          .where((entity) => _matches(p.relative(entity.path, from: dir)));
     }
 
     // Don't spawn extra [Directory.listSync] calls when we already know exactly
@@ -363,14 +380,15 @@
     if (_isIntermediate) {
       return children.keys.expand((sequence) {
         return children[sequence].listSync(
-            p.join(dir, sequence.nodes.single.text), followLinks: followLinks);
+            p.join(dir, (sequence.nodes.single as LiteralNode).text),
+            followLinks: followLinks);
       });
     }
 
     return new Directory(dir).listSync(followLinks: followLinks)
         .expand((entity) {
-      var entities = [];
-      var basename = entity.path.substring(dir.length + 1);
+      var entities = <FileSystemEntity>[];
+      var basename = p.relative(entity.path, from: dir);
       if (_matches(basename)) entities.add(entity);
       if (entity is! Directory) return entities;
 
@@ -411,10 +429,11 @@
 /// a path separator.
 SequenceNode _join(Iterable<AstNode> components) {
   var componentsList = components.toList();
-  var nodes = [componentsList.removeAt(0)];
+  var first = componentsList.removeAt(0);
+  var nodes = [first];
   for (var component in componentsList) {
-    nodes.add(new LiteralNode('/'));
+    nodes.add(new LiteralNode('/', caseSensitive: first.caseSensitive));
     nodes.add(component);
   }
-  return new SequenceNode(nodes);
+  return new SequenceNode(nodes, caseSensitive: first.caseSensitive);
 }
diff --git a/packages/glob/lib/src/parser.dart b/packages/glob/lib/src/parser.dart
index 5dac146..d3c7e1d 100644
--- a/packages/glob/lib/src/parser.dart
+++ b/packages/glob/lib/src/parser.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library glob.single_component;
-
 import 'package:path/path.dart' as p;
 import 'package:string_scanner/string_scanner.dart';
 
@@ -21,8 +19,12 @@
   /// The path context for the glob.
   final p.Context _context;
 
-  Parser(String component, this._context)
-      : _scanner = new StringScanner(component);
+  /// Whether this glob is case-sensitive.
+  final bool _caseSensitive;
+
+  Parser(String component, this._context, {bool caseSensitive: true})
+      : _scanner = new StringScanner(component),
+        _caseSensitive = caseSensitive;
 
   /// Parses an entire glob.
   SequenceNode parse() => _parseSequence();
@@ -31,7 +33,7 @@
   ///
   /// If [inOptions] is true, this is parsing within an [OptionsNode].
   SequenceNode _parseSequence({bool inOptions: false}) {
-    var nodes = [];
+    var nodes = <AstNode>[];
 
     if (_scanner.isDone) {
       _scanner.error('expected a glob.', position: 0, length: 0);
@@ -42,7 +44,7 @@
       nodes.add(_parseNode(inOptions: inOptions));
     }
 
-    return new SequenceNode(nodes);
+    return new SequenceNode(nodes, caseSensitive: _caseSensitive);
   }
 
   /// Parses an [AstNode].
@@ -69,7 +71,9 @@
   /// Returns `null` if there's not one to parse.
   AstNode _parseStar() {
     if (!_scanner.scan('*')) return null;
-    return _scanner.scan('*') ? new DoubleStarNode(_context) : new StarNode();
+    return _scanner.scan('*')
+        ? new DoubleStarNode(_context, caseSensitive: _caseSensitive)
+        : new StarNode(caseSensitive: _caseSensitive);
   }
 
   /// Tries to parse an [AnyCharNode].
@@ -77,7 +81,7 @@
   /// Returns `null` if there's not one to parse.
   AstNode _parseAnyChar() {
     if (!_scanner.scan('?')) return null;
-    return new AnyCharNode();
+    return new AnyCharNode(caseSensitive: _caseSensitive);
   }
 
   /// Tries to parse an [RangeNode].
@@ -95,7 +99,7 @@
           position: _scanner.position - 1);
     }
 
-    var ranges = [];
+    var ranges = <Range>[];
     while (!_scanner.scan(']')) {
       var start = _scanner.position;
       // Allow a backslash to escape a character.
@@ -125,7 +129,8 @@
       }
     }
 
-    return new RangeNode(ranges, negated: negated);
+    return new RangeNode(ranges,
+        negated: negated, caseSensitive: _caseSensitive);
   }
 
   /// Tries to parse an [OptionsNode].
@@ -135,7 +140,7 @@
     if (!_scanner.scan('{')) return null;
     if (_scanner.matches('}')) _scanner.error('unexpected "}".');
 
-    var options = [];
+    var options = <SequenceNode>[];
     do {
       options.add(_parseSequence(inOptions: true));
     } while (_scanner.scan(','));
@@ -144,7 +149,7 @@
     if (options.length == 1) _scanner.expect(',');
     _scanner.expect('}');
 
-    return new OptionsNode(options);
+    return new OptionsNode(options, caseSensitive: _caseSensitive);
   }
 
   /// Parses a [LiteralNode].
@@ -168,6 +173,7 @@
     }
     if (!inOptions && _scanner.matches('}')) _scanner.error('unexpected "}"');
 
-    return new LiteralNode(buffer.toString(), _context);
+    return new LiteralNode(buffer.toString(),
+        context: _context, caseSensitive: _caseSensitive);
   }
 }
diff --git a/packages/glob/lib/src/stream_pool.dart b/packages/glob/lib/src/stream_pool.dart
index 6417513..817d57a 100644
--- a/packages/glob/lib/src/stream_pool.dart
+++ b/packages/glob/lib/src/stream_pool.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library glob.stream_pool;
-
 import 'dart:async';
 
 /// A pool of streams whose events are unified and emitted through a central
diff --git a/packages/glob/lib/src/utils.dart b/packages/glob/lib/src/utils.dart
index f17f2ed..94f6a05 100644
--- a/packages/glob/lib/src/utils.dart
+++ b/packages/glob/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library glob.utils;
-
 import 'package:path/path.dart' as p;
 
 /// A range from [min] to [max], inclusive.
diff --git a/packages/glob/pubspec.yaml b/packages/glob/pubspec.yaml
index eb7816c..4037f80 100644
--- a/packages/glob/pubspec.yaml
+++ b/packages/glob/pubspec.yaml
@@ -1,12 +1,15 @@
 name: glob
-version: 1.0.5
+version: 1.1.3
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/glob
 description: Bash-style filename globbing.
 dependencies:
+  async: "^1.2.0"
   collection: ">=1.1.0 <2.0.0"
   path: ">=1.3.0 <2.0.0"
-  string_scanner: ">=0.1.0 <0.2.0"
+  string_scanner: ">=0.1.0 <2.0.0"
 dev_dependencies:
   test: ">=0.12.0 <0.13.0"
   scheduled_test: ">=0.12.0 <0.13.0"
+environment:
+  sdk: ">=1.12.0 <2.0.0"
diff --git a/packages/glob/test/glob_test.dart b/packages/glob/test/glob_test.dart
index a742f20..4cbb453 100644
--- a/packages/glob/test/glob_test.dart
+++ b/packages/glob/test/glob_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 void main() {
@@ -91,4 +92,20 @@
       expect(() => match.groups([1]), throwsRangeError);
     });
   });
+
+  test("globs are case-sensitive by default for Posix and URL contexts", () {
+    expect("foo", contains(new Glob("foo", context: p.posix)));
+    expect("FOO", isNot(contains(new Glob("foo", context: p.posix))));
+    expect("foo", isNot(contains(new Glob("FOO", context: p.posix))));
+
+    expect("foo", contains(new Glob("foo", context: p.url)));
+    expect("FOO", isNot(contains(new Glob("foo", context: p.url))));
+    expect("foo", isNot(contains(new Glob("FOO", context: p.url))));
+  });
+
+  test("globs are case-insensitive by default for Windows contexts", () {
+    expect("foo", contains(new Glob("foo", context: p.windows)));
+    expect("FOO", contains(new Glob("foo", context: p.windows)));
+    expect("foo", contains(new Glob("FOO", context: p.windows)));
+  });
 }
diff --git a/packages/glob/test/list_test.dart b/packages/glob/test/list_test.dart
index 3327524..d59e273 100644
--- a/packages/glob/test/list_test.dart
+++ b/packages/glob/test/list_test.dart
@@ -52,6 +52,29 @@
     });
   });
 
+  group("when case-sensitive", () {
+    test("lists literals case-sensitively", () {
+      schedule(() {
+        expect(new Glob("foo/BAZ/qux", caseSensitive: true).listSync,
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+
+    test("lists ranges case-sensitively", () {
+      schedule(() {
+        expect(new Glob("foo/[BX][A-Z]z/qux", caseSensitive: true).listSync,
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+
+    test("options preserve case-sensitivity", () {
+      schedule(() {
+        expect(new Glob("foo/{BAZ,ZAP}/qux", caseSensitive: true).listSync,
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+  });
+
   syncAndAsync((list) {
     group("literals", () {
       test("lists a single literal", () {
@@ -252,6 +275,19 @@
       ])));
     });
 
+    // Regression test for #4.
+    test("lists an absolute case-insensitive glob", () {
+      expect(schedule(() {
+        var pattern = separatorToForwardSlash(
+            p.absolute(p.join(sandbox, 'foo/Baz/**')));
+
+        return list(pattern, caseSensitive: false);
+      }), completion(unorderedEquals([
+        p.join("foo", "baz", "bang"),
+        p.join("foo", "baz", "qux")
+      ])));
+    });
+
     test("lists a subdirectory that sometimes exists", () {
       d.dir("top", [
         d.dir("dir1", [
@@ -263,34 +299,63 @@
       expect(list("top/*/subdir/**"),
           completion(equals([p.join("top", "dir1", "subdir", "file")])));
     });
+
+    group("when case-insensitive", () {
+      test("lists literals case-insensitively", () {
+        expect(list("foo/baz/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+        expect(list("foo/BAZ/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+      });
+
+      test("lists ranges case-insensitively", () {
+        expect(list("foo/[bx][a-z]z/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+        expect(list("foo/[BX][A-Z]z/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+      });
+
+      test("options preserve case-insensitivity", () {
+        expect(list("foo/{bar,baz}/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+        expect(list("foo/{BAR,BAZ}/qux", caseSensitive: false),
+            completion(equals([p.join("foo", "baz", "qux")])));
+      });
+    });
   });
 }
 
 typedef Future<List<String>> ListFn(String glob,
-    {bool recursive, bool followLinks});
+    {bool recursive, bool followLinks, bool caseSensitive});
 
 /// Runs [callback] in two groups with two values of [listFn]: one that uses
 /// [Glob.list], one that uses [Glob.listSync].
 void syncAndAsync(callback(ListFn listFn)) {
   group("async", () {
-    callback((glob, {recursive: false, followLinks: true}) {
+    callback((pattern, {recursive: false, followLinks: true, caseSensitive}) {
       return schedule(() {
-        return new Glob(glob, recursive: recursive)
+        var glob = new Glob(pattern,
+            recursive: recursive, caseSensitive: caseSensitive);
+
+        return glob
             .list(root: sandbox, followLinks: followLinks)
             .map((entity) => p.relative(entity.path, from: sandbox))
             .toList();
-      }, 'listing $glob');
+      }, 'listing $pattern');
     });
   });
 
   group("sync", () {
-    callback((glob, {recursive: false, followLinks: true}) {
+    callback((pattern, {recursive: false, followLinks: true, caseSensitive}) {
       return schedule(() {
-        return new Glob(glob, recursive: recursive)
+        var glob = new Glob(pattern,
+            recursive: recursive, caseSensitive: caseSensitive);
+
+        return glob
             .listSync(root: sandbox, followLinks: followLinks)
             .map((entity) => p.relative(entity.path, from: sandbox))
             .toList();
-      }, 'listing $glob');
+      }, 'listing $pattern');
     });
   });
 }
diff --git a/packages/glob/test/match_test.dart b/packages/glob/test/match_test.dart
index 90b5b7f..13dc7d6 100644
--- a/packages/glob/test/match_test.dart
+++ b/packages/glob/test/match_test.dart
@@ -291,4 +291,62 @@
     expect("/foo/bar", isNot(contains(new Glob("**", context: p.url))));
     expect("/foo/bar", contains(new Glob("/**", context: p.url)));
   });
+
+  group("when case-sensitive", () {
+    test("literals match case-sensitively", () {
+      expect("foo", contains(new Glob("foo", caseSensitive: true)));
+      expect("FOO", isNot(contains(new Glob("foo", caseSensitive: true))));
+      expect("foo", isNot(contains(new Glob("FOO", caseSensitive: true))));
+    });
+
+    test("ranges match case-sensitively", () {
+      expect("foo", contains(new Glob("[fx][a-z]o", caseSensitive: true)));
+      expect("FOO",
+          isNot(contains(new Glob("[fx][a-z]o", caseSensitive: true))));
+      expect("foo",
+          isNot(contains(new Glob("[FX][A-Z]O", caseSensitive: true))));
+    });
+
+    test("sequences preserve case-sensitivity", () {
+      expect("foo/bar", contains(new Glob("foo/bar", caseSensitive: true)));
+      expect("FOO/BAR",
+          isNot(contains(new Glob("foo/bar", caseSensitive: true))));
+      expect("foo/bar",
+          isNot(contains(new Glob("FOO/BAR", caseSensitive: true))));
+    });
+
+    test("options preserve case-sensitivity", () {
+      expect("foo", contains(new Glob("{foo,bar}", caseSensitive: true)));
+      expect("FOO",
+          isNot(contains(new Glob("{foo,bar}", caseSensitive: true))));
+      expect("foo",
+          isNot(contains(new Glob("{FOO,BAR}", caseSensitive: true))));
+    });
+  });
+
+  group("when case-insensitive", () {
+    test("literals match case-insensitively", () {
+      expect("foo", contains(new Glob("foo", caseSensitive: false)));
+      expect("FOO", contains(new Glob("foo", caseSensitive: false)));
+      expect("foo", contains(new Glob("FOO", caseSensitive: false)));
+    });
+
+    test("ranges match case-insensitively", () {
+      expect("foo", contains(new Glob("[fx][a-z]o", caseSensitive: false)));
+      expect("FOO", contains(new Glob("[fx][a-z]o", caseSensitive: false)));
+      expect("foo", contains(new Glob("[FX][A-Z]O", caseSensitive: false)));
+    });
+
+    test("sequences preserve case-insensitivity", () {
+      expect("foo/bar", contains(new Glob("foo/bar", caseSensitive: false)));
+      expect("FOO/BAR", contains(new Glob("foo/bar", caseSensitive: false)));
+      expect("foo/bar", contains(new Glob("FOO/BAR", caseSensitive: false)));
+    });
+
+    test("options preserve case-insensitivity", () {
+      expect("foo", contains(new Glob("{foo,bar}", caseSensitive: false)));
+      expect("FOO", contains(new Glob("{foo,bar}", caseSensitive: false)));
+      expect("foo", contains(new Glob("{FOO,BAR}", caseSensitive: false)));
+    });
+  });
 }
diff --git a/packages/html/.gitignore b/packages/html/.gitignore
index e979170..f20a0d0 100644
--- a/packages/html/.gitignore
+++ b/packages/html/.gitignore
@@ -2,6 +2,7 @@
 .pub
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/packages/html/CHANGELOG.md b/packages/html/CHANGELOG.md
index 588c735..4dbea39 100644
--- a/packages/html/CHANGELOG.md
+++ b/packages/html/CHANGELOG.md
@@ -3,6 +3,12 @@
 This file contains highlights of what changes on each version of the html
 package.
 
+#### Pub version 0.12.2+2
+  * Support `csslib` versions `0.13.x`.
+  
+#### Pub version 0.12.2+1
+  * Exclude `.packages` file from the published package.
+
 #### Pub version 0.12.2
   * Added `Element.endSourceSpan`, containing the span of a closing tag.
 
diff --git a/packages/html/pubspec.yaml b/packages/html/pubspec.yaml
index 15c83c7..697d1c8 100644
--- a/packages/html/pubspec.yaml
+++ b/packages/html/pubspec.yaml
@@ -1,12 +1,12 @@
 name: html
-version: 0.12.2
+version: 0.12.2+2
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents. Previously known as html5lib.
 homepage: https://github.com/dart-lang/html
 environment:
   sdk: '>=1.2.0 <2.0.0'
 dependencies:
-  csslib: '>=0.10.0 <0.13.0'
+  csslib: '>=0.10.0 <0.14.0'
   source_span: '>=1.0.0 <2.0.0'
   utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
diff --git a/packages/initialize/.status b/packages/initialize/.status
deleted file mode 100644
index ff83d82..0000000
--- a/packages/initialize/.status
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Don't run any test-like files that show up in packages directories. It
-# shouldn't be necessary to run "pub install" in these packages, but if you do
-# it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
-
-# tests that don't need to be ran after pub-build
-build/test/transformer_test: Skip
-build/test/initializer_cycle_error_test.initialize_test: Skip # Build time warning
-build/test/initializer_from_test.initialize_test: SkipByDesign
-
-# tests that need to run, but we use the bootstrap output instead
-# (build/test/foo.initialize.dart) which is renamed by the .test_config scripts.
-build/test/deferred_library_test: Skip
-build/test/initializer_custom_filter_test: Skip
-build/test/initializer_cycle_error_test: Skip
-build/test/initializer_from_test: Skip
-build/test/initializer_parts_test: Skip
-build/test/initializer_super_test: Skip
-build/test/initializer_test: Skip
-build/test/initializer_type_filter_test: Skip
-build/test/init_method_test: Skip
-
-# failing tests
-[ $compiler == none ]
-build/test/deferred_library_test.initialize_test: RuntimeError # Issue 22592
-
-[ $browser ]
-# All tests are for the standalone vm only
-build/test/*: Skip
-test/*: Skip
diff --git a/packages/initialize/.test_config b/packages/initialize/.test_config
index 4462942..2535563 100644
--- a/packages/initialize/.test_config
+++ b/packages/initialize/.test_config
@@ -1,5 +1,3 @@
 {
-  "post_pub_build_hooks" : {
-    "Rename output files for testing": "$dart $project_root/tool/rename_build_outputs.dart"
-  }
+  "test_package": true
 }
diff --git a/packages/initialize/CHANGELOG.md b/packages/initialize/CHANGELOG.md
index b1dbc70..3c7d38e 100644
--- a/packages/initialize/CHANGELOG.md
+++ b/packages/initialize/CHANGELOG.md
@@ -1,3 +1,31 @@
+## 0.6.2+6
+
+* Small bug fixes for https://github.com/dart-lang/web-components/issues/54.
+
+## 0.6.2+5
+
+* Update analyzer minimum version to `0.27.2`.
+
+## 0.6.2+4
+
+* Stop using deprecated analyzer apis.
+
+## 0.6.2+3
+
+* Update code_transformers, analyzer, and html version constraints.
+
+## 0.6.2+2
+
+* Update `transformer_test` dep to `0.2.x`.
+
+## 0.6.2+1
+
+* Add support for code_transformers `0.4.x`.
+
+## 0.6.2
+
+* Update analyzer to `>=0.27.0 <0.28.0`.
+
 ## 0.6.1+2
 
 * Update analyzer to `<0.27.0` and dart_style to `<0.3.0`.
diff --git a/packages/initialize/lib/build/initializer_plugin.dart b/packages/initialize/lib/build/initializer_plugin.dart
index 8822dc4..f049df0 100644
--- a/packages/initialize/lib/build/initializer_plugin.dart
+++ b/packages/initialize/lib/build/initializer_plugin.dart
@@ -3,8 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 library initialize.build.initializer_plugin;
 
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/constant.dart';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
 import 'package:initialize/transformer.dart';
@@ -58,10 +59,8 @@
   /// [ElementAnnotation] that was found.
   String buildMeta(InitializerPluginData pluginData) {
     var logger = pluginData.logger;
-    var element = pluginData.initializer.targetElement;
     var elementAnnotation = pluginData.initializer.annotationElement;
     var elementAnnotationElement = elementAnnotation.element;
-    var libraryPrefixes = pluginData.libraryPrefixes;
     if (elementAnnotationElement is ConstructorElement) {
       return buildConstructorMeta(elementAnnotation, pluginData);
     } else if (elementAnnotationElement is PropertyAccessorElement) {
@@ -264,7 +263,8 @@
     return buffer.toString();
   }
 
-  _evaluateExpression(Expression expression, InitializerPluginData pluginData) {
+  _evaluateExpression(
+      Expression expression, InitializerPluginData pluginData) {
     var logger = pluginData.logger;
     var result = pluginData.resolver.evaluateConstant(
         pluginData.initializer.targetElement.library, expression);
@@ -273,15 +273,17 @@
           'And got the following errors: ${result.errors}.');
       return null;
     }
-    var value = result.value.value;
+
+    var value = _getValue(result.value);
+
     if (value == null) {
       logger.error('Unsupported expression in initializer, found '
           '$expression. Please file a bug at '
           'https://github.com/dart-lang/initialize/issues');
-      return null;
     }
 
     if (value is String) value = _stringValue(value);
+
     return value;
   }
 
@@ -291,4 +293,31 @@
     value = value.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
     return "'$value'";
   }
+
+  // Gets an actual value for a [DartObject].
+  _getValue(DartObject object) {
+    if (object == null) return null;
+    var value = object.toBoolValue() ??
+        object.toDoubleValue() ??
+        object.toIntValue() ??
+        object.toStringValue();
+    if (value == null) {
+      value = object.toListValue();
+      if (value != null) {
+        return value.map((DartObject element) => _getValue(element)).toList();
+      }
+      Map<DartObject, DartObject> map = object.toMapValue();
+      if (map != null) {
+        Map result = {};
+        map.forEach((DartObject key, DartObject value) {
+          dynamic mappedKey = _getValue(key);
+          if (mappedKey != null) {
+            result[mappedKey] = _getValue(value);
+          }
+        });
+        return result;
+      }
+    }
+    return value;
+  }
 }
diff --git a/packages/initialize/lib/src/mirror_loader.dart b/packages/initialize/lib/src/mirror_loader.dart
index 4ca2004..11722c1 100644
--- a/packages/initialize/lib/src/mirror_loader.dart
+++ b/packages/initialize/lib/src/mirror_loader.dart
@@ -48,7 +48,6 @@
   Queue<Function> run() {
     var librariesSeen = new Set<LibraryMirror>();
     var queue = new Queue<Function>();
-    var libraries = currentMirrorSystem().libraries;
 
     _readLibraryDeclarations(_rootLibrary, librariesSeen, queue);
     return queue;
@@ -152,9 +151,6 @@
     return declarationList;
   }
 
-  String _declarationName(DeclarationMirror declaration) =>
-      MirrorSystem.getName(declaration.qualifiedName);
-
   /// Reads annotations on a [DeclarationMirror] and adds them to [_initQueue]
   /// if they are [Initializer]s.
   void _readAnnotations(DeclarationMirror declaration, Queue<Function> queue) {
diff --git a/packages/initialize/lib/transformer.dart b/packages/initialize/lib/transformer.dart
index a1f01fa..34acd4a 100644
--- a/packages/initialize/lib/transformer.dart
+++ b/packages/initialize/lib/transformer.dart
@@ -5,8 +5,9 @@
 
 import 'dart:async';
 import 'dart:collection' show Queue;
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
 import 'package:code_transformers/resolver.dart';
@@ -24,15 +25,17 @@
 /// a new file that bootstraps your application.
 Asset generateBootstrapFile(Resolver resolver, Transform transform,
     AssetId primaryAssetId, AssetId newEntryPointId,
-    {bool errorIfNotFound: true, List<InitializerPlugin> plugins,
+    {bool errorIfNotFound: true,
+    List<InitializerPlugin> plugins,
     bool appendDefaultPlugin: true}) {
   if (appendDefaultPlugin) {
     if (plugins == null) plugins = [];
     plugins.add(const DefaultInitializerPlugin());
   }
   return new _BootstrapFileBuilder(
-      resolver, transform, primaryAssetId, newEntryPointId, errorIfNotFound,
-      plugins: plugins).run();
+          resolver, transform, primaryAssetId, newEntryPointId, errorIfNotFound,
+          plugins: plugins)
+      .run();
 }
 
 /// Transformer which removes the mirror-based initialization logic and replaces
@@ -98,18 +101,19 @@
       });
     });
   }
+
   // Finds the first (and only) dart script on an html page and returns the
   // [AssetId] that points to it
   AssetId _findMainScript(
       dom.Document document, AssetId entryPoint, Transform transform) {
-    var scripts = document.querySelectorAll('script[type="application/dart"]');
+    var scripts = _getScripts(document);
     if (scripts.length != 1) {
       transform.logger.error('Expected exactly one dart script in $entryPoint '
           'but found ${scripts.length}.');
       return null;
     }
 
-    var src = scripts[0].attributes['src'];
+    var src = _getScriptAttribute(scripts[0]);
     if (src == null) {
       // TODO(jakemac): Support inline scripts,
       transform.logger.error('Inline scripts are not supported at this time, '
@@ -125,26 +129,51 @@
   // [entryPoint].
   void _replaceEntryWithBootstrap(Transform transform, dom.Document document,
       AssetId entryPoint, AssetId originalDartFile, AssetId newDartFile) {
-    var found = false;
-
-    var scripts = document
-        .querySelectorAll('script[type="application/dart"]')
+    var scripts = _getScripts(document)
         .where((script) {
-      var assetId = uriToAssetId(entryPoint, script.attributes['src'],
+      var assetId = uriToAssetId(entryPoint, _getScriptAttribute(script),
           transform.logger, script.sourceSpan);
       return assetId == originalDartFile;
     }).toList();
 
     if (scripts.length != 1) {
-      transform.logger.error(
-          'Expected exactly one script pointing to $originalDartFile in '
-          '$entryPoint, but found ${scripts.length}.');
+      transform.logger
+          .error('Expected exactly one script pointing to $originalDartFile in '
+              '$entryPoint, but found ${scripts.length}.');
       return;
     }
-    scripts[0].attributes['src'] = path.url.relative(newDartFile.path,
-        from: path.dirname(entryPoint.path));
+    _setScriptAttribute(
+        scripts[0],
+        path.url
+            .relative(newDartFile.path, from: path.dirname(entryPoint.path)));
     transform.addOutput(new Asset.fromString(entryPoint, document.outerHtml));
   }
+
+  String _getScriptAttribute(dom.Element element) {
+    switch (element.localName) {
+      case 'script':
+        return element.attributes['src'];
+      case 'link':
+        return element.attributes['href'];
+      default:
+        throw 'Unrecognized element $element';
+    }
+  }
+
+  void _setScriptAttribute(dom.Element element, String path) {
+    switch (element.localName) {
+      case 'script':
+        element.attributes['src'] = path;
+        break;
+      case 'link':
+        element.attributes['href'] = path;
+        break;
+    }
+  }
+
+  List<dom.Element> _getScripts(dom.Document document) =>
+      document.querySelectorAll(
+          'script[type="application/dart"], link[rel="x-dart-test"]');
 }
 
 // Class which builds a bootstrap file.
@@ -157,11 +186,13 @@
 
   /// The resolved initialize library.
   LibraryElement _initializeLibrary;
+
   /// The resolved Initializer class from the initialize library.
   ClassElement _initializer;
 
   /// Queue for intialization annotations.
   final _initQueue = new Queue<InitializerData>();
+
   /// All the annotations we have seen for each element
   final _seenAnnotations = new Map<Element, Set<ElementAnnotation>>();
 
@@ -234,10 +265,11 @@
 
   bool _readAnnotations(Element element) {
     var found = false;
-    if (element.metadata.isEmpty) return found;
+    // analyzer 0.29 doesn't allow this optimization :
+    //if (element.metadata.isEmpty) return found;
 
     var metaNodes;
-    var node = element.node;
+    var node = element.computeNode();
     if (node is SimpleIdentifier && node.parent is LibraryIdentifier) {
       metaNodes = node.parent.parent.metadata;
     } else if (node is ClassDeclaration || node is FunctionDeclaration) {
@@ -326,8 +358,8 @@
       _logger.error("Can't import `${id}` from `${_newEntryPoint}`");
     } else if (path.url.split(id.path)[0] ==
         path.url.split(_newEntryPoint.path)[0]) {
-      var relativePath = path.url.relative(id.path,
-          from: path.url.dirname(_newEntryPoint.path));
+      var relativePath = path.url
+          .relative(id.path, from: path.url.dirname(_newEntryPoint.path));
       buffer.write("import '${relativePath}'");
     } else {
       _logger.error("Can't import `${id}` from `${_newEntryPoint}`");
@@ -409,8 +441,9 @@
     }
 
     return (new List.from(library.imports)
-      ..addAll(library.exports)
-      ..sort((a, b) => a.nameOffset.compareTo(b.nameOffset))).map(getLibrary);
+          ..addAll(library.exports)
+          ..sort((a, b) => a.nameOffset.compareTo(b.nameOffset)))
+        .map(getLibrary);
   }
 }
 
diff --git a/packages/initialize/pubspec.yaml b/packages/initialize/pubspec.yaml
index b9ade8b..887267f 100644
--- a/packages/initialize/pubspec.yaml
+++ b/packages/initialize/pubspec.yaml
@@ -1,36 +1,39 @@
 name: initialize
-version: 0.6.1+2
+version: 0.6.2+6
 author: Polymer.dart Authors <web@dartlang.org>
 description: Generic building blocks for doing static initialization.
 homepage: https://github.com/dart-lang/initialize
 dependencies:
-  analyzer: '>=0.15.6 <0.27.0'
+  analyzer: '>=0.27.2 <0.30.0'
   barback: '>=0.14.2 <0.16.0'
-  code_transformers: '>=0.2.7 <0.3.0'
+  code_transformers: '>=0.3.0 <0.6.0'
   dart_style: '>=0.1.3 <0.3.0'
   glob: ">=1.0.4 <2.0.0"
-  html: '>=0.12.0 <0.13.0'
+  html: '>=0.12.0 <0.14.0'
   path: '>=1.3.0 <2.0.0'
 dev_dependencies:
   test_package:
     path: test_package
-  unittest: '>=0.10.0 <0.12.0'
+  test: '>=0.12.0 <0.13.0'
+  transformer_test: '>=0.2.0 <0.3.0'
 environment:
   sdk: ">=1.9.0-dev.7.1 <2.0.0"
 transformers:
 - initialize/build/loader_replacer:
     $include: lib/initialize.dart
 - initialize:
-    $include: '**/*_test.dart'
+    $include: '**/*_test.*'
     entry_points:
-      - test/deferred_library_test.dart
-      - test/initializer_test.dart
-      - test/initializer_from_test.dart
-      - test/initializer_parts_test.dart
-      - test/initializer_super_test.dart
-      - test/initializer_cycle_error_test.dart
-      - test/initializer_custom_filter_test.dart
-      - test/initializer_type_filter_test.dart
-      - test/init_method_test.dart
+      - test/deferred_library_test.html
+      - test/initializer_test.html
+      - test/initializer_from_test.html
+      - test/initializer_parts_test.html
+      - test/initializer_super_test.html
+      - test/initializer_cycle_error_test.html
+      - test/initializer_custom_filter_test.html
+      - test/initializer_type_filter_test.html
+      - test/init_method_test.html
+- test/pub_serve:
+    $include: test/**_test{.*,}.dart
 - $dart2js:
-    $exclude: '**/*.dart'
+    $include: test/*_test.initialize{.*,}.dart
diff --git a/packages/initialize/test/common.dart b/packages/initialize/test/common.dart
index f121be5..0638431 100644
--- a/packages/initialize/test/common.dart
+++ b/packages/initialize/test/common.dart
@@ -4,8 +4,8 @@
 library initialize.test.build.common;
 
 import 'package:barback/barback.dart';
-import 'package:code_transformers/src/test_harness.dart';
-import 'package:unittest/unittest.dart';
+import 'package:transformer_test/src/test_harness.dart';
+import 'package:test/test.dart';
 
 testPhases(String testName, List<List<Transformer>> phases,
     Map<String, String> inputFiles, Map<String, String> expectedFiles,
diff --git a/packages/initialize/test/cycle_a.dart b/packages/initialize/test/cycle_a.dart
index 6bc6d84..301260e 100644
--- a/packages/initialize/test/cycle_a.dart
+++ b/packages/initialize/test/cycle_a.dart
@@ -4,7 +4,8 @@
 library initialize.test.cycle_a;
 
 import 'package:initialize/src/initialize_tracker.dart';
-import 'cycle_b.dart';
+import 'cycle_b.dart' as cycle_b;
 
+/// Uses [cycle_b].
 @initializeTracker
 class CycleA {}
diff --git a/packages/initialize/test/deferred_library_test.dart b/packages/initialize/test/deferred_library_test.dart
index 2b480ae..0bff187 100644
--- a/packages/initialize/test/deferred_library_test.dart
+++ b/packages/initialize/test/deferred_library_test.dart
@@ -1,18 +1,19 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 @initializeTracker
 library initialize.deferred_library_test;
 
 import 'foo.dart' deferred as foo;
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   test('annotations can be loaded lazily', () {
     // Initialize everything not in deferred imports.
     return run().then((_) {
@@ -23,5 +24,6 @@
         expect(InitializeTracker.seen.length, 5);
       });
     });
-  });
+  }, skip: 'Should be skipped only in pub-serve mode, blocked on  '
+      'https://github.com/dart-lang/test/issues/388.');
 }
diff --git a/packages/initialize/test/deferred_library_test.html b/packages/initialize/test/deferred_library_test.html
new file mode 100644
index 0000000..6631529
--- /dev/null
+++ b/packages/initialize/test/deferred_library_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="deferred_library_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/init_method_test.dart b/packages/initialize/test/init_method_test.dart
index 55fa282..c976a52 100644
--- a/packages/initialize/test/init_method_test.dart
+++ b/packages/initialize/test/init_method_test.dart
@@ -1,20 +1,21 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 library initialize.init_method_test;
 
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 int calledFoo = 0;
 int calledBar = 0;
 
 main() {
-  useCompactVMConfiguration();
-
   // Run all initializers.
-  run().then((_) {
+  return run().then((_) {
     test('initMethod annotation invokes functions once', () {
       expect(calledFoo, 1);
       expect(calledBar, 1);
diff --git a/packages/initialize/test/init_method_test.html b/packages/initialize/test/init_method_test.html
new file mode 100644
index 0000000..bdb66d6
--- /dev/null
+++ b/packages/initialize/test/init_method_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="init_method_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_custom_filter_test.dart b/packages/initialize/test/initializer_custom_filter_test.dart
index f8f789d..302db1b 100644
--- a/packages/initialize/test/initializer_custom_filter_test.dart
+++ b/packages/initialize/test/initializer_custom_filter_test.dart
@@ -1,17 +1,18 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 library initialize.initializer_custom_filter_test;
 
 import 'dart:async';
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 import 'package:initialize/src/initialize_tracker.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   test('filter option limits which types of annotations will be ran', () {
     var originalSize;
     return runPhase(1).then((_) {
diff --git a/packages/initialize/test/initializer_custom_filter_test.html b/packages/initialize/test/initializer_custom_filter_test.html
new file mode 100644
index 0000000..d629075
--- /dev/null
+++ b/packages/initialize/test/initializer_custom_filter_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_custom_filter_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_cycle_error_test.dart b/packages/initialize/test/initializer_cycle_error_test.dart
index bc5c8a3..365e64f 100644
--- a/packages/initialize/test/initializer_cycle_error_test.dart
+++ b/packages/initialize/test/initializer_cycle_error_test.dart
@@ -1,17 +1,20 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 library initialize.initializer_cycle_error_test;
 
-import 'cycle_a.dart'; // Causes a cycle.
+import 'cycle_a.dart' as cycle_a; // Causes a cycle.
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
+/// Uses [cycle_a].
 main() {
-  useCompactVMConfiguration();
-
   test('super class cycles are not supported', () {
     expect(run, throwsUnsupportedError);
-  });
+  }, skip: 'Should be skipped only in pub-serve mode, blocked on  '
+      'https://github.com/dart-lang/test/issues/388.');
 }
diff --git a/packages/initialize/test/initializer_cycle_error_test.html b/packages/initialize/test/initializer_cycle_error_test.html
new file mode 100644
index 0000000..5738a4a
--- /dev/null
+++ b/packages/initialize/test/initializer_cycle_error_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_cycle_error_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_from_test.dart b/packages/initialize/test/initializer_from_test.dart
index 30587f5..aa7172b 100644
--- a/packages/initialize/test/initializer_from_test.dart
+++ b/packages/initialize/test/initializer_from_test.dart
@@ -1,31 +1,39 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 @initializeTracker
 library initialize.test.initializer_from_test;
 
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:test_package/bar.dart'; // Used for annotations
+import 'package:test/test.dart';
+import 'package:test_package/bar.dart' as bar;
 
+/// Uses [bar]
 main() {
-  useCompactVMConfiguration();
+  test('The `from` option', () async {
+    final expectedNames = <LibraryIdentifier>[];
 
-  test('The `from` option', () {
-    var expectedNames = [];
-    return run(from: Uri.parse('package:test_package/bar.dart')).then((_) {
-      // First just run on the test packages bar.dart file.
-      expectedNames.add(const LibraryIdentifier(
-          #test_package.bar, 'test_package', 'bar.dart'));
-      expect(InitializeTracker.seen, expectedNames);
-    }).then((_) => run()).then((_) {
-      // Now we run on the rest (just this file).
-      expectedNames.add(const LibraryIdentifier(
-          #initialize.test.initializer_from_test, null,
-          'initializer_from_test.dart'));
-      expect(InitializeTracker.seen, expectedNames);
-    });
-  });
+    // First just run on the test packages bar.dart file.
+    await run(from: Uri.parse('package:test_package/bar.dart'));
+    expectedNames.add(
+        const LibraryIdentifier(#test_package.bar, 'test_package', 'bar.dart'));
+    expect(InitializeTracker.seen, expectedNames);
+
+    // Now we run on the rest (just this file).
+    await run();
+    expect(InitializeTracker.seen.length, 2);
+    // Don't know what the path will be, so have to explicitly check fields
+    // and use an [endsWith] matcher for the path.
+    expect(InitializeTracker.seen[1].name,
+        #initialize.test.initializer_from_test);
+    expect(InitializeTracker.seen[1].package, isNull);
+    expect(
+        InitializeTracker.seen[1].path, endsWith('initializer_from_test.dart'));
+  }, skip: 'Should be skipped only in pub-serve mode, blocked on  '
+      'https://github.com/dart-lang/test/issues/388.');
 }
diff --git a/packages/initialize/test/initializer_from_test.html b/packages/initialize/test/initializer_from_test.html
new file mode 100644
index 0000000..0a038f2
--- /dev/null
+++ b/packages/initialize/test/initializer_from_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_from_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_parts_test.dart b/packages/initialize/test/initializer_parts_test.dart
index fc77886..5839b91 100644
--- a/packages/initialize/test/initializer_parts_test.dart
+++ b/packages/initialize/test/initializer_parts_test.dart
@@ -1,22 +1,23 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 @initializeTracker
 library initialize.initializer_parts_test;
 
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 part 'parts/foo.dart';
 part 'parts/bar.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   // Run all initializers.
-  run().then((_) {
+  return run().then((_) {
     test('parts', () {
       var expectedNames = [
         const LibraryIdentifier(#initialize.initializer_parts_test, null,
diff --git a/packages/initialize/test/initializer_parts_test.html b/packages/initialize/test/initializer_parts_test.html
new file mode 100644
index 0000000..58c2695
--- /dev/null
+++ b/packages/initialize/test/initializer_parts_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_parts_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_super_test.dart b/packages/initialize/test/initializer_super_test.dart
index 66e6e76..512ef51 100644
--- a/packages/initialize/test/initializer_super_test.dart
+++ b/packages/initialize/test/initializer_super_test.dart
@@ -1,18 +1,19 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 library initialize.initializer_super_test;
 
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 main() {
-  useCompactVMConfiguration();
-
   // Run all initializers.
-  run().then((_) {
+  return run().then((_) {
     test('annotations are seen in post-order with superclasses first', () {
       var expectedNames = [A, C, B, E, D,];
       expect(InitializeTracker.seen, expectedNames);
diff --git a/packages/initialize/test/initializer_super_test.html b/packages/initialize/test/initializer_super_test.html
new file mode 100644
index 0000000..d944ac2
--- /dev/null
+++ b/packages/initialize/test/initializer_super_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_super_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_test.dart b/packages/initialize/test/initializer_test.dart
index 1488b1d..579e9c9 100644
--- a/packages/initialize/test/initializer_test.dart
+++ b/packages/initialize/test/initializer_test.dart
@@ -1,21 +1,23 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 @initializeTracker
 library initialize.initializer_test;
 
 import 'foo/bar.dart';
 import 'package:initialize/src/initialize_tracker.dart';
 import 'package:initialize/initialize.dart';
-import 'package:test_package/foo.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test_package/foo.dart' as test_foo;
+import 'package:test/test.dart';
 
+/// Uses [test_foo].
 main() {
-  useCompactVMConfiguration();
-
   // Run all initializers.
-  run().then((_) {
+  return run().then((_) {
     test('annotations are seen in post-order with superclasses first', () {
       var expectedNames = [
         const LibraryIdentifier(#initialize.test.foo, null, 'foo.dart'),
diff --git a/packages/initialize/test/initializer_test.html b/packages/initialize/test/initializer_test.html
new file mode 100644
index 0000000..f4b9e01
--- /dev/null
+++ b/packages/initialize/test/initializer_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/initializer_type_filter_test.dart b/packages/initialize/test/initializer_type_filter_test.dart
index b5ebb92..87e0196 100644
--- a/packages/initialize/test/initializer_type_filter_test.dart
+++ b/packages/initialize/test/initializer_type_filter_test.dart
@@ -1,19 +1,20 @@
 // Copyright (c) 2015, 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.
+
+// TODO(jakemac): swap this to @TestOn('pub-serve') once
+// https://github.com/dart-lang/test/issues/388 is completed.
+@TestOn('!js')
 library initialize.initializer_type_filter_test;
 
 import 'package:initialize/initialize.dart';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 // Initializers will mess with this value, and it gets reset to 0 at the
 // start of every test.
 var total;
 
 main() {
-  useCompactVMConfiguration();
-
   setUp(() {
     total = 0;
   });
diff --git a/packages/initialize/test/initializer_type_filter_test.html b/packages/initialize/test/initializer_type_filter_test.html
new file mode 100644
index 0000000..50f358a
--- /dev/null
+++ b/packages/initialize/test/initializer_type_filter_test.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <head>
+    <link rel="x-dart-test" href="initializer_type_filter_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/packages/initialize/test/transformer_test.dart b/packages/initialize/test/transformer_test.dart
index 3b637c7..8342c03 100644
--- a/packages/initialize/test/transformer_test.dart
+++ b/packages/initialize/test/transformer_test.dart
@@ -1,20 +1,18 @@
 // Copyright (c) 2015, 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.
+@TestOn('vm')
 library initialize.transformer_test;
 
 import 'common.dart';
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:dart_style/dart_style.dart';
 import 'package:initialize/transformer.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 var formatter = new DartFormatter();
 
 main() {
-  useCompactVMConfiguration();
-
   group('Html entry points', htmlEntryPointTests);
   group('Dart entry points', dartEntryPointTests);
   group('InitializerPlugins', pluginTests);
diff --git a/packages/initialize/tool/all_tests.sh b/packages/initialize/tool/all_tests.sh
index 99e42d5..312cda2 100755
--- a/packages/initialize/tool/all_tests.sh
+++ b/packages/initialize/tool/all_tests.sh
@@ -8,8 +8,7 @@
 set -e
 
 # Run the un-transformed command-line tests.
-# TODO(jakemac): Add back once http://dartbug.com/22592 is fixed.
-# dart test/deferred_library_test.dart
+dart test/deferred_library_test.dart
 dart test/init_method_test.dart
 dart test/initializer_custom_filter_test.dart
 dart test/initializer_cycle_error_test.dart
diff --git a/packages/intl/.gitignore b/packages/intl/.gitignore
index e979170..3e2dd99 100644
--- a/packages/intl/.gitignore
+++ b/packages/intl/.gitignore
@@ -1,6 +1,7 @@
 # Don’t commit the following directories created by pub.
 .pub
 build/
+.packages
 packages
 
 # Or the files created by dart2js.
diff --git a/packages/intl/.status b/packages/intl/.status
index 10b5bf6..a88dfbc 100644
--- a/packages/intl/.status
+++ b/packages/intl/.status
@@ -49,20 +49,6 @@
 test/date_time_format_file_even_test: Skip # Uses dart:io.
 test/date_time_format_file_odd_test: Skip # Uses dart:io.
 test/find_default_locale_standalone_test: Skip # Uses dart:io.
-test/message_extraction/examples_parsing_test: Skip # Users dart:io
-test/message_extraction/failed_extraction_test: Skip # Users dart:io
-test/message_extraction/message_extraction_test: Skip # Uses dart:io.
-test/message_extraction/message_extraction_no_deferred_test: Skip # Uses dart:io.
-test/message_extraction/really_fail_extraction_test: Skip # Users dart:io
-test/message_extraction/embedded_plural_text_after_test: Skip # Uses dart:io.
-test/message_extraction/embedded_plural_text_before_test: Skip # Uses dart:io.
 build/test/date_time_format_file_even_test: Skip # Uses dart:io.
 build/test/date_time_format_file_odd_test: Skip # Uses dart:io.
 build/test/find_default_locale_standalone_test: Skip # Uses dart:io.
-build/test/message_extraction/examples_parsing_test: Skip # Users dart:io
-build/test/message_extraction/failed_extraction_test: Skip # Users dart:io
-build/test/message_extraction/message_extraction_test: Skip # Uses dart:io.
-build/test/message_extraction/message_extraction_no_deferred_test: Skip # Uses dart:io.
-build/test/message_extraction/really_fail_extraction_test: Skip # Users dart:io
-build/test/message_extraction/embedded_plural_text_after_test: Skip # Uses dart:io.
-build/test/message_extraction/embedded_plural_text_before_test: Skip # Uses dart:io.
diff --git a/packages/intl/CHANGELOG.md b/packages/intl/CHANGELOG.md
index 6266a06..312b6d3 100644
--- a/packages/intl/CHANGELOG.md
+++ b/packages/intl/CHANGELOG.md
@@ -1,3 +1,114 @@
+## 0.15.1
+ * Use the platform.locale API to get the OS platform.
+ * Convert to use package:test
+
+## 0.15.0
+ * Fix compactCurrency to correctly use passed-in symbol.
+ * A tweak to the way we retry on DateTime.asDate to compensate for a VM bug.
+ * Update CLDR version to 30.
+ * Cache the last result of isRtlLanguage
+ * Some strong mode fixes
+ * Allow passing enums to a select.
+ * Remove the cacheBlocker parameter from HttpRequestDataReader
+ * Optimize padding numbers when printing
+ * Remove the out of date example directory
+ * Add a facility to check if messages are being called before locale
+   initialization, which can lead to errors if the results are being cached. See
+   UninitializedLocaleData.throwOnFallback.
+ * Restore dependency on path which was removed when intl_translation was
+   separated.
+ * Improve the error message when date parsing fails validation to show what the
+   parsed date was.
+
+## 0.14.0
+ * MAJOR BREAKING CHANGE! Remove message extraction and code generation into a
+   separate intl_translation package. This means packages with a runtime
+   dependency on intl don't also depend on analyzer, barback, and so forth.
+
+## 0.13.1
+ * Update CLDR data to version 29.
+ * Add a toBeginningOfSentenceCase() method which converts the first character
+   of a string to uppercase. It may become more clever about that for locales
+   with different conventions over time.
+ * Fixed the use of currency-specific decimal places, which weren't being used
+   if the currency was the default for the locale.
+ * Add support for currency in compact number formats.
+ * Added support for "Q" and "QQ" numeric quarter formatting, which fixes "QQQ"
+   and "QQQQ" in the zh_CN locale.
+ * As part of deprecating transformer usage, allow `rewrite_intl_messages.dart`
+   to add names and arguments to messages with parameters. Make the transformer
+   not generate names for zero-argument methods and just use the name+meaning
+   instead.
+ * Move barback from dev dependencies into public (see
+   https://github.com/dart-lang/intl/issues/120 )
+
+## 0.13.0
+ * Add support for compact number formats ("1.2K") and for significant digits in
+   number formats.
+ * Add a NumberFormat.simpleCurrency constructor which will attempt to
+   automatically determine the currency symbol. Very simple implementation but
+   can be expanded to be per-locale.
+ * Fix a problem where, in a message, a literal dollar sign followed by a number
+   was seen as a valid identifier, resulting in invalid code being generated.
+ * Add support for locale-specific plural rules. Note that this changes the
+   interpretation of plurals and so is potentially breaking. For example, in
+   English three will now be treated as "other" rather than as "few".
+ * Add `onMessage` top level variable, which defaults to `print`. Warning and
+   error messages will all now go through this function instead of calling
+   `print` directly.
+ * Move top-level variables in `extract_messages.dart` into a MessageExtraction
+   object. This is a breaking change for code that imports
+   `extract_messages.dart`, which probably only means message format
+   readers/extractors like `extract_to_arb.dart` and `generate_from_arb.dart`.
+ * Cache the message lookup for a locale, reducing unnecessary locale validation
+   and lookup.
+
+## 0.12.7+1
+ * Change the signature for args and examples in Intl.plural/gender/select to
+   match Intl.message, allowing dynamic values.
+ * Parameters to initializeDateFormatting are optional.
+ * Extend DateFormat.parseLoose() to allow arbitrary amounts of whitespace
+   before literal fields (as well as after), and treat all whitespace around
+   literal fields as optional even if the literal field's pattern has leading
+   or trailing whitespace.
+ * Fix DateFormat.parseLoose() returning unexpected values in certain cases
+   where a pattern was missing from the input string.
+ * Fix DateFormat.parseLoose() ignoring the value of numeric standalone months
+   ('LL' pattern).
+ * Remove relative imports on `generate_locale_data_files.dart`
+
+## 0.12.7
+ * Update SDK dependency to 1.12.0, to reflect use of null-aware operators.
+ * Add a transformer to automatically add the "name" and "args" parameters to
+   Intl.message and related calls. This removes a lot of tedious repetition.
+ * Fix typo in README.
+ * Make Intl strong-mode compatible.
+
+## 0.12.6
+  * Update links in README.md to point to current dartdocs.
+  * Update locale data to CLDR 28.
+  * Remove library directive from generated libraries. Conflicted with linter.
+  * Support @@locale in ARB files as well as the older _locale
+  * Print a message when generating from ARB files if we guess the locale
+    from the file name when there's no explicit @@locale or _locale in the file.
+  * Switch all the source to use line comments.
+  * Slight improvement to the error message when parsing dates has an invalid
+    value.
+  * Introduce new NumberFormat.currency constructor which can explicitly take a
+    separate currency name and symbol, as well as the number of decimal digits.
+  * Provide a default number of decimal digits per-currency.
+  * Deprecate NumberFormat.currencyPattern.
+
+## 0.12.5
+  * Parse Eras in DateFormat.
+  * Update pubspec.yaml to allow newer version of fixnum and analyzer.
+  * Improvements to the compiled size of generated messages code with dart2js.
+  * Allow adjacent literal strings to be used for message names/descriptions.
+  * Provide a better error message for some cases of bad parameters
+    to plural/gender/select messages.
+  * Introduce a simple MicroMoney class that can represent currency values
+    scaled by a constant factor.
+
 ## 0.12.4+3
   * update analyzer to '<0.28.0' and fixnum to '<0.11.0'
 
diff --git a/packages/intl/README.md b/packages/intl/README.md
index e1fcfc0..0b38b17 100644
--- a/packages/intl/README.md
+++ b/packages/intl/README.md
@@ -52,11 +52,11 @@
 ```dart
 print(myMessage(dateString, locale: 'ar');
 ```
-	  
+
 or
 
 ```dart
-Intl.defaultLocale = "es"'
+Intl.defaultLocale = "es";
 new DateFormat.jm().format(new DateTime.now());
 ```
 
@@ -96,13 +96,20 @@
 description for translators, the arguments used in the message, and
 examples. The `name` and `args` parameters are required, and must
 match the name (or ClassName_methodName) and arguments list of the
-function respectively.  In the future we
-hope to have these provided automatically.
+function respectively. However, there is a transformer provided that
+will automatically insert those parameters for you. In pubspec.yaml,
+add a section like
 
-This can be run in the program before any translation has been done,
-and will just return the message string. It can also be extracted to a
-file and then be made to return a translated version without modifying
-the original program. See "Extracting Messages" below for more
+      transformers:
+      - intl:
+      $include: some_file.dart
+
+and then you can omit the name and args.
+
+A function with an Intl.message call can be run in the program before any
+translation has been done, and will just return the message string. It can also
+be extracted to a file and then be made to return a translated version without
+modifying the original program. See "Extracting Messages" below for more
 details.
 
 The purpose of wrapping the message in a function is to allow it to
@@ -123,13 +130,13 @@
           name: "greetingMessage",
           args: [name],
           desc: "Greet the user as they first open the application",
-          examples: {'name': "Emily"});
+          examples: const {'name': "Emily"});
       print(greetingMessage('Dan'));
 
 There is one special class of complex expressions allowed in the
 message string, for plurals and genders.
 
-      remainingEmailsMessage(int howMany, String userName) => 
+      remainingEmailsMessage(int howMany, String userName) =>
         Intl.message(
           "${Intl.plural(howMany,
               zero: 'There are no emails left for $userName.',
@@ -138,7 +145,7 @@
         name: "remainingEmailsMessage",
         args: [howMany, userName],
         desc: "How many emails remain after archiving.",
-        examples: {'howMany': 42, 'userName': 'Fred'});
+        examples: const {'howMany': 42, 'userName': 'Fred'});
 
       print(remainingEmailsMessage(1, "Fred"));
 
@@ -146,30 +153,30 @@
 be at the top-level, we can also omit the [Intl.message][Intl.message] call and
 provide its parameters to the [Intl.plural][Intl.plural] call instead.
 
-      remainingEmailsMessage(int howMany, String userName) => 
+      remainingEmailsMessage(int howMany, String userName) =>
         Intl.plural(
           howMany,
           zero: 'There are no emails left for $userName.',
           one: 'There is one email left for $userName.',
-          other: 'There are $howMany emails left for $userName.'),
+          other: 'There are $howMany emails left for $userName.',
           name: "remainingEmailsMessage",
           args: [howMany, userName],
           desc: "How many emails remain after archiving.",
-          examples: {'howMany': 42, 'userName': 'Fred'});
+          examples: const {'howMany': 42, 'userName': 'Fred'});
 
 Similarly, there is an [Intl.gender][Intl.gender] message, and plurals
 and genders can be nested.
 
-      notOnlineMessage(String userName, String userGender) => 
+      notOnlineMessage(String userName, String userGender) =>
         Intl.gender(
           userGender,
           male: '$userName is unavailable because he is not online.',
           female: '$userName is unavailable because she is not online.',
-          other: '$userName is unavailable because they are not online'),
+          other: '$userName is unavailable because they are not online',
           name: "notOnlineMessage",
           args: [userName, userGender],
           desc: "The user is not available to hangout.",
-          examples: {{'userGender': 'male', 'userName': 'Fred'},
+          examples: const {{'userGender': 'male', 'userName': 'Fred'},
               {'userGender': 'female', 'userName' : 'Alice'}});
 
 It's recommended to use complete sentences in the sub-messages to keep
@@ -179,26 +186,29 @@
 
 When your program contains messages that need translation, these must
 be extracted from the program source, sent to human translators, and the
-results need to be incorporated. 
+results need to be incorporated. The code for this is in the
+[Intl_translation][Intl_translation] package.
 
 To extract messages, run the `extract_to_arb.dart` program.
 
-      pub run intl:extract_to_arb --output-dir=target/directory
+      pub run intl_translation:extract_to_arb --output-dir=target/directory
           my_program.dart more_of_my_program.dart
 
 This will produce a file `intl_messages.arb` with the messages from
 all of these programs. an [ARB]
 (https://code.google.com/p/arb/wiki/ApplicationResourceBundleSpecification)
 format file which can be used for input to translation tools like
-[Google Translator Toolkit](https://translate.google.com/toolkit/) 
+[Google Translator Toolkit](https://translate.google.com/toolkit/)
 The resulting translations can be used to generate a set of libraries
 using the `generate_from_arb.dart` program.
 
 This expects to receive a series of files, one per
-locale. 
+locale.
 
-      pub run intl:generate_from_arb --generated_file_prefix=<prefix> 
-          <my_dart_files> <translated_ARB_files>
+```
+pub run intl_translation:generate_from_arb --generated_file_prefix=<prefix>
+    <my_dart_files> <translated_ARB_files>
+```
 
 This will generate Dart libraries, one per locale, which contain the
 translated versions. Your Dart libraries can import the primary file,
@@ -307,16 +317,16 @@
         new BidiFormatter.RTL().wrapWithUnicode('xyz');
         new BidiFormatter.RTL().wrapWithSpan('xyz');
 
-[intl_lib]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl
-[Intl]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl
-[DateFormat]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat
-[NumberFormat]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.NumberFormat
-[withLocale]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.Intl#id_withLocale
-[defaultLocale]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.Intl#id_defaultLocale
-[Intl.message]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.Intl#id_message
-[Intl.plural]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.Intl#id_plural
-[Intl.gender]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.Intl#id_gender
-[DateTime]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.DateTime
-[BidiFormatter]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.BidiFormatter
-[BidiFormatter.RTL]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.BidiFormatter#id_BidiFormatter-RTL
-[BidiFormatter.LTR]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.BidiFormatter#id_BidiFormatter-LTR
+[intl_lib]: https://www.dartdocs.org/documentation/intl/latest/intl/intl-library.html
+[Intl]: https://www.dartdocs.org/documentation/intl/latest
+[DateFormat]: https://www.dartdocs.org/documentation/intl/latest/intl/DateFormat-class.html
+[NumberFormat]: https://www.dartdocs.org/documentation/intl/latest/intl/NumberFormat-class.html
+[withLocale]: https://www.dartdocs.org/documentation/intl/latest/intl/Intl/withLocale.html
+[defaultLocale]: https://www.dartdocs.org/documentation/intl/latest/intl/Intl/defaultLocale.html
+[Intl.message]: https://www.dartdocs.org/documentation/intl/latest/intl/Intl/message.html
+[Intl.plural]: https://www.dartdocs.org/documentation/intl/latest/intl/Intl/plural.html
+[Intl.gender]: https://www.dartdocs.org/documentation/intl/latest/intl/Intl/gender.html
+[DateTime]: https://api.dartlang.org/stable/dart-core/DateTime-class.html
+[BidiFormatter]: https://www.dartdocs.org/documentation/intl/latest/intl/BidiFormatter-class.html
+[BidiFormatter.RTL]: https://www.dartdocs.org/documentation/intl/latest/intl/BidiFormatter/BidiFormatter.RTL.html
+[BidiFormatter.LTR]: https://www.dartdocs.org/documentation/intl/latest/intl/BidiFormatter/BidiFormatter.LTR.html
diff --git a/packages/intl/bin/extract_to_arb.dart b/packages/intl/bin/extract_to_arb.dart
deleted file mode 100644
index a79023b..0000000
--- a/packages/intl/bin/extract_to_arb.dart
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env dart
-// 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 script uses the extract_messages.dart library to find the Intl.message
- * calls in the target dart files and produces ARB format output. See
- * https://code.google.com/p/arb/wiki/ApplicationResourceBundleSpecification
- */
-library extract_to_arb;
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:intl/extract_messages.dart';
-import 'package:path/path.dart' as path;
-import 'package:intl/src/intl_message.dart';
-import 'package:args/args.dart';
-
-main(List<String> args) {
-  var targetDir;
-  var parser = new ArgParser();
-  parser.addFlag("suppress-warnings",
-      defaultsTo: false,
-      callback: (x) => suppressWarnings = x,
-      help: 'Suppress printing of warnings.');
-  parser.addFlag("warnings-are-errors",
-      defaultsTo: false,
-      callback: (x) => warningsAreErrors = x,
-      help: 'Treat all warnings as errors, stop processing ');
-  parser.addFlag("embedded-plurals",
-      defaultsTo: true,
-      callback: (x) => allowEmbeddedPluralsAndGenders = x,
-      help: 'Allow plurals and genders to be embedded as part of a larger '
-      'string, otherwise they must be at the top level.');
-
-  parser.addOption("output-dir",
-      defaultsTo: '.',
-      callback: (value) => targetDir = value,
-      help: 'Specify the output directory.');
-  parser.parse(args);
-  if (args.length == 0) {
-    print('Accepts Dart files and produces intl_messages.json');
-    print('Usage: extract_to_arb [options] [files.dart]');
-    print(parser.usage);
-    exit(0);
-  }
-  var allMessages = {};
-  for (var arg in args.where((x) => x.contains(".dart"))) {
-    var messages = parseFile(new File(arg));
-    messages.forEach((k, v) => allMessages.addAll(toARB(v)));
-  }
-  var file = new File(path.join(targetDir, 'intl_messages.arb'));
-  file.writeAsStringSync(JSON.encode(allMessages));
-  if (hasWarnings && warningsAreErrors) {
-    exit(1);
-  }
-}
-
-/**
- * This is a placeholder for transforming a parameter substitution from
- * the translation file format into a Dart interpolation. In our case we
- * store it to the file in Dart interpolation syntax, so the transformation
- * is trivial.
- */
-String leaveTheInterpolationsInDartForm(MainMessage msg, chunk) {
-  if (chunk is String) return chunk;
-  if (chunk is int) return "\$${msg.arguments[chunk]}";
-  return chunk.toCode();
-}
-
-/**
- * Convert the [MainMessage] to a trivial JSON format.
- */
-Map toARB(MainMessage message) {
-  if (message.messagePieces.isEmpty) return null;
-  var out = {};
-  out[message.name] = icuForm(message);
-  out["@${message.name}"] = arbMetadata(message);
-  return out;
-}
-
-Map arbMetadata(MainMessage message) {
-  var out = {};
-  var desc = message.description;
-  if (desc != null) {
-    out["description"] = desc;
-  }
-  out["type"] = "text";
-  var placeholders = {};
-  for (var arg in message.arguments) {
-    addArgumentFor(message, arg, placeholders);
-  }
-  out["placeholders"] = placeholders;
-  return out;
-}
-
-void addArgumentFor(MainMessage message, String arg, Map result) {
-  var extraInfo = {};
-  if (message.examples != null && message.examples[arg] != null) {
-    extraInfo["example"] = message.examples[arg];
-  }
-  result[arg] = extraInfo;
-}
-
-/**
- * Return a version of the message string with
- * with ICU parameters "{variable}" rather than Dart interpolations "$variable".
- */
-String icuForm(MainMessage message) =>
-    message.expanded(turnInterpolationIntoICUForm);
-
-String turnInterpolationIntoICUForm(Message message, chunk,
-    {bool shouldEscapeICU: false}) {
-  if (chunk is String) {
-    return shouldEscapeICU ? escape(chunk) : chunk;
-  }
-  if (chunk is int && chunk >= 0 && chunk < message.arguments.length) {
-    return "{${message.arguments[chunk]}}";
-  }
-  if (chunk is SubMessage) {
-    return chunk.expanded((message, chunk) =>
-        turnInterpolationIntoICUForm(message, chunk, shouldEscapeICU: true));
-  }
-  if (chunk is Message) {
-    return chunk.expanded((message, chunk) => turnInterpolationIntoICUForm(
-        message, chunk, shouldEscapeICU: shouldEscapeICU));
-  }
-  throw new FormatException("Illegal interpolation: $chunk");
-}
-
-String escape(String s) {
-  return s.replaceAll("'", "''").replaceAll("{", "'{'").replaceAll("}", "'}'");
-}
diff --git a/packages/intl/bin/generate_from_arb.dart b/packages/intl/bin/generate_from_arb.dart
deleted file mode 100644
index 5abf723..0000000
--- a/packages/intl/bin/generate_from_arb.dart
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env dart
-// 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.
-
-/**
- * A main program that takes as input a source Dart file and a number
- * of ARB files representing translations of messages from the corresponding
- * Dart file. See extract_to_arb.dart and make_hardcoded_translation.dart.
- *
- * This produces a series of files named
- * "messages_<locale>.dart" containing messages for a particular locale
- * and a main import file named "messages_all.dart" which has imports all of
- * them and provides an initializeMessages function.
- */
-library generate_from_arb;
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:intl/extract_messages.dart';
-import 'package:intl/src/icu_parser.dart';
-import 'package:intl/src/intl_message.dart';
-import 'package:intl/generate_localized.dart';
-import 'package:path/path.dart' as path;
-import 'package:args/args.dart';
-
-/**
- * Keeps track of all the messages we have processed so far, keyed by message
- * name.
- */
-Map<String, List<MainMessage>> messages;
-
-main(List<String> args) {
-  var targetDir;
-  var parser = new ArgParser();
-  parser.addFlag("suppress-warnings",
-      defaultsTo: false,
-      callback: (x) => suppressWarnings = x,
-      help: 'Suppress printing of warnings.');
-  parser.addOption("output-dir",
-      defaultsTo: '.',
-      callback: (x) => targetDir = x,
-      help: 'Specify the output directory.');
-  parser.addOption("generated-file-prefix",
-      defaultsTo: '',
-      callback: (x) => generatedFilePrefix = x,
-      help: 'Specify a prefix to be used for the generated file names.');
-  parser.addFlag("use-deferred-loading",
-      defaultsTo: true,
-      callback: (x) => useDeferredLoading = x,
-      help: 'Generate message code that must be loaded with deferred loading. '
-      'Otherwise, all messages are eagerly loaded.');
-  parser.parse(args);
-  var dartFiles = args.where((x) => x.endsWith("dart")).toList();
-  var jsonFiles = args.where((x) => x.endsWith(".arb")).toList();
-  if (dartFiles.length == 0 || jsonFiles.length == 0) {
-    print('Usage: generate_from_arb [options]'
-        ' file1.dart file2.dart ...'
-        ' translation1_<languageTag>.arb translation2.arb ...');
-    print(parser.usage);
-    exit(0);
-  }
-
-  // We're re-parsing the original files to find the corresponding messages,
-  // so if there are warnings extracting the messages, suppress them.
-  suppressWarnings = true;
-  var allMessages = dartFiles.map((each) => parseFile(new File(each)));
-
-  messages = new Map();
-  for (var eachMap in allMessages) {
-    eachMap.forEach(
-        (key, value) => messages.putIfAbsent(key, () => []).add(value));
-  }
-  for (var arg in jsonFiles) {
-    var file = new File(arg);
-    generateLocaleFile(file, targetDir);
-  }
-
-  var mainImportFile =
-      new File(path.join(targetDir, '${generatedFilePrefix}messages_all.dart'));
-  mainImportFile.writeAsStringSync(generateMainImportFile());
-}
-
-/**
- * Create the file of generated code for a particular locale. We read the ARB
- * data and create [BasicTranslatedMessage] instances from everything,
- * excluding only the special _locale attribute that we use to indicate the
- * locale. If that attribute is missing, we try to get the locale from the last
- * section of the file name.
- */
-void generateLocaleFile(File file, String targetDir) {
-  var src = file.readAsStringSync();
-  var data = JSON.decode(src);
-  data.forEach((k, v) => data[k] = recreateIntlObjects(k, v));
-  var locale = data["_locale"];
-  if (locale != null) {
-    locale = locale.translated.string;
-  } else {
-    // Get the locale from the end of the file name. This assumes that the file
-    // name doesn't contain any underscores except to begin the language tag
-    // and to separate language from country. Otherwise we can't tell if
-    // my_file_fr.arb is locale "fr" or "file_fr".
-    var name = path.basenameWithoutExtension(file.path);
-    locale = name.split("_").skip(1).join("_");
-  }
-  allLocales.add(locale);
-
-  var translations = [];
-  data.forEach((key, value) {
-    if (value != null) {
-      translations.add(value);
-    }
-  });
-  generateIndividualMessageFile(locale, translations, targetDir);
-}
-
-/**
- * Regenerate the original IntlMessage objects from the given [data]. For
- * things that are messages, we expect [id] not to start with "@" and
- * [data] to be a String. For metadata we expect [id] to start with "@"
- * and [data] to be a Map or null. For metadata we return null.
- */
-BasicTranslatedMessage recreateIntlObjects(String id, data) {
-  if (id.startsWith("@")) return null;
-  if (data == null) return null;
-  var parsed = pluralAndGenderParser.parse(data).value;
-  if (parsed is LiteralString && parsed.string.isEmpty) {
-    parsed = plainParser.parse(data).value;
-    ;
-  }
-  return new BasicTranslatedMessage(id, parsed);
-}
-
-/**
- * A TranslatedMessage that just uses the name as the id and knows how to look
- * up its original messages in our [messages].
- */
-class BasicTranslatedMessage extends TranslatedMessage {
-  BasicTranslatedMessage(String name, translated) : super(name, translated);
-
-  List<MainMessage> get originalMessages => (super.originalMessages == null)
-      ? _findOriginals()
-      : super.originalMessages;
-
-  // We know that our [id] is the name of the message, which is used as the
-  //key in [messages].
-  List<MainMessage> _findOriginals() => originalMessages = messages[id];
-}
-
-final pluralAndGenderParser = new IcuParser().message;
-final plainParser = new IcuParser().nonIcuMessage;
diff --git a/packages/intl/example/basic/basic_example.dart b/packages/intl/example/basic/basic_example.dart
deleted file mode 100644
index 25f9cb0..0000000
--- a/packages/intl/example/basic/basic_example.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This provides a basic example of internationalization usage. It uses the
- * local variant of all the facilities, meaning that libraries with the
- * data for all the locales are directly imported by the program. Once lazy
- * loading is available, we expect this to be the preferred mode, with
- * the initialization code actually loading the specific libraries needed.
- *
- * This defines messages for an English locale directly in the program and
- * has separate libraries that define German and Thai messages that say more or
- * less the same thing, and prints the message with the date and time in it
- * formatted appropriately for the locale.
- */
-
-library intl_basic_example;
-
-import 'dart:async';
-import 'package:intl/date_symbol_data_local.dart';
-import 'package:intl/intl.dart';
-import 'messages_all.dart';
-
-/**
- * In order to use this both as an example and as a test case, we pass in
- * the function for what we're going to do with the output. For a simple
- * example we just pass in [print] and for tests we pass in a function that
- * adds it a list to be verified.
- */
-Function doThisWithTheOutput;
-
-void setup(Function program, Function output) {
-  // Before we use any messages or use date formatting for a locale we must
-  // call their initializtion messages, which are asynchronous, since they
-  // might be reading information from files or over the web. Since we are
-  // running here in local mode they will all complete immediately.
-  doThisWithTheOutput = output;
-  var germanDatesFuture = initializeDateFormatting('de_DE', null);
-  var thaiDatesFuture = initializeDateFormatting('th_TH', null);
-  var germanMessagesFuture = initializeMessages('de_DE');
-  var thaiMessagesFuture = initializeMessages('th_TH');
-  Future
-      .wait([
-    germanDatesFuture,
-    thaiDatesFuture,
-    germanMessagesFuture,
-    thaiMessagesFuture
-  ])
-      .then(program);
-}
-
-// Because the initialization messages return futures we split out the main
-// part of our program into a separate function that runs once all the
-// futures have completed. We are passed the collection of futures, but we
-// don't need to use them, so ignore the parameter.
-runProgram(List<Future> _) {
-  var aDate = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
-  var de = new Intl('de_DE');
-  var th = new Intl('th_TH');
-  // This defines a message that can be internationalized. It is written as a
-  // function that returns the result of an Intl.message call. The primary
-  // parameter is a string that may use interpolation.
-  runAt(time, date) =>
-      Intl.message('Ran at $time on $date', name: 'runAt', args: [time, date]);
-  printForLocale(aDate, new Intl(), runAt);
-  printForLocale(aDate, de, runAt);
-  printForLocale(aDate, th, runAt);
-  // Example making use of the return value from withLocale;
-  var returnValue = Intl.withLocale(th.locale, () => runAt('now', 'today'));
-  doThisWithTheOutput(returnValue);
-}
-
-printForLocale(aDate, intl, operation) {
-  var hmsFormat = intl.date().add_Hms();
-  var dayFormat = intl.date().add_yMMMMEEEEd();
-  var time = hmsFormat.format(aDate);
-  var day = dayFormat.format(aDate);
-  Intl.withLocale(intl.locale, () => doThisWithTheOutput(operation(time, day)));
-}
diff --git a/packages/intl/example/basic/basic_example_runner.dart b/packages/intl/example/basic/basic_example_runner.dart
deleted file mode 100644
index 805d4f7..0000000
--- a/packages/intl/example/basic/basic_example_runner.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This is just a shell that runs the code in basic_example.dart, leaving
- * that as a library that can also be run by tests.
- */
-
-import 'basic_example.dart';
-
-main() {
-  setup(runProgram, print);
-}
diff --git a/packages/intl/example/basic/messages_all.dart b/packages/intl/example/basic/messages_all.dart
deleted file mode 100644
index 88942b3..0000000
--- a/packages/intl/example/basic/messages_all.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This imports all of the different message libraries and provides an
- * [initializeMessages] function that sets up the lookup for a particular
- * library.
- */
-library messages_all;
-
-import 'dart:async';
-import 'package:intl/message_lookup_by_library.dart';
-import 'package:intl/src/intl_helpers.dart';
-import 'messages_th_th.dart' as th_TH;
-import 'messages_de.dart' as de;
-import 'package:intl/intl.dart';
-
-// TODO(alanknight): Use lazy loading of the requested library.
-MessageLookupByLibrary _findExact(localeName) {
-  switch (localeName) {
-    case 'th_TH':
-      return th_TH.messages;
-    case 'de':
-      return de.messages;
-    default:
-      return null;
-  }
-}
-
-initializeMessages(localeName) {
-  initializeInternalMessageLookup(() => new CompositeMessageLookup());
-  messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
-  return new Future.value();
-}
-
-MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
-  var actualLocale = Intl.verifiedLocale(locale, (x) => _findExact(x) != null,
-      onFailure: (_) => null);
-  if (actualLocale == null) return null;
-  return _findExact(actualLocale);
-}
diff --git a/packages/intl/example/basic/messages_de.dart b/packages/intl/example/basic/messages_de.dart
deleted file mode 100644
index dea00ac..0000000
--- a/packages/intl/example/basic/messages_de.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This is a library that provides messages for a German locale. All the
- * messages from the main program should be duplicated here with the same
- * function name.
- */
-library messages_de;
-
-import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-class MessageLookup extends MessageLookupByLibrary {
-  get localeName => 'de';
-
-  final messages = {
-    "runAt": (time, day) => Intl.message("Ausgedruckt am $time am $day.")
-  };
-}
diff --git a/packages/intl/example/basic/messages_th_th.dart b/packages/intl/example/basic/messages_th_th.dart
deleted file mode 100644
index c5f3187..0000000
--- a/packages/intl/example/basic/messages_th_th.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This is a library that provides messages for a German locale. All the
- * messages from the main program should be duplicated here with the same
- * function name.
- */
-library messages_th_TH;
-
-import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-class MessageLookup extends MessageLookupByLibrary {
-  get localeName => 'th_TH';
-
-  final messages = {
-    "runAt": (time, day) => Intl.message('วิ่ง $time on $day.')
-  };
-}
diff --git a/packages/intl/lib/date_symbol_data_file.dart b/packages/intl/lib/date_symbol_data_file.dart
index c1b5ea4..dbb1dc0 100644
--- a/packages/intl/lib/date_symbol_data_file.dart
+++ b/packages/intl/lib/date_symbol_data_file.dart
@@ -2,10 +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.
 
-/**
- * This file should be imported, along with date_format.dart in order to read
- * locale data from files in the file system.
- */
+/// This file should be imported, along with date_format.dart in order to read
+/// locale data from files in the file system.
 
 library date_symbol_data_file;
 
@@ -21,12 +19,10 @@
 
 export 'src/data/dates/locale_list.dart';
 
-/**
- * This should be called for at least one [locale] before any date formatting
- * methods are called. It sets up the lookup for date symbols using [path].
- * The [path] parameter should end with a directory separator appropriate
- * for the platform.
- */
+/// This should be called for at least one [locale] before any date formatting
+/// methods are called. It sets up the lookup for date symbols using [path].
+/// The [path] parameter should end with a directory separator appropriate
+/// for the platform.
 Future initializeDateFormatting(String locale, String filePath) {
   var reader = new FileDataReader(path.join(filePath, 'symbols'));
   initializeDateSymbols(() => new LazyLocaleData(
@@ -35,11 +31,11 @@
   initializeDatePatterns(() =>
       new LazyLocaleData(reader2, (x) => x, availableLocalesForDateFormatting));
   return initializeIndividualLocaleDateFormatting((symbols, patterns) {
-    return Future
-        .wait([symbols.initLocale(locale), patterns.initLocale(locale)]);
+    return Future.wait(
+        <Future>[symbols.initLocale(locale), patterns.initLocale(locale)]);
   });
 }
 
-/** Defines how new date symbol entries are created. */
+/// Defines how new date symbol entries are created.
 DateSymbols _createDateSymbol(Map map) =>
     new DateSymbols.deserializeFromMap(map);
diff --git a/packages/intl/lib/date_symbol_data_http_request.dart b/packages/intl/lib/date_symbol_data_http_request.dart
index 5e206f6..fd4f625 100644
--- a/packages/intl/lib/date_symbol_data_http_request.dart
+++ b/packages/intl/lib/date_symbol_data_http_request.dart
@@ -2,10 +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.
 
-/**
- * This file should be imported, along with date_format.dart in order to read
- * locale data via http requests to a web server..
- */
+/// This file should be imported, along with date_format.dart in order to read
+/// locale data via http requests to a web server..
 library date_symbol_data_http_request;
 
 import 'dart:async';
@@ -19,12 +17,10 @@
 
 export 'src/data/dates/locale_list.dart';
 
-/**
- * This should be called for at least one [locale] before any date formatting
- * methods are called. It sets up the lookup for date symbols using [url].
- * The [url] parameter should end with a "/". For example,
- *   "http://localhost:8000/dates/"
- */
+/// This should be called for at least one [locale] before any date formatting
+/// methods are called. It sets up the lookup for date symbols using [url].
+/// The [url] parameter should end with a "/". For example,
+///   "http://localhost:8000/dates/"
 Future initializeDateFormatting(String locale, String url) {
   var reader = new HttpRequestDataReader('${url}symbols/');
   initializeDateSymbols(() => new LazyLocaleData(
@@ -35,11 +31,13 @@
   var actualLocale = Intl.verifiedLocale(
       locale, (l) => availableLocalesForDateFormatting.contains(l));
   return initializeIndividualLocaleDateFormatting((symbols, patterns) {
-    return Future.wait(
-        [symbols.initLocale(actualLocale), patterns.initLocale(actualLocale)]);
+    return Future.wait(<Future>[
+      symbols.initLocale(actualLocale),
+      patterns.initLocale(actualLocale)
+    ]);
   });
 }
 
-/** Defines how new date symbol entries are created. */
+/// Defines how new date symbol entries are created.
 DateSymbols _createDateSymbol(Map map) =>
     new DateSymbols.deserializeFromMap(map);
diff --git a/packages/intl/lib/date_symbol_data_local.dart b/packages/intl/lib/date_symbol_data_local.dart
index 6e3a1e7..6a69c06 100644
--- a/packages/intl/lib/date_symbol_data_local.dart
+++ b/packages/intl/lib/date_symbol_data_local.dart
@@ -4,19 +4,17 @@
 // is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Date/time formatting symbols for all locales.
- *
- * DO NOT EDIT. This file is autogenerated by script.  See
- * 'http://go/generate_datetime_constants.py' using the --for_dart
- * flag.
- * File generated from CLDR ver. 25
- *
- * Before checkin, this file could have been manually edited. This is
- * to incorporate changes before we could correct CLDR. All manual
- * modification must be documented in this section, and should be
- * removed after those changes land to CLDR.
- */
+/// Date/time formatting symbols for all locales.
+///
+/// DO NOT EDIT. This file is autogenerated by script.  See
+/// 'http://go/generate_datetime_constants.py' using the --for_dart
+/// flag.
+/// File generated from CLDR ver. 30.0.2
+///
+/// Before checkin, this file could have been manually edited. This is
+/// to incorporate changes before we could correct CLDR. All manual
+/// modification must be documented in this section, and should be
+/// removed after those changes land to CLDR.
 library date_symbol_data_local;
 
 import "date_symbols.dart";
@@ -24,14133 +22,16370 @@
 import "date_time_patterns.dart";
 import "dart:async";
 
-/**
- * This should be called for at least one [locale] before any date
- * formatting methods are called. It sets up the lookup for date
- * symbols. Both the [locale] and [ignored] parameter are ignored, as
- * the data for all locales is directly available.
- */
-Future initializeDateFormatting(String locale, String ignored) {
+/// This should be called for at least one [locale] before any date
+/// formatting methods are called. It sets up the lookup for date
+/// symbols. Both the [locale] and [ignored] parameter are ignored, as
+/// the data for all locales is directly available.
+Future initializeDateFormatting([String locale, String ignored]) {
   initializeDateSymbols(dateTimeSymbolMap);
   initializeDatePatterns(dateTimePatternMap);
   return new Future.value(null);
 }
 
-/**
- * Returns a Map from locale names to the DateSymbols instance for
- * that locale. Internal use only. Call initializeDateFormatting
- * instead.
- */
+/// Returns a Map from locale names to the DateSymbols instance for
+/// that locale. Internal use only. Call initializeDateFormatting
+/// instead.
 Map dateTimeSymbolMap() => {
-  /**
-   * Date/time formatting symbols for locale en_ISO.
-   */
-  "en_ISO": new DateSymbols(
-      NAME: 'en_ISO',
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, y MMMM dd',
-    'y MMMM d',
-    'y MMM d',
-    'yyyy-MM-dd'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss v', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      AVAILABLEFORMATS: const {'Md': 'M/d', 'MMMMd': 'MMMM d', 'MMMd': 'MMM d'},
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale en_ISO.
+      "en_ISO": new DateSymbols(
+          NAME: 'en_ISO',
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, y MMMM dd',
+            'y MMMM d',
+            'y MMM d',
+            'yyyy-MM-dd'
+          ],
+          TIMEFORMATS: const ['HH:mm:ss v', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
 
-  /**
-   * Date/time formatting symbols for locale af.
-   */
-  "af": new DateSymbols(
-      NAME: "af",
-      ERAS: const ['v.C.', 'n.C.'],
-      ERANAMES: const ['voor Christus', 'na Christus'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januarie',
-    'Februarie',
-    'Maart',
-    'April',
-    'Mei',
-    'Junie',
-    'Julie',
-    'Augustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januarie',
-    'Februarie',
-    'Maart',
-    'April',
-    'Mei',
-    'Junie',
-    'Julie',
-    'Augustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      WEEKDAYS: const [
-    'Sondag',
-    'Maandag',
-    'Dinsdag',
-    'Woensdag',
-    'Donderdag',
-    'Vrydag',
-    'Saterdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sondag',
-    'Maandag',
-    'Dinsdag',
-    'Woensdag',
-    'Donderdag',
-    'Vrydag',
-    'Saterdag'
-  ],
-      SHORTWEEKDAYS: const ['So', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa'],
-      STANDALONESHORTWEEKDAYS: const ['So', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa'],
-      NARROWWEEKDAYS: const ['S', 'M', 'D', 'W', 'D', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'W', 'D', 'V', 'S'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const [
-    '1ste kwartaal',
-    '2de kwartaal',
-    '3de kwartaal',
-    '4de kwartaal'
-  ],
-      AMPMS: const ['vm.', 'nm.'],
-      DATEFORMATS: const ['EEEE dd MMMM y', 'dd MMMM y', 'dd MMM y', 'y-MM-dd'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale am.
-   */
-  "am": new DateSymbols(
-      NAME: "am",
-      ERAS: const ['ዓ/ዓ', 'ዓ/ም'],
-      ERANAMES: const ['ዓመተ ዓለም', 'ዓመተ ምሕረት'],
-      NARROWMONTHS: const [
-    'ጃ',
-    'ፌ',
-    'ማ',
-    'ኤ',
-    'ሜ',
-    'ጁ',
-    'ጁ',
-    'ኦ',
-    'ሴ',
-    'ኦ',
-    'ኖ',
-    'ዲ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ጃ',
-    'ፌ',
-    'ማ',
-    'ኤ',
-    'ሜ',
-    'ጁ',
-    'ጁ',
-    'ኦ',
-    'ሴ',
-    'ኦ',
-    'ኖ',
-    'ዲ'
-  ],
-      MONTHS: const [
-    'ጃንዩወሪ',
-    'ፌብሩወሪ',
-    'ማርች',
-    'ኤፕሪል',
-    'ሜይ',
-    'ጁን',
-    'ጁላይ',
-    'ኦገስት',
-    'ሴፕቴምበር',
-    'ኦክተውበር',
-    'ኖቬምበር',
-    'ዲሴምበር'
-  ],
-      STANDALONEMONTHS: const [
-    'ጃንዩወሪ',
-    'ፌብሩወሪ',
-    'ማርች',
-    'ኤፕሪል',
-    'ሜይ',
-    'ጁን',
-    'ጁላይ',
-    'ኦገስት',
-    'ሴፕቴምበር',
-    'ኦክቶበር',
-    'ኖቬምበር',
-    'ዲሴምበር'
-  ],
-      SHORTMONTHS: const [
-    'ጃንዩ',
-    'ፌብሩ',
-    'ማርች',
-    'ኤፕሪ',
-    'ሜይ',
-    'ጁን',
-    'ጁላይ',
-    'ኦገስ',
-    'ሴፕቴ',
-    'ኦክተ',
-    'ኖቬም',
-    'ዲሴም'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ጃንዩ',
-    'ፌብሩ',
-    'ማርች',
-    'ኤፕሪ',
-    'ሜይ',
-    'ጁን',
-    'ጁላይ',
-    'ኦገስ',
-    'ሴፕቴ',
-    'ኦክቶ',
-    'ኖቬም',
-    'ዲሴም'
-  ],
-      WEEKDAYS: const ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],
-      STANDALONEWEEKDAYS: const [
-    'እሑድ',
-    'ሰኞ',
-    'ማክሰኞ',
-    'ረቡዕ',
-    'ሐሙስ',
-    'ዓርብ',
-    'ቅዳሜ'
-  ],
-      SHORTWEEKDAYS: const ['እሑድ', 'ሰኞ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],
-      STANDALONESHORTWEEKDAYS: const [
-    'እሑድ',
-    'ሰኞ',
-    'ማክሰ',
-    'ረቡዕ',
-    'ሐሙስ',
-    'ዓርብ',
-    'ቅዳሜ'
-  ],
-      NARROWWEEKDAYS: const ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],
-      STANDALONENARROWWEEKDAYS: const ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],
-      SHORTQUARTERS: const ['ሩብ1', 'ሩብ2', 'ሩብ3', 'ሩብ4'],
-      QUARTERS: const ['1ኛው ሩብ', 'ሁለተኛው ሩብ', '3ኛው ሩብ', '4ኛው ሩብ'],
-      AMPMS: const ['ጥዋት', 'ከሰዓት'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ar.
-   */
-  "ar": new DateSymbols(
-      NAME: "ar",
-      ERAS: const ['ق.م', 'م'],
-      ERANAMES: const ['قبل الميلاد', 'ميلادي'],
-      NARROWMONTHS: const [
-    'ي',
-    'ف',
-    'م',
-    'أ',
-    'و',
-    'ن',
-    'ل',
-    'غ',
-    'س',
-    'ك',
-    'ب',
-    'د'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ي',
-    'ف',
-    'م',
-    'أ',
-    'و',
-    'ن',
-    'ل',
-    'غ',
-    'س',
-    'ك',
-    'ب',
-    'د'
-  ],
-      MONTHS: const [
-    'يناير',
-    'فبراير',
-    'مارس',
-    'أبريل',
-    'مايو',
-    'يونيو',
-    'يوليو',
-    'أغسطس',
-    'سبتمبر',
-    'أكتوبر',
-    'نوفمبر',
-    'ديسمبر'
-  ],
-      STANDALONEMONTHS: const [
-    'يناير',
-    'فبراير',
-    'مارس',
-    'أبريل',
-    'مايو',
-    'يونيو',
-    'يوليو',
-    'أغسطس',
-    'سبتمبر',
-    'أكتوبر',
-    'نوفمبر',
-    'ديسمبر'
-  ],
-      SHORTMONTHS: const [
-    'يناير',
-    'فبراير',
-    'مارس',
-    'أبريل',
-    'مايو',
-    'يونيو',
-    'يوليو',
-    'أغسطس',
-    'سبتمبر',
-    'أكتوبر',
-    'نوفمبر',
-    'ديسمبر'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'يناير',
-    'فبراير',
-    'مارس',
-    'أبريل',
-    'مايو',
-    'يونيو',
-    'يوليو',
-    'أغسطس',
-    'سبتمبر',
-    'أكتوبر',
-    'نوفمبر',
-    'ديسمبر'
-  ],
-      WEEKDAYS: const [
-    'الأحد',
-    'الاثنين',
-    'الثلاثاء',
-    'الأربعاء',
-    'الخميس',
-    'الجمعة',
-    'السبت'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'الأحد',
-    'الاثنين',
-    'الثلاثاء',
-    'الأربعاء',
-    'الخميس',
-    'الجمعة',
-    'السبت'
-  ],
-      SHORTWEEKDAYS: const [
-    'الأحد',
-    'الاثنين',
-    'الثلاثاء',
-    'الأربعاء',
-    'الخميس',
-    'الجمعة',
-    'السبت'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'الأحد',
-    'الاثنين',
-    'الثلاثاء',
-    'الأربعاء',
-    'الخميس',
-    'الجمعة',
-    'السبت'
-  ],
-      NARROWWEEKDAYS: const ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
-      STANDALONENARROWWEEKDAYS: const ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
-      SHORTQUARTERS: const [
-    'الربع الأول',
-    'الربع الثاني',
-    'الربع الثالث',
-    'الربع الرابع'
-  ],
-      QUARTERS: const [
-    'الربع الأول',
-    'الربع الثاني',
-    'الربع الثالث',
-    'الربع الرابع'
-  ],
-      AMPMS: const ['ص', 'م'],
-      DATEFORMATS: const [
-    'EEEE، d MMMM، y',
-    'd MMMM، y',
-    'dd‏/MM‏/y',
-    'd‏/M‏/y'
-  ],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 5,
-      WEEKENDRANGE: const [4, 5],
-      FIRSTWEEKCUTOFFDAY: 4),
-  /**
-   * Date/time formatting symbols for locale az.
-   */
-  "az": new DateSymbols(
-      NAME: "az",
-      ERAS: const ['e.ə.', 'b.e.'],
-      ERANAMES: const ['eramızdan əvvəl', 'bizim eramızın'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'yanvar',
-    'fevral',
-    'mart',
-    'aprel',
-    'may',
-    'iyun',
-    'iyul',
-    'avqust',
-    'sentyabr',
-    'oktyabr',
-    'noyabr',
-    'dekabr'
-  ],
-      STANDALONEMONTHS: const [
-    'Yanvar',
-    'Fevral',
-    'Mart',
-    'Aprel',
-    'May',
-    'İyun',
-    'İyul',
-    'Avqust',
-    'Sentyabr',
-    'Oktyabr',
-    'Noyabr',
-    'Dekabr'
-  ],
-      SHORTMONTHS: const [
-    'yan',
-    'fev',
-    'mar',
-    'apr',
-    'may',
-    'iyn',
-    'iyl',
-    'avq',
-    'sen',
-    'okt',
-    'noy',
-    'dek'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'yan',
-    'fev',
-    'mar',
-    'apr',
-    'may',
-    'iyn',
-    'iyl',
-    'avq',
-    'sen',
-    'okt',
-    'noy',
-    'dek'
-  ],
-      WEEKDAYS: const [
-    'bazar',
-    'bazar ertəsi',
-    'çərşənbə axşamı',
-    'çərşənbə',
-    'cümə axşamı',
-    'cümə',
-    'şənbə'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'bazar',
-    'bazar ertəsi',
-    'çərşənbə axşamı',
-    'çərşənbə',
-    'cümə axşamı',
-    'cümə',
-    'şənbə'
-  ],
-      SHORTWEEKDAYS: const ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C', 'Ş.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'B.',
-    'B.E.',
-    'Ç.A.',
-    'Ç.',
-    'C.A.',
-    'C',
-    'Ş.'
-  ],
-      NARROWWEEKDAYS: const ['7', '1', '2', '3', '4', '5', '6'],
-      STANDALONENARROWWEEKDAYS: const ['7', '1', '2', '3', '4', '5', '6'],
-      SHORTQUARTERS: const ['1-ci kv.', '2-ci kv.', '3-cü kv.', '4-cü kv.'],
-      QUARTERS: const [
-    '1-ci kvartal',
-    '2-ci kvartal',
-    '3-cü kvartal',
-    '4-cü kvartal'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['d MMMM y, EEEE', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale bg.
-   */
-  "bg": new DateSymbols(
-      NAME: "bg",
-      ERAS: const ['пр.Хр.', 'сл.Хр.'],
-      ERANAMES: const ['пр.Хр.', 'сл.Хр.'],
-      NARROWMONTHS: const [
-    'я',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ю',
-    'ю',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'я',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ю',
-    'ю',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      MONTHS: const [
-    'януари',
-    'февруари',
-    'март',
-    'април',
-    'май',
-    'юни',
-    'юли',
-    'август',
-    'септември',
-    'октомври',
-    'ноември',
-    'декември'
-  ],
-      STANDALONEMONTHS: const [
-    'януари',
-    'февруари',
-    'март',
-    'април',
-    'май',
-    'юни',
-    'юли',
-    'август',
-    'септември',
-    'октомври',
-    'ноември',
-    'декември'
-  ],
-      SHORTMONTHS: const [
-    'ян.',
-    'февр.',
-    'март',
-    'апр.',
-    'май',
-    'юни',
-    'юли',
-    'авг.',
-    'септ.',
-    'окт.',
-    'ноем.',
-    'дек.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ян.',
-    'февр.',
-    'март',
-    'апр.',
-    'май',
-    'юни',
-    'юли',
-    'авг.',
-    'септ.',
-    'окт.',
-    'ноем.',
-    'дек.'
-  ],
-      WEEKDAYS: const [
-    'неделя',
-    'понеделник',
-    'вторник',
-    'сряда',
-    'четвъртък',
-    'петък',
-    'събота'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'неделя',
-    'понеделник',
-    'вторник',
-    'сряда',
-    'четвъртък',
-    'петък',
-    'събота'
-  ],
-      SHORTWEEKDAYS: const ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
-      STANDALONESHORTWEEKDAYS: const ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
-      NARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
-      STANDALONENARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
-      SHORTQUARTERS: const ['1 трим.', '2 трим.', '3 трим.', '4 трим.'],
-      QUARTERS: const [
-    '1-во тримесечие',
-    '2-ро тримесечие',
-    '3-то тримесечие',
-    '4-то тримесечие'
-  ],
-      AMPMS: const ['пр.об.', 'сл.об.'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM y \'г\'.',
-    'd MMMM y \'г\'.',
-    'd.MM.y \'г\'.',
-    'd.MM.yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale bn.
-   */
-  "bn": new DateSymbols(
-      NAME: "bn",
-      ERAS: const ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],
-      ERANAMES: const ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],
-      NARROWMONTHS: const [
-    'জা',
-    'ফে',
-    'মা',
-    'এ',
-    'মে',
-    'জুন',
-    'জু',
-    'আ',
-    'সে',
-    'অ',
-    'ন',
-    'ডি'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'জা',
-    'ফে',
-    'মা',
-    'এ',
-    'মে',
-    'জুন',
-    'জু',
-    'আ',
-    'সে',
-    'অ',
-    'ন',
-    'ডি'
-  ],
-      MONTHS: const [
-    'জানুয়ারী',
-    'ফেব্রুয়ারী',
-    'মার্চ',
-    'এপ্রিল',
-    'মে',
-    'জুন',
-    'জুলাই',
-    'আগস্ট',
-    'সেপ্টেম্বর',
-    'অক্টোবর',
-    'নভেম্বর',
-    'ডিসেম্বর'
-  ],
-      STANDALONEMONTHS: const [
-    'জানুয়ারী',
-    'ফেব্রুয়ারী',
-    'মার্চ',
-    'এপ্রিল',
-    'মে',
-    'জুন',
-    'জুলাই',
-    'আগস্ট',
-    'সেপ্টেম্বর',
-    'অক্টোবর',
-    'নভেম্বর',
-    'ডিসেম্বর'
-  ],
-      SHORTMONTHS: const [
-    'জানুয়ারী',
-    'ফেব্রুয়ারী',
-    'মার্চ',
-    'এপ্রিল',
-    'মে',
-    'জুন',
-    'জুলাই',
-    'আগস্ট',
-    'সেপ্টেম্বর',
-    'অক্টোবর',
-    'নভেম্বর',
-    'ডিসেম্বর'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'জানুয়ারী',
-    'ফেব্রুয়ারী',
-    'মার্চ',
-    'এপ্রিল',
-    'মে',
-    'জুন',
-    'জুলাই',
-    'আগস্ট',
-    'সেপ্টেম্বর',
-    'অক্টোবর',
-    'নভেম্বর',
-    'ডিসেম্বর'
-  ],
-      WEEKDAYS: const [
-    'রবিবার',
-    'সোমবার',
-    'মঙ্গলবার',
-    'বুধবার',
-    'বৃহষ্পতিবার',
-    'শুক্রবার',
-    'শনিবার'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'রবিবার',
-    'সোমবার',
-    'মঙ্গলবার',
-    'বুধবার',
-    'বৃহষ্পতিবার',
-    'শুক্রবার',
-    'শনিবার'
-  ],
-      SHORTWEEKDAYS: const [
-    'রবি',
-    'সোম',
-    'মঙ্গল',
-    'বুধ',
-    'বৃহস্পতি',
-    'শুক্র',
-    'শনি'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'রবি',
-    'সোম',
-    'মঙ্গল',
-    'বুধ',
-    'বৃহস্পতি',
-    'শুক্র',
-    'শনি'
-  ],
-      NARROWWEEKDAYS: const ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],
-      STANDALONENARROWWEEKDAYS: const ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],
-      SHORTQUARTERS: const [
-    'চতুর্থাংশ ১',
-    'চতুর্থাংশ ২',
-    'চতুর্থাংশ ৩',
-    'চতুর্থাংশ ৪'
-  ],
-      QUARTERS: const [
-    'প্রথম চতুর্থাংশ',
-    'দ্বিতীয় চতুর্থাংশ',
-    'তৃতীয় চতুর্থাংশ',
-    'চতুর্থ চতুর্থাংশ'
-  ],
-      AMPMS: const ['am', 'pm'],
-      DATEFORMATS: const ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 4,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale br.
-   */
-  "br": new DateSymbols(
-      NAME: "br",
-      ERAS: const ['BCE', 'CE'],
-      ERANAMES: const ['BCE', 'CE'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'Genver',
-    'Cʼhwevrer',
-    'Meurzh',
-    'Ebrel',
-    'Mae',
-    'Mezheven',
-    'Gouere',
-    'Eost',
-    'Gwengolo',
-    'Here',
-    'Du',
-    'Kerzu'
-  ],
-      STANDALONEMONTHS: const [
-    'Genver',
-    'Cʼhwevrer',
-    'Meurzh',
-    'Ebrel',
-    'Mae',
-    'Mezheven',
-    'Gouere',
-    'Eost',
-    'Gwengolo',
-    'Here',
-    'Du',
-    'Kerzu'
-  ],
-      SHORTMONTHS: const [
-    'Gen',
-    'Cʼhwe',
-    'Meur',
-    'Ebr',
-    'Mae',
-    'Mezh',
-    'Goue',
-    'Eost',
-    'Gwen',
-    'Here',
-    'Du',
-    'Ker'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Gen',
-    'Cʼhwe',
-    'Meur',
-    'Ebr',
-    'Mae',
-    'Mezh',
-    'Goue',
-    'Eost',
-    'Gwen',
-    'Here',
-    'Du',
-    'Ker'
-  ],
-      WEEKDAYS: const [
-    'Sul',
-    'Lun',
-    'Meurzh',
-    'Mercʼher',
-    'Yaou',
-    'Gwener',
-    'Sadorn'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sul',
-    'Lun',
-    'Meurzh',
-    'Mercʼher',
-    'Yaou',
-    'Gwener',
-    'Sadorn'
-  ],
-      SHORTWEEKDAYS: const [
-    'sul',
-    'lun',
-    'meu.',
-    'mer.',
-    'yaou',
-    'gwe.',
-    'sad.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'sul',
-    'lun',
-    'meu.',
-    'mer.',
-    'yaou',
-    'gwe.',
-    'sad.'
-  ],
-      NARROWWEEKDAYS: const ['su', 'lu', 'mz', 'mc', 'ya', 'gw', 'sa'],
-      STANDALONENARROWWEEKDAYS: const [
-    'su',
-    'lu',
-    'mz',
-    'mc',
-    'ya',
-    'gw',
-    'sa'
-  ],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ca.
-   */
-  "ca": new DateSymbols(
-      NAME: "ca",
-      ERAS: const ['aC', 'dC'],
-      ERANAMES: const ['abans de Crist', 'després de Crist'],
-      NARROWMONTHS: const [
-    'GN',
-    'FB',
-    'MÇ',
-    'AB',
-    'MG',
-    'JN',
-    'JL',
-    'AG',
-    'ST',
-    'OC',
-    'NV',
-    'DS'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'GN',
-    'FB',
-    'MÇ',
-    'AB',
-    'MG',
-    'JN',
-    'JL',
-    'AG',
-    'ST',
-    'OC',
-    'NV',
-    'DS'
-  ],
-      MONTHS: const [
-    'gener',
-    'febrer',
-    'març',
-    'abril',
-    'maig',
-    'juny',
-    'juliol',
-    'agost',
-    'setembre',
-    'octubre',
-    'novembre',
-    'desembre'
-  ],
-      STANDALONEMONTHS: const [
-    'gener',
-    'febrer',
-    'març',
-    'abril',
-    'maig',
-    'juny',
-    'juliol',
-    'agost',
-    'setembre',
-    'octubre',
-    'novembre',
-    'desembre'
-  ],
-      SHORTMONTHS: const [
-    'gen.',
-    'feb.',
-    'març',
-    'abr.',
-    'maig',
-    'juny',
-    'jul.',
-    'ag.',
-    'set.',
-    'oct.',
-    'nov.',
-    'des.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'gen.',
-    'feb.',
-    'març',
-    'abr.',
-    'maig',
-    'juny',
-    'jul.',
-    'ag.',
-    'set.',
-    'oct.',
-    'nov.',
-    'des.'
-  ],
-      WEEKDAYS: const [
-    'diumenge',
-    'dilluns',
-    'dimarts',
-    'dimecres',
-    'dijous',
-    'divendres',
-    'dissabte'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'diumenge',
-    'dilluns',
-    'dimarts',
-    'dimecres',
-    'dijous',
-    'divendres',
-    'dissabte'
-  ],
-      SHORTWEEKDAYS: const ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'dg.',
-    'dl.',
-    'dt.',
-    'dc.',
-    'dj.',
-    'dv.',
-    'ds.'
-  ],
-      NARROWWEEKDAYS: const ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],
-      STANDALONENARROWWEEKDAYS: const [
-    'dg',
-    'dl',
-    'dt',
-    'dc',
-    'dj',
-    'dv',
-    'ds'
-  ],
-      SHORTQUARTERS: const ['1T', '2T', '3T', '4T'],
-      QUARTERS: const [
-    '1r trimestre',
-    '2n trimestre',
-    '3r trimestre',
-    '4t trimestre'
-  ],
-      AMPMS: const ['a. m.', 'p. m.'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM \'de\' y',
-    'd MMMM \'de\' y',
-    'dd/MM/y',
-    'd/M/yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale chr.
-   */
-  "chr": new DateSymbols(
-      NAME: "chr",
-      ERAS: const ['ᎤᏓᎷᎸ', 'ᎤᎶᏐᏅ'],
-      ERANAMES: const ['Ꮟ ᏥᏌ ᎾᏕᎲᏍᎬᎾ', 'ᎠᎩᏃᎮᎵᏓᏍᏗᏱ ᎠᏕᏘᏱᏍᎬ ᏱᎰᏩ ᏧᏓᏂᎸᎢᏍᏗ'],
-      NARROWMONTHS: const [
-    'Ꭴ',
-    'Ꭷ',
-    'Ꭰ',
-    'Ꭷ',
-    'Ꭰ',
-    'Ꮥ',
-    'Ꭻ',
-    'Ꭶ',
-    'Ꮪ',
-    'Ꮪ',
-    'Ꮕ',
-    'Ꭵ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Ꭴ',
-    'Ꭷ',
-    'Ꭰ',
-    'Ꭷ',
-    'Ꭰ',
-    'Ꮥ',
-    'Ꭻ',
-    'Ꭶ',
-    'Ꮪ',
-    'Ꮪ',
-    'Ꮕ',
-    'Ꭵ'
-  ],
-      MONTHS: const [
-    'ᎤᏃᎸᏔᏅ',
-    'ᎧᎦᎵ',
-    'ᎠᏅᏱ',
-    'ᎧᏬᏂ',
-    'ᎠᏂᏍᎬᏘ',
-    'ᏕᎭᎷᏱ',
-    'ᎫᏰᏉᏂ',
-    'ᎦᎶᏂ',
-    'ᏚᎵᏍᏗ',
-    'ᏚᏂᏅᏗ',
-    'ᏅᏓᏕᏆ',
-    'ᎥᏍᎩᏱ'
-  ],
-      STANDALONEMONTHS: const [
-    'ᎤᏃᎸᏔᏅ',
-    'ᎧᎦᎵ',
-    'ᎠᏅᏱ',
-    'ᎧᏬᏂ',
-    'ᎠᏂᏍᎬᏘ',
-    'ᏕᎭᎷᏱ',
-    'ᎫᏰᏉᏂ',
-    'ᎦᎶᏂ',
-    'ᏚᎵᏍᏗ',
-    'ᏚᏂᏅᏗ',
-    'ᏅᏓᏕᏆ',
-    'ᎥᏍᎩᏱ'
-  ],
-      SHORTMONTHS: const [
-    'ᎤᏃ',
-    'ᎧᎦ',
-    'ᎠᏅ',
-    'ᎧᏬ',
-    'ᎠᏂ',
-    'ᏕᎭ',
-    'ᎫᏰ',
-    'ᎦᎶ',
-    'ᏚᎵ',
-    'ᏚᏂ',
-    'ᏅᏓ',
-    'ᎥᏍ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ᎤᏃ',
-    'ᎧᎦ',
-    'ᎠᏅ',
-    'ᎧᏬ',
-    'ᎠᏂ',
-    'ᏕᎭ',
-    'ᎫᏰ',
-    'ᎦᎶ',
-    'ᏚᎵ',
-    'ᏚᏂ',
-    'ᏅᏓ',
-    'ᎥᏍ'
-  ],
-      WEEKDAYS: const [
-    'ᎤᎾᏙᏓᏆᏍᎬ',
-    'ᎤᎾᏙᏓᏉᏅᎯ',
-    'ᏔᎵᏁᎢᎦ',
-    'ᏦᎢᏁᎢᎦ',
-    'ᏅᎩᏁᎢᎦ',
-    'ᏧᎾᎩᎶᏍᏗ',
-    'ᎤᎾᏙᏓᏈᏕᎾ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ᎤᎾᏙᏓᏆᏍᎬ',
-    'ᎤᎾᏙᏓᏉᏅᎯ',
-    'ᏔᎵᏁᎢᎦ',
-    'ᏦᎢᏁᎢᎦ',
-    'ᏅᎩᏁᎢᎦ',
-    'ᏧᎾᎩᎶᏍᏗ',
-    'ᎤᎾᏙᏓᏈᏕᎾ'
-  ],
-      SHORTWEEKDAYS: const ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'],
-      STANDALONESHORTWEEKDAYS: const [
-    'ᏆᏍᎬ',
-    'ᏉᏅᎯ',
-    'ᏔᎵᏁ',
-    'ᏦᎢᏁ',
-    'ᏅᎩᏁ',
-    'ᏧᎾᎩ',
-    'ᏈᏕᎾ'
-  ],
-      NARROWWEEKDAYS: const ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],
-      STANDALONENARROWWEEKDAYS: const ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      AMPMS: const ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ'],
-      DATEFORMATS: const ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale cs.
-   */
-  "cs": new DateSymbols(
-      NAME: "cs",
-      ERAS: const ['př. n. l.', 'n. l.'],
-      ERANAMES: const ['př. n. l.', 'n. l.'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'l',
-    'ú',
-    'b',
-    'd',
-    'k',
-    'č',
-    'č',
-    's',
-    'z',
-    'ř',
-    'l',
-    'p'
-  ],
-      MONTHS: const [
-    'ledna',
-    'února',
-    'března',
-    'dubna',
-    'května',
-    'června',
-    'července',
-    'srpna',
-    'září',
-    'října',
-    'listopadu',
-    'prosince'
-  ],
-      STANDALONEMONTHS: const [
-    'leden',
-    'únor',
-    'březen',
-    'duben',
-    'květen',
-    'červen',
-    'červenec',
-    'srpen',
-    'září',
-    'říjen',
-    'listopad',
-    'prosinec'
-  ],
-      SHORTMONTHS: const [
-    'led',
-    'úno',
-    'bře',
-    'dub',
-    'kvě',
-    'čvn',
-    'čvc',
-    'srp',
-    'zář',
-    'říj',
-    'lis',
-    'pro'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'led',
-    'úno',
-    'bře',
-    'dub',
-    'kvě',
-    'čvn',
-    'čvc',
-    'srp',
-    'zář',
-    'říj',
-    'lis',
-    'pro'
-  ],
-      WEEKDAYS: const [
-    'neděle',
-    'pondělí',
-    'úterý',
-    'středa',
-    'čtvrtek',
-    'pátek',
-    'sobota'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'neděle',
-    'pondělí',
-    'úterý',
-    'středa',
-    'čtvrtek',
-    'pátek',
-    'sobota'
-  ],
-      SHORTWEEKDAYS: const ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-      STANDALONESHORTWEEKDAYS: const ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-      NARROWWEEKDAYS: const ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1. čtvrtletí',
-    '2. čtvrtletí',
-    '3. čtvrtletí',
-    '4. čtvrtletí'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d. MMMM y', 'd. MMMM y', 'd. M. y', 'dd.MM.yy'],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale cy.
-   */
-  "cy": new DateSymbols(
-      NAME: "cy",
-      ERAS: const ['CC', 'OC'],
-      ERANAMES: const ['Cyn Crist', 'Oed Crist'],
-      NARROWMONTHS: const [
-    'I',
-    'Ch',
-    'M',
-    'E',
-    'M',
-    'M',
-    'G',
-    'A',
-    'M',
-    'H',
-    'T',
-    'Rh'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'I',
-    'Ch',
-    'M',
-    'E',
-    'M',
-    'M',
-    'G',
-    'A',
-    'M',
-    'H',
-    'T',
-    'Rh'
-  ],
-      MONTHS: const [
-    'Ionawr',
-    'Chwefror',
-    'Mawrth',
-    'Ebrill',
-    'Mai',
-    'Mehefin',
-    'Gorffennaf',
-    'Awst',
-    'Medi',
-    'Hydref',
-    'Tachwedd',
-    'Rhagfyr'
-  ],
-      STANDALONEMONTHS: const [
-    'Ionawr',
-    'Chwefror',
-    'Mawrth',
-    'Ebrill',
-    'Mai',
-    'Mehefin',
-    'Gorffennaf',
-    'Awst',
-    'Medi',
-    'Hydref',
-    'Tachwedd',
-    'Rhagfyr'
-  ],
-      SHORTMONTHS: const [
-    'Ion',
-    'Chwef',
-    'Mawrth',
-    'Ebrill',
-    'Mai',
-    'Meh',
-    'Gorff',
-    'Awst',
-    'Medi',
-    'Hyd',
-    'Tach',
-    'Rhag'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ion',
-    'Chw',
-    'Maw',
-    'Ebr',
-    'Mai',
-    'Meh',
-    'Gor',
-    'Awst',
-    'Medi',
-    'Hyd',
-    'Tach',
-    'Rhag'
-  ],
-      WEEKDAYS: const [
-    'Dydd Sul',
-    'Dydd Llun',
-    'Dydd Mawrth',
-    'Dydd Mercher',
-    'Dydd Iau',
-    'Dydd Gwener',
-    'Dydd Sadwrn'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Dydd Sul',
-    'Dydd Llun',
-    'Dydd Mawrth',
-    'Dydd Mercher',
-    'Dydd Iau',
-    'Dydd Gwener',
-    'Dydd Sadwrn'
-  ],
-      SHORTWEEKDAYS: const ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwen', 'Sad'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sul',
-    'Llun',
-    'Maw',
-    'Mer',
-    'Iau',
-    'Gwe',
-    'Sad'
-  ],
-      NARROWWEEKDAYS: const ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],
-      SHORTQUARTERS: const ['Ch1', 'Ch2', 'Ch3', 'Ch4'],
-      QUARTERS: const [
-    'Chwarter 1af',
-    '2il chwarter',
-    '3ydd chwarter',
-    '4ydd chwarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'am\' {0}',
-    '{1} \'am\' {0}',
-    '{1} {0}',
-    '{1} {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale da.
-   */
-  "da": new DateSymbols(
-      NAME: "da",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['f.Kr.', 'e.Kr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januar',
-    'februar',
-    'marts',
-    'april',
-    'maj',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      STANDALONEMONTHS: const [
-    'januar',
-    'februar',
-    'marts',
-    'april',
-    'maj',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'maj',
-    'jun.',
-    'jul.',
-    'aug.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'maj',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      WEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      SHORTWEEKDAYS: const [
-    'søn.',
-    'man.',
-    'tir.',
-    'ons.',
-    'tor.',
-    'fre.',
-    'lør.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'søn',
-    'man',
-    'tir',
-    'ons',
-    'tor',
-    'fre',
-    'lør'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE \'den\' d. MMMM y',
-    'd. MMM y',
-    'dd/MM/y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'kl.\' {0}',
-    '{1} \'kl.\' {0}',
-    '{1} {0}',
-    '{1} {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale de.
-   */
-  "de": new DateSymbols(
-      NAME: "de",
-      ERAS: const ['v. Chr.', 'n. Chr.'],
-      ERANAMES: const ['v. Chr.', 'n. Chr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      SHORTMONTHS: const [
-    'Jan.',
-    'Feb.',
-    'März',
-    'Apr.',
-    'Mai',
-    'Juni',
-    'Juli',
-    'Aug.',
-    'Sep.',
-    'Okt.',
-    'Nov.',
-    'Dez.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mär',
-    'Apr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dez'
-  ],
-      WEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      SHORTWEEKDAYS: const ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
-      STANDALONESHORTWEEKDAYS: const ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
-      NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],
-      AMPMS: const ['vorm.', 'nachm.'],
-      DATEFORMATS: const [
-    'EEEE, d. MMMM y',
-    'd. MMMM y',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale de_AT.
-   */
-  "de_AT": new DateSymbols(
-      NAME: "de_AT",
-      ERAS: const ['v. Chr.', 'n. Chr.'],
-      ERANAMES: const ['v. Chr.', 'n. Chr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Jänner',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      STANDALONEMONTHS: const [
-    'Jänner',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      SHORTMONTHS: const [
-    'Jän.',
-    'Feb.',
-    'März',
-    'Apr.',
-    'Mai',
-    'Juni',
-    'Juli',
-    'Aug.',
-    'Sep.',
-    'Okt.',
-    'Nov.',
-    'Dez.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jän',
-    'Feb',
-    'Mär',
-    'Apr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dez'
-  ],
-      WEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      SHORTWEEKDAYS: const ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
-      STANDALONESHORTWEEKDAYS: const ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
-      NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],
-      AMPMS: const ['vorm.', 'nachm.'],
-      DATEFORMATS: const [
-    'EEEE, dd. MMMM y',
-    'dd. MMMM y',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale de_CH.
-   */
-  /**
-   * Date/time formatting symbols for locale de_CH.
-   */
-  "de_CH": new DateSymbols(
-      NAME: "de_CH",
-      ERAS: const ['v. Chr.', 'n. Chr.'],
-      ERANAMES: const ['v. Chr.', 'n. Chr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'August',
-    'September',
-    'Oktober',
-    'November',
-    'Dezember'
-  ],
-      SHORTMONTHS: const [
-    'Jan.',
-    'Feb.',
-    'März',
-    'Apr.',
-    'Mai',
-    'Juni',
-    'Juli',
-    'Aug.',
-    'Sep.',
-    'Okt.',
-    'Nov.',
-    'Dez.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mär',
-    'Apr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dez'
-  ],
-      WEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sonntag',
-    'Montag',
-    'Dienstag',
-    'Mittwoch',
-    'Donnerstag',
-    'Freitag',
-    'Samstag'
-  ],
-      SHORTWEEKDAYS: const ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
-      STANDALONESHORTWEEKDAYS: const ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
-      NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],
-      AMPMS: const ['vorm.', 'nachm.'],
-      DATEFORMATS: const [
-    'EEEE, d. MMMM y',
-    'd. MMMM y',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale el.
-   */
-  "el": new DateSymbols(
-      NAME: "el",
-      ERAS: const ['π.Χ.', 'μ.Χ.'],
-      ERANAMES: const ['π.Χ.', 'μ.Χ.'],
-      NARROWMONTHS: const [
-    'Ι',
-    'Φ',
-    'Μ',
-    'Α',
-    'Μ',
-    'Ι',
-    'Ι',
-    'Α',
-    'Σ',
-    'Ο',
-    'Ν',
-    'Δ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Ι',
-    'Φ',
-    'Μ',
-    'Α',
-    'Μ',
-    'Ι',
-    'Ι',
-    'Α',
-    'Σ',
-    'Ο',
-    'Ν',
-    'Δ'
-  ],
-      MONTHS: const [
-    'Ιανουαρίου',
-    'Φεβρουαρίου',
-    'Μαρτίου',
-    'Απριλίου',
-    'Μαΐου',
-    'Ιουνίου',
-    'Ιουλίου',
-    'Αυγούστου',
-    'Σεπτεμβρίου',
-    'Οκτωβρίου',
-    'Νοεμβρίου',
-    'Δεκεμβρίου'
-  ],
-      STANDALONEMONTHS: const [
-    'Ιανουάριος',
-    'Φεβρουάριος',
-    'Μάρτιος',
-    'Απρίλιος',
-    'Μάιος',
-    'Ιούνιος',
-    'Ιούλιος',
-    'Αύγουστος',
-    'Σεπτέμβριος',
-    'Οκτώβριος',
-    'Νοέμβριος',
-    'Δεκέμβριος'
-  ],
-      SHORTMONTHS: const [
-    'Ιαν',
-    'Φεβ',
-    'Μαρ',
-    'Απρ',
-    'Μαΐ',
-    'Ιουν',
-    'Ιουλ',
-    'Αυγ',
-    'Σεπ',
-    'Οκτ',
-    'Νοε',
-    'Δεκ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ιαν',
-    'Φεβ',
-    'Μάρ',
-    'Απρ',
-    'Μάι',
-    'Ιούν',
-    'Ιούλ',
-    'Αύγ',
-    'Σεπ',
-    'Οκτ',
-    'Νοέ',
-    'Δεκ'
-  ],
-      WEEKDAYS: const [
-    'Κυριακή',
-    'Δευτέρα',
-    'Τρίτη',
-    'Τετάρτη',
-    'Πέμπτη',
-    'Παρασκευή',
-    'Σάββατο'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Κυριακή',
-    'Δευτέρα',
-    'Τρίτη',
-    'Τετάρτη',
-    'Πέμπτη',
-    'Παρασκευή',
-    'Σάββατο'
-  ],
-      SHORTWEEKDAYS: const ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Κυρ',
-    'Δευ',
-    'Τρί',
-    'Τετ',
-    'Πέμ',
-    'Παρ',
-    'Σάβ'
-  ],
-      NARROWWEEKDAYS: const ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],
-      STANDALONENARROWWEEKDAYS: const ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],
-      SHORTQUARTERS: const ['Τ1', 'Τ2', 'Τ3', 'Τ4'],
-      QUARTERS: const ['1ο τρίμηνο', '2ο τρίμηνο', '3ο τρίμηνο', '4ο τρίμηνο'],
-      AMPMS: const ['π.μ.', 'μ.μ.'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} - {0}',
-    '{1} - {0}',
-    '{1} - {0}',
-    '{1} - {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale en.
-   */
-  "en": new DateSymbols(
-      NAME: "en",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale en_AU.
-   */
-  "en_AU": new DateSymbols(
-      NAME: "en_AU",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/y'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale en_GB.
-   */
-  "en_GB": new DateSymbols(
-      NAME: "en_GB",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['am', 'pm'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale en_IE.
-   */
-  "en_IE": new DateSymbols(
-      NAME: "en_IE",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 2),
-  /**
-   * Date/time formatting symbols for locale en_IN.
-   */
-  "en_IN": new DateSymbols(
-      NAME: "en_IN",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale en_SG.
-   */
-  "en_SG": new DateSymbols(
-      NAME: "en_SG",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale en_US.
-   */
-  /**
-   * Date/time formatting symbols for locale en_US.
-   */
-  "en_US": new DateSymbols(
-      NAME: "en_US",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale en_ZA.
-   */
-  "en_ZA": new DateSymbols(
-      NAME: "en_ZA",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['Before Christ', 'Anno Domini'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      STANDALONEMONTHS: const [
-    'January',
-    'February',
-    'March',
-    'April',
-    'May',
-    'June',
-    'July',
-    'August',
-    'September',
-    'October',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'May',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Oct',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunday',
-    'Monday',
-    'Tuesday',
-    'Wednesday',
-    'Thursday',
-    'Friday',
-    'Saturday'
-  ],
-      SHORTWEEKDAYS: const ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sun',
-    'Mon',
-    'Tue',
-    'Wed',
-    'Thu',
-    'Fri',
-    'Sat'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1st quarter',
-    '2nd quarter',
-    '3rd quarter',
-    '4th quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE dd MMMM y', 'dd MMMM y', 'dd MMM y', 'y/MM/dd'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'at\' {0}',
-    '{1} \'at\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale es.
-   */
-  "es": new DateSymbols(
-      NAME: "es",
-      ERAS: const ['a. C.', 'd. C.'],
-      ERANAMES: const ['antes de Cristo', 'anno Dómini'],
-      NARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'enero',
-    'febrero',
-    'marzo',
-    'abril',
-    'mayo',
-    'junio',
-    'julio',
-    'agosto',
-    'septiembre',
-    'octubre',
-    'noviembre',
-    'diciembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Enero',
-    'Febrero',
-    'Marzo',
-    'Abril',
-    'Mayo',
-    'Junio',
-    'Julio',
-    'Agosto',
-    'Septiembre',
-    'Octubre',
-    'Noviembre',
-    'Diciembre'
-  ],
-      SHORTMONTHS: const [
-    'ene.',
-    'feb.',
-    'mar.',
-    'abr.',
-    'may.',
-    'jun.',
-    'jul.',
-    'ago.',
-    'sept.',
-    'oct.',
-    'nov.',
-    'dic.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ene.',
-    'Feb.',
-    'Mar.',
-    'Abr.',
-    'May.',
-    'Jun.',
-    'Jul.',
-    'Ago.',
-    'Sept.',
-    'Oct.',
-    'Nov.',
-    'Dic.'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'lunes',
-    'martes',
-    'miércoles',
-    'jueves',
-    'viernes',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Domingo',
-    'Lunes',
-    'Martes',
-    'Miércoles',
-    'Jueves',
-    'Viernes',
-    'Sábado'
-  ],
-      SHORTWEEKDAYS: const [
-    'dom.',
-    'lun.',
-    'mar.',
-    'mié.',
-    'jue.',
-    'vie.',
-    'sáb.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'Dom.',
-    'Lun.',
-    'Mar.',
-    'Mié.',
-    'Jue.',
-    'Vie.',
-    'Sáb.'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1.er trimestre',
-    '2.º trimestre',
-    '3.er trimestre',
-    '4.º trimestre'
-  ],
-      AMPMS: const ['a. m.', 'p. m.'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'd/M/y',
-    'd/M/yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale es_419.
-   */
-  /**
-   * Date/time formatting symbols for locale es_419.
-   */
-  "es_419": new DateSymbols(
-      NAME: "es_419",
-      ERAS: const ['a. C.', 'd. C.'],
-      ERANAMES: const ['antes de Cristo', 'anno Dómini'],
-      NARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'enero',
-    'febrero',
-    'marzo',
-    'abril',
-    'mayo',
-    'junio',
-    'julio',
-    'agosto',
-    'septiembre',
-    'octubre',
-    'noviembre',
-    'diciembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Enero',
-    'Febrero',
-    'Marzo',
-    'Abril',
-    'Mayo',
-    'Junio',
-    'Julio',
-    'Agosto',
-    'Septiembre',
-    'Octubre',
-    'Noviembre',
-    'Diciembre'
-  ],
-      SHORTMONTHS: const [
-    'ene.',
-    'feb.',
-    'mar.',
-    'abr.',
-    'may.',
-    'jun.',
-    'jul.',
-    'ago.',
-    'sept.',
-    'oct.',
-    'nov.',
-    'dic.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ene.',
-    'Feb.',
-    'Mar.',
-    'Abr.',
-    'May.',
-    'Jun.',
-    'Jul.',
-    'Ago.',
-    'Sept.',
-    'Oct.',
-    'Nov.',
-    'Dic.'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'lunes',
-    'martes',
-    'miércoles',
-    'jueves',
-    'viernes',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Domingo',
-    'Lunes',
-    'Martes',
-    'Miércoles',
-    'Jueves',
-    'Viernes',
-    'Sábado'
-  ],
-      SHORTWEEKDAYS: const [
-    'dom.',
-    'lun.',
-    'mar.',
-    'mié.',
-    'jue.',
-    'vie.',
-    'sáb.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'Dom.',
-    'Lun.',
-    'Mar.',
-    'Mié.',
-    'Jue.',
-    'Vie.',
-    'Sáb.'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1.er trimestre',
-    '2.º trimestre',
-    '3.er trimestre',
-    '4.º trimestre'
-  ],
-      AMPMS: const ['a. m.', 'p. m.'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'd/M/y',
-    'd/M/yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale es_ES.
-   */
-  /**
-   * Date/time formatting symbols for locale es_ES.
-   */
-  "es_ES": new DateSymbols(
-      NAME: "es_ES",
-      ERAS: const ['a. C.', 'd. C.'],
-      ERANAMES: const ['antes de Cristo', 'anno Dómini'],
-      NARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'E',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'enero',
-    'febrero',
-    'marzo',
-    'abril',
-    'mayo',
-    'junio',
-    'julio',
-    'agosto',
-    'septiembre',
-    'octubre',
-    'noviembre',
-    'diciembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Enero',
-    'Febrero',
-    'Marzo',
-    'Abril',
-    'Mayo',
-    'Junio',
-    'Julio',
-    'Agosto',
-    'Septiembre',
-    'Octubre',
-    'Noviembre',
-    'Diciembre'
-  ],
-      SHORTMONTHS: const [
-    'ene.',
-    'feb.',
-    'mar.',
-    'abr.',
-    'may.',
-    'jun.',
-    'jul.',
-    'ago.',
-    'sept.',
-    'oct.',
-    'nov.',
-    'dic.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ene.',
-    'Feb.',
-    'Mar.',
-    'Abr.',
-    'May.',
-    'Jun.',
-    'Jul.',
-    'Ago.',
-    'Sept.',
-    'Oct.',
-    'Nov.',
-    'Dic.'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'lunes',
-    'martes',
-    'miércoles',
-    'jueves',
-    'viernes',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Domingo',
-    'Lunes',
-    'Martes',
-    'Miércoles',
-    'Jueves',
-    'Viernes',
-    'Sábado'
-  ],
-      SHORTWEEKDAYS: const [
-    'dom.',
-    'lun.',
-    'mar.',
-    'mié.',
-    'jue.',
-    'vie.',
-    'sáb.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'Dom.',
-    'Lun.',
-    'Mar.',
-    'Mié.',
-    'Jue.',
-    'Vie.',
-    'Sáb.'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1.er trimestre',
-    '2.º trimestre',
-    '3.er trimestre',
-    '4.º trimestre'
-  ],
-      AMPMS: const ['a. m.', 'p. m.'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'd/M/y',
-    'd/M/yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale et.
-   */
-  "et": new DateSymbols(
-      NAME: "et",
-      ERAS: const ['e.m.a.', 'm.a.j.'],
-      ERANAMES: const ['enne meie aega', 'meie aja järgi'],
-      NARROWMONTHS: const [
-    'J',
-    'V',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'V',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'jaanuar',
-    'veebruar',
-    'märts',
-    'aprill',
-    'mai',
-    'juuni',
-    'juuli',
-    'august',
-    'september',
-    'oktoober',
-    'november',
-    'detsember'
-  ],
-      STANDALONEMONTHS: const [
-    'jaanuar',
-    'veebruar',
-    'märts',
-    'aprill',
-    'mai',
-    'juuni',
-    'juuli',
-    'august',
-    'september',
-    'oktoober',
-    'november',
-    'detsember'
-  ],
-      SHORTMONTHS: const [
-    'jaan',
-    'veebr',
-    'märts',
-    'apr',
-    'mai',
-    'juuni',
-    'juuli',
-    'aug',
-    'sept',
-    'okt',
-    'nov',
-    'dets'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jaan',
-    'veebr',
-    'märts',
-    'apr',
-    'mai',
-    'juuni',
-    'juuli',
-    'aug',
-    'sept',
-    'okt',
-    'nov',
-    'dets'
-  ],
-      WEEKDAYS: const [
-    'pühapäev',
-    'esmaspäev',
-    'teisipäev',
-    'kolmapäev',
-    'neljapäev',
-    'reede',
-    'laupäev'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'pühapäev',
-    'esmaspäev',
-    'teisipäev',
-    'kolmapäev',
-    'neljapäev',
-    'reede',
-    'laupäev'
-  ],
-      SHORTWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
-      STANDALONESHORTWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
-      NARROWWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d. MMMM y',
-    'd. MMMM y',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['H:mm.ss zzzz', 'H:mm.ss z', 'H:mm.ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale eu.
-   */
-  "eu": new DateSymbols(
-      NAME: "eu",
-      ERAS: const ['K.a.', 'K.o.'],
-      ERANAMES: const ['K.a.', 'K.o.'],
-      NARROWMONTHS: const [
-    'U',
-    'O',
-    'M',
-    'A',
-    'M',
-    'E',
-    'U',
-    'A',
-    'I',
-    'U',
-    'A',
-    'A'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'U',
-    'O',
-    'M',
-    'A',
-    'M',
-    'E',
-    'U',
-    'A',
-    'I',
-    'U',
-    'A',
-    'A'
-  ],
-      MONTHS: const [
-    'urtarrilak',
-    'otsailak',
-    'martxoak',
-    'apirilak',
-    'maiatzak',
-    'ekainak',
-    'uztailak',
-    'abuztuak',
-    'irailak',
-    'urriak',
-    'azaroak',
-    'abenduak'
-  ],
-      STANDALONEMONTHS: const [
-    'urtarrila',
-    'otsaila',
-    'martxoa',
-    'apirila',
-    'maiatza',
-    'ekaina',
-    'uztaila',
-    'abuztua',
-    'iraila',
-    'urria',
-    'azaroa',
-    'abendua'
-  ],
-      SHORTMONTHS: const [
-    'urt.',
-    'ots.',
-    'mar.',
-    'api.',
-    'mai.',
-    'eka.',
-    'uzt.',
-    'abu.',
-    'ira.',
-    'urr.',
-    'aza.',
-    'abe.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'urt.',
-    'ots.',
-    'mar.',
-    'api.',
-    'mai.',
-    'eka.',
-    'uzt.',
-    'abu.',
-    'ira.',
-    'urr.',
-    'aza.',
-    'abe.'
-  ],
-      WEEKDAYS: const [
-    'igandea',
-    'astelehena',
-    'asteartea',
-    'asteazkena',
-    'osteguna',
-    'ostirala',
-    'larunbata'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'igandea',
-    'astelehena',
-    'asteartea',
-    'asteazkena',
-    'osteguna',
-    'ostirala',
-    'larunbata'
-  ],
-      SHORTWEEKDAYS: const ['ig.', 'al.', 'ar.', 'az.', 'og.', 'or.', 'lr.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'ig.',
-    'al.',
-    'ar.',
-    'az.',
-    'og.',
-    'or.',
-    'lr.'
-  ],
-      NARROWWEEKDAYS: const ['I', 'A', 'A', 'A', 'O', 'O', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['I', 'A', 'A', 'A', 'O', 'O', 'L'],
-      SHORTQUARTERS: const ['1Hh', '2Hh', '3Hh', '4Hh'],
-      QUARTERS: const [
-    '1. hiruhilekoa',
-    '2. hiruhilekoa',
-    '3. hiruhilekoa',
-    '4. hiruhilekoa'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'y(\'e\')\'ko\' MMMM d, EEEE',
-    'y(\'e\')\'ko\' MMMM d',
-    'y MMM d',
-    'y-MM-dd'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale fa.
-   */
-  "fa": new DateSymbols(
-      NAME: "fa",
-      ERAS: const ['ق.م.', 'م.'],
-      ERANAMES: const ['قبل از میلاد', 'میلادی'],
-      NARROWMONTHS: const [
-    'ژ',
-    'ف',
-    'م',
-    'آ',
-    'م',
-    'ژ',
-    'ژ',
-    'ا',
-    'س',
-    'ا',
-    'ن',
-    'د'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ژ',
-    'ف',
-    'م',
-    'آ',
-    'م',
-    'ژ',
-    'ژ',
-    'ا',
-    'س',
-    'ا',
-    'ن',
-    'د'
-  ],
-      MONTHS: const [
-    'ژانویهٔ',
-    'فوریهٔ',
-    'مارس',
-    'آوریل',
-    'مهٔ',
-    'ژوئن',
-    'ژوئیهٔ',
-    'اوت',
-    'سپتامبر',
-    'اکتبر',
-    'نوامبر',
-    'دسامبر'
-  ],
-      STANDALONEMONTHS: const [
-    'ژانویه',
-    'فوریه',
-    'مارس',
-    'آوریل',
-    'مه',
-    'ژوئن',
-    'ژوئیه',
-    'اوت',
-    'سپتامبر',
-    'اکتبر',
-    'نوامبر',
-    'دسامبر'
-  ],
-      SHORTMONTHS: const [
-    'ژانویهٔ',
-    'فوریهٔ',
-    'مارس',
-    'آوریل',
-    'مهٔ',
-    'ژوئن',
-    'ژوئیهٔ',
-    'اوت',
-    'سپتامبر',
-    'اکتبر',
-    'نوامبر',
-    'دسامبر'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ژانویه',
-    'فوریه',
-    'مارس',
-    'آوریل',
-    'مه',
-    'ژوئن',
-    'ژوئیه',
-    'اوت',
-    'سپتامبر',
-    'اکتبر',
-    'نوامبر',
-    'دسامبر'
-  ],
-      WEEKDAYS: const [
-    'یکشنبه',
-    'دوشنبه',
-    'سه‌شنبه',
-    'چهارشنبه',
-    'پنجشنبه',
-    'جمعه',
-    'شنبه'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'یکشنبه',
-    'دوشنبه',
-    'سه‌شنبه',
-    'چهارشنبه',
-    'پنجشنبه',
-    'جمعه',
-    'شنبه'
-  ],
-      SHORTWEEKDAYS: const [
-    'یکشنبه',
-    'دوشنبه',
-    'سه‌شنبه',
-    'چهارشنبه',
-    'پنجشنبه',
-    'جمعه',
-    'شنبه'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'یکشنبه',
-    'دوشنبه',
-    'سه‌شنبه',
-    'چهارشنبه',
-    'پنجشنبه',
-    'جمعه',
-    'شنبه'
-  ],
-      NARROWWEEKDAYS: const ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
-      STANDALONENARROWWEEKDAYS: const ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
-      SHORTQUARTERS: const ['س‌م۱', 'س‌م۲', 'س‌م۳', 'س‌م۴'],
-      QUARTERS: const [
-    'سه‌ماههٔ اول',
-    'سه‌ماههٔ دوم',
-    'سه‌ماههٔ سوم',
-    'سه‌ماههٔ چهارم'
-  ],
-      AMPMS: const ['قبل‌ازظهر', 'بعدازظهر'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y/M/d'],
-      TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss (z)', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const [
-    '{1}، ساعت {0}',
-    '{1}، ساعت {0}',
-    '{1}،‏ {0}',
-    '{1}،‏ {0}'
-  ],
-      FIRSTDAYOFWEEK: 5,
-      WEEKENDRANGE: const [3, 4],
-      FIRSTWEEKCUTOFFDAY: 4),
-  /**
-   * Date/time formatting symbols for locale fi.
-   */
-  "fi": new DateSymbols(
-      NAME: "fi",
-      ERAS: const ['eKr.', 'jKr.'],
-      ERANAMES: const [
-    'ennen Kristuksen syntymää',
-    'jälkeen Kristuksen syntymän'
-  ],
-      NARROWMONTHS: const [
-    'T',
-    'H',
-    'M',
-    'H',
-    'T',
-    'K',
-    'H',
-    'E',
-    'S',
-    'L',
-    'M',
-    'J'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'T',
-    'H',
-    'M',
-    'H',
-    'T',
-    'K',
-    'H',
-    'E',
-    'S',
-    'L',
-    'M',
-    'J'
-  ],
-      MONTHS: const [
-    'tammikuuta',
-    'helmikuuta',
-    'maaliskuuta',
-    'huhtikuuta',
-    'toukokuuta',
-    'kesäkuuta',
-    'heinäkuuta',
-    'elokuuta',
-    'syyskuuta',
-    'lokakuuta',
-    'marraskuuta',
-    'joulukuuta'
-  ],
-      STANDALONEMONTHS: const [
-    'tammikuu',
-    'helmikuu',
-    'maaliskuu',
-    'huhtikuu',
-    'toukokuu',
-    'kesäkuu',
-    'heinäkuu',
-    'elokuu',
-    'syyskuu',
-    'lokakuu',
-    'marraskuu',
-    'joulukuu'
-  ],
-      SHORTMONTHS: const [
-    'tammikuuta',
-    'helmikuuta',
-    'maaliskuuta',
-    'huhtikuuta',
-    'toukokuuta',
-    'kesäkuuta',
-    'heinäkuuta',
-    'elokuuta',
-    'syyskuuta',
-    'lokakuuta',
-    'marraskuuta',
-    'joulukuuta'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'tammi',
-    'helmi',
-    'maalis',
-    'huhti',
-    'touko',
-    'kesä',
-    'heinä',
-    'elo',
-    'syys',
-    'loka',
-    'marras',
-    'joulu'
-  ],
-      WEEKDAYS: const [
-    'sunnuntaina',
-    'maanantaina',
-    'tiistaina',
-    'keskiviikkona',
-    'torstaina',
-    'perjantaina',
-    'lauantaina'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'sunnuntai',
-    'maanantai',
-    'tiistai',
-    'keskiviikko',
-    'torstai',
-    'perjantai',
-    'lauantai'
-  ],
-      SHORTWEEKDAYS: const ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
-      STANDALONESHORTWEEKDAYS: const ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'K', 'T', 'P', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'K', 'T', 'P', 'L'],
-      SHORTQUARTERS: const ['1. nelj.', '2. nelj.', '3. nelj.', '4. nelj.'],
-      QUARTERS: const [
-    '1. neljännes',
-    '2. neljännes',
-    '3. neljännes',
-    '4. neljännes'
-  ],
-      AMPMS: const ['ap.', 'ip.'],
-      DATEFORMATS: const ['cccc d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.y'],
-      TIMEFORMATS: const ['H.mm.ss zzzz', 'H.mm.ss z', 'H.mm.ss', 'H.mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale fil.
-   */
-  "fil": new DateSymbols(
-      NAME: "fil",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['BC', 'AD'],
-      NARROWMONTHS: const [
-    'E',
-    'P',
-    'M',
-    'A',
-    'M',
-    'H',
-    'H',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'E',
-    'P',
-    'M',
-    'A',
-    'M',
-    'H',
-    'H',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Enero',
-    'Pebrero',
-    'Marso',
-    'Abril',
-    'Mayo',
-    'Hunyo',
-    'Hulyo',
-    'Agosto',
-    'Setyembre',
-    'Oktubre',
-    'Nobyembre',
-    'Disyembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Enero',
-    'Pebrero',
-    'Marso',
-    'Abril',
-    'Mayo',
-    'Hunyo',
-    'Hulyo',
-    'Agosto',
-    'Setyembre',
-    'Oktubre',
-    'Nobyembre',
-    'Disyembre'
-  ],
-      SHORTMONTHS: const [
-    'Ene',
-    'Peb',
-    'Mar',
-    'Abr',
-    'May',
-    'Hun',
-    'Hul',
-    'Ago',
-    'Set',
-    'Okt',
-    'Nob',
-    'Dis'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ene',
-    'Peb',
-    'Mar',
-    'Abr',
-    'May',
-    'Hun',
-    'Hul',
-    'Ago',
-    'Set',
-    'Okt',
-    'Nob',
-    'Dis'
-  ],
-      WEEKDAYS: const [
-    'Linggo',
-    'Lunes',
-    'Martes',
-    'Miyerkules',
-    'Huwebes',
-    'Biyernes',
-    'Sabado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Linggo',
-    'Lunes',
-    'Martes',
-    'Miyerkules',
-    'Huwebes',
-    'Biyernes',
-    'Sabado'
-  ],
-      SHORTWEEKDAYS: const ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Lin',
-    'Lun',
-    'Mar',
-    'Miy',
-    'Huw',
-    'Biy',
-    'Sab'
-  ],
-      NARROWWEEKDAYS: const ['L', 'L', 'M', 'M', 'H', 'B', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['L', 'L', 'M', 'M', 'H', 'B', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    'ika-1 quarter',
-    'ika-2 quarter',
-    'ika-3 quarter',
-    'ika-4 na quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'ng\' {0}',
-    '{1} \'ng\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale fr.
-   */
-  "fr": new DateSymbols(
-      NAME: "fr",
-      ERAS: const ['av. J.-C.', 'ap. J.-C.'],
-      ERANAMES: const ['avant Jésus-Christ', 'après Jésus-Christ'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janvier',
-    'février',
-    'mars',
-    'avril',
-    'mai',
-    'juin',
-    'juillet',
-    'août',
-    'septembre',
-    'octobre',
-    'novembre',
-    'décembre'
-  ],
-      STANDALONEMONTHS: const [
-    'janvier',
-    'février',
-    'mars',
-    'avril',
-    'mai',
-    'juin',
-    'juillet',
-    'août',
-    'septembre',
-    'octobre',
-    'novembre',
-    'décembre'
-  ],
-      SHORTMONTHS: const [
-    'janv.',
-    'févr.',
-    'mars',
-    'avr.',
-    'mai',
-    'juin',
-    'juil.',
-    'août',
-    'sept.',
-    'oct.',
-    'nov.',
-    'déc.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'janv.',
-    'févr.',
-    'mars',
-    'avr.',
-    'mai',
-    'juin',
-    'juil.',
-    'août',
-    'sept.',
-    'oct.',
-    'nov.',
-    'déc.'
-  ],
-      WEEKDAYS: const [
-    'dimanche',
-    'lundi',
-    'mardi',
-    'mercredi',
-    'jeudi',
-    'vendredi',
-    'samedi'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'dimanche',
-    'lundi',
-    'mardi',
-    'mercredi',
-    'jeudi',
-    'vendredi',
-    'samedi'
-  ],
-      SHORTWEEKDAYS: const [
-    'dim.',
-    'lun.',
-    'mar.',
-    'mer.',
-    'jeu.',
-    'ven.',
-    'sam.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'dim.',
-    'lun.',
-    'mar.',
-    'mer.',
-    'jeu.',
-    'ven.',
-    'sam.'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1er trimestre',
-    '2e trimestre',
-    '3e trimestre',
-    '4e trimestre'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale fr_CA.
-   */
-  "fr_CA": new DateSymbols(
-      NAME: "fr_CA",
-      ERAS: const ['av. J.-C.', 'ap. J.-C.'],
-      ERANAMES: const ['avant Jésus-Christ', 'après Jésus-Christ'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janvier',
-    'février',
-    'mars',
-    'avril',
-    'mai',
-    'juin',
-    'juillet',
-    'août',
-    'septembre',
-    'octobre',
-    'novembre',
-    'décembre'
-  ],
-      STANDALONEMONTHS: const [
-    'janvier',
-    'février',
-    'mars',
-    'avril',
-    'mai',
-    'juin',
-    'juillet',
-    'août',
-    'septembre',
-    'octobre',
-    'novembre',
-    'décembre'
-  ],
-      SHORTMONTHS: const [
-    'janv.',
-    'févr.',
-    'mars',
-    'avr.',
-    'mai',
-    'juin',
-    'juil.',
-    'août',
-    'sept.',
-    'oct.',
-    'nov.',
-    'déc.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'janv.',
-    'févr.',
-    'mars',
-    'avr.',
-    'mai',
-    'juin',
-    'juil.',
-    'août',
-    'sept.',
-    'oct.',
-    'nov.',
-    'déc.'
-  ],
-      WEEKDAYS: const [
-    'dimanche',
-    'lundi',
-    'mardi',
-    'mercredi',
-    'jeudi',
-    'vendredi',
-    'samedi'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'dimanche',
-    'lundi',
-    'mardi',
-    'mercredi',
-    'jeudi',
-    'vendredi',
-    'samedi'
-  ],
-      SHORTWEEKDAYS: const [
-    'dim.',
-    'lun.',
-    'mar.',
-    'mer.',
-    'jeu.',
-    'ven.',
-    'sam.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'dim.',
-    'lun.',
-    'mar.',
-    'mer.',
-    'jeu.',
-    'ven.',
-    'sam.'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1er trimestre',
-    '2e trimestre',
-    '3e trimestre',
-    '4e trimestre'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'y-MM-dd', 'yy-MM-dd'],
-      TIMEFORMATS: const [
-    'HH \'h\' mm \'min\' ss \'s\' zzzz',
-    'HH:mm:ss z',
-    'HH:mm:ss',
-    'HH:mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale gl.
-   */
-  "gl": new DateSymbols(
-      NAME: "gl",
-      ERAS: const ['a.C.', 'd.C.'],
-      ERANAMES: const ['antes de Cristo', 'despois de Cristo'],
-      NARROWMONTHS: const [
-    'X',
-    'F',
-    'M',
-    'A',
-    'M',
-    'X',
-    'X',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'X',
-    'F',
-    'M',
-    'A',
-    'M',
-    'X',
-    'X',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'xaneiro',
-    'febreiro',
-    'marzo',
-    'abril',
-    'maio',
-    'xuño',
-    'xullo',
-    'agosto',
-    'setembro',
-    'outubro',
-    'novembro',
-    'decembro'
-  ],
-      STANDALONEMONTHS: const [
-    'Xaneiro',
-    'Febreiro',
-    'Marzo',
-    'Abril',
-    'Maio',
-    'Xuño',
-    'Xullo',
-    'Agosto',
-    'Setembro',
-    'Outubro',
-    'Novembro',
-    'Decembro'
-  ],
-      SHORTMONTHS: const [
-    'xan',
-    'feb',
-    'mar',
-    'abr',
-    'mai',
-    'xuñ',
-    'xul',
-    'ago',
-    'set',
-    'out',
-    'nov',
-    'dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Xan',
-    'Feb',
-    'Mar',
-    'Abr',
-    'Mai',
-    'Xuñ',
-    'Xul',
-    'Ago',
-    'Set',
-    'Out',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'luns',
-    'martes',
-    'mércores',
-    'xoves',
-    'venres',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Domingo',
-    'Luns',
-    'Martes',
-    'Mércores',
-    'Xoves',
-    'Venres',
-    'Sábado'
-  ],
-      SHORTWEEKDAYS: const ['dom', 'lun', 'mar', 'mér', 'xov', 'ven', 'sáb'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Dom',
-    'Lun',
-    'Mar',
-    'Mér',
-    'Xov',
-    'Ven',
-    'Sáb'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'X', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'X', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1o trimestre',
-    '2o trimestre',
-    '3o trimestre',
-    '4o trimestre'
-  ],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const [
-    'EEEE dd MMMM y',
-    'dd MMMM y',
-    'd MMM, y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale gsw.
-   */
-  "gsw": new DateSymbols(
-      NAME: "gsw",
-      ERAS: const ['v. Chr.', 'n. Chr.'],
-      ERANAMES: const ['v. Chr.', 'n. Chr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'Auguscht',
-    'Septämber',
-    'Oktoober',
-    'Novämber',
-    'Dezämber'
-  ],
-      STANDALONEMONTHS: const [
-    'Januar',
-    'Februar',
-    'März',
-    'April',
-    'Mai',
-    'Juni',
-    'Juli',
-    'Auguscht',
-    'Septämber',
-    'Oktoober',
-    'Novämber',
-    'Dezämber'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mär',
-    'Apr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dez'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mär',
-    'Apr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dez'
-  ],
-      WEEKDAYS: const [
-    'Sunntig',
-    'Määntig',
-    'Ziischtig',
-    'Mittwuch',
-    'Dunschtig',
-    'Friitig',
-    'Samschtig'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sunntig',
-    'Määntig',
-    'Ziischtig',
-    'Mittwuch',
-    'Dunschtig',
-    'Friitig',
-    'Samschtig'
-  ],
-      SHORTWEEKDAYS: const ['Su.', 'Mä.', 'Zi.', 'Mi.', 'Du.', 'Fr.', 'Sa.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Su.',
-    'Mä.',
-    'Zi.',
-    'Mi.',
-    'Du.',
-    'Fr.',
-    'Sa.'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],
-      AMPMS: const ['vorm.', 'nam.'],
-      DATEFORMATS: const [
-    'EEEE, d. MMMM y',
-    'd. MMMM y',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale gu.
-   */
-  "gu": new DateSymbols(
-      NAME: "gu",
-      ERAS: const ['ઈસુના જન્મ પહેલા', 'ઇસવીસન'],
-      ERANAMES: const ['ઈસવીસન પૂર્વે', 'ઇસવીસન'],
-      NARROWMONTHS: const [
-    'જા',
-    'ફે',
-    'મા',
-    'એ',
-    'મે',
-    'જૂ',
-    'જુ',
-    'ઑ',
-    'સ',
-    'ઑ',
-    'ન',
-    'ડિ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'જા',
-    'ફે',
-    'મા',
-    'એ',
-    'મે',
-    'જૂ',
-    'જુ',
-    'ઑ',
-    'સ',
-    'ઑ',
-    'ન',
-    'ડિ'
-  ],
-      MONTHS: const [
-    'જાન્યુઆરી',
-    'ફેબ્રુઆરી',
-    'માર્ચ',
-    'એપ્રિલ',
-    'મે',
-    'જૂન',
-    'જુલાઈ',
-    'ઑગસ્ટ',
-    'સપ્ટેમ્બર',
-    'ઑક્ટોબર',
-    'નવેમ્બર',
-    'ડિસેમ્બર'
-  ],
-      STANDALONEMONTHS: const [
-    'જાન્યુઆરી',
-    'ફેબ્રુઆરી',
-    'માર્ચ',
-    'એપ્રિલ',
-    'મે',
-    'જૂન',
-    'જુલાઈ',
-    'ઑગસ્ટ',
-    'સપ્ટેમ્બર',
-    'ઑક્ટોબર',
-    'નવેમ્બર',
-    'ડિસેમ્બર'
-  ],
-      SHORTMONTHS: const [
-    'જાન્યુ',
-    'ફેબ્રુ',
-    'માર્ચ',
-    'એપ્રિલ',
-    'મે',
-    'જૂન',
-    'જુલાઈ',
-    'ઑગસ્ટ',
-    'સપ્ટે',
-    'ઑક્ટો',
-    'નવે',
-    'ડિસે'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'જાન્યુ',
-    'ફેબ્રુ',
-    'માર્ચ',
-    'એપ્રિલ',
-    'મે',
-    'જૂન',
-    'જુલાઈ',
-    'ઑગ',
-    'સપ્ટે',
-    'ઑક્ટો',
-    'નવે',
-    'ડિસે'
-  ],
-      WEEKDAYS: const [
-    'રવિવાર',
-    'સોમવાર',
-    'મંગળવાર',
-    'બુધવાર',
-    'ગુરુવાર',
-    'શુક્રવાર',
-    'શનિવાર'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'રવિવાર',
-    'સોમવાર',
-    'મંગળવાર',
-    'બુધવાર',
-    'ગુરુવાર',
-    'શુક્રવાર',
-    'શનિવાર'
-  ],
-      SHORTWEEKDAYS: const [
-    'રવિ',
-    'સોમ',
-    'મંગળ',
-    'બુધ',
-    'ગુરુ',
-    'શુક્ર',
-    'શનિ'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'રવિ',
-    'સોમ',
-    'મંગળ',
-    'બુધ',
-    'ગુરુ',
-    'શુક્ર',
-    'શનિ'
-  ],
-      NARROWWEEKDAYS: const ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'],
-      STANDALONENARROWWEEKDAYS: const ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    'પહેલો ત્રિમાસ',
-    'બીજો ત્રિમાસ',
-    'ત્રીજો ત્રિમાસ',
-    'ચોથો ત્રિમાસ'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM, y',
-    'd MMMM, y',
-    'd MMM, y',
-    'd-MM-yy'
-  ],
-      TIMEFORMATS: const [
-    'hh:mm:ss a zzzz',
-    'hh:mm:ss a z',
-    'hh:mm:ss a',
-    'hh:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale haw.
-   */
-  "haw": new DateSymbols(
-      NAME: "haw",
-      ERAS: const ['BCE', 'CE'],
-      ERANAMES: const ['BCE', 'CE'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'Ianuali',
-    'Pepeluali',
-    'Malaki',
-    'ʻApelila',
-    'Mei',
-    'Iune',
-    'Iulai',
-    'ʻAukake',
-    'Kepakemapa',
-    'ʻOkakopa',
-    'Nowemapa',
-    'Kekemapa'
-  ],
-      STANDALONEMONTHS: const [
-    'Ianuali',
-    'Pepeluali',
-    'Malaki',
-    'ʻApelila',
-    'Mei',
-    'Iune',
-    'Iulai',
-    'ʻAukake',
-    'Kepakemapa',
-    'ʻOkakopa',
-    'Nowemapa',
-    'Kekemapa'
-  ],
-      SHORTMONTHS: const [
-    'Ian.',
-    'Pep.',
-    'Mal.',
-    'ʻAp.',
-    'Mei',
-    'Iun.',
-    'Iul.',
-    'ʻAu.',
-    'Kep.',
-    'ʻOk.',
-    'Now.',
-    'Kek.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ian.',
-    'Pep.',
-    'Mal.',
-    'ʻAp.',
-    'Mei',
-    'Iun.',
-    'Iul.',
-    'ʻAu.',
-    'Kep.',
-    'ʻOk.',
-    'Now.',
-    'Kek.'
-  ],
-      WEEKDAYS: const [
-    'Lāpule',
-    'Poʻakahi',
-    'Poʻalua',
-    'Poʻakolu',
-    'Poʻahā',
-    'Poʻalima',
-    'Poʻaono'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Lāpule',
-    'Poʻakahi',
-    'Poʻalua',
-    'Poʻakolu',
-    'Poʻahā',
-    'Poʻalima',
-    'Poʻaono'
-  ],
-      SHORTWEEKDAYS: const ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'],
-      STANDALONESHORTWEEKDAYS: const ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale he.
-   */
-  "he": new DateSymbols(
-      NAME: "he",
-      ERAS: const ['לפנה״ס', 'לסה״נ'],
-      ERANAMES: const ['לפני הספירה', 'לספירה'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'ינואר',
-    'פברואר',
-    'מרץ',
-    'אפריל',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוגוסט',
-    'ספטמבר',
-    'אוקטובר',
-    'נובמבר',
-    'דצמבר'
-  ],
-      STANDALONEMONTHS: const [
-    'ינואר',
-    'פברואר',
-    'מרץ',
-    'אפריל',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוגוסט',
-    'ספטמבר',
-    'אוקטובר',
-    'נובמבר',
-    'דצמבר'
-  ],
-      SHORTMONTHS: const [
-    'ינו׳',
-    'פבר׳',
-    'מרץ',
-    'אפר׳',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוג׳',
-    'ספט׳',
-    'אוק׳',
-    'נוב׳',
-    'דצמ׳'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ינו׳',
-    'פבר׳',
-    'מרץ',
-    'אפר׳',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוג׳',
-    'ספט׳',
-    'אוק׳',
-    'נוב׳',
-    'דצמ׳'
-  ],
-      WEEKDAYS: const [
-    'יום ראשון',
-    'יום שני',
-    'יום שלישי',
-    'יום רביעי',
-    'יום חמישי',
-    'יום שישי',
-    'יום שבת'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'יום ראשון',
-    'יום שני',
-    'יום שלישי',
-    'יום רביעי',
-    'יום חמישי',
-    'יום שישי',
-    'יום שבת'
-  ],
-      SHORTWEEKDAYS: const [
-    'יום א׳',
-    'יום ב׳',
-    'יום ג׳',
-    'יום ד׳',
-    'יום ה׳',
-    'יום ו׳',
-    'שבת'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'יום א׳',
-    'יום ב׳',
-    'יום ג׳',
-    'יום ד׳',
-    'יום ה׳',
-    'יום ו׳',
-    'שבת'
-  ],
-      NARROWWEEKDAYS: const ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
-      STANDALONENARROWWEEKDAYS: const [
-    'א׳',
-    'ב׳',
-    'ג׳',
-    'ד׳',
-    'ה׳',
-    'ו׳',
-    'ש׳'
-  ],
-      SHORTQUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
-      QUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
-      AMPMS: const ['לפנה״צ', 'אחה״צ'],
-      DATEFORMATS: const [
-    'EEEE, d בMMMM y',
-    'd בMMMM y',
-    'd בMMM y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} בשעה {0}',
-    '{1} בשעה {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [4, 5],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale hi.
-   */
-  "hi": new DateSymbols(
-      NAME: "hi",
-      ERAS: const ['ईसा-पूर्व', 'ईस्वी'],
-      ERANAMES: const ['ईसा-पूर्व', 'ईस्वी'],
-      NARROWMONTHS: const [
-    'ज',
-    'फ़',
-    'मा',
-    'अ',
-    'म',
-    'जू',
-    'जु',
-    'अ',
-    'सि',
-    'अ',
-    'न',
-    'दि'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ज',
-    'फ़',
-    'मा',
-    'अ',
-    'म',
-    'जू',
-    'जु',
-    'अ',
-    'सि',
-    'अ',
-    'न',
-    'दि'
-  ],
-      MONTHS: const [
-    'जनवरी',
-    'फ़रवरी',
-    'मार्च',
-    'अप्रैल',
-    'मई',
-    'जून',
-    'जुलाई',
-    'अगस्त',
-    'सितंबर',
-    'अक्टूबर',
-    'नवंबर',
-    'दिसंबर'
-  ],
-      STANDALONEMONTHS: const [
-    'जनवरी',
-    'फ़रवरी',
-    'मार्च',
-    'अप्रैल',
-    'मई',
-    'जून',
-    'जुलाई',
-    'अगस्त',
-    'सितंबर',
-    'अक्टूबर',
-    'नवंबर',
-    'दिसंबर'
-  ],
-      SHORTMONTHS: const [
-    'जन',
-    'फ़र',
-    'मार्च',
-    'अप्रै',
-    'मई',
-    'जून',
-    'जुला',
-    'अग',
-    'सितं',
-    'अक्टू',
-    'नवं',
-    'दिसं'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'जन',
-    'फ़र',
-    'मार्च',
-    'अप्रै',
-    'मई',
-    'जून',
-    'जुला',
-    'अग',
-    'सितं',
-    'अक्टू',
-    'नवं',
-    'दिसं'
-  ],
-      WEEKDAYS: const [
-    'रविवार',
-    'सोमवार',
-    'मंगलवार',
-    'बुधवार',
-    'गुरुवार',
-    'शुक्रवार',
-    'शनिवार'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'रविवार',
-    'सोमवार',
-    'मंगलवार',
-    'बुधवार',
-    'गुरुवार',
-    'शुक्रवार',
-    'शनिवार'
-  ],
-      SHORTWEEKDAYS: const [
-    'रवि',
-    'सोम',
-    'मंगल',
-    'बुध',
-    'गुरु',
-    'शुक्र',
-    'शनि'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'रवि',
-    'सोम',
-    'मंगल',
-    'बुध',
-    'गुरु',
-    'शुक्र',
-    'शनि'
-  ],
-      NARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
-      STANDALONENARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
-      SHORTQUARTERS: const ['ति1', 'ति2', 'ति3', 'ति4'],
-      QUARTERS: const [
-    'पहली तिमाही',
-    'दूसरी तिमाही',
-    'तीसरी तिमाही',
-    'चौथी तिमाही'
-  ],
-      AMPMS: const ['am', 'pm'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'dd-MM-y', 'd-M-yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} को {0}',
-    '{1} को {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale hr.
-   */
-  "hr": new DateSymbols(
-      NAME: "hr",
-      ERAS: const ['pr. Kr.', 'p. Kr.'],
-      ERANAMES: const ['Prije Krista', 'Poslije Krista'],
-      NARROWMONTHS: const [
-    '1.',
-    '2.',
-    '3.',
-    '4.',
-    '5.',
-    '6.',
-    '7.',
-    '8.',
-    '9.',
-    '10.',
-    '11.',
-    '12.'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1.',
-    '2.',
-    '3.',
-    '4.',
-    '5.',
-    '6.',
-    '7.',
-    '8.',
-    '9.',
-    '10.',
-    '11.',
-    '12.'
-  ],
-      MONTHS: const [
-    'siječnja',
-    'veljače',
-    'ožujka',
-    'travnja',
-    'svibnja',
-    'lipnja',
-    'srpnja',
-    'kolovoza',
-    'rujna',
-    'listopada',
-    'studenoga',
-    'prosinca'
-  ],
-      STANDALONEMONTHS: const [
-    'siječanj',
-    'veljača',
-    'ožujak',
-    'travanj',
-    'svibanj',
-    'lipanj',
-    'srpanj',
-    'kolovoz',
-    'rujan',
-    'listopad',
-    'studeni',
-    'prosinac'
-  ],
-      SHORTMONTHS: const [
-    'sij',
-    'velj',
-    'ožu',
-    'tra',
-    'svi',
-    'lip',
-    'srp',
-    'kol',
-    'ruj',
-    'lis',
-    'stu',
-    'pro'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'sij',
-    'velj',
-    'ožu',
-    'tra',
-    'svi',
-    'lip',
-    'srp',
-    'kol',
-    'ruj',
-    'lis',
-    'stu',
-    'pro'
-  ],
-      WEEKDAYS: const [
-    'nedjelja',
-    'ponedjeljak',
-    'utorak',
-    'srijeda',
-    'četvrtak',
-    'petak',
-    'subota'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'nedjelja',
-    'ponedjeljak',
-    'utorak',
-    'srijeda',
-    'četvrtak',
-    'petak',
-    'subota'
-  ],
-      SHORTWEEKDAYS: const ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],
-      STANDALONESHORTWEEKDAYS: const [
-    'ned',
-    'pon',
-    'uto',
-    'sri',
-    'čet',
-    'pet',
-    'sub'
-  ],
-      NARROWWEEKDAYS: const ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'č', 'p', 's'],
-      SHORTQUARTERS: const ['1kv', '2kv', '3kv', '4kv'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d. MMMM y.',
-    'd. MMMM y.',
-    'd. MMM y.',
-    'd.M.yy.'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'u\' {0}',
-    '{1} \'u\' {0}',
-    '{1} {0}',
-    '{1} {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale hu.
-   */
-  "hu": new DateSymbols(
-      NAME: "hu",
-      ERAS: const ['i. e.', 'i. sz.'],
-      ERANAMES: const ['időszámításunk előtt', 'időszámításunk szerint'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'Á',
-    'M',
-    'J',
-    'J',
-    'A',
-    'Sz',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'Á',
-    'M',
-    'J',
-    'J',
-    'A',
-    'Sz',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'január',
-    'február',
-    'március',
-    'április',
-    'május',
-    'június',
-    'július',
-    'augusztus',
-    'szeptember',
-    'október',
-    'november',
-    'december'
-  ],
-      STANDALONEMONTHS: const [
-    'január',
-    'február',
-    'március',
-    'április',
-    'május',
-    'június',
-    'július',
-    'augusztus',
-    'szeptember',
-    'október',
-    'november',
-    'december'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'febr.',
-    'márc.',
-    'ápr.',
-    'máj.',
-    'jún.',
-    'júl.',
-    'aug.',
-    'szept.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan.',
-    'febr.',
-    'márc.',
-    'ápr.',
-    'máj.',
-    'jún.',
-    'júl.',
-    'aug.',
-    'szept.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      WEEKDAYS: const [
-    'vasárnap',
-    'hétfő',
-    'kedd',
-    'szerda',
-    'csütörtök',
-    'péntek',
-    'szombat'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'vasárnap',
-    'hétfő',
-    'kedd',
-    'szerda',
-    'csütörtök',
-    'péntek',
-    'szombat'
-  ],
-      SHORTWEEKDAYS: const ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
-      STANDALONESHORTWEEKDAYS: const ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
-      NARROWWEEKDAYS: const ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
-      STANDALONENARROWWEEKDAYS: const ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
-      SHORTQUARTERS: const ['N1', 'N2', 'N3', 'N4'],
-      QUARTERS: const [
-    'I. negyedév',
-    'II. negyedév',
-    'III. negyedév',
-    'IV. negyedév'
-  ],
-      AMPMS: const ['de.', 'du.'],
-      DATEFORMATS: const [
-    'y. MMMM d., EEEE',
-    'y. MMMM d.',
-    'y. MMM d.',
-    'y. MM. dd.'
-  ],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale hy.
-   */
-  "hy": new DateSymbols(
-      NAME: "hy",
-      ERAS: const ['մ.թ.ա.', 'մ.թ.'],
-      ERANAMES: const ['մ.թ.ա.', 'մ.թ.'],
-      NARROWMONTHS: const [
-    'Հ',
-    'Փ',
-    'Մ',
-    'Ա',
-    'Մ',
-    'Հ',
-    'Հ',
-    'Օ',
-    'Ս',
-    'Հ',
-    'Ն',
-    'Դ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Հ',
-    'Փ',
-    'Մ',
-    'Ա',
-    'Մ',
-    'Հ',
-    'Հ',
-    'Օ',
-    'Ս',
-    'Հ',
-    'Ն',
-    'Դ'
-  ],
-      MONTHS: const [
-    'հունվարի',
-    'փետրվարի',
-    'մարտի',
-    'ապրիլի',
-    'մայիսի',
-    'հունիսի',
-    'հուլիսի',
-    'օգոստոսի',
-    'սեպտեմբերի',
-    'հոկտեմբերի',
-    'նոյեմբերի',
-    'դեկտեմբերի'
-  ],
-      STANDALONEMONTHS: const [
-    'հունվար',
-    'փետրվար',
-    'մարտ',
-    'ապրիլ',
-    'մայիս',
-    'հունիս',
-    'հուլիս',
-    'օգոստոս',
-    'սեպտեմբեր',
-    'հոկտեմբեր',
-    'նոյեմբեր',
-    'դեկտեմբեր'
-  ],
-      SHORTMONTHS: const [
-    'հնվ',
-    'փտվ',
-    'մրտ',
-    'ապր',
-    'մյս',
-    'հնս',
-    'հլս',
-    'օգս',
-    'սպտ',
-    'հկտ',
-    'նյմ',
-    'դկտ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'հնվ',
-    'փտվ',
-    'մրտ',
-    'ապր',
-    'մյս',
-    'հնս',
-    'հլս',
-    'օգս',
-    'սպտ',
-    'հկտ',
-    'նյմ',
-    'դկտ'
-  ],
-      WEEKDAYS: const [
-    'կիրակի',
-    'երկուշաբթի',
-    'երեքշաբթի',
-    'չորեքշաբթի',
-    'հինգշաբթի',
-    'ուրբաթ',
-    'շաբաթ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'կիրակի',
-    'երկուշաբթի',
-    'երեքշաբթի',
-    'չորեքշաբթի',
-    'հինգշաբթի',
-    'ուրբաթ',
-    'շաբաթ'
-  ],
-      SHORTWEEKDAYS: const ['կիր', 'երկ', 'երք', 'չրք', 'հնգ', 'ուր', 'շբթ'],
-      STANDALONESHORTWEEKDAYS: const [
-    'կիր',
-    'երկ',
-    'երք',
-    'չրք',
-    'հնգ',
-    'ուր',
-    'շբթ'
-  ],
-      NARROWWEEKDAYS: const ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ու', 'Շ'],
-      STANDALONENARROWWEEKDAYS: const ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ու', 'Շ'],
-      SHORTQUARTERS: const [
-    '1-ին եռմս.',
-    '2-րդ եռմս.',
-    '3-րդ եռմս.',
-    '4-րդ եռմս.'
-  ],
-      QUARTERS: const [
-    '1-ին եռամսյակ',
-    '2-րդ եռամսյակ',
-    '3-րդ եռամսյակ',
-    '4-րդ եռամսյակ'
-  ],
-      AMPMS: const ['կեսօրից առաջ', 'կեսօրից հետո'],
-      DATEFORMATS: const [
-    'yթ. MMMM d, EEEE',
-    'dd MMMM, yթ.',
-    'dd MMM, y թ.',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss, zzzz', 'H:mm:ss, z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale id.
-   */
-  "id": new DateSymbols(
-      NAME: "id",
-      ERAS: const ['SM', 'M'],
-      ERANAMES: const ['SM', 'M'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januari',
-    'Februari',
-    'Maret',
-    'April',
-    'Mei',
-    'Juni',
-    'Juli',
-    'Agustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januari',
-    'Februari',
-    'Maret',
-    'April',
-    'Mei',
-    'Juni',
-    'Juli',
-    'Agustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Agt',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Agt',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      WEEKDAYS: const [
-    'Minggu',
-    'Senin',
-    'Selasa',
-    'Rabu',
-    'Kamis',
-    'Jumat',
-    'Sabtu'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Minggu',
-    'Senin',
-    'Selasa',
-    'Rabu',
-    'Kamis',
-    'Jumat',
-    'Sabtu'
-  ],
-      SHORTWEEKDAYS: const ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Min',
-    'Sen',
-    'Sel',
-    'Rab',
-    'Kam',
-    'Jum',
-    'Sab'
-  ],
-      NARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const [
-    'Kuartal ke-1',
-    'Kuartal ke-2',
-    'Kuartal ke-3',
-    'Kuartal ke-4'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale in.
-   */
-  "in": new DateSymbols(
-      NAME: "in",
-      ERAS: const ['SM', 'M'],
-      ERANAMES: const ['SM', 'M'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januari',
-    'Februari',
-    'Maret',
-    'April',
-    'Mei',
-    'Juni',
-    'Juli',
-    'Agustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januari',
-    'Februari',
-    'Maret',
-    'April',
-    'Mei',
-    'Juni',
-    'Juli',
-    'Agustus',
-    'September',
-    'Oktober',
-    'November',
-    'Desember'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Agt',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Agt',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      WEEKDAYS: const [
-    'Minggu',
-    'Senin',
-    'Selasa',
-    'Rabu',
-    'Kamis',
-    'Jumat',
-    'Sabtu'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Minggu',
-    'Senin',
-    'Selasa',
-    'Rabu',
-    'Kamis',
-    'Jumat',
-    'Sabtu'
-  ],
-      SHORTWEEKDAYS: const ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Min',
-    'Sen',
-    'Sel',
-    'Rab',
-    'Kam',
-    'Jum',
-    'Sab'
-  ],
-      NARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const [
-    'Kuartal ke-1',
-    'Kuartal ke-2',
-    'Kuartal ke-3',
-    'Kuartal ke-4'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale is.
-   */
-  "is": new DateSymbols(
-      NAME: "is",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['fyrir Krist', 'eftir Krist'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'Á',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'Á',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janúar',
-    'febrúar',
-    'mars',
-    'apríl',
-    'maí',
-    'júní',
-    'júlí',
-    'ágúst',
-    'september',
-    'október',
-    'nóvember',
-    'desember'
-  ],
-      STANDALONEMONTHS: const [
-    'janúar',
-    'febrúar',
-    'mars',
-    'apríl',
-    'maí',
-    'júní',
-    'júlí',
-    'ágúst',
-    'september',
-    'október',
-    'nóvember',
-    'desember'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'maí',
-    'jún.',
-    'júl.',
-    'ágú.',
-    'sep.',
-    'okt.',
-    'nóv.',
-    'des.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'maí',
-    'jún.',
-    'júl.',
-    'ágú.',
-    'sep.',
-    'okt.',
-    'nóv.',
-    'des.'
-  ],
-      WEEKDAYS: const [
-    'sunnudagur',
-    'mánudagur',
-    'þriðjudagur',
-    'miðvikudagur',
-    'fimmtudagur',
-    'föstudagur',
-    'laugardagur'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'sunnudagur',
-    'mánudagur',
-    'þriðjudagur',
-    'miðvikudagur',
-    'fimmtudagur',
-    'föstudagur',
-    'laugardagur'
-  ],
-      SHORTWEEKDAYS: const [
-    'sun.',
-    'mán.',
-    'þri.',
-    'mið.',
-    'fim.',
-    'fös.',
-    'lau.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'sun.',
-    'mán.',
-    'þri.',
-    'mið.',
-    'fim.',
-    'fös.',
-    'lau.'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],
-      SHORTQUARTERS: const ['F1', 'F2', 'F3', 'F4'],
-      QUARTERS: const [
-    '1. fjórðungur',
-    '2. fjórðungur',
-    '3. fjórðungur',
-    '4. fjórðungur'
-  ],
-      AMPMS: const ['f.h.', 'e.h.'],
-      DATEFORMATS: const ['EEEE, d. MMMM y', 'd. MMMM y', 'd. MMM y', 'd.M.y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'kl.\' {0}',
-    '{1} \'kl.\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale it.
-   */
-  "it": new DateSymbols(
-      NAME: "it",
-      ERAS: const ['aC', 'dC'],
-      ERANAMES: const ['a.C.', 'd.C.'],
-      NARROWMONTHS: const [
-    'G',
-    'F',
-    'M',
-    'A',
-    'M',
-    'G',
-    'L',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'G',
-    'F',
-    'M',
-    'A',
-    'M',
-    'G',
-    'L',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'gennaio',
-    'febbraio',
-    'marzo',
-    'aprile',
-    'maggio',
-    'giugno',
-    'luglio',
-    'agosto',
-    'settembre',
-    'ottobre',
-    'novembre',
-    'dicembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Gennaio',
-    'Febbraio',
-    'Marzo',
-    'Aprile',
-    'Maggio',
-    'Giugno',
-    'Luglio',
-    'Agosto',
-    'Settembre',
-    'Ottobre',
-    'Novembre',
-    'Dicembre'
-  ],
-      SHORTMONTHS: const [
-    'gen',
-    'feb',
-    'mar',
-    'apr',
-    'mag',
-    'giu',
-    'lug',
-    'ago',
-    'set',
-    'ott',
-    'nov',
-    'dic'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'gen',
-    'feb',
-    'mar',
-    'apr',
-    'mag',
-    'giu',
-    'lug',
-    'ago',
-    'set',
-    'ott',
-    'nov',
-    'dic'
-  ],
-      WEEKDAYS: const [
-    'domenica',
-    'lunedì',
-    'martedì',
-    'mercoledì',
-    'giovedì',
-    'venerdì',
-    'sabato'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Domenica',
-    'Lunedì',
-    'Martedì',
-    'Mercoledì',
-    'Giovedì',
-    'Venerdì',
-    'Sabato'
-  ],
-      SHORTWEEKDAYS: const ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'dom',
-    'lun',
-    'mar',
-    'mer',
-    'gio',
-    'ven',
-    'sab'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'G', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'G', 'V', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1º trimestre',
-    '2º trimestre',
-    '3º trimestre',
-    '4º trimestre'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'dd MMMM y', 'dd/MMM/y', 'dd/MM/yy'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale iw.
-   */
-  "iw": new DateSymbols(
-      NAME: "iw",
-      ERAS: const ['לפנה״ס', 'לסה״נ'],
-      ERANAMES: const ['לפני הספירה', 'לספירה'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'ינואר',
-    'פברואר',
-    'מרץ',
-    'אפריל',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוגוסט',
-    'ספטמבר',
-    'אוקטובר',
-    'נובמבר',
-    'דצמבר'
-  ],
-      STANDALONEMONTHS: const [
-    'ינואר',
-    'פברואר',
-    'מרץ',
-    'אפריל',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוגוסט',
-    'ספטמבר',
-    'אוקטובר',
-    'נובמבר',
-    'דצמבר'
-  ],
-      SHORTMONTHS: const [
-    'ינו׳',
-    'פבר׳',
-    'מרץ',
-    'אפר׳',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוג׳',
-    'ספט׳',
-    'אוק׳',
-    'נוב׳',
-    'דצמ׳'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ינו׳',
-    'פבר׳',
-    'מרץ',
-    'אפר׳',
-    'מאי',
-    'יוני',
-    'יולי',
-    'אוג׳',
-    'ספט׳',
-    'אוק׳',
-    'נוב׳',
-    'דצמ׳'
-  ],
-      WEEKDAYS: const [
-    'יום ראשון',
-    'יום שני',
-    'יום שלישי',
-    'יום רביעי',
-    'יום חמישי',
-    'יום שישי',
-    'יום שבת'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'יום ראשון',
-    'יום שני',
-    'יום שלישי',
-    'יום רביעי',
-    'יום חמישי',
-    'יום שישי',
-    'יום שבת'
-  ],
-      SHORTWEEKDAYS: const [
-    'יום א׳',
-    'יום ב׳',
-    'יום ג׳',
-    'יום ד׳',
-    'יום ה׳',
-    'יום ו׳',
-    'שבת'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'יום א׳',
-    'יום ב׳',
-    'יום ג׳',
-    'יום ד׳',
-    'יום ה׳',
-    'יום ו׳',
-    'שבת'
-  ],
-      NARROWWEEKDAYS: const ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
-      STANDALONENARROWWEEKDAYS: const [
-    'א׳',
-    'ב׳',
-    'ג׳',
-    'ד׳',
-    'ה׳',
-    'ו׳',
-    'ש׳'
-  ],
-      SHORTQUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
-      QUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
-      AMPMS: const ['לפנה״צ', 'אחה״צ'],
-      DATEFORMATS: const [
-    'EEEE, d בMMMM y',
-    'd בMMMM y',
-    'd בMMM y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} בשעה {0}',
-    '{1} בשעה {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [4, 5],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ja.
-   */
-  "ja": new DateSymbols(
-      NAME: "ja",
-      ERAS: const ['紀元前', '西暦'],
-      ERANAMES: const ['紀元前', '西暦'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONEMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      SHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      WEEKDAYS: const ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
-      STANDALONEWEEKDAYS: const [
-    '日曜日',
-    '月曜日',
-    '火曜日',
-    '水曜日',
-    '木曜日',
-    '金曜日',
-    '土曜日'
-  ],
-      SHORTWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
-      STANDALONESHORTWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
-      NARROWWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
-      STANDALONENARROWWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['第1四半期', '第2四半期', '第3四半期', '第4四半期'],
-      AMPMS: const ['午前', '午後'],
-      DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y/MM/dd', 'y/MM/dd'],
-      TIMEFORMATS: const ['H時mm分ss秒 zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ka.
-   */
-  "ka": new DateSymbols(
-      NAME: "ka",
-      ERAS: const ['ძვ. წ.', 'ახ. წ.'],
-      ERANAMES: const ['ძველი წელთაღრიცხვით', 'ახალი წელთაღრიცხვით'],
-      NARROWMONTHS: const [
-    'ი',
-    'თ',
-    'მ',
-    'ა',
-    'მ',
-    'ი',
-    'ი',
-    'ა',
-    'ს',
-    'ო',
-    'ნ',
-    'დ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ი',
-    'თ',
-    'მ',
-    'ა',
-    'მ',
-    'ი',
-    'ი',
-    'ა',
-    'ს',
-    'ო',
-    'ნ',
-    'დ'
-  ],
-      MONTHS: const [
-    'იანვარი',
-    'თებერვალი',
-    'მარტი',
-    'აპრილი',
-    'მაისი',
-    'ივნისი',
-    'ივლისი',
-    'აგვისტო',
-    'სექტემბერი',
-    'ოქტომბერი',
-    'ნოემბერი',
-    'დეკემბერი'
-  ],
-      STANDALONEMONTHS: const [
-    'იანვარი',
-    'თებერვალი',
-    'მარტი',
-    'აპრილი',
-    'მაისი',
-    'ივნისი',
-    'ივლისი',
-    'აგვისტო',
-    'სექტემბერი',
-    'ოქტომბერი',
-    'ნოემბერი',
-    'დეკემბერი'
-  ],
-      SHORTMONTHS: const [
-    'იან',
-    'თებ',
-    'მარ',
-    'აპრ',
-    'მაი',
-    'ივნ',
-    'ივლ',
-    'აგვ',
-    'სექ',
-    'ოქტ',
-    'ნოე',
-    'დეკ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'იან',
-    'თებ',
-    'მარ',
-    'აპრ',
-    'მაი',
-    'ივნ',
-    'ივლ',
-    'აგვ',
-    'სექ',
-    'ოქტ',
-    'ნოე',
-    'დეკ'
-  ],
-      WEEKDAYS: const [
-    'კვირა',
-    'ორშაბათი',
-    'სამშაბათი',
-    'ოთხშაბათი',
-    'ხუთშაბათი',
-    'პარასკევი',
-    'შაბათი'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'კვირა',
-    'ორშაბათი',
-    'სამშაბათი',
-    'ოთხშაბათი',
-    'ხუთშაბათი',
-    'პარასკევი',
-    'შაბათი'
-  ],
-      SHORTWEEKDAYS: const ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'],
-      STANDALONESHORTWEEKDAYS: const [
-    'კვი',
-    'ორშ',
-    'სამ',
-    'ოთხ',
-    'ხუთ',
-    'პარ',
-    'შაბ'
-  ],
-      NARROWWEEKDAYS: const ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],
-      STANDALONENARROWWEEKDAYS: const ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],
-      SHORTQUARTERS: const ['I კვ.', 'II კვ.', 'III კვ.', 'IV კვ.'],
-      QUARTERS: const [
-    'I კვარტალი',
-    'II კვარტალი',
-    'III კვარტალი',
-    'IV კვარტალი'
-  ],
-      AMPMS: const ['დილის', 'საღამოს'],
-      DATEFORMATS: const [
-    'EEEE, dd MMMM, y',
-    'd MMMM, y',
-    'd MMM, y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1}, {0}', '{1} {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale kk.
-   */
-  "kk": new DateSymbols(
-      NAME: "kk",
-      ERAS: const ['б.з.д.', 'б.з.'],
-      ERANAMES: const ['б.з.д.', 'б.з.'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'қаңтар',
-    'ақпан',
-    'наурыз',
-    'сәуір',
-    'мамыр',
-    'маусым',
-    'шілде',
-    'тамыз',
-    'қыркүйек',
-    'қазан',
-    'қараша',
-    'желтоқсан'
-  ],
-      STANDALONEMONTHS: const [
-    'қаңтар',
-    'ақпан',
-    'наурыз',
-    'сәуір',
-    'мамыр',
-    'маусым',
-    'шілде',
-    'тамыз',
-    'қыркүйек',
-    'қазан',
-    'қараша',
-    'желтоқсан'
-  ],
-      SHORTMONTHS: const [
-    'қаң.',
-    'ақп.',
-    'нау.',
-    'сәу.',
-    'мам.',
-    'мау.',
-    'шіл.',
-    'там.',
-    'қыр.',
-    'қаз.',
-    'қар.',
-    'желт.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'қаң.',
-    'ақп.',
-    'нау.',
-    'сәу.',
-    'мам.',
-    'мау.',
-    'шіл.',
-    'там.',
-    'қыр.',
-    'қаз.',
-    'қар.',
-    'желт.'
-  ],
-      WEEKDAYS: const [
-    'жексенбі',
-    'дүйсенбі',
-    'сейсенбі',
-    'сәрсенбі',
-    'бейсенбі',
-    'жұма',
-    'сенбі'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'жексенбі',
-    'дүйсенбі',
-    'сейсенбі',
-    'сәрсенбі',
-    'бейсенбі',
-    'жұма',
-    'сенбі'
-  ],
-      SHORTWEEKDAYS: const ['жс.', 'дс.', 'сс.', 'ср.', 'бс.', 'жм.', 'сб.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'жс.',
-    'дс.',
-    'сс.',
-    'ср.',
-    'бс.',
-    'жм.',
-    'сб.'
-  ],
-      NARROWWEEKDAYS: const ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],
-      STANDALONENARROWWEEKDAYS: const ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],
-      SHORTQUARTERS: const ['1-тоқсан', '2-тоқсан', '3-тоқсан', '4-тоқсан'],
-      QUARTERS: const [
-    '1-інші тоқсан',
-    '2-інші тоқсан',
-    '3-інші тоқсан',
-    '4-інші тоқсан'
-  ],
-      AMPMS: const ['түске дейін', 'түстен кейін'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM y \'ж\'.',
-    'd MMMM y \'ж\'.',
-    'dd.MM.y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale km.
-   */
-  "km": new DateSymbols(
-      NAME: "km",
-      ERAS: const ['មុន គ.ស.', 'គ.ស.'],
-      ERANAMES: const ['មុន​គ្រិស្តសករាជ', 'គ្រិស្តសករាជ'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'មករា',
-    'កុម្ភៈ',
-    'មីនា',
-    'មេសា',
-    'ឧសភា',
-    'មិថុនា',
-    'កក្កដា',
-    'សីហា',
-    'កញ្ញា',
-    'តុលា',
-    'វិច្ឆិកា',
-    'ធ្នូ'
-  ],
-      STANDALONEMONTHS: const [
-    'មករា',
-    'កុម្ភៈ',
-    'មីនា',
-    'មេសា',
-    'ឧសភា',
-    'មិថុនា',
-    'កក្កដា',
-    'សីហា',
-    'កញ្ញា',
-    'តុលា',
-    'វិច្ឆិកា',
-    'ធ្នូ'
-  ],
-      SHORTMONTHS: const [
-    'មករា',
-    'កុម្ភៈ',
-    'មីនា',
-    'មេសា',
-    'ឧសភា',
-    'មិថុនា',
-    'កក្កដា',
-    'សីហា',
-    'កញ្ញា',
-    'តុលា',
-    'វិច្ឆិកា',
-    'ធ្នូ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'មករា',
-    'កុម្ភៈ',
-    'មីនា',
-    'មេសា',
-    'ឧសភា',
-    'មិថុនា',
-    'កក្កដា',
-    'សីហា',
-    'កញ្ញា',
-    'តុលា',
-    'វិច្ឆិកា',
-    'ធ្នូ'
-  ],
-      WEEKDAYS: const [
-    'អាទិត្យ',
-    'ចន្ទ',
-    'អង្គារ',
-    'ពុធ',
-    'ព្រហស្បតិ៍',
-    'សុក្រ',
-    'សៅរ៍'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'អាទិត្យ',
-    'ចន្ទ',
-    'អង្គារ',
-    'ពុធ',
-    'ព្រហស្បតិ៍',
-    'សុក្រ',
-    'សៅរ៍'
-  ],
-      SHORTWEEKDAYS: const [
-    'អាទិត្យ',
-    'ចន្ទ',
-    'អង្គារ',
-    'ពុធ',
-    'ព្រហស្បតិ៍',
-    'សុក្រ',
-    'សៅរ៍'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'អាទិត្យ',
-    'ចន្ទ',
-    'អង្គារ',
-    'ពុធ',
-    'ព្រហស្បតិ៍',
-    'សុក្រ',
-    'សៅរ៍'
-  ],
-      NARROWWEEKDAYS: const ['1', '2', '3', '4', '5', '6', '7'],
-      STANDALONENARROWWEEKDAYS: const ['1', '2', '3', '4', '5', '6', '7'],
-      SHORTQUARTERS: const ['ត្រីមាស ១', 'ត្រីមាស ២', 'ត្រីមាស ៣', 'ត្រីមាស ៤'],
-      QUARTERS: const [
-    'ត្រីមាសទី ១',
-    'ត្រីមាសទី ២',
-    'ត្រីមាសទី ៣',
-    'ត្រីមាសទី ៤'
-  ],
-      AMPMS: const ['ព្រឹក', 'ល្ងាច'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale kn.
-   */
-  "kn": new DateSymbols(
-      NAME: "kn",
-      ERAS: const ['ಕ್ರಿ.ಪೂ', 'ಜಾಹೀ'],
-      ERANAMES: const ['ಈಸಪೂವ೯.', 'ಕ್ರಿಸ್ತ ಶಕ'],
-      NARROWMONTHS: const [
-    'ಜ',
-    'ಫೆ',
-    'ಮಾ',
-    'ಏ',
-    'ಮೇ',
-    'ಜೂ',
-    'ಜು',
-    'ಆ',
-    'ಸೆ',
-    'ಅ',
-    'ನ',
-    'ಡಿ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ಜ',
-    'ಫೆ',
-    'ಮಾ',
-    'ಏ',
-    'ಮೇ',
-    'ಜೂ',
-    'ಜು',
-    'ಆ',
-    'ಸೆ',
-    'ಅ',
-    'ನ',
-    'ಡಿ'
-  ],
-      MONTHS: const [
-    'ಜನವರಿ',
-    'ಫೆಬ್ರವರಿ',
-    'ಮಾರ್ಚ್',
-    'ಏಪ್ರಿಲ್',
-    'ಮೇ',
-    'ಜೂನ್',
-    'ಜುಲೈ',
-    'ಆಗಸ್ಟ್',
-    'ಸಪ್ಟೆಂಬರ್',
-    'ಅಕ್ಟೋಬರ್',
-    'ನವೆಂಬರ್',
-    'ಡಿಸೆಂಬರ್'
-  ],
-      STANDALONEMONTHS: const [
-    'ಜನವರಿ',
-    'ಫೆಬ್ರವರಿ',
-    'ಮಾರ್ಚ್',
-    'ಏಪ್ರಿಲ್',
-    'ಮೇ',
-    'ಜೂನ್',
-    'ಜುಲೈ',
-    'ಆಗಸ್ಟ್',
-    'ಸಪ್ಟೆಂಬರ್',
-    'ಅಕ್ಟೋಬರ್',
-    'ನವೆಂಬರ್',
-    'ಡಿಸೆಂಬರ್'
-  ],
-      SHORTMONTHS: const [
-    'ಜನ.',
-    'ಫೆಬ್ರು.',
-    'ಮಾ',
-    'ಏಪ್ರಿ.',
-    'ಮೇ',
-    'ಜೂ',
-    'ಜು.',
-    'ಆಗ.',
-    'ಸೆಪ್ಟೆಂ.',
-    'ಅಕ್ಟೋ.',
-    'ನವೆಂ.',
-    'ಡಿಸೆಂ.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ಜನ.',
-    'ಫೆಬ್ರು.',
-    'ಮಾ',
-    'ಏಪ್ರಿ.',
-    'ಮೇ',
-    'ಜೂ',
-    'ಜು.',
-    'ಆಗ.',
-    'ಸೆಪ್ಟೆಂ.',
-    'ಅಕ್ಟೋ.',
-    'ನವೆಂ.',
-    'ಡಿಸೆಂ.'
-  ],
-      WEEKDAYS: const [
-    'ರವಿವಾರ',
-    'ಸೋಮವಾರ',
-    'ಮಂಗಳವಾರ',
-    'ಬುಧವಾರ',
-    'ಗುರುವಾರ',
-    'ಶುಕ್ರವಾರ',
-    'ಶನಿವಾರ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ರವಿವಾರ',
-    'ಸೋಮವಾರ',
-    'ಮಂಗಳವಾರ',
-    'ಬುಧವಾರ',
-    'ಗುರುವಾರ',
-    'ಶುಕ್ರವಾರ',
-    'ಶನಿವಾರ'
-  ],
-      SHORTWEEKDAYS: const ['ರ.', 'ಸೋ.', 'ಮಂ.', 'ಬು.', 'ಗು.', 'ಶು.', 'ಶನಿ.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'ರವಿ',
-    'ಸೋಮ',
-    'ಮಂಗಳ',
-    'ಬುಧ',
-    'ಗುರು',
-    'ಶುಕ್ರ',
-    'ಶನಿ'
-  ],
-      NARROWWEEKDAYS: const ['ರ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'],
-      STANDALONENARROWWEEKDAYS: const ['ರ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'],
-      SHORTQUARTERS: const ['ತ್ರೈ 1', 'ತ್ರೈ 2', 'ತ್ರೈ 3', 'ತ್ರೈ 4'],
-      QUARTERS: const [
-    '1 ನೇ ತ್ರೈಮಾಸಿಕ',
-    '2ನೇ ತ್ರೈಮಾಸಿಕ',
-    '3 ನೇ ತ್ರೈಮಾಸಿಕ',
-    '4 ನೇ ತ್ರೈಮಾಸಿಕ'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['d MMMM y, EEEE', 'd MMMM y', 'd MMM y', 'd-M-yy'],
-      TIMEFORMATS: const [
-    'hh:mm:ss a zzzz',
-    'hh:mm:ss a z',
-    'hh:mm:ss a',
-    'hh:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ko.
-   */
-  "ko": new DateSymbols(
-      NAME: "ko",
-      ERAS: const ['기원전', '서기'],
-      ERANAMES: const ['서력기원전', '서력기원'],
-      NARROWMONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      MONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      STANDALONEMONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      SHORTMONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1월',
-    '2월',
-    '3월',
-    '4월',
-    '5월',
-    '6월',
-    '7월',
-    '8월',
-    '9월',
-    '10월',
-    '11월',
-    '12월'
-  ],
-      WEEKDAYS: const ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],
-      STANDALONEWEEKDAYS: const [
-    '일요일',
-    '월요일',
-    '화요일',
-    '수요일',
-    '목요일',
-    '금요일',
-    '토요일'
-  ],
-      SHORTWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
-      STANDALONESHORTWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
-      NARROWWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
-      STANDALONENARROWWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
-      SHORTQUARTERS: const ['1분기', '2분기', '3분기', '4분기'],
-      QUARTERS: const ['제 1/4분기', '제 2/4분기', '제 3/4분기', '제 4/4분기'],
-      AMPMS: const ['오전', '오후'],
-      DATEFORMATS: const ['y년 M월 d일 EEEE', 'y년 M월 d일', 'y. M. d.', 'yy. M. d.'],
-      TIMEFORMATS: const [
-    'a h시 m분 s초 zzzz',
-    'a h시 m분 s초 z',
-    'a h:mm:ss',
-    'a h:mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ky.
-   */
-  "ky": new DateSymbols(
-      NAME: "ky",
-      ERAS: const ['б.з. ч.', 'б.з.'],
-      ERANAMES: const ['б.з. чейин', 'б.з.'],
-      NARROWMONTHS: const [
-    'Я',
-    'Ф',
-    'М',
-    'А',
-    'М',
-    'И',
-    'И',
-    'А',
-    'С',
-    'О',
-    'Н',
-    'Д'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Я',
-    'Ф',
-    'М',
-    'А',
-    'М',
-    'И',
-    'И',
-    'А',
-    'С',
-    'О',
-    'Н',
-    'Д'
-  ],
-      MONTHS: const [
-    'январь',
-    'февраль',
-    'март',
-    'апрель',
-    'май',
-    'июнь',
-    'июль',
-    'август',
-    'сентябрь',
-    'октябрь',
-    'ноябрь',
-    'декабрь'
-  ],
-      STANDALONEMONTHS: const [
-    'январь',
-    'февраль',
-    'март',
-    'апрель',
-    'май',
-    'июнь',
-    'июль',
-    'август',
-    'сентябрь',
-    'октябрь',
-    'ноябрь',
-    'декабрь'
-  ],
-      SHORTMONTHS: const [
-    'янв.',
-    'фев.',
-    'мар.',
-    'апр.',
-    'май',
-    'июн.',
-    'июл.',
-    'авг.',
-    'сен.',
-    'окт.',
-    'ноя.',
-    'дек.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'янв.',
-    'фев.',
-    'мар.',
-    'апр.',
-    'май',
-    'июн.',
-    'июл.',
-    'авг.',
-    'сен.',
-    'окт.',
-    'ноя.',
-    'дек.'
-  ],
-      WEEKDAYS: const ['Жек', 'Дүй', 'Шей', 'Шар', 'Бей', 'Жум', 'Ишм'],
-      STANDALONEWEEKDAYS: const [
-    'Жекшемби',
-    'Дүйшөмбү',
-    'Шейшемби',
-    'Шаршемби',
-    'Бейшемби',
-    'Жума',
-    'Ишемби'
-  ],
-      SHORTWEEKDAYS: const ['Жк', 'Дш', 'Ше', 'Ша', 'Бш', 'Жм', 'Иш'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Жек',
-    'Дүй',
-    'Шей',
-    'Шар',
-    'Бей',
-    'Жум',
-    'Ишм'
-  ],
-      NARROWWEEKDAYS: const ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],
-      STANDALONENARROWWEEKDAYS: const ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],
-      SHORTQUARTERS: const ['1-чей.', '2-чей.', '3-чей.', '4-чей.'],
-      QUARTERS: const ['1-чейрек', '2-чейрек', '3-чейрек', '4-чейрек'],
-      AMPMS: const ['түшкө чейинки', 'түштөн кийинки'],
-      DATEFORMATS: const [
-    'EEEE, d-MMMM, y-\'ж\'.',
-    'd-MMMM, y-\'ж\'.',
-    'dd.MM.y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ln.
-   */
-  "ln": new DateSymbols(
-      NAME: "ln",
-      ERAS: const ['libóso ya', 'nsima ya Y'],
-      ERANAMES: const ['Yambo ya Yézu Krís', 'Nsima ya Yézu Krís'],
-      NARROWMONTHS: const [
-    'y',
-    'f',
-    'm',
-    'a',
-    'm',
-    'y',
-    'y',
-    'a',
-    's',
-    'ɔ',
-    'n',
-    'd'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'y',
-    'f',
-    'm',
-    'a',
-    'm',
-    'y',
-    'y',
-    'a',
-    's',
-    'ɔ',
-    'n',
-    'd'
-  ],
-      MONTHS: const [
-    'sánzá ya yambo',
-    'sánzá ya míbalé',
-    'sánzá ya mísáto',
-    'sánzá ya mínei',
-    'sánzá ya mítáno',
-    'sánzá ya motóbá',
-    'sánzá ya nsambo',
-    'sánzá ya mwambe',
-    'sánzá ya libwa',
-    'sánzá ya zómi',
-    'sánzá ya zómi na mɔ̌kɔ́',
-    'sánzá ya zómi na míbalé'
-  ],
-      STANDALONEMONTHS: const [
-    'sánzá ya yambo',
-    'sánzá ya míbalé',
-    'sánzá ya mísáto',
-    'sánzá ya mínei',
-    'sánzá ya mítáno',
-    'sánzá ya motóbá',
-    'sánzá ya nsambo',
-    'sánzá ya mwambe',
-    'sánzá ya libwa',
-    'sánzá ya zómi',
-    'sánzá ya zómi na mɔ̌kɔ́',
-    'sánzá ya zómi na míbalé'
-  ],
-      SHORTMONTHS: const [
-    'yan',
-    'fbl',
-    'msi',
-    'apl',
-    'mai',
-    'yun',
-    'yul',
-    'agt',
-    'stb',
-    'ɔtb',
-    'nvb',
-    'dsb'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'yan',
-    'fbl',
-    'msi',
-    'apl',
-    'mai',
-    'yun',
-    'yul',
-    'agt',
-    'stb',
-    'ɔtb',
-    'nvb',
-    'dsb'
-  ],
-      WEEKDAYS: const [
-    'eyenga',
-    'mokɔlɔ mwa yambo',
-    'mokɔlɔ mwa míbalé',
-    'mokɔlɔ mwa mísáto',
-    'mokɔlɔ ya mínéi',
-    'mokɔlɔ ya mítáno',
-    'mpɔ́sɔ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'eyenga',
-    'mokɔlɔ mwa yambo',
-    'mokɔlɔ mwa míbalé',
-    'mokɔlɔ mwa mísáto',
-    'mokɔlɔ ya mínéi',
-    'mokɔlɔ ya mítáno',
-    'mpɔ́sɔ'
-  ],
-      SHORTWEEKDAYS: const ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'],
-      STANDALONESHORTWEEKDAYS: const [
-    'eye',
-    'ybo',
-    'mbl',
-    'mst',
-    'min',
-    'mtn',
-    'mps'
-  ],
-      NARROWWEEKDAYS: const ['e', 'y', 'm', 'm', 'm', 'm', 'p'],
-      STANDALONENARROWWEEKDAYS: const ['e', 'y', 'm', 'm', 'm', 'm', 'p'],
-      SHORTQUARTERS: const ['SM1', 'SM2', 'SM3', 'SM4'],
-      QUARTERS: const [
-    'sánzá mísáto ya yambo',
-    'sánzá mísáto ya míbalé',
-    'sánzá mísáto ya mísáto',
-    'sánzá mísáto ya mínei'
-  ],
-      AMPMS: const ['ntɔ́ngɔ́', 'mpókwa'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale lo.
-   */
-  "lo": new DateSymbols(
-      NAME: "lo",
-      ERAS: const ['ກ່ອນ ຄ.ສ.', 'ຄ.ສ.'],
-      ERANAMES: const ['ກ່ອນ ຄ.ສ.', 'ຄ.ສ.'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'ມັງກອນ',
-    'ກຸມພາ',
-    'ມີນາ',
-    'ເມສາ',
-    'ພຶດສະພາ',
-    'ມິຖຸນາ',
-    'ກໍລະກົດ',
-    'ສິງຫາ',
-    'ກັນຍາ',
-    'ຕຸລາ',
-    'ພະຈິກ',
-    'ທັນວາ'
-  ],
-      STANDALONEMONTHS: const [
-    'ມັງກອນ',
-    'ກຸມພາ',
-    'ມີນາ',
-    'ເມສາ',
-    'ພຶດສະພາ',
-    'ມິຖຸນາ',
-    'ກໍລະກົດ',
-    'ສິງຫາ',
-    'ກັນຍາ',
-    'ຕຸລາ',
-    'ພະຈິກ',
-    'ທັນວາ'
-  ],
-      SHORTMONTHS: const [
-    'ມ.ກ.',
-    'ກ.ພ.',
-    'ມ.ນ.',
-    'ມ.ສ.',
-    'ພ.ພ.',
-    'ມິ.ຖ.',
-    'ກ.ລ.',
-    'ສ.ຫ.',
-    'ກ.ຍ.',
-    'ຕ.ລ.',
-    'ພ.ຈ.',
-    'ທ.ວ.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ມ.ກ.',
-    'ກ.ພ.',
-    'ມ.ນ.',
-    'ມ.ສ.',
-    'ພ.ພ.',
-    'ມິ.ຖ.',
-    'ກ.ລ.',
-    'ສ.ຫ.',
-    'ກ.ຍ.',
-    'ຕ.ລ.',
-    'ພ.ຈ.',
-    'ທ.ວ.'
-  ],
-      WEEKDAYS: const [
-    'ວັນອາທິດ',
-    'ວັນຈັນ',
-    'ວັນອັງຄານ',
-    'ວັນພຸດ',
-    'ວັນພະຫັດ',
-    'ວັນສຸກ',
-    'ວັນເສົາ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ວັນອາທິດ',
-    'ວັນຈັນ',
-    'ວັນອັງຄານ',
-    'ວັນພຸດ',
-    'ວັນພະຫັດ',
-    'ວັນສຸກ',
-    'ວັນເສົາ'
-  ],
-      SHORTWEEKDAYS: const [
-    'ວັນອາທິດ',
-    'ວັນຈັນ',
-    'ວັນອັງຄານ',
-    'ວັນພຸດ',
-    'ວັນພະຫັດ',
-    'ວັນສຸກ',
-    'ວັນເສົາ'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ວັນອາທິດ',
-    'ວັນຈັນ',
-    'ວັນອັງຄານ',
-    'ວັນພຸດ',
-    'ວັນພະຫັດ',
-    'ວັນສຸກ',
-    'ວັນເສົາ'
-  ],
-      NARROWWEEKDAYS: const ['1', '2', '3', '4', '5', '6', '7'],
-      STANDALONENARROWWEEKDAYS: const ['ທ', 'ຈ', 'ຄ', '​ພຸ', 'ພ', '​ສຸ', 'ສ'],
-      SHORTQUARTERS: const ['ຕມ1', 'ຕມ2', 'ຕມ3', 'ຕມ4'],
-      QUARTERS: const ['ໄຕຣມາດ 1', 'ໄຕຣມາດ 2', 'ໄຕຣມາດ 3', 'ໄຕຣມາດ 4'],
-      AMPMS: const ['ກ່ອນທ່ຽງ', 'ຫຼັງທ່ຽງ'],
-      DATEFORMATS: const ['EEEE ທີ d MMMM G y', 'd MMMM y', 'd MMM y', 'd/M/y'],
-      TIMEFORMATS: const [
-    'H ໂມງ m ນາທີ ss ວິນາທີ zzzz',
-    'H ໂມງ m ນາທີ ss ວິນາທີ z',
-    'H:mm:ss',
-    'H:mm'
-  ],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale lt.
-   */
-  "lt": new DateSymbols(
-      NAME: "lt",
-      ERAS: const ['pr. Kr.', 'po Kr.'],
-      ERANAMES: const ['prieš Kristų', 'po Kristaus'],
-      NARROWMONTHS: const [
-    'S',
-    'V',
-    'K',
-    'B',
-    'G',
-    'B',
-    'L',
-    'R',
-    'R',
-    'S',
-    'L',
-    'G'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'S',
-    'V',
-    'K',
-    'B',
-    'G',
-    'B',
-    'L',
-    'R',
-    'R',
-    'S',
-    'L',
-    'G'
-  ],
-      MONTHS: const [
-    'sausis',
-    'vasaris',
-    'kovas',
-    'balandis',
-    'gegužė',
-    'birželis',
-    'liepa',
-    'rugpjūtis',
-    'rugsėjis',
-    'spalis',
-    'lapkritis',
-    'gruodis'
-  ],
-      STANDALONEMONTHS: const [
-    'sausis',
-    'vasaris',
-    'kovas',
-    'balandis',
-    'gegužė',
-    'birželis',
-    'liepa',
-    'rugpjūtis',
-    'rugsėjis',
-    'spalis',
-    'lapkritis',
-    'gruodis'
-  ],
-      SHORTMONTHS: const [
-    'saus.',
-    'vas.',
-    'kov.',
-    'bal.',
-    'geg.',
-    'birž.',
-    'liep.',
-    'rugp.',
-    'rugs.',
-    'spal.',
-    'lapkr.',
-    'gruod.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'saus.',
-    'vas.',
-    'kov.',
-    'bal.',
-    'geg.',
-    'birž.',
-    'liep.',
-    'rugp.',
-    'rugs.',
-    'spal.',
-    'lapkr.',
-    'gruod.'
-  ],
-      WEEKDAYS: const [
-    'sekmadienis',
-    'pirmadienis',
-    'antradienis',
-    'trečiadienis',
-    'ketvirtadienis',
-    'penktadienis',
-    'šeštadienis'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'sekmadienis',
-    'pirmadienis',
-    'antradienis',
-    'trečiadienis',
-    'ketvirtadienis',
-    'penktadienis',
-    'šeštadienis'
-  ],
-      SHORTWEEKDAYS: const ['sk', 'pr', 'an', 'tr', 'kt', 'pn', 'št'],
-      STANDALONESHORTWEEKDAYS: const ['sk', 'pr', 'an', 'tr', 'kt', 'pn', 'št'],
-      NARROWWEEKDAYS: const ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],
-      SHORTQUARTERS: const ['I k.', 'II k.', 'III k.', 'IV k.'],
-      QUARTERS: const [
-    'I ketvirtis',
-    'II ketvirtis',
-    'III ketvirtis',
-    'IV ketvirtis'
-  ],
-      AMPMS: const ['priešpiet', 'popiet'],
-      DATEFORMATS: const [
-    'y \'m\'. MMMM d \'d\'., EEEE',
-    'y \'m\'. MMMM d \'d\'.',
-    'y MMM d',
-    'y-MM-dd'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale lv.
-   */
-  "lv": new DateSymbols(
-      NAME: "lv",
-      ERAS: const ['p.m.ē.', 'm.ē.'],
-      ERANAMES: const ['pirms mūsu ēras', 'mūsu ērā'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janvāris',
-    'februāris',
-    'marts',
-    'aprīlis',
-    'maijs',
-    'jūnijs',
-    'jūlijs',
-    'augusts',
-    'septembris',
-    'oktobris',
-    'novembris',
-    'decembris'
-  ],
-      STANDALONEMONTHS: const [
-    'Janvāris',
-    'Februāris',
-    'Marts',
-    'Aprīlis',
-    'Maijs',
-    'Jūnijs',
-    'Jūlijs',
-    'Augusts',
-    'Septembris',
-    'Oktobris',
-    'Novembris',
-    'Decembris'
-  ],
-      SHORTMONTHS: const [
-    'janv.',
-    'febr.',
-    'marts',
-    'apr.',
-    'maijs',
-    'jūn.',
-    'jūl.',
-    'aug.',
-    'sept.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Janv.',
-    'Febr.',
-    'Marts',
-    'Apr.',
-    'Maijs',
-    'Jūn.',
-    'Jūl.',
-    'Aug.',
-    'Sept.',
-    'Okt.',
-    'Nov.',
-    'Dec.'
-  ],
-      WEEKDAYS: const [
-    'svētdiena',
-    'pirmdiena',
-    'otrdiena',
-    'trešdiena',
-    'ceturtdiena',
-    'piektdiena',
-    'sestdiena'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Svētdiena',
-    'Pirmdiena',
-    'Otrdiena',
-    'Trešdiena',
-    'Ceturtdiena',
-    'Piektdiena',
-    'Sestdiena'
-  ],
-      SHORTWEEKDAYS: const ['Sv', 'Pr', 'Ot', 'Tr', 'Ce', 'Pk', 'Se'],
-      STANDALONESHORTWEEKDAYS: const ['Sv', 'Pr', 'Ot', 'Tr', 'Ce', 'Pk', 'Se'],
-      NARROWWEEKDAYS: const ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
-      SHORTQUARTERS: const ['C1', 'C2', 'C3', 'C4'],
-      QUARTERS: const [
-    '1. ceturksnis',
-    '2. ceturksnis',
-    '3. ceturksnis',
-    '4. ceturksnis'
-  ],
-      AMPMS: const ['priekšpusdienā', 'pēcpusdienā'],
-      DATEFORMATS: const [
-    'EEEE, y. \'gada\' d. MMMM',
-    'y. \'gada\' d. MMMM',
-    'y. \'gada\' d. MMM',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale mk.
-   */
-  "mk": new DateSymbols(
-      NAME: "mk",
-      ERAS: const ['пр.н.е.', 'н.е.'],
-      ERANAMES: const ['пр.н.е.', 'н.е.'],
-      NARROWMONTHS: const [
-    'ј',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ј',
-    'ј',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ј',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ј',
-    'ј',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      MONTHS: const [
-    'јануари',
-    'февруари',
-    'март',
-    'април',
-    'мај',
-    'јуни',
-    'јули',
-    'август',
-    'септември',
-    'октомври',
-    'ноември',
-    'декември'
-  ],
-      STANDALONEMONTHS: const [
-    'јануари',
-    'февруари',
-    'март',
-    'април',
-    'мај',
-    'јуни',
-    'јули',
-    'август',
-    'септември',
-    'октомври',
-    'ноември',
-    'декември'
-  ],
-      SHORTMONTHS: const [
-    'јан.',
-    'фев.',
-    'мар.',
-    'апр.',
-    'мај',
-    'јун.',
-    'јул.',
-    'авг.',
-    'септ.',
-    'окт.',
-    'ноем.',
-    'дек.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'јан.',
-    'фев.',
-    'мар.',
-    'апр.',
-    'мај',
-    'јун.',
-    'јул.',
-    'авг.',
-    'септ.',
-    'окт.',
-    'ноем.',
-    'дек.'
-  ],
-      WEEKDAYS: const [
-    'недела',
-    'понеделник',
-    'вторник',
-    'среда',
-    'четврток',
-    'петок',
-    'сабота'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'недела',
-    'понеделник',
-    'вторник',
-    'среда',
-    'четврток',
-    'петок',
-    'сабота'
-  ],
-      SHORTWEEKDAYS: const [
-    'нед.',
-    'пон.',
-    'вт.',
-    'сре.',
-    'чет.',
-    'пет.',
-    'саб.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'нед.',
-    'пон.',
-    'вт.',
-    'сре.',
-    'чет.',
-    'пет.',
-    'саб.'
-  ],
-      NARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
-      STANDALONENARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    'прво тромесечје',
-    'второ тромесечје',
-    'трето тромесечје',
-    'четврто тромесечје'
-  ],
-      AMPMS: const ['претпладне', 'попладне'],
-      DATEFORMATS: const [
-    'EEEE, dd MMMM y \'г\'.',
-    'dd MMMM y \'г\'.',
-    'dd.M.y',
-    'dd.M.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ml.
-   */
-  "ml": new DateSymbols(
-      NAME: "ml",
-      ERAS: const ['ക്രി.മൂ', 'എഡി'],
-      ERANAMES: const ['ക്രിസ്തുവിനു് മുമ്പ്‌', 'ക്രിസ്തുവിന് പിൻപ്'],
-      NARROWMONTHS: const [
-    'ജ',
-    'ഫെ',
-    'മാ',
-    'ഏ',
-    'മേ',
-    'ജൂ',
-    'ജൂ',
-    'ഓ',
-    'സെ',
-    'ഒ',
-    'ന',
-    'ഡി'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ജ',
-    'ഫെ',
-    'മാ',
-    'ഏ',
-    'മേ',
-    'ജൂ',
-    'ജൂ',
-    'ഓ',
-    'സെ',
-    'ഒ',
-    'ന',
-    'ഡി'
-  ],
-      MONTHS: const [
-    'ജനുവരി',
-    'ഫെബ്രുവരി',
-    'മാർച്ച്',
-    'ഏപ്രിൽ',
-    'മേയ്',
-    'ജൂൺ',
-    'ജൂലൈ',
-    'ആഗസ്റ്റ്',
-    'സെപ്റ്റംബർ',
-    'ഒക്‌ടോബർ',
-    'നവംബർ',
-    'ഡിസംബർ'
-  ],
-      STANDALONEMONTHS: const [
-    'ജനുവരി',
-    'ഫെബ്രുവരി',
-    'മാർച്ച്',
-    'ഏപ്രിൽ',
-    'മേയ്',
-    'ജൂൺ',
-    'ജൂലൈ',
-    'ആഗസ്റ്റ്',
-    'സെപ്റ്റംബർ',
-    'ഒക്‌ടോബർ',
-    'നവംബർ',
-    'ഡിസംബർ'
-  ],
-      SHORTMONTHS: const [
-    'ജനു',
-    'ഫെബ്രു',
-    'മാർ',
-    'ഏപ്രി',
-    'മേയ്',
-    'ജൂൺ',
-    'ജൂലൈ',
-    'ഓഗ',
-    'സെപ്റ്റം',
-    'ഒക്ടോ',
-    'നവം',
-    'ഡിസം'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ജനു',
-    'ഫെബ്രു',
-    'മാർ',
-    'ഏപ്രി',
-    'മേയ്',
-    'ജൂൺ',
-    'ജൂലൈ',
-    'ഓഗ',
-    'സെപ്റ്റം',
-    'ഒക്ടോ',
-    'നവം',
-    'ഡിസം'
-  ],
-      WEEKDAYS: const [
-    'ഞായറാഴ്‌ച',
-    'തിങ്കളാഴ്‌ച',
-    'ചൊവ്വാഴ്ച',
-    'ബുധനാഴ്‌ച',
-    'വ്യാഴാഴ്‌ച',
-    'വെള്ളിയാഴ്‌ച',
-    'ശനിയാഴ്‌ച'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ഞായറാഴ്‌ച',
-    'തിങ്കളാഴ്‌ച',
-    'ചൊവ്വാഴ്‌ച',
-    'ബുധനാഴ്‌ച',
-    'വ്യാഴാഴ്‌ച',
-    'വെള്ളിയാഴ്‌ച',
-    'ശനിയാഴ്‌ച'
-  ],
-      SHORTWEEKDAYS: const [
-    'ഞായർ',
-    'തിങ്കൾ',
-    'ചൊവ്വ',
-    'ബുധൻ',
-    'വ്യാഴം',
-    'വെള്ളി',
-    'ശനി'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ഞായർ',
-    'തിങ്കൾ',
-    'ചൊവ്വ',
-    'ബുധൻ',
-    'വ്യാഴം',
-    'വെള്ളി',
-    'ശനി'
-  ],
-      NARROWWEEKDAYS: const ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],
-      STANDALONENARROWWEEKDAYS: const [
-    'ഞാ',
-    'തി',
-    'ചൊ',
-    'ബു',
-    'വ്യാ',
-    'വെ',
-    'ശ'
-  ],
-      SHORTQUARTERS: const [
-    'ഒന്നാം പാദം',
-    'രണ്ടാം പാദം',
-    'മൂന്നാം പാദം',
-    'നാലാം പാദം'
-  ],
-      QUARTERS: const [
-    'ഒന്നാം പാദം',
-    'രണ്ടാം പാദം',
-    'മൂന്നാം പാദം',
-    'നാലാം പാദം'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'y, MMMM d, EEEE',
-    'y, MMMM d',
-    'y, MMM d',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale mn.
-   */
-  "mn": new DateSymbols(
-      NAME: "mn",
-      ERAS: const ['МЭӨ', 'МЭ'],
-      ERANAMES: const ['манай эриний өмнөх', 'манай эриний'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'Нэгдүгээр сар',
-    'Хоёрдугаар сар',
-    'Гуравдугаар сар',
-    'Дөрөвдүгээр сар',
-    'Тавдугаар сар',
-    'Зургадугаар сар',
-    'Долдугаар сар',
-    'Наймдугаар сар',
-    'Есдүгээр сар',
-    'Аравдугаар сар',
-    'Арван нэгдүгээр сар',
-    'Арван хоёрдугаар сар'
-  ],
-      STANDALONEMONTHS: const [
-    'Нэгдүгээр сар',
-    'Хоёрдугаар сар',
-    'Гуравдугаар сар',
-    'Дөрөвдүгээр сар',
-    'Тавдугаар сар',
-    'Зургадугаар сар',
-    'Долдугаар сар',
-    'Наймдугаар сар',
-    'Есдүгээр сар',
-    'Аравдугаар сар',
-    'Арван нэгдүгээр сар',
-    'Арван хоёрдугаар сар'
-  ],
-      SHORTMONTHS: const [
-    '1-р сар',
-    '2-р сар',
-    '3-р сар',
-    '4-р сар',
-    '5-р сар',
-    '6-р сар',
-    '7-р сар',
-    '8-р сар',
-    '9-р сар',
-    '10-р сар',
-    '11-р сар',
-    '12-р сар'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1-р сар',
-    '2-р сар',
-    '3-р сар',
-    '4-р сар',
-    '5-р сар',
-    '6-р сар',
-    '7-р сар',
-    '8-р сар',
-    '9-р сар',
-    '10-р сар',
-    '11-р сар',
-    '12-р сар'
-  ],
-      WEEKDAYS: const [
-    'ням',
-    'даваа',
-    'мягмар',
-    'лхагва',
-    'пүрэв',
-    'баасан',
-    'бямба'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ням',
-    'даваа',
-    'мягмар',
-    'лхагва',
-    'пүрэв',
-    'баасан',
-    'бямба'
-  ],
-      SHORTWEEKDAYS: const ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],
-      STANDALONESHORTWEEKDAYS: const ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],
-      NARROWWEEKDAYS: const ['1', '2', '3', '4', '5', '6', '7'],
-      STANDALONENARROWWEEKDAYS: const ['1', '2', '3', '4', '5', '6', '7'],
-      SHORTQUARTERS: const ['У1', 'У2', 'У3', 'У4'],
-      QUARTERS: const ['1-р улирал', '2-р улирал', '3-р улирал', '4-р улирал'],
-      AMPMS: const ['ҮӨ', 'ҮХ'],
-      DATEFORMATS: const [
-    'EEEE, y \'оны\' MMMM \'сарын\' dd',
-    'y \'оны\' MMMM \'сарын\' d',
-    'y MMM d',
-    'y-MM-dd'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale mr.
-   */
-  "mr": new DateSymbols(
-      NAME: "mr",
-      ERAS: const ['ईसापूर्व', 'सन'],
-      ERANAMES: const ['ईसवीसनपूर्व', 'ईसवीसन'],
-      NARROWMONTHS: const [
-    'जा',
-    'फे',
-    'मा',
-    'ए',
-    'मे',
-    'जू',
-    'जु',
-    'ऑ',
-    'स',
-    'ऑ',
-    'नो',
-    'डि'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'जा',
-    'फे',
-    'मा',
-    'ए',
-    'मे',
-    'जू',
-    'जु',
-    'ऑ',
-    'स',
-    'ऑ',
-    'नो',
-    'डि'
-  ],
-      MONTHS: const [
-    'जानेवारी',
-    'फेब्रुवारी',
-    'मार्च',
-    'एप्रिल',
-    'मे',
-    'जून',
-    'जुलै',
-    'ऑगस्ट',
-    'सप्टेंबर',
-    'ऑक्टोबर',
-    'नोव्हेंबर',
-    'डिसेंबर'
-  ],
-      STANDALONEMONTHS: const [
-    'जानेवारी',
-    'फेब्रुवारी',
-    'मार्च',
-    'एप्रिल',
-    'मे',
-    'जून',
-    'जुलै',
-    'ऑगस्ट',
-    'सप्टेंबर',
-    'ऑक्टोबर',
-    'नोव्हेंबर',
-    'डिसेंबर'
-  ],
-      SHORTMONTHS: const [
-    'जाने',
-    'फेब्रु',
-    'मार्च',
-    'एप्रि',
-    'मे',
-    'जून',
-    'जुलै',
-    'ऑग',
-    'सप्टें',
-    'ऑक्टो',
-    'नोव्हें',
-    'डिसें'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'जाने',
-    'फेब्रु',
-    'मार्च',
-    'एप्रि',
-    'मे',
-    'जून',
-    'जुलै',
-    'ऑग',
-    'सप्टें',
-    'ऑक्टो',
-    'नोव्हें',
-    'डिसें'
-  ],
-      WEEKDAYS: const [
-    'रविवार',
-    'सोमवार',
-    'मंगळवार',
-    'बुधवार',
-    'गुरुवार',
-    'शुक्रवार',
-    'शनिवार'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'रविवार',
-    'सोमवार',
-    'मंगळवार',
-    'बुधवार',
-    'गुरुवार',
-    'शुक्रवार',
-    'शनिवार'
-  ],
-      SHORTWEEKDAYS: const [
-    'रवि',
-    'सोम',
-    'मंगळ',
-    'बुध',
-    'गुरु',
-    'शुक्र',
-    'शनि'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'रवि',
-    'सोम',
-    'मंगळ',
-    'बुध',
-    'गुरु',
-    'शुक्र',
-    'शनि'
-  ],
-      NARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
-      STANDALONENARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
-      SHORTQUARTERS: const ['ति1', 'ति2', 'ति3', 'ति4'],
-      QUARTERS: const [
-    'प्रथम तिमाही',
-    'द्वितीय तिमाही',
-    'तृतीय तिमाही',
-    'चतुर्थ तिमाही'
-  ],
-      AMPMS: const ['[AM]', '[PM]'],
-      DATEFORMATS: const ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'रोजी\' {0}',
-    '{1} \'रोजी\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale ms.
-   */
-  "ms": new DateSymbols(
-      NAME: "ms",
-      ERAS: const ['S.M.', 'TM'],
-      ERANAMES: const ['S.M.', 'TM'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'O',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'O',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januari',
-    'Februari',
-    'Mac',
-    'April',
-    'Mei',
-    'Jun',
-    'Julai',
-    'Ogos',
-    'September',
-    'Oktober',
-    'November',
-    'Disember'
-  ],
-      STANDALONEMONTHS: const [
-    'Januari',
-    'Februari',
-    'Mac',
-    'April',
-    'Mei',
-    'Jun',
-    'Julai',
-    'Ogos',
-    'September',
-    'Oktober',
-    'November',
-    'Disember'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mac',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Ogo',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dis'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mac',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Ogo',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dis'
-  ],
-      WEEKDAYS: const [
-    'Ahad',
-    'Isnin',
-    'Selasa',
-    'Rabu',
-    'Khamis',
-    'Jumaat',
-    'Sabtu'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Ahad',
-    'Isnin',
-    'Selasa',
-    'Rabu',
-    'Khamis',
-    'Jumaat',
-    'Sabtu'
-  ],
-      SHORTWEEKDAYS: const ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Ahd',
-    'Isn',
-    'Sel',
-    'Rab',
-    'Kha',
-    'Jum',
-    'Sab'
-  ],
-      NARROWWEEKDAYS: const ['A', 'I', 'S', 'R', 'K', 'J', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['A', 'I', 'S', 'R', 'K', 'J', 'S'],
-      SHORTQUARTERS: const ['S1', 'S2', 'S3', 'S4'],
-      QUARTERS: const ['Suku pertama', 'Suku Ke-2', 'Suku Ke-3', 'Suku Ke-4'],
-      AMPMS: const ['PG', 'PTG'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale mt.
-   */
-  "mt": new DateSymbols(
-      NAME: "mt",
-      ERAS: const ['QK', 'WK'],
-      ERANAMES: const ['Qabel Kristu', 'Wara Kristu'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'Ġ',
-    'L',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'Ġ',
-    'L',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Jannar',
-    'Frar',
-    'Marzu',
-    'April',
-    'Mejju',
-    'Ġunju',
-    'Lulju',
-    'Awwissu',
-    'Settembru',
-    'Ottubru',
-    'Novembru',
-    'Diċembru'
-  ],
-      STANDALONEMONTHS: const [
-    'Jannar',
-    'Frar',
-    'Marzu',
-    'April',
-    'Mejju',
-    'Ġunju',
-    'Lulju',
-    'Awwissu',
-    'Settembru',
-    'Ottubru',
-    'Novembru',
-    'Diċembru'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Fra',
-    'Mar',
-    'Apr',
-    'Mej',
-    'Ġun',
-    'Lul',
-    'Aww',
-    'Set',
-    'Ott',
-    'Nov',
-    'Diċ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Fra',
-    'Mar',
-    'Apr',
-    'Mej',
-    'Ġun',
-    'Lul',
-    'Aww',
-    'Set',
-    'Ott',
-    'Nov',
-    'Diċ'
-  ],
-      WEEKDAYS: const [
-    'Il-Ħadd',
-    'It-Tnejn',
-    'It-Tlieta',
-    'L-Erbgħa',
-    'Il-Ħamis',
-    'Il-Ġimgħa',
-    'Is-Sibt'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Il-Ħadd',
-    'It-Tnejn',
-    'It-Tlieta',
-    'L-Erbgħa',
-    'Il-Ħamis',
-    'Il-Ġimgħa',
-    'Is-Sibt'
-  ],
-      SHORTWEEKDAYS: const ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Ħad',
-    'Tne',
-    'Tli',
-    'Erb',
-    'Ħam',
-    'Ġim',
-    'Sib'
-  ],
-      NARROWWEEKDAYS: const ['Ħ', 'T', 'T', 'E', 'Ħ', 'Ġ', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['Ħ', 'T', 'T', 'E', 'Ħ', 'Ġ', 'S'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      AMPMS: const ['QN', 'WN'],
-      DATEFORMATS: const [
-    'EEEE, d \'ta\'’ MMMM y',
-    'd \'ta\'’ MMMM y',
-    'dd MMM y',
-    'dd/MM/y'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale my.
-   */
-  "my": new DateSymbols(
-      NAME: "my",
-      ERAS: const ['ဘီစီ', 'အေဒီ'],
-      ERANAMES: const ['ခရစ်တော် မပေါ်မီကာလ', 'ခရစ်တော် ပေါ်ထွန်းပြီးကာလ'],
-      NARROWMONTHS: const [
-    'ဇ',
-    'ဖ',
-    'မ',
-    'ဧ',
-    'မ',
-    'ဇ',
-    'ဇ',
-    'ဩ',
-    'စ',
-    'အ',
-    'န',
-    'ဒ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ဇ',
-    'ဖ',
-    'မ',
-    'ဧ',
-    'မ',
-    'ဇ',
-    'ဇ',
-    'ဩ',
-    'စ',
-    'အ',
-    'န',
-    'ဒ'
-  ],
-      MONTHS: const [
-    'ဇန်နဝါရီ',
-    'ဖေဖော်ဝါရီ',
-    'မတ်',
-    'ဧပြီ',
-    'မေ',
-    'ဇွန်',
-    'ဇူလိုင်',
-    'ဩဂုတ်',
-    'စက်တင်ဘာ',
-    'အောက်တိုဘာ',
-    'နိုဝင်ဘာ',
-    'ဒီဇင်ဘာ'
-  ],
-      STANDALONEMONTHS: const [
-    'ဇန်နဝါရီ',
-    'ဖေဖော်ဝါရီ',
-    'မတ်',
-    'ဧပြီ',
-    'မေ',
-    'ဇွန်',
-    'ဇူလိုင်',
-    'ဩဂုတ်',
-    'စက်တင်ဘာ',
-    'အောက်တိုဘာ',
-    'နိုဝင်ဘာ',
-    'ဒီဇင်ဘာ'
-  ],
-      SHORTMONTHS: const [
-    'ဇန်နဝါရီ',
-    'ဖေဖော်ဝါရီ',
-    'မတ်',
-    'ဧပြီ',
-    'မေ',
-    'ဇွန်',
-    'ဇူလိုင်',
-    'ဩဂုတ်',
-    'စက်တင်ဘာ',
-    'အောက်တိုဘာ',
-    'နိုဝင်ဘာ',
-    'ဒီဇင်ဘာ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ဇန်နဝါရီ',
-    'ဖေဖော်ဝါရီ',
-    'မတ်',
-    'ဧပြီ',
-    'မေ',
-    'ဇွန်',
-    'ဇူလိုင်',
-    'ဩဂုတ်',
-    'စက်တင်ဘာ',
-    'အောက်တိုဘာ',
-    'နိုဝင်ဘာ',
-    'ဒီဇင်ဘာ'
-  ],
-      WEEKDAYS: const [
-    'တနင်္ဂနွေ',
-    'တနင်္လာ',
-    'အင်္ဂါ',
-    'ဗုဒ္ဓဟူး',
-    'ကြာသပတေး',
-    'သောကြာ',
-    'စနေ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'တနင်္ဂနွေ',
-    'တနင်္လာ',
-    'အင်္ဂါ',
-    'ဗုဒ္ဓဟူး',
-    'ကြာသပတေး',
-    'သောကြာ',
-    'စနေ'
-  ],
-      SHORTWEEKDAYS: const [
-    'တနင်္ဂနွေ',
-    'တနင်္လာ',
-    'အင်္ဂါ',
-    'ဗုဒ္ဓဟူး',
-    'ကြာသပတေး',
-    'သောကြာ',
-    'စနေ'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'တနင်္ဂနွေ',
-    'တနင်္လာ',
-    'အင်္ဂါ',
-    'ဗုဒ္ဓဟူး',
-    'ကြာသပတေး',
-    'သောကြာ',
-    'စနေ'
-  ],
-      NARROWWEEKDAYS: const ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],
-      STANDALONENARROWWEEKDAYS: const ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],
-      SHORTQUARTERS: const [
-    'ပထမ သုံးလပတ်',
-    'ဒုတိယ သုံးလပတ်',
-    'တတိယ သုံးလပတ်',
-    'စတုတ္ထ သုံးလပတ်'
-  ],
-      QUARTERS: const [
-    'ပထမ သုံးလပတ်',
-    'ဒုတိယ သုံးလပတ်',
-    'တတိယ သုံးလပတ်',
-    'စတုတ္ထ သုံးလပတ်'
-  ],
-      AMPMS: const ['နံနက်', 'ညနေ'],
-      DATEFORMATS: const ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'yy/MM/dd'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1}မှာ {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale nb.
-   */
-  "nb": new DateSymbols(
-      NAME: "nb",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['f.Kr.', 'e.Kr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      STANDALONEMONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'mai',
-    'jun.',
-    'jul.',
-    'aug.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'des.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'mai',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'des'
-  ],
-      WEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      SHORTWEEKDAYS: const [
-    'søn.',
-    'man.',
-    'tir.',
-    'ons.',
-    'tor.',
-    'fre.',
-    'lør.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'sø.',
-    'ma.',
-    'ti.',
-    'on.',
-    'to.',
-    'fr.',
-    'lø.'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const [
-    'EEEE d. MMMM y',
-    'd. MMMM y',
-    'd. MMM y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const [
-    '{1} {0}',
-    '{1} \'kl.\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale ne.
-   */
-  "ne": new DateSymbols(
-      NAME: "ne",
-      ERAS: const ['ईसा पूर्व', 'सन्'],
-      ERANAMES: const ['ईसा पूर्व', 'सन्'],
-      NARROWMONTHS: const [
-    '१',
-    '२',
-    '३',
-    '४',
-    '५',
-    '६',
-    '७',
-    '८',
-    '९',
-    '१०',
-    '११',
-    '१२'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '१',
-    '२',
-    '३',
-    '४',
-    '५',
-    '६',
-    '७',
-    '८',
-    '९',
-    '१०',
-    '११',
-    '१२'
-  ],
-      MONTHS: const [
-    'जनवरी',
-    'फेब्रुअरी',
-    'मार्च',
-    'अप्रिल',
-    'मे',
-    'जुन',
-    'जुलाई',
-    'अगस्ट',
-    'सेप्टेम्बर',
-    'अक्टोबर',
-    'नोभेम्बर',
-    'डिसेम्बर'
-  ],
-      STANDALONEMONTHS: const [
-    'जनवरी',
-    'फेब्रुअरी',
-    'मार्च',
-    'अप्रिल',
-    'मे',
-    'जुन',
-    'जुलाई',
-    'अगस्ट',
-    'सेप्टेम्बर',
-    'अक्टोबर',
-    'नोभेम्बर',
-    'डिसेम्बर'
-  ],
-      SHORTMONTHS: const [
-    'जनवरी',
-    'फेब्रुअरी',
-    'मार्च',
-    'अप्रिल',
-    'मे',
-    'जुन',
-    'जुलाई',
-    'अगस्ट',
-    'सेप्टेम्बर',
-    'अक्टोबर',
-    'नोभेम्बर',
-    'डिसेम्बर'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'जनवरी',
-    'फेब्रुअरी',
-    'मार्च',
-    'अप्रिल',
-    'मे',
-    'जुन',
-    'जुलाई',
-    'अगस्ट',
-    'सेप्टेम्बर',
-    'अक्टोबर',
-    'नोभेम्बर',
-    'डिसेम्बर'
-  ],
-      WEEKDAYS: const [
-    'आइतबार',
-    'सोमबार',
-    'मङ्गलबार',
-    'बुधबार',
-    'बिहीबार',
-    'शुक्रबार',
-    'शनिबार'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'आइतबार',
-    'सोमबार',
-    'मङ्गलबार',
-    'बुधबार',
-    'बिहीबार',
-    'शुक्रबार',
-    'शनिबार'
-  ],
-      SHORTWEEKDAYS: const [
-    'आइत',
-    'सोम',
-    'मङ्गल',
-    'बुध',
-    'बिही',
-    'शुक्र',
-    'शनि'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'आइत',
-    'सोम',
-    'मङ्गल',
-    'बुध',
-    'बिही',
-    'शुक्र',
-    'शनि'
-  ],
-      NARROWWEEKDAYS: const ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],
-      STANDALONENARROWWEEKDAYS: const ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],
-      SHORTQUARTERS: const [
-    'पहिलो सत्र',
-    'दोस्रो सत्र',
-    'तेस्रो सत्र',
-    'चौथो सत्र'
-  ],
-      QUARTERS: const ['पहिलो सत्र', 'दोस्रो सत्र', 'तेस्रो सत्र', 'चौथो सत्र'],
-      AMPMS: const ['पूर्व मध्यान्ह', 'उत्तर मध्यान्ह'],
-      DATEFORMATS: const ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale nl.
-   */
-  "nl": new DateSymbols(
-      NAME: "nl",
-      ERAS: const ['v.Chr.', 'n.Chr.'],
-      ERANAMES: const ['Voor Christus', 'na Christus'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januari',
-    'februari',
-    'maart',
-    'april',
-    'mei',
-    'juni',
-    'juli',
-    'augustus',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      STANDALONEMONTHS: const [
-    'januari',
-    'februari',
-    'maart',
-    'april',
-    'mei',
-    'juni',
-    'juli',
-    'augustus',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mrt.',
-    'apr.',
-    'mei',
-    'jun.',
-    'jul.',
-    'aug.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mrt',
-    'apr',
-    'mei',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      WEEKDAYS: const [
-    'zondag',
-    'maandag',
-    'dinsdag',
-    'woensdag',
-    'donderdag',
-    'vrijdag',
-    'zaterdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'zondag',
-    'maandag',
-    'dinsdag',
-    'woensdag',
-    'donderdag',
-    'vrijdag',
-    'zaterdag'
-  ],
-      SHORTWEEKDAYS: const ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
-      STANDALONESHORTWEEKDAYS: const ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
-      NARROWWEEKDAYS: const ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],
-      STANDALONENARROWWEEKDAYS: const ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const [
-    '1e kwartaal',
-    '2e kwartaal',
-    '3e kwartaal',
-    '4e kwartaal'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-yy'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale no.
-   */
-  "no": new DateSymbols(
-      NAME: "no",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['f.Kr.', 'e.Kr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      STANDALONEMONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'mai',
-    'jun.',
-    'jul.',
-    'aug.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'des.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'mai',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'des'
-  ],
-      WEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      SHORTWEEKDAYS: const [
-    'søn.',
-    'man.',
-    'tir.',
-    'ons.',
-    'tor.',
-    'fre.',
-    'lør.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'sø.',
-    'ma.',
-    'ti.',
-    'on.',
-    'to.',
-    'fr.',
-    'lø.'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const [
-    'EEEE d. MMMM y',
-    'd. MMMM y',
-    'd. MMM y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const [
-    '{1} {0}',
-    '{1} \'kl.\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale no_NO.
-   */
-  /**
-   * Date/time formatting symbols for locale no_NO.
-   */
-  "no_NO": new DateSymbols(
-      NAME: "no_NO",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['f.Kr.', 'e.Kr.'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      STANDALONEMONTHS: const [
-    'januar',
-    'februar',
-    'mars',
-    'april',
-    'mai',
-    'juni',
-    'juli',
-    'august',
-    'september',
-    'oktober',
-    'november',
-    'desember'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'mai',
-    'jun.',
-    'jul.',
-    'aug.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'des.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'mai',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'des'
-  ],
-      WEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'søndag',
-    'mandag',
-    'tirsdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lørdag'
-  ],
-      SHORTWEEKDAYS: const [
-    'søn.',
-    'man.',
-    'tir.',
-    'ons.',
-    'tor.',
-    'fre.',
-    'lør.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'sø.',
-    'ma.',
-    'ti.',
-    'on.',
-    'to.',
-    'fr.',
-    'lø.'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const [
-    'EEEE d. MMMM y',
-    'd. MMMM y',
-    'd. MMM y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const [
-    '{1} {0}',
-    '{1} \'kl.\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale or.
-   */
-  "or": new DateSymbols(
-      NAME: "or",
-      ERAS: const ['BCE', 'CE'],
-      ERANAMES: const ['BCE', 'CE'],
-      NARROWMONTHS: const [
-    'ଜା',
-    'ଫେ',
-    'ମା',
-    'ଅ',
-    'ମେ',
-    'ଜୁ',
-    'ଜୁ',
-    'ଅ',
-    'ସେ',
-    'ଅ',
-    'ନ',
-    'ଡି'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ଜା',
-    'ଫେ',
-    'ମା',
-    'ଅ',
-    'ମେ',
-    'ଜୁ',
-    'ଜୁ',
-    'ଅ',
-    'ସେ',
-    'ଅ',
-    'ନ',
-    'ଡି'
-  ],
-      MONTHS: const [
-    'ଜାନୁଆରୀ',
-    'ଫେବ୍ରୁୟାରୀ',
-    'ମାର୍ଚ୍ଚ',
-    'ଅପ୍ରେଲ',
-    'ମେ',
-    'ଜୁନ',
-    'ଜୁଲାଇ',
-    'ଅଗଷ୍ଟ',
-    'ସେପ୍ଟେମ୍ବର',
-    'ଅକ୍ଟୋବର',
-    'ନଭେମ୍ବର',
-    'ଡିସେମ୍ବର'
-  ],
-      STANDALONEMONTHS: const [
-    'ଜାନୁଆରୀ',
-    'ଫେବ୍ରୁୟାରୀ',
-    'ମାର୍ଚ୍ଚ',
-    'ଅପ୍ରେଲ',
-    'ମେ',
-    'ଜୁନ',
-    'ଜୁଲାଇ',
-    'ଅଗଷ୍ଟ',
-    'ସେପ୍ଟେମ୍ବର',
-    'ଅକ୍ଟୋବର',
-    'ନଭେମ୍ବର',
-    'ଡିସେମ୍ବର'
-  ],
-      SHORTMONTHS: const [
-    'ଜାନୁଆରୀ',
-    'ଫେବ୍ରୁୟାରୀ',
-    'ମାର୍ଚ୍ଚ',
-    'ଅପ୍ରେଲ',
-    'ମେ',
-    'ଜୁନ',
-    'ଜୁଲାଇ',
-    'ଅଗଷ୍ଟ',
-    'ସେପ୍ଟେମ୍ବର',
-    'ଅକ୍ଟୋବର',
-    'ନଭେମ୍ବର',
-    'ଡିସେମ୍ବର'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ଜାନୁଆରୀ',
-    'ଫେବ୍ରୁୟାରୀ',
-    'ମାର୍ଚ୍ଚ',
-    'ଅପ୍ରେଲ',
-    'ମେ',
-    'ଜୁନ',
-    'ଜୁଲାଇ',
-    'ଅଗଷ୍ଟ',
-    'ସେପ୍ଟେମ୍ବର',
-    'ଅକ୍ଟୋବର',
-    'ନଭେମ୍ବର',
-    'ଡିସେମ୍ବର'
-  ],
-      WEEKDAYS: const [
-    'ରବିବାର',
-    'ସୋମବାର',
-    'ମଙ୍ଗଳବାର',
-    'ବୁଧବାର',
-    'ଗୁରୁବାର',
-    'ଶୁକ୍ରବାର',
-    'ଶନିବାର'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ରବିବାର',
-    'ସୋମବାର',
-    'ମଙ୍ଗଳବାର',
-    'ବୁଧବାର',
-    'ଗୁରୁବାର',
-    'ଶୁକ୍ରବାର',
-    'ଶନିବାର'
-  ],
-      SHORTWEEKDAYS: const [
-    'ରବି',
-    'ସୋମ',
-    'ମଙ୍ଗଳ',
-    'ବୁଧ',
-    'ଗୁରୁ',
-    'ଶୁକ୍ର',
-    'ଶନି'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ରବି',
-    'ସୋମ',
-    'ମଙ୍ଗଳ',
-    'ବୁଧ',
-    'ଗୁରୁ',
-    'ଶୁକ୍ର',
-    'ଶନି'
-  ],
-      NARROWWEEKDAYS: const ['ର', 'ସୋ', 'ମ', 'ବୁ', 'ଗୁ', 'ଶୁ', 'ଶ'],
-      STANDALONENARROWWEEKDAYS: const ['ର', 'ସୋ', 'ମ', 'ବୁ', 'ଗୁ', 'ଶୁ', 'ଶ'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      AMPMS: const ['am', 'pm'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd-M-yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale pa.
-   */
-  "pa": new DateSymbols(
-      NAME: "pa",
-      ERAS: const ['ਈ. ਪੂ.', 'ਸੰਨ'],
-      ERANAMES: const ['ਈ. ਪੂ.', 'ਸੰਨ'],
-      NARROWMONTHS: const [
-    'ਜ',
-    'ਫ਼',
-    'ਮਾ',
-    'ਅ',
-    'ਮ',
-    'ਜੂ',
-    'ਜੁ',
-    'ਅ',
-    'ਸ',
-    'ਅ',
-    'ਨ',
-    'ਦ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ਜ',
-    'ਫ਼',
-    'ਮਾ',
-    'ਅ',
-    'ਮ',
-    'ਜੂ',
-    'ਜੁ',
-    'ਅ',
-    'ਸ',
-    'ਅ',
-    'ਨ',
-    'ਦ'
-  ],
-      MONTHS: const [
-    'ਜਨਵਰੀ',
-    'ਫ਼ਰਵਰੀ',
-    'ਮਾਰਚ',
-    'ਅਪ੍ਰੈਲ',
-    'ਮਈ',
-    'ਜੂਨ',
-    'ਜੁਲਾਈ',
-    'ਅਗਸਤ',
-    'ਸਤੰਬਰ',
-    'ਅਕਤੂਬਰ',
-    'ਨਵੰਬਰ',
-    'ਦਸੰਬਰ'
-  ],
-      STANDALONEMONTHS: const [
-    'ਜਨਵਰੀ',
-    'ਫ਼ਰਵਰੀ',
-    'ਮਾਰਚ',
-    'ਅਪ੍ਰੈਲ',
-    'ਮਈ',
-    'ਜੂਨ',
-    'ਜੁਲਾਈ',
-    'ਅਗਸਤ',
-    'ਸਤੰਬਰ',
-    'ਅਕਤੂਬਰ',
-    'ਨਵੰਬਰ',
-    'ਦਸੰਬਰ'
-  ],
-      SHORTMONTHS: const [
-    'ਜਨਵਰੀ',
-    'ਫ਼ਰਵਰੀ',
-    'ਮਾਰਚ',
-    'ਅਪ੍ਰੈਲ',
-    'ਮਈ',
-    'ਜੂਨ',
-    'ਜੁਲਾਈ',
-    'ਅਗਸਤ',
-    'ਸਤੰਬਰ',
-    'ਅਕਤੂਬਰ',
-    'ਨਵੰਬਰ',
-    'ਦਸੰਬਰ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ਜਨਵਰੀ',
-    'ਫ਼ਰਵਰੀ',
-    'ਮਾਰਚ',
-    'ਅਪ੍ਰੈਲ',
-    'ਮਈ',
-    'ਜੂਨ',
-    'ਜੁਲਾਈ',
-    'ਅਗਸਤ',
-    'ਸਤੰਬਰ',
-    'ਅਕਤੂਬਰ',
-    'ਨਵੰਬਰ',
-    'ਦਸੰਬਰ'
-  ],
-      WEEKDAYS: const [
-    'ਐਤਵਾਰ',
-    'ਸੋਮਵਾਰ',
-    'ਮੰਗਲਵਾਰ',
-    'ਬੁਧਵਾਰ',
-    'ਵੀਰਵਾਰ',
-    'ਸ਼ੁੱਕਰਵਾਰ',
-    'ਸ਼ਨੀਵਾਰ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ਐਤਵਾਰ',
-    'ਸੋਮਵਾਰ',
-    'ਮੰਗਲਵਾਰ',
-    'ਬੁਧਵਾਰ',
-    'ਵੀਰਵਾਰ',
-    'ਸ਼ੁੱਕਰਵਾਰ',
-    'ਸ਼ਨੀਵਾਰ'
-  ],
-      SHORTWEEKDAYS: const [
-    'ਐਤ.',
-    'ਸੋਮ.',
-    'ਮੰਗਲ.',
-    'ਬੁਧ.',
-    'ਵੀਰ.',
-    'ਸ਼ੁੱਕਰ.',
-    'ਸ਼ਨੀ.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ਐਤ.',
-    'ਸੋਮ.',
-    'ਮੰਗਲ.',
-    'ਬੁਧ.',
-    'ਵੀਰ.',
-    'ਸ਼ੁੱਕਰ.',
-    'ਸ਼ਨੀ.'
-  ],
-      NARROWWEEKDAYS: const ['ਐ', 'ਸੋ', 'ਮੰ', 'ਬੁੱ', 'ਵੀ', 'ਸ਼ੁੱ', 'ਸ਼'],
-      STANDALONENARROWWEEKDAYS: const [
-    'ਐ',
-    'ਸੋ',
-    'ਮੰ',
-    'ਬੁੱ',
-    'ਵੀ',
-    'ਸ਼ੁੱ',
-    'ਸ਼'
-  ],
-      SHORTQUARTERS: const ['ਪਊਆ', 'ਅੱਧਾ', 'ਪੌਣਾ', 'ਪੂਰਾ'],
-      QUARTERS: const ['ਪਊਆ', 'ਅੱਧਾ', 'ਪੌਣਾ', 'ਪੂਰਾ'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale pl.
-   */
-  "pl": new DateSymbols(
-      NAME: "pl",
-      ERAS: const ['p.n.e.', 'n.e.'],
-      ERANAMES: const ['p.n.e.', 'n.e.'],
-      NARROWMONTHS: const [
-    's',
-    'l',
-    'm',
-    'k',
-    'm',
-    'c',
-    'l',
-    's',
-    'w',
-    'p',
-    'l',
-    'g'
-  ],
-      STANDALONENARROWMONTHS: const [
-    's',
-    'l',
-    'm',
-    'k',
-    'm',
-    'c',
-    'l',
-    's',
-    'w',
-    'p',
-    'l',
-    'g'
-  ],
-      MONTHS: const [
-    'stycznia',
-    'lutego',
-    'marca',
-    'kwietnia',
-    'maja',
-    'czerwca',
-    'lipca',
-    'sierpnia',
-    'września',
-    'października',
-    'listopada',
-    'grudnia'
-  ],
-      STANDALONEMONTHS: const [
-    'styczeń',
-    'luty',
-    'marzec',
-    'kwiecień',
-    'maj',
-    'czerwiec',
-    'lipiec',
-    'sierpień',
-    'wrzesień',
-    'październik',
-    'listopad',
-    'grudzień'
-  ],
-      SHORTMONTHS: const [
-    'sty',
-    'lut',
-    'mar',
-    'kwi',
-    'maj',
-    'cze',
-    'lip',
-    'sie',
-    'wrz',
-    'paź',
-    'lis',
-    'gru'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'sty',
-    'lut',
-    'mar',
-    'kwi',
-    'maj',
-    'cze',
-    'lip',
-    'sie',
-    'wrz',
-    'paź',
-    'lis',
-    'gru'
-  ],
-      WEEKDAYS: const [
-    'niedziela',
-    'poniedziałek',
-    'wtorek',
-    'środa',
-    'czwartek',
-    'piątek',
-    'sobota'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'niedziela',
-    'poniedziałek',
-    'wtorek',
-    'środa',
-    'czwartek',
-    'piątek',
-    'sobota'
-  ],
-      SHORTWEEKDAYS: const [
-    'niedz.',
-    'pon.',
-    'wt.',
-    'śr.',
-    'czw.',
-    'pt.',
-    'sob.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'niedz.',
-    'pon.',
-    'wt.',
-    'śr.',
-    'czw.',
-    'pt.',
-    'sob.'
-  ],
-      NARROWWEEKDAYS: const ['N', 'P', 'W', 'Ś', 'C', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['N', 'P', 'W', 'Ś', 'C', 'P', 'S'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const ['I kwartał', 'II kwartał', 'III kwartał', 'IV kwartał'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale pt.
-   */
-  "pt": new DateSymbols(
-      NAME: "pt",
-      ERAS: const ['a.C.', 'd.C.'],
-      ERANAMES: const ['Antes de Cristo', 'Ano do Senhor'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janeiro',
-    'fevereiro',
-    'março',
-    'abril',
-    'maio',
-    'junho',
-    'julho',
-    'agosto',
-    'setembro',
-    'outubro',
-    'novembro',
-    'dezembro'
-  ],
-      STANDALONEMONTHS: const [
-    'janeiro',
-    'fevereiro',
-    'março',
-    'abril',
-    'maio',
-    'junho',
-    'julho',
-    'agosto',
-    'setembro',
-    'outubro',
-    'novembro',
-    'dezembro'
-  ],
-      SHORTMONTHS: const [
-    'jan',
-    'fev',
-    'mar',
-    'abr',
-    'mai',
-    'jun',
-    'jul',
-    'ago',
-    'set',
-    'out',
-    'nov',
-    'dez'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'fev',
-    'mar',
-    'abr',
-    'mai',
-    'jun',
-    'jul',
-    'ago',
-    'set',
-    'out',
-    'nov',
-    'dez'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      SHORTWEEKDAYS: const ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],
-      STANDALONESHORTWEEKDAYS: const [
-    'dom',
-    'seg',
-    'ter',
-    'qua',
-    'qui',
-    'sex',
-    'sáb'
-  ],
-      NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1º trimestre',
-    '2º trimestre',
-    '3º trimestre',
-    '4º trimestre'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'dd/MM/y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale pt_BR.
-   */
-  /**
-   * Date/time formatting symbols for locale pt_BR.
-   */
-  "pt_BR": new DateSymbols(
-      NAME: "pt_BR",
-      ERAS: const ['a.C.', 'd.C.'],
-      ERANAMES: const ['Antes de Cristo', 'Ano do Senhor'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janeiro',
-    'fevereiro',
-    'março',
-    'abril',
-    'maio',
-    'junho',
-    'julho',
-    'agosto',
-    'setembro',
-    'outubro',
-    'novembro',
-    'dezembro'
-  ],
-      STANDALONEMONTHS: const [
-    'janeiro',
-    'fevereiro',
-    'março',
-    'abril',
-    'maio',
-    'junho',
-    'julho',
-    'agosto',
-    'setembro',
-    'outubro',
-    'novembro',
-    'dezembro'
-  ],
-      SHORTMONTHS: const [
-    'jan',
-    'fev',
-    'mar',
-    'abr',
-    'mai',
-    'jun',
-    'jul',
-    'ago',
-    'set',
-    'out',
-    'nov',
-    'dez'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'fev',
-    'mar',
-    'abr',
-    'mai',
-    'jun',
-    'jul',
-    'ago',
-    'set',
-    'out',
-    'nov',
-    'dez'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      SHORTWEEKDAYS: const ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],
-      STANDALONESHORTWEEKDAYS: const [
-    'dom',
-    'seg',
-    'ter',
-    'qua',
-    'qui',
-    'sex',
-    'sáb'
-  ],
-      NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1º trimestre',
-    '2º trimestre',
-    '3º trimestre',
-    '4º trimestre'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'dd/MM/y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale pt_PT.
-   */
-  "pt_PT": new DateSymbols(
-      NAME: "pt_PT",
-      ERAS: const ['a.C.', 'd.C.'],
-      ERANAMES: const ['Antes de Cristo', 'Ano do Senhor'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Janeiro',
-    'Fevereiro',
-    'Março',
-    'Abril',
-    'Maio',
-    'Junho',
-    'Julho',
-    'Agosto',
-    'Setembro',
-    'Outubro',
-    'Novembro',
-    'Dezembro'
-  ],
-      STANDALONEMONTHS: const [
-    'Janeiro',
-    'Fevereiro',
-    'Março',
-    'Abril',
-    'Maio',
-    'Junho',
-    'Julho',
-    'Agosto',
-    'Setembro',
-    'Outubro',
-    'Novembro',
-    'Dezembro'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Fev',
-    'Mar',
-    'Abr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Ago',
-    'Set',
-    'Out',
-    'Nov',
-    'Dez'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Fev',
-    'Mar',
-    'Abr',
-    'Mai',
-    'Jun',
-    'Jul',
-    'Ago',
-    'Set',
-    'Out',
-    'Nov',
-    'Dez'
-  ],
-      WEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'domingo',
-    'segunda-feira',
-    'terça-feira',
-    'quarta-feira',
-    'quinta-feira',
-    'sexta-feira',
-    'sábado'
-  ],
-      SHORTWEEKDAYS: const ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],
-      STANDALONESHORTWEEKDAYS: const [
-    'dom',
-    'seg',
-    'ter',
-    'qua',
-    'qui',
-    'sex',
-    'sáb'
-  ],
-      NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    '1.º trimestre',
-    '2.º trimestre',
-    '3.º trimestre',
-    '4.º trimestre'
-  ],
-      AMPMS: const ['da manhã', 'da tarde'],
-      DATEFORMATS: const [
-    'EEEE, d \'de\' MMMM \'de\' y',
-    'd \'de\' MMMM \'de\' y',
-    'dd/MM/y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'às\' {0}',
-    '{1} \'às\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale ro.
-   */
-  "ro": new DateSymbols(
-      NAME: "ro",
-      ERAS: const ['î.Hr.', 'd.Hr.'],
-      ERANAMES: const ['înainte de Hristos', 'după Hristos'],
-      NARROWMONTHS: const [
-    'I',
-    'F',
-    'M',
-    'A',
-    'M',
-    'I',
-    'I',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'I',
-    'F',
-    'M',
-    'A',
-    'M',
-    'I',
-    'I',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'ianuarie',
-    'februarie',
-    'martie',
-    'aprilie',
-    'mai',
-    'iunie',
-    'iulie',
-    'august',
-    'septembrie',
-    'octombrie',
-    'noiembrie',
-    'decembrie'
-  ],
-      STANDALONEMONTHS: const [
-    'ianuarie',
-    'februarie',
-    'martie',
-    'aprilie',
-    'mai',
-    'iunie',
-    'iulie',
-    'august',
-    'septembrie',
-    'octombrie',
-    'noiembrie',
-    'decembrie'
-  ],
-      SHORTMONTHS: const [
-    'ian.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'mai',
-    'iun.',
-    'iul.',
-    'aug.',
-    'sept.',
-    'oct.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ian.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'mai',
-    'iun.',
-    'iul.',
-    'aug.',
-    'sept.',
-    'oct.',
-    'nov.',
-    'dec.'
-  ],
-      WEEKDAYS: const [
-    'duminică',
-    'luni',
-    'marți',
-    'miercuri',
-    'joi',
-    'vineri',
-    'sâmbătă'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'duminică',
-    'luni',
-    'marți',
-    'miercuri',
-    'joi',
-    'vineri',
-    'sâmbătă'
-  ],
-      SHORTWEEKDAYS: const ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Dum',
-    'Lun',
-    'Mar',
-    'Mie',
-    'Joi',
-    'Vin',
-    'Sâm'
-  ],
-      NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
-      SHORTQUARTERS: const ['trim. I', 'trim. II', 'trim. III', 'trim. IV'],
-      QUARTERS: const [
-    'trimestrul I',
-    'trimestrul al II-lea',
-    'trimestrul al III-lea',
-    'trimestrul al IV-lea'
-  ],
-      AMPMS: const ['a.m.', 'p.m.'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ru.
-   */
-  "ru": new DateSymbols(
-      NAME: "ru",
-      ERAS: const ['до н. э.', 'н. э.'],
-      ERANAMES: const ['до н.э.', 'н.э.'],
-      NARROWMONTHS: const [
-    'Я',
-    'Ф',
-    'М',
-    'А',
-    'М',
-    'И',
-    'И',
-    'А',
-    'С',
-    'О',
-    'Н',
-    'Д'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Я',
-    'Ф',
-    'М',
-    'А',
-    'М',
-    'И',
-    'И',
-    'А',
-    'С',
-    'О',
-    'Н',
-    'Д'
-  ],
-      MONTHS: const [
-    'января',
-    'февраля',
-    'марта',
-    'апреля',
-    'мая',
-    'июня',
-    'июля',
-    'августа',
-    'сентября',
-    'октября',
-    'ноября',
-    'декабря'
-  ],
-      STANDALONEMONTHS: const [
-    'Январь',
-    'Февраль',
-    'Март',
-    'Апрель',
-    'Май',
-    'Июнь',
-    'Июль',
-    'Август',
-    'Сентябрь',
-    'Октябрь',
-    'Ноябрь',
-    'Декабрь'
-  ],
-      SHORTMONTHS: const [
-    'янв.',
-    'февр.',
-    'марта',
-    'апр.',
-    'мая',
-    'июня',
-    'июля',
-    'авг.',
-    'сент.',
-    'окт.',
-    'нояб.',
-    'дек.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Янв.',
-    'Февр.',
-    'Март',
-    'Апр.',
-    'Май',
-    'Июнь',
-    'Июль',
-    'Авг.',
-    'Сент.',
-    'Окт.',
-    'Нояб.',
-    'Дек.'
-  ],
-      WEEKDAYS: const [
-    'воскресенье',
-    'понедельник',
-    'вторник',
-    'среда',
-    'четверг',
-    'пятница',
-    'суббота'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Воскресенье',
-    'Понедельник',
-    'Вторник',
-    'Среда',
-    'Четверг',
-    'Пятница',
-    'Суббота'
-  ],
-      SHORTWEEKDAYS: const ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
-      STANDALONESHORTWEEKDAYS: const ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-      NARROWWEEKDAYS: const ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
-      STANDALONENARROWWEEKDAYS: const ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],
-      SHORTQUARTERS: const ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],
-      QUARTERS: const [
-    '1-й квартал',
-    '2-й квартал',
-    '3-й квартал',
-    '4-й квартал'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM y \'г\'.',
-    'd MMMM y \'г\'.',
-    'd MMM y \'г\'.',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale si.
-   */
-  "si": new DateSymbols(
-      NAME: "si",
-      ERAS: const ['ක්‍රි.පූ.', 'ක්‍රි.ව.'],
-      ERANAMES: const ['ක්‍රිස්තු පූර්‍ව', 'ක්‍රිස්තු වර්‍ෂ'],
-      NARROWMONTHS: const [
-    'ජ',
-    'පෙ',
-    'මා',
-    'අ',
-    'මැ',
-    'ජූ',
-    'ජූ',
-    'අ',
-    'සැ',
-    'ඔ',
-    'නෙ',
-    'දෙ'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ජ',
-    'පෙ',
-    'මා',
-    'අ',
-    'මැ',
-    'ජූ',
-    'ජූ',
-    'අ',
-    'සැ',
-    'ඔ',
-    'නෙ',
-    'දෙ'
-  ],
-      MONTHS: const [
-    'ජනවාරි',
-    'පෙබරවාරි',
-    'මාර්තු',
-    'අප්‍රේල්',
-    'මැයි',
-    'ජූනි',
-    'ජූලි',
-    'අගෝස්තු',
-    'සැප්තැම්බර්',
-    'ඔක්තෝබර්',
-    'නොවැම්බර්',
-    'දෙසැම්බර්'
-  ],
-      STANDALONEMONTHS: const [
-    'ජනවාරි',
-    'පෙබරවාරි',
-    'මාර්තු',
-    'අප්‍රේල්',
-    'මැයි',
-    'ජූනි',
-    'ජූලි',
-    'අගෝස්තු',
-    'සැප්තැම්බර්',
-    'ඔක්තෝබර්',
-    'නොවැම්බර්',
-    'දෙසැම්බර්'
-  ],
-      SHORTMONTHS: const [
-    'ජන',
-    'පෙබ',
-    'මාර්තු',
-    'අප්‍රේල්',
-    'මැයි',
-    'ජූනි',
-    'ජූලි',
-    'අගෝ',
-    'සැප්',
-    'ඔක්',
-    'නොවැ',
-    'දෙසැ'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ජන',
-    'පෙබ',
-    'මාර්',
-    'අප්‍රේල්',
-    'මැයි',
-    'ජූනි',
-    'ජූලි',
-    'අගෝ',
-    'සැප්',
-    'ඔක්',
-    'නොවැ',
-    'දෙසැ'
-  ],
-      WEEKDAYS: const [
-    'ඉරිදා',
-    'සඳුදා',
-    'අඟහරුවාදා',
-    'බදාදා',
-    'බ්‍රහස්පතින්දා',
-    'සිකුරාදා',
-    'සෙනසුරාදා'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ඉරිදා',
-    'සඳුදා',
-    'අඟහරුවාදා',
-    'බදාදා',
-    'බ්‍රහස්පතින්දා',
-    'සිකුරාදා',
-    'සෙනසුරාදා'
-  ],
-      SHORTWEEKDAYS: const [
-    'ඉරිදා',
-    'සඳුදා',
-    'අඟහ',
-    'බදාදා',
-    'බ්‍රහස්',
-    'සිකු',
-    'සෙන'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ඉරිදා',
-    'සඳුදා',
-    'අඟහ',
-    'බදාදා',
-    'බ්‍රහස්',
-    'සිකු',
-    'සෙන'
-  ],
-      NARROWWEEKDAYS: const ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'],
-      STANDALONENARROWWEEKDAYS: const ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'],
-      SHORTQUARTERS: const ['කාර්:1', 'කාර්:2', 'කාර්:3', 'කාර්:4'],
-      QUARTERS: const [
-    '1 වන කාර්තුව',
-    '2 වන කාර්තුව',
-    '3 වන කාර්තුව',
-    '4 වන කාර්තුව'
-  ],
-      AMPMS: const ['පෙ.ව.', 'ප.ව.'],
-      DATEFORMATS: const ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],
-      TIMEFORMATS: const [
-    'a h.mm.ss zzzz',
-    'a h.mm.ss z',
-    'a h.mm.ss',
-    'a h.mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale sk.
-   */
-  "sk": new DateSymbols(
-      NAME: "sk",
-      ERAS: const ['pred n.l.', 'n.l.'],
-      ERANAMES: const ['pred n.l.', 'n.l.'],
-      NARROWMONTHS: const [
-    'j',
-    'f',
-    'm',
-    'a',
-    'm',
-    'j',
-    'j',
-    'a',
-    's',
-    'o',
-    'n',
-    'd'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'j',
-    'f',
-    'm',
-    'a',
-    'm',
-    'j',
-    'j',
-    'a',
-    's',
-    'o',
-    'n',
-    'd'
-  ],
-      MONTHS: const [
-    'januára',
-    'februára',
-    'marca',
-    'apríla',
-    'mája',
-    'júna',
-    'júla',
-    'augusta',
-    'septembra',
-    'októbra',
-    'novembra',
-    'decembra'
-  ],
-      STANDALONEMONTHS: const [
-    'január',
-    'február',
-    'marec',
-    'apríl',
-    'máj',
-    'jún',
-    'júl',
-    'august',
-    'september',
-    'október',
-    'november',
-    'december'
-  ],
-      SHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'máj',
-    'jún',
-    'júl',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'máj',
-    'jún',
-    'júl',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      WEEKDAYS: const [
-    'nedeľa',
-    'pondelok',
-    'utorok',
-    'streda',
-    'štvrtok',
-    'piatok',
-    'sobota'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'nedeľa',
-    'pondelok',
-    'utorok',
-    'streda',
-    'štvrtok',
-    'piatok',
-    'sobota'
-  ],
-      SHORTWEEKDAYS: const ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],
-      STANDALONESHORTWEEKDAYS: const ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],
-      NARROWWEEKDAYS: const ['N', 'P', 'U', 'S', 'Š', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['N', 'P', 'U', 'S', 'Š', 'P', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1. štvrťrok',
-    '2. štvrťrok',
-    '3. štvrťrok',
-    '4. štvrťrok'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.y'],
-      TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale sl.
-   */
-  "sl": new DateSymbols(
-      NAME: "sl",
-      ERAS: const ['pr. n. št.', 'po Kr.'],
-      ERANAMES: const ['pred našim štetjem', 'naše štetje'],
-      NARROWMONTHS: const [
-    'j',
-    'f',
-    'm',
-    'a',
-    'm',
-    'j',
-    'j',
-    'a',
-    's',
-    'o',
-    'n',
-    'd'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'j',
-    'f',
-    'm',
-    'a',
-    'm',
-    'j',
-    'j',
-    'a',
-    's',
-    'o',
-    'n',
-    'd'
-  ],
-      MONTHS: const [
-    'januar',
-    'februar',
-    'marec',
-    'april',
-    'maj',
-    'junij',
-    'julij',
-    'avgust',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      STANDALONEMONTHS: const [
-    'januar',
-    'februar',
-    'marec',
-    'april',
-    'maj',
-    'junij',
-    'julij',
-    'avgust',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      SHORTMONTHS: const [
-    'jan.',
-    'feb.',
-    'mar.',
-    'apr.',
-    'maj',
-    'jun.',
-    'jul.',
-    'avg.',
-    'sep.',
-    'okt.',
-    'nov.',
-    'dec.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'maj',
-    'jun',
-    'jul',
-    'avg',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      WEEKDAYS: const [
-    'nedelja',
-    'ponedeljek',
-    'torek',
-    'sreda',
-    'četrtek',
-    'petek',
-    'sobota'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'nedelja',
-    'ponedeljek',
-    'torek',
-    'sreda',
-    'četrtek',
-    'petek',
-    'sobota'
-  ],
-      SHORTWEEKDAYS: const [
-    'ned.',
-    'pon.',
-    'tor.',
-    'sre.',
-    'čet.',
-    'pet.',
-    'sob.'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ned',
-    'pon',
-    'tor',
-    'sre',
-    'čet',
-    'pet',
-    'sob'
-  ],
-      NARROWWEEKDAYS: const ['n', 'p', 't', 's', 'č', 'p', 's'],
-      STANDALONENARROWWEEKDAYS: const ['n', 'p', 't', 's', 'č', 'p', 's'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    '1. četrtletje',
-    '2. četrtletje',
-    '3. četrtletje',
-    '4. četrtletje'
-  ],
-      AMPMS: const ['dop.', 'pop.'],
-      DATEFORMATS: const [
-    'EEEE, dd. MMMM y',
-    'dd. MMMM y',
-    'd. MMM y',
-    'd. MM. yy'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale sq.
-   */
-  "sq": new DateSymbols(
-      NAME: "sq",
-      ERAS: const ['p.e.r.', 'e.r.'],
-      ERANAMES: const ['para erës së re', 'erës së re'],
-      NARROWMONTHS: const [
-    'J',
-    'S',
-    'M',
-    'P',
-    'M',
-    'Q',
-    'K',
-    'G',
-    'S',
-    'T',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'S',
-    'M',
-    'P',
-    'M',
-    'Q',
-    'K',
-    'G',
-    'S',
-    'T',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'janar',
-    'shkurt',
-    'mars',
-    'prill',
-    'maj',
-    'qershor',
-    'korrik',
-    'gusht',
-    'shtator',
-    'tetor',
-    'nëntor',
-    'dhjetor'
-  ],
-      STANDALONEMONTHS: const [
-    'janar',
-    'shkurt',
-    'mars',
-    'prill',
-    'maj',
-    'qershor',
-    'korrik',
-    'gusht',
-    'shtator',
-    'tetor',
-    'nëntor',
-    'dhjetor'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Shk',
-    'Mar',
-    'Pri',
-    'Maj',
-    'Qer',
-    'Kor',
-    'Gsh',
-    'Sht',
-    'Tet',
-    'Nën',
-    'Dhj'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Shk',
-    'Mar',
-    'Pri',
-    'Maj',
-    'Qer',
-    'Kor',
-    'Gsh',
-    'Sht',
-    'Tet',
-    'Nën',
-    'Dhj'
-  ],
-      WEEKDAYS: const [
-    'e diel',
-    'e hënë',
-    'e martë',
-    'e mërkurë',
-    'e enjte',
-    'e premte',
-    'e shtunë'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'e diel',
-    'e hënë',
-    'e martë',
-    'e mërkurë',
-    'e enjte',
-    'e premte',
-    'e shtunë'
-  ],
-      SHORTWEEKDAYS: const ['Die', 'Hën', 'Mar', 'Mër', 'Enj', 'Pre', 'Sht'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Die',
-    'Hën',
-    'Mar',
-    'Mër',
-    'Enj',
-    'Pre',
-    'Sht'
-  ],
-      NARROWWEEKDAYS: const ['D', 'H', 'M', 'M', 'E', 'P', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['D', 'H', 'M', 'M', 'E', 'P', 'S'],
-      SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
-      QUARTERS: const [
-    'tremujori i parë',
-    'tremujori i dytë',
-    'tremujori i tretë',
-    'tremujori i katërt'
-  ],
-      AMPMS: const ['paradite', 'pasdite'],
-      DATEFORMATS: const [
-    'EEEE, dd MMMM y',
-    'dd MMMM y',
-    'dd/MM/y',
-    'dd/MM/yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const [
-    '{1} \'në\' {0}',
-    '{1} \'në\' {0}',
-    '{1} {0}',
-    '{1} {0}'
-  ],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale sr.
-   */
-  "sr": new DateSymbols(
-      NAME: "sr",
-      ERAS: const ['п. н. е.', 'н. е.'],
-      ERANAMES: const ['Пре нове ере', 'Нове ере'],
-      NARROWMONTHS: const [
-    'ј',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ј',
-    'ј',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ј',
-    'ф',
-    'м',
-    'а',
-    'м',
-    'ј',
-    'ј',
-    'а',
-    'с',
-    'о',
-    'н',
-    'д'
-  ],
-      MONTHS: const [
-    'јануар',
-    'фебруар',
-    'март',
-    'април',
-    'мај',
-    'јун',
-    'јул',
-    'август',
-    'септембар',
-    'октобар',
-    'новембар',
-    'децембар'
-  ],
-      STANDALONEMONTHS: const [
-    'јануар',
-    'фебруар',
-    'март',
-    'април',
-    'мај',
-    'јун',
-    'јул',
-    'август',
-    'септембар',
-    'октобар',
-    'новембар',
-    'децембар'
-  ],
-      SHORTMONTHS: const [
-    'јан',
-    'феб',
-    'мар',
-    'апр',
-    'мај',
-    'јун',
-    'јул',
-    'авг',
-    'сеп',
-    'окт',
-    'нов',
-    'дец'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'јан',
-    'феб',
-    'мар',
-    'апр',
-    'мај',
-    'јун',
-    'јул',
-    'авг',
-    'сеп',
-    'окт',
-    'нов',
-    'дец'
-  ],
-      WEEKDAYS: const [
-    'недеља',
-    'понедељак',
-    'уторак',
-    'среда',
-    'четвртак',
-    'петак',
-    'субота'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'недеља',
-    'понедељак',
-    'уторак',
-    'среда',
-    'четвртак',
-    'петак',
-    'субота'
-  ],
-      SHORTWEEKDAYS: const ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],
-      STANDALONESHORTWEEKDAYS: const [
-    'нед',
-    'пон',
-    'уто',
-    'сре',
-    'чет',
-    'пет',
-    'суб'
-  ],
-      NARROWWEEKDAYS: const ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],
-      STANDALONENARROWWEEKDAYS: const ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],
-      SHORTQUARTERS: const ['К1', 'К2', 'К3', 'К4'],
-      QUARTERS: const [
-    'Прво тромесечје',
-    'Друго тромесечје',
-    'Треће тромесечје',
-    'Четврто тромесечје'
-  ],
-      AMPMS: const ['пре подне', 'поподне'],
-      DATEFORMATS: const [
-    'EEEE, dd. MMMM y.',
-    'dd. MMMM y.',
-    'dd.MM.y.',
-    'd.M.yy.'
-  ],
-      TIMEFORMATS: const ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale sv.
-   */
-  "sv": new DateSymbols(
-      NAME: "sv",
-      ERAS: const ['f.Kr.', 'e.Kr.'],
-      ERANAMES: const ['före Kristus', 'efter Kristus'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'januari',
-    'februari',
-    'mars',
-    'april',
-    'maj',
-    'juni',
-    'juli',
-    'augusti',
-    'september',
-    'oktober',
-    'november',
-    'december'
-  ],
-      STANDALONEMONTHS: const [
-    'Januari',
-    'Februari',
-    'Mars',
-    'April',
-    'Maj',
-    'Juni',
-    'Juli',
-    'Augusti',
-    'September',
-    'Oktober',
-    'November',
-    'December'
-  ],
-      SHORTMONTHS: const [
-    'jan',
-    'feb',
-    'mar',
-    'apr',
-    'maj',
-    'jun',
-    'jul',
-    'aug',
-    'sep',
-    'okt',
-    'nov',
-    'dec'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mar',
-    'Apr',
-    'Maj',
-    'Jun',
-    'Jul',
-    'Aug',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dec'
-  ],
-      WEEKDAYS: const [
-    'söndag',
-    'måndag',
-    'tisdag',
-    'onsdag',
-    'torsdag',
-    'fredag',
-    'lördag'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Söndag',
-    'Måndag',
-    'Tisdag',
-    'Onsdag',
-    'Torsdag',
-    'Fredag',
-    'Lördag'
-  ],
-      SHORTWEEKDAYS: const ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Sön',
-    'Mån',
-    'Tis',
-    'Ons',
-    'Tor',
-    'Fre',
-    'Lör'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
-      SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
-      QUARTERS: const [
-    '1:a kvartalet',
-    '2:a kvartalet',
-    '3:e kvartalet',
-    '4:e kvartalet'
-  ],
-      AMPMS: const ['fm', 'em'],
-      DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y-MM-dd'],
-      TIMEFORMATS: const [
-    '\'kl\'. HH:mm:ss zzzz',
-    'HH:mm:ss z',
-    'HH:mm:ss',
-    'HH:mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 3),
-  /**
-   * Date/time formatting symbols for locale sw.
-   */
-  "sw": new DateSymbols(
-      NAME: "sw",
-      ERAS: const ['KK', 'BK'],
-      ERANAMES: const ['Kabla ya Kristo', 'Baada ya Kristo'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januari',
-    'Februari',
-    'Machi',
-    'Aprili',
-    'Mei',
-    'Juni',
-    'Julai',
-    'Agosti',
-    'Septemba',
-    'Oktoba',
-    'Novemba',
-    'Desemba'
-  ],
-      STANDALONEMONTHS: const [
-    'Januari',
-    'Februari',
-    'Machi',
-    'Aprili',
-    'Mei',
-    'Juni',
-    'Julai',
-    'Agosti',
-    'Septemba',
-    'Oktoba',
-    'Novemba',
-    'Desemba'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mac',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Ago',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mac',
-    'Apr',
-    'Mei',
-    'Jun',
-    'Jul',
-    'Ago',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Des'
-  ],
-      WEEKDAYS: const [
-    'Jumapili',
-    'Jumatatu',
-    'Jumanne',
-    'Jumatano',
-    'Alhamisi',
-    'Ijumaa',
-    'Jumamosi'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Jumapili',
-    'Jumatatu',
-    'Jumanne',
-    'Jumatano',
-    'Alhamisi',
-    'Ijumaa',
-    'Jumamosi'
-  ],
-      SHORTWEEKDAYS: const [
-    'Jumapili',
-    'Jumatatu',
-    'Jumanne',
-    'Jumatano',
-    'Alhamisi',
-    'Ijumaa',
-    'Jumamosi'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'Jumapili',
-    'Jumatatu',
-    'Jumanne',
-    'Jumatano',
-    'Alhamisi',
-    'Ijumaa',
-    'Jumamosi'
-  ],
-      NARROWWEEKDAYS: const ['2', '3', '4', '5', 'A', 'I', '1'],
-      STANDALONENARROWWEEKDAYS: const ['2', '3', '4', '5', 'A', 'I', '1'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ta.
-   */
-  "ta": new DateSymbols(
-      NAME: "ta",
-      ERAS: const ['கி.மு.', 'கி.பி.'],
-      ERANAMES: const ['கிறிஸ்துவுக்கு முன்', 'அனோ டோமினி'],
-      NARROWMONTHS: const [
-    'ஜ',
-    'பி',
-    'மா',
-    'ஏ',
-    'மே',
-    'ஜூ',
-    'ஜூ',
-    'ஆ',
-    'செ',
-    'அ',
-    'ந',
-    'டி'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ஜ',
-    'பி',
-    'மா',
-    'ஏ',
-    'மே',
-    'ஜூ',
-    'ஜூ',
-    'ஆ',
-    'செ',
-    'அ',
-    'ந',
-    'டி'
-  ],
-      MONTHS: const [
-    'ஜனவரி',
-    'பிப்ரவரி',
-    'மார்ச்',
-    'ஏப்ரல்',
-    'மே',
-    'ஜூன்',
-    'ஜூலை',
-    'ஆகஸ்ட்',
-    'செப்டம்பர்',
-    'அக்டோபர்',
-    'நவம்பர்',
-    'டிசம்பர்'
-  ],
-      STANDALONEMONTHS: const [
-    'ஜனவரி',
-    'பிப்ரவரி',
-    'மார்ச்',
-    'ஏப்ரல்',
-    'மே',
-    'ஜூன்',
-    'ஜூலை',
-    'ஆகஸ்டு',
-    'செப்டம்பர்',
-    'அக்டோபர்',
-    'நவம்பர்',
-    'டிசம்பர்'
-  ],
-      SHORTMONTHS: const [
-    'ஜன.',
-    'பிப்.',
-    'மார்.',
-    'ஏப்.',
-    'மே',
-    'ஜூன்',
-    'ஜூலை',
-    'ஆக.',
-    'செப்.',
-    'அக்.',
-    'நவ.',
-    'டிச.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ஜன.',
-    'பிப்.',
-    'மார்.',
-    'ஏப்.',
-    'மே',
-    'ஜூன்',
-    'ஜூலை',
-    'ஆக.',
-    'செப்.',
-    'அக்.',
-    'நவ.',
-    'டிச.'
-  ],
-      WEEKDAYS: const [
-    'ஞாயிறு',
-    'திங்கள்',
-    'செவ்வாய்',
-    'புதன்',
-    'வியாழன்',
-    'வெள்ளி',
-    'சனி'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ஞாயிறு',
-    'திங்கள்',
-    'செவ்வாய்',
-    'புதன்',
-    'வியாழன்',
-    'வெள்ளி',
-    'சனி'
-  ],
-      SHORTWEEKDAYS: const ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],
-      STANDALONESHORTWEEKDAYS: const ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],
-      NARROWWEEKDAYS: const ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],
-      STANDALONENARROWWEEKDAYS: const ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],
-      SHORTQUARTERS: const ['காலாண்டு1', 'காலாண்டு2', 'காலாண்டு3', 'காலாண்டு4'],
-      QUARTERS: const [
-    'முதல் காலாண்டு',
-    'இரண்டாம் காலாண்டு',
-    'மூன்றாம் காலாண்டு',
-    'நான்காம் காலாண்டு'
-  ],
-      AMPMS: const ['முற்பகல்', 'பிற்பகல்'],
-      DATEFORMATS: const ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd-M-yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale te.
-   */
-  "te": new DateSymbols(
-      NAME: "te",
-      ERAS: const ['క్రీపూ', 'క్రీశ'],
-      ERANAMES: const ['ఈసాపూర్వ.', 'సన్.'],
-      NARROWMONTHS: const [
-    'జ',
-    'ఫి',
-    'మా',
-    'ఏ',
-    'మే',
-    'జూ',
-    'జు',
-    'ఆ',
-    'సె',
-    'అ',
-    'న',
-    'డి'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'జ',
-    'ఫి',
-    'మా',
-    'ఏ',
-    'మే',
-    'జూ',
-    'జు',
-    'ఆ',
-    'సె',
-    'అ',
-    'న',
-    'డి'
-  ],
-      MONTHS: const [
-    'జనవరి',
-    'ఫిబ్రవరి',
-    'మార్చి',
-    'ఎప్రిల్',
-    'మే',
-    'జూన్',
-    'జులై',
-    'ఆగస్టు',
-    'సెప్టెంబర్',
-    'అక్టోబర్',
-    'నవంబర్',
-    'డిసెంబర్'
-  ],
-      STANDALONEMONTHS: const [
-    'జనవరి',
-    'ఫిబ్రవరి',
-    'మార్చి',
-    'ఎప్రిల్',
-    'మే',
-    'జూన్',
-    'జూలై',
-    'ఆగస్టు',
-    'సెప్టెంబర్',
-    'అక్టోబర్',
-    'నవంబర్',
-    'డిసెంబర్'
-  ],
-      SHORTMONTHS: const [
-    'జన',
-    'ఫిబ్ర',
-    'మార్చి',
-    'ఏప్రి',
-    'మే',
-    'జూన్',
-    'జులై',
-    'ఆగ',
-    'సెప్టెం',
-    'అక్టో',
-    'నవం',
-    'డిసెం'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'జన',
-    'ఫిబ్ర',
-    'మార్చి',
-    'ఏప్రి',
-    'మే',
-    'జూన్',
-    'జులై',
-    'ఆగస్టు',
-    'సెప్టెం',
-    'అక్టో',
-    'నవం',
-    'డిసెం'
-  ],
-      WEEKDAYS: const [
-    'ఆదివారం',
-    'సోమవారం',
-    'మంగళవారం',
-    'బుధవారం',
-    'గురువారం',
-    'శుక్రవారం',
-    'శనివారం'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'ఆదివారం',
-    'సోమవారం',
-    'మంగళవారం',
-    'బుధవారం',
-    'గురువారం',
-    'శుక్రవారం',
-    'శనివారం'
-  ],
-      SHORTWEEKDAYS: const [
-    'ఆది',
-    'సోమ',
-    'మంగళ',
-    'బుధ',
-    'గురు',
-    'శుక్ర',
-    'శని'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'ఆది',
-    'సోమ',
-    'మంగళ',
-    'బుధ',
-    'గురు',
-    'శుక్ర',
-    'శని'
-  ],
-      NARROWWEEKDAYS: const ['ఆ', 'సో', 'మ', 'బు', 'గు', 'శు', 'శ'],
-      STANDALONENARROWWEEKDAYS: const ['ఆ', 'సో', 'మ', 'బు', 'గు', 'శు', 'శ'],
-      SHORTQUARTERS: const ['త్రై1', 'త్రై2', 'త్రై3', 'త్రై4'],
-      QUARTERS: const [
-    '1వ త్రైమాసం',
-    '2వ త్రైమాసం',
-    '3వ త్రైమాసం',
-    '4వ త్రైమాసం'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'dd-MM-yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [6, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale th.
-   */
-  "th": new DateSymbols(
-      NAME: "th",
-      ERAS: const ['ปีก่อน ค.ศ.', 'ค.ศ.'],
-      ERANAMES: const ['ปีก่อนคริสต์ศักราช', 'คริสต์ศักราช'],
-      NARROWMONTHS: const [
-    'ม.ค.',
-    'ก.พ.',
-    'มี.ค.',
-    'เม.ย.',
-    'พ.ค.',
-    'มิ.ย.',
-    'ก.ค.',
-    'ส.ค.',
-    'ก.ย.',
-    'ต.ค.',
-    'พ.ย.',
-    'ธ.ค.'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'ม.ค.',
-    'ก.พ.',
-    'มี.ค.',
-    'เม.ย.',
-    'พ.ค.',
-    'มิ.ย.',
-    'ก.ค.',
-    'ส.ค.',
-    'ก.ย.',
-    'ต.ค.',
-    'พ.ย.',
-    'ธ.ค.'
-  ],
-      MONTHS: const [
-    'มกราคม',
-    'กุมภาพันธ์',
-    'มีนาคม',
-    'เมษายน',
-    'พฤษภาคม',
-    'มิถุนายน',
-    'กรกฎาคม',
-    'สิงหาคม',
-    'กันยายน',
-    'ตุลาคม',
-    'พฤศจิกายน',
-    'ธันวาคม'
-  ],
-      STANDALONEMONTHS: const [
-    'มกราคม',
-    'กุมภาพันธ์',
-    'มีนาคม',
-    'เมษายน',
-    'พฤษภาคม',
-    'มิถุนายน',
-    'กรกฎาคม',
-    'สิงหาคม',
-    'กันยายน',
-    'ตุลาคม',
-    'พฤศจิกายน',
-    'ธันวาคม'
-  ],
-      SHORTMONTHS: const [
-    'ม.ค.',
-    'ก.พ.',
-    'มี.ค.',
-    'เม.ย.',
-    'พ.ค.',
-    'มิ.ย.',
-    'ก.ค.',
-    'ส.ค.',
-    'ก.ย.',
-    'ต.ค.',
-    'พ.ย.',
-    'ธ.ค.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'ม.ค.',
-    'ก.พ.',
-    'มี.ค.',
-    'เม.ย.',
-    'พ.ค.',
-    'มิ.ย.',
-    'ก.ค.',
-    'ส.ค.',
-    'ก.ย.',
-    'ต.ค.',
-    'พ.ย.',
-    'ธ.ค.'
-  ],
-      WEEKDAYS: const [
-    'วันอาทิตย์',
-    'วันจันทร์',
-    'วันอังคาร',
-    'วันพุธ',
-    'วันพฤหัสบดี',
-    'วันศุกร์',
-    'วันเสาร์'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'วันอาทิตย์',
-    'วันจันทร์',
-    'วันอังคาร',
-    'วันพุธ',
-    'วันพฤหัสบดี',
-    'วันศุกร์',
-    'วันเสาร์'
-  ],
-      SHORTWEEKDAYS: const ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],
-      STANDALONESHORTWEEKDAYS: const [
-    'อา.',
-    'จ.',
-    'อ.',
-    'พ.',
-    'พฤ.',
-    'ศ.',
-    'ส.'
-  ],
-      NARROWWEEKDAYS: const ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
-      STANDALONENARROWWEEKDAYS: const ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
-      SHORTQUARTERS: const ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],
-      QUARTERS: const ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],
-      AMPMS: const ['ก่อนเที่ยง', 'หลังเที่ยง'],
-      DATEFORMATS: const [
-    'EEEEที่ d MMMM G y',
-    'd MMMM y',
-    'd MMM y',
-    'd/M/yy'
-  ],
-      TIMEFORMATS: const [
-    'H นาฬิกา mm นาที ss วินาที zzzz',
-    'H นาฬิกา mm นาที ss วินาที z',
-    'HH:mm:ss',
-    'HH:mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale tl.
-   */
-  "tl": new DateSymbols(
-      NAME: "tl",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['BC', 'AD'],
-      NARROWMONTHS: const [
-    'E',
-    'P',
-    'M',
-    'A',
-    'M',
-    'H',
-    'H',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'E',
-    'P',
-    'M',
-    'A',
-    'M',
-    'H',
-    'H',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Enero',
-    'Pebrero',
-    'Marso',
-    'Abril',
-    'Mayo',
-    'Hunyo',
-    'Hulyo',
-    'Agosto',
-    'Setyembre',
-    'Oktubre',
-    'Nobyembre',
-    'Disyembre'
-  ],
-      STANDALONEMONTHS: const [
-    'Enero',
-    'Pebrero',
-    'Marso',
-    'Abril',
-    'Mayo',
-    'Hunyo',
-    'Hulyo',
-    'Agosto',
-    'Setyembre',
-    'Oktubre',
-    'Nobyembre',
-    'Disyembre'
-  ],
-      SHORTMONTHS: const [
-    'Ene',
-    'Peb',
-    'Mar',
-    'Abr',
-    'May',
-    'Hun',
-    'Hul',
-    'Ago',
-    'Set',
-    'Okt',
-    'Nob',
-    'Dis'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Ene',
-    'Peb',
-    'Mar',
-    'Abr',
-    'May',
-    'Hun',
-    'Hul',
-    'Ago',
-    'Set',
-    'Okt',
-    'Nob',
-    'Dis'
-  ],
-      WEEKDAYS: const [
-    'Linggo',
-    'Lunes',
-    'Martes',
-    'Miyerkules',
-    'Huwebes',
-    'Biyernes',
-    'Sabado'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Linggo',
-    'Lunes',
-    'Martes',
-    'Miyerkules',
-    'Huwebes',
-    'Biyernes',
-    'Sabado'
-  ],
-      SHORTWEEKDAYS: const ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Lin',
-    'Lun',
-    'Mar',
-    'Miy',
-    'Huw',
-    'Biy',
-    'Sab'
-  ],
-      NARROWWEEKDAYS: const ['L', 'L', 'M', 'M', 'H', 'B', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['L', 'L', 'M', 'M', 'H', 'B', 'S'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    'ika-1 quarter',
-    'ika-2 quarter',
-    'ika-3 quarter',
-    'ika-4 na quarter'
-  ],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const [
-    '{1} \'ng\' {0}',
-    '{1} \'ng\' {0}',
-    '{1}, {0}',
-    '{1}, {0}'
-  ],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale tr.
-   */
-  "tr": new DateSymbols(
-      NAME: "tr",
-      ERAS: const ['MÖ', 'MS'],
-      ERANAMES: const ['Milattan Önce', 'Milattan Sonra'],
-      NARROWMONTHS: const [
-    'O',
-    'Ş',
-    'M',
-    'N',
-    'M',
-    'H',
-    'T',
-    'A',
-    'E',
-    'E',
-    'K',
-    'A'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'O',
-    'Ş',
-    'M',
-    'N',
-    'M',
-    'H',
-    'T',
-    'A',
-    'E',
-    'E',
-    'K',
-    'A'
-  ],
-      MONTHS: const [
-    'Ocak',
-    'Şubat',
-    'Mart',
-    'Nisan',
-    'Mayıs',
-    'Haziran',
-    'Temmuz',
-    'Ağustos',
-    'Eylül',
-    'Ekim',
-    'Kasım',
-    'Aralık'
-  ],
-      STANDALONEMONTHS: const [
-    'Ocak',
-    'Şubat',
-    'Mart',
-    'Nisan',
-    'Mayıs',
-    'Haziran',
-    'Temmuz',
-    'Ağustos',
-    'Eylül',
-    'Ekim',
-    'Kasım',
-    'Aralık'
-  ],
-      SHORTMONTHS: const [
-    'Oca',
-    'Şub',
-    'Mar',
-    'Nis',
-    'May',
-    'Haz',
-    'Tem',
-    'Ağu',
-    'Eyl',
-    'Eki',
-    'Kas',
-    'Ara'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Oca',
-    'Şub',
-    'Mar',
-    'Nis',
-    'May',
-    'Haz',
-    'Tem',
-    'Ağu',
-    'Eyl',
-    'Eki',
-    'Kas',
-    'Ara'
-  ],
-      WEEKDAYS: const [
-    'Pazar',
-    'Pazartesi',
-    'Salı',
-    'Çarşamba',
-    'Perşembe',
-    'Cuma',
-    'Cumartesi'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Pazar',
-    'Pazartesi',
-    'Salı',
-    'Çarşamba',
-    'Perşembe',
-    'Cuma',
-    'Cumartesi'
-  ],
-      SHORTWEEKDAYS: const ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Paz',
-    'Pzt',
-    'Sal',
-    'Çar',
-    'Per',
-    'Cum',
-    'Cmt'
-  ],
-      NARROWWEEKDAYS: const ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],
-      STANDALONENARROWWEEKDAYS: const ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],
-      SHORTQUARTERS: const ['Ç1', 'Ç2', 'Ç3', 'Ç4'],
-      QUARTERS: const ['1. çeyrek', '2. çeyrek', '3. çeyrek', '4. çeyrek'],
-      AMPMS: const ['ÖÖ', 'ÖS'],
-      DATEFORMATS: const ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'd MM y'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale uk.
-   */
-  "uk": new DateSymbols(
-      NAME: "uk",
-      ERAS: const ['до н.е.', 'н.е.'],
-      ERANAMES: const ['до нашої ери', 'нашої ери'],
-      NARROWMONTHS: const [
-    'С',
-    'Л',
-    'Б',
-    'К',
-    'Т',
-    'Ч',
-    'Л',
-    'С',
-    'В',
-    'Ж',
-    'Л',
-    'Г'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'С',
-    'Л',
-    'Б',
-    'К',
-    'Т',
-    'Ч',
-    'Л',
-    'С',
-    'В',
-    'Ж',
-    'Л',
-    'Г'
-  ],
-      MONTHS: const [
-    'січня',
-    'лютого',
-    'березня',
-    'квітня',
-    'травня',
-    'червня',
-    'липня',
-    'серпня',
-    'вересня',
-    'жовтня',
-    'листопада',
-    'грудня'
-  ],
-      STANDALONEMONTHS: const [
-    'Січень',
-    'Лютий',
-    'Березень',
-    'Квітень',
-    'Травень',
-    'Червень',
-    'Липень',
-    'Серпень',
-    'Вересень',
-    'Жовтень',
-    'Листопад',
-    'Грудень'
-  ],
-      SHORTMONTHS: const [
-    'січ.',
-    'лют.',
-    'бер.',
-    'квіт.',
-    'трав.',
-    'черв.',
-    'лип.',
-    'серп.',
-    'вер.',
-    'жовт.',
-    'лист.',
-    'груд.'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Січ',
-    'Лют',
-    'Бер',
-    'Кві',
-    'Тра',
-    'Чер',
-    'Лип',
-    'Сер',
-    'Вер',
-    'Жов',
-    'Лис',
-    'Гру'
-  ],
-      WEEKDAYS: const [
-    'неділя',
-    'понеділок',
-    'вівторок',
-    'середа',
-    'четвер',
-    'пʼятниця',
-    'субота'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Неділя',
-    'Понеділок',
-    'Вівторок',
-    'Середа',
-    'Четвер',
-    'Пʼятниця',
-    'Субота'
-  ],
-      SHORTWEEKDAYS: const ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-      STANDALONESHORTWEEKDAYS: const ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-      NARROWWEEKDAYS: const ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],
-      STANDALONENARROWWEEKDAYS: const ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],
-      SHORTQUARTERS: const ['I кв.', 'II кв.', 'III кв.', 'IV кв.'],
-      QUARTERS: const ['I квартал', 'II квартал', 'III квартал', 'IV квартал'],
-      AMPMS: const ['дп', 'пп'],
-      DATEFORMATS: const [
-    'EEEE, d MMMM y \'р\'.',
-    'd MMMM y \'р\'.',
-    'd MMM y',
-    'dd.MM.yy'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale ur.
-   */
-  "ur": new DateSymbols(
-      NAME: "ur",
-      ERAS: const ['ق م', 'عیسوی سن'],
-      ERANAMES: const ['قبل مسیح', 'عیسوی سن'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'جنوری',
-    'فروری',
-    'مارچ',
-    'اپریل',
-    'مئی',
-    'جون',
-    'جولائی',
-    'اگست',
-    'ستمبر',
-    'اکتوبر',
-    'نومبر',
-    'دسمبر'
-  ],
-      STANDALONEMONTHS: const [
-    'جنوری',
-    'فروری',
-    'مارچ',
-    'اپریل',
-    'مئی',
-    'جون',
-    'جولائی',
-    'اگست',
-    'ستمبر',
-    'اکتوبر',
-    'نومبر',
-    'دسمبر'
-  ],
-      SHORTMONTHS: const [
-    'جنوری',
-    'فروری',
-    'مارچ',
-    'اپریل',
-    'مئی',
-    'جون',
-    'جولائی',
-    'اگست',
-    'ستمبر',
-    'اکتوبر',
-    'نومبر',
-    'دسمبر'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'جنوری',
-    'فروری',
-    'مارچ',
-    'اپریل',
-    'مئی',
-    'جون',
-    'جولائی',
-    'اگست',
-    'ستمبر',
-    'اکتوبر',
-    'نومبر',
-    'دسمبر'
-  ],
-      WEEKDAYS: const [
-    'اتوار',
-    'سوموار',
-    'منگل',
-    'بدھ',
-    'جمعرات',
-    'جمعہ',
-    'ہفتہ'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'اتوار',
-    'سوموار',
-    'منگل',
-    'بدھ',
-    'جمعرات',
-    'جمعہ',
-    'ہفتہ'
-  ],
-      SHORTWEEKDAYS: const [
-    'اتوار',
-    'سوموار',
-    'منگل',
-    'بدھ',
-    'جمعرات',
-    'جمعہ',
-    'ہفتہ'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'اتوار',
-    'سوموار',
-    'منگل',
-    'بدھ',
-    'جمعرات',
-    'جمعہ',
-    'ہفتہ'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
-      SHORTQUARTERS: const [
-    'پہلی سہ ماہی',
-    'دوسری سہ ماہی',
-    'تیسری سہ ماہی',
-    'چوتهی سہ ماہی'
-  ],
-      QUARTERS: const [
-    'پہلی سہ ماہی',
-    'دوسری سہ ماہی',
-    'تیسری سہ ماہی',
-    'چوتهی سہ ماہی'
-  ],
-      AMPMS: const ['قبل دوپہر', 'بعد دوپہر'],
-      DATEFORMATS: const ['EEEE، d MMMM، y', 'd MMMM، y', 'd MMM، y', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale uz.
-   */
-  "uz": new DateSymbols(
-      NAME: "uz",
-      ERAS: const ['M.A.', 'E'],
-      ERANAMES: const ['M.A.', 'E'],
-      NARROWMONTHS: const [
-    'Y',
-    'F',
-    'M',
-    'A',
-    'M',
-    'I',
-    'I',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'Y',
-    'F',
-    'M',
-    'A',
-    'M',
-    'I',
-    'I',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Yanvar',
-    'Fevral',
-    'Mart',
-    'Aprel',
-    'May',
-    'Iyun',
-    'Iyul',
-    'Avgust',
-    'Sentyabr',
-    'Oktyabr',
-    'Noyabr',
-    'Dekabr'
-  ],
-      STANDALONEMONTHS: const [
-    'Yanvar',
-    'Fevral',
-    'Mart',
-    'Aprel',
-    'May',
-    'Iyun',
-    'Iyul',
-    'Avgust',
-    'Sentyabr',
-    'Oktyabr',
-    'Noyabr',
-    'Dekabr'
-  ],
-      SHORTMONTHS: const [
-    'Yanv',
-    'Fev',
-    'Mar',
-    'Apr',
-    'May',
-    'Iyun',
-    'Iyul',
-    'Avg',
-    'Sen',
-    'Okt',
-    'Noya',
-    'Dek'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Yanv',
-    'Fev',
-    'Mar',
-    'Apr',
-    'May',
-    'Iyun',
-    'Iyul',
-    'Avg',
-    'Sen',
-    'Okt',
-    'Noya',
-    'Dek'
-  ],
-      WEEKDAYS: const [
-    'yakshanba',
-    'dushanba',
-    'seshanba',
-    'chorshanba',
-    'payshanba',
-    'juma',
-    'shanba'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'yakshanba',
-    'dushanba',
-    'seshanba',
-    'chorshanba',
-    'payshanba',
-    'juma',
-    'shanba'
-  ],
-      SHORTWEEKDAYS: const [
-    'Yaksh',
-    'Dush',
-    'Sesh',
-    'Chor',
-    'Pay',
-    'Jum',
-    'Shan'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'Yaksh',
-    'Dush',
-    'Sesh',
-    'Chor',
-    'Pay',
-    'Jum',
-    'Shan'
-  ],
-      NARROWWEEKDAYS: const ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],
-      STANDALONENARROWWEEKDAYS: const ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],
-      SHORTQUARTERS: const ['1-ch', '2-ch', '3-ch', '4-ch'],
-      QUARTERS: const ['1-chorak', '2-chorak', '3-chorak', '4-chorak'],
-      AMPMS: const ['AM', 'PM'],
-      DATEFORMATS: const ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'yy/MM/dd'],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale vi.
-   */
-  "vi": new DateSymbols(
-      NAME: "vi",
-      ERAS: const ['tr. CN', 'sau CN'],
-      ERANAMES: const ['tr. CN', 'sau CN'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    'tháng 1',
-    'tháng 2',
-    'tháng 3',
-    'tháng 4',
-    'tháng 5',
-    'tháng 6',
-    'tháng 7',
-    'tháng 8',
-    'tháng 9',
-    'tháng 10',
-    'tháng 11',
-    'tháng 12'
-  ],
-      STANDALONEMONTHS: const [
-    'Tháng 1',
-    'Tháng 2',
-    'Tháng 3',
-    'Tháng 4',
-    'Tháng 5',
-    'Tháng 6',
-    'Tháng 7',
-    'Tháng 8',
-    'Tháng 9',
-    'Tháng 10',
-    'Tháng 11',
-    'Tháng 12'
-  ],
-      SHORTMONTHS: const [
-    'thg 1',
-    'thg 2',
-    'thg 3',
-    'thg 4',
-    'thg 5',
-    'thg 6',
-    'thg 7',
-    'thg 8',
-    'thg 9',
-    'thg 10',
-    'thg 11',
-    'thg 12'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Thg 1',
-    'Thg 2',
-    'Thg 3',
-    'Thg 4',
-    'Thg 5',
-    'Thg 6',
-    'Thg 7',
-    'Thg 8',
-    'Thg 9',
-    'Thg 10',
-    'Thg 11',
-    'Thg 12'
-  ],
-      WEEKDAYS: const [
-    'Chủ Nhật',
-    'Thứ Hai',
-    'Thứ Ba',
-    'Thứ Tư',
-    'Thứ Năm',
-    'Thứ Sáu',
-    'Thứ Bảy'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Chủ Nhật',
-    'Thứ Hai',
-    'Thứ Ba',
-    'Thứ Tư',
-    'Thứ Năm',
-    'Thứ Sáu',
-    'Thứ Bảy'
-  ],
-      SHORTWEEKDAYS: const [
-    'CN',
-    'Th 2',
-    'Th 3',
-    'Th 4',
-    'Th 5',
-    'Th 6',
-    'Th 7'
-  ],
-      STANDALONESHORTWEEKDAYS: const [
-    'CN',
-    'Th 2',
-    'Th 3',
-    'Th 4',
-    'Th 5',
-    'Th 6',
-    'Th 7'
-  ],
-      NARROWWEEKDAYS: const ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
-      STANDALONENARROWWEEKDAYS: const [
-    'CN',
-    'T2',
-    'T3',
-    'T4',
-    'T5',
-    'T6',
-    'T7'
-  ],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const ['Quý 1', 'Quý 2', 'Quý 3', 'Quý 4'],
-      AMPMS: const ['SA', 'CH'],
-      DATEFORMATS: const [
-    'EEEE, \'ngày\' dd MMMM \'năm\' y',
-    '\'Ngày\' dd \'tháng\' MM \'năm\' y',
-    'dd-MM-y',
-    'dd/MM/y'
-  ],
-      TIMEFORMATS: const ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],
-      DATETIMEFORMATS: const ['{0} {1}', '{0} {1}', '{0} {1}', '{0} {1}'],
-      FIRSTDAYOFWEEK: 0,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 6),
-  /**
-   * Date/time formatting symbols for locale zh.
-   */
-  "zh": new DateSymbols(
-      NAME: "zh",
-      ERAS: const ['公元前', '公元'],
-      ERANAMES: const ['公元前', '公元'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    '一月',
-    '二月',
-    '三月',
-    '四月',
-    '五月',
-    '六月',
-    '七月',
-    '八月',
-    '九月',
-    '十月',
-    '十一月',
-    '十二月'
-  ],
-      STANDALONEMONTHS: const [
-    '一月',
-    '二月',
-    '三月',
-    '四月',
-    '五月',
-    '六月',
-    '七月',
-    '八月',
-    '九月',
-    '十月',
-    '十一月',
-    '十二月'
-  ],
-      SHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-      STANDALONEWEEKDAYS: const [
-    '星期日',
-    '星期一',
-    '星期二',
-    '星期三',
-    '星期四',
-    '星期五',
-    '星期六'
-  ],
-      SHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
-      STANDALONESHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
-      NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      SHORTQUARTERS: const ['1季度', '2季度', '3季度', '4季度'],
-      QUARTERS: const ['第一季度', '第二季度', '第三季度', '第四季度'],
-      AMPMS: const ['上午', '下午'],
-      DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'yy/M/d'],
-      TIMEFORMATS: const ['zzzzah:mm:ss', 'zah:mm:ss', 'ah:mm:ss', 'ah:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale zh_CN.
-   */
-  /**
-   * Date/time formatting symbols for locale zh_CN.
-   */
-  "zh_CN": new DateSymbols(
-      NAME: "zh_CN",
-      ERAS: const ['公元前', '公元'],
-      ERANAMES: const ['公元前', '公元'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    '一月',
-    '二月',
-    '三月',
-    '四月',
-    '五月',
-    '六月',
-    '七月',
-    '八月',
-    '九月',
-    '十月',
-    '十一月',
-    '十二月'
-  ],
-      STANDALONEMONTHS: const [
-    '一月',
-    '二月',
-    '三月',
-    '四月',
-    '五月',
-    '六月',
-    '七月',
-    '八月',
-    '九月',
-    '十月',
-    '十一月',
-    '十二月'
-  ],
-      SHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-      STANDALONEWEEKDAYS: const [
-    '星期日',
-    '星期一',
-    '星期二',
-    '星期三',
-    '星期四',
-    '星期五',
-    '星期六'
-  ],
-      SHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
-      STANDALONESHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
-      NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      SHORTQUARTERS: const ['1季度', '2季度', '3季度', '4季度'],
-      QUARTERS: const ['第一季度', '第二季度', '第三季度', '第四季度'],
-      AMPMS: const ['上午', '下午'],
-      DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'yy/M/d'],
-      TIMEFORMATS: const ['zzzzah:mm:ss', 'zah:mm:ss', 'ah:mm:ss', 'ah:mm'],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale zh_HK.
-   */
-  "zh_HK": new DateSymbols(
-      NAME: "zh_HK",
-      ERAS: const ['西元前', '西元'],
-      ERANAMES: const ['西元前', '西元'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONEMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      SHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-      STANDALONEWEEKDAYS: const [
-    '星期日',
-    '星期一',
-    '星期二',
-    '星期三',
-    '星期四',
-    '星期五',
-    '星期六'
-  ],
-      SHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
-      STANDALONESHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
-      NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      SHORTQUARTERS: const ['1季', '2季', '3季', '4季'],
-      QUARTERS: const ['第1季', '第2季', '第3季', '第4季'],
-      AMPMS: const ['上午', '下午'],
-      DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/yy'],
-      TIMEFORMATS: const [
-    'ah:mm:ss [zzzz]',
-    'ah:mm:ss [z]',
-    'ah:mm:ss',
-    'ah:mm'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}{0}', '{1}{0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale zh_TW.
-   */
-  "zh_TW": new DateSymbols(
-      NAME: "zh_TW",
-      ERAS: const ['西元前', '西元'],
-      ERANAMES: const ['西元前', '西元'],
-      NARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      STANDALONENARROWMONTHS: const [
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '7',
-    '8',
-    '9',
-    '10',
-    '11',
-    '12'
-  ],
-      MONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONEMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      SHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      STANDALONESHORTMONTHS: const [
-    '1月',
-    '2月',
-    '3月',
-    '4月',
-    '5月',
-    '6月',
-    '7月',
-    '8月',
-    '9月',
-    '10月',
-    '11月',
-    '12月'
-  ],
-      WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-      STANDALONEWEEKDAYS: const [
-    '星期日',
-    '星期一',
-    '星期二',
-    '星期三',
-    '星期四',
-    '星期五',
-    '星期六'
-  ],
-      SHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
-      STANDALONESHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
-      NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
-      SHORTQUARTERS: const ['1季', '2季', '3季', '4季'],
-      QUARTERS: const ['第1季', '第2季', '第3季', '第4季'],
-      AMPMS: const ['上午', '下午'],
-      DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],
-      TIMEFORMATS: const ['zzzzah時mm分ss秒', 'zah時mm分ss秒', 'ah:mm:ss', 'ah:mm'],
-      DATETIMEFORMATS: const ['{1}{0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5),
-  /**
-   * Date/time formatting symbols for locale zu.
-   */
-  "zu": new DateSymbols(
-      NAME: "zu",
-      ERAS: const ['BC', 'AD'],
-      ERANAMES: const ['BC', 'AD'],
-      NARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      STANDALONENARROWMONTHS: const [
-    'J',
-    'F',
-    'M',
-    'A',
-    'M',
-    'J',
-    'J',
-    'A',
-    'S',
-    'O',
-    'N',
-    'D'
-  ],
-      MONTHS: const [
-    'Januwari',
-    'Februwari',
-    'Mashi',
-    'Apreli',
-    'Meyi',
-    'Juni',
-    'Julayi',
-    'Agasti',
-    'Septhemba',
-    'Okthoba',
-    'Novemba',
-    'Disemba'
-  ],
-      STANDALONEMONTHS: const [
-    'uJanuwari',
-    'uFebruwari',
-    'uMashi',
-    'u-Apreli',
-    'uMeyi',
-    'uJuni',
-    'uJulayi',
-    'uAgasti',
-    'uSepthemba',
-    'u-Okthoba',
-    'uNovemba',
-    'uDisemba'
-  ],
-      SHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mas',
-    'Apr',
-    'Mey',
-    'Jun',
-    'Jul',
-    'Aga',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dis'
-  ],
-      STANDALONESHORTMONTHS: const [
-    'Jan',
-    'Feb',
-    'Mas',
-    'Apr',
-    'Mey',
-    'Jun',
-    'Jul',
-    'Aga',
-    'Sep',
-    'Okt',
-    'Nov',
-    'Dis'
-  ],
-      WEEKDAYS: const [
-    'Sonto',
-    'Msombuluko',
-    'Lwesibili',
-    'Lwesithathu',
-    'Lwesine',
-    'Lwesihlanu',
-    'Mgqibelo'
-  ],
-      STANDALONEWEEKDAYS: const [
-    'Sonto',
-    'Msombuluko',
-    'Lwesibili',
-    'Lwesithathu',
-    'Lwesine',
-    'Lwesihlanu',
-    'Mgqibelo'
-  ],
-      SHORTWEEKDAYS: const ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'],
-      STANDALONESHORTWEEKDAYS: const [
-    'Son',
-    'Mso',
-    'Bil',
-    'Tha',
-    'Sin',
-    'Hla',
-    'Mgq'
-  ],
-      NARROWWEEKDAYS: const ['S', 'M', 'T', 'T', 'S', 'H', 'M'],
-      STANDALONENARROWWEEKDAYS: const ['S', 'M', 'B', 'T', 'S', 'H', 'M'],
-      SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
-      QUARTERS: const [
-    'ikota engu-1',
-    'ikota engu-2',
-    'ikota engu-3',
-    'ikota engu-4'
-  ],
-      AMPMS: const ['Ekuseni', 'Ntambama'],
-      DATEFORMATS: const ['EEEE dd MMMM y', 'd MMMM y', 'd MMM y', 'y-MM-dd'],
-      TIMEFORMATS: const [
-    'h:mm:ss a zzzz',
-    'h:mm:ss a z',
-    'h:mm:ss a',
-    'h:mm a'
-  ],
-      DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
-      FIRSTDAYOFWEEK: 6,
-      WEEKENDRANGE: const [5, 6],
-      FIRSTWEEKCUTOFFDAY: 5)
-};
+      // Date/time formatting symbols for locale af.
+      "af": new DateSymbols(
+          NAME: "af",
+          ERAS: const ['v.C.', 'n.C.'],
+          ERANAMES: const ['voor Christus', 'na Christus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januarie',
+            'Februarie',
+            'Maart',
+            'April',
+            'Mei',
+            'Junie',
+            'Julie',
+            'Augustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januarie',
+            'Februarie',
+            'Maart',
+            'April',
+            'Mei',
+            'Junie',
+            'Julie',
+            'Augustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          SHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'Mrt.',
+            'Apr.',
+            'Mei',
+            'Jun.',
+            'Jul.',
+            'Aug.',
+            'Sep.',
+            'Okt.',
+            'Nov.',
+            'Des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'Mrt.',
+            'Apr.',
+            'Mei',
+            'Jun.',
+            'Jul.',
+            'Aug.',
+            'Sep.',
+            'Okt.',
+            'Nov.',
+            'Des.'
+          ],
+          WEEKDAYS: const [
+            'Sondag',
+            'Maandag',
+            'Dinsdag',
+            'Woensdag',
+            'Donderdag',
+            'Vrydag',
+            'Saterdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sondag',
+            'Maandag',
+            'Dinsdag',
+            'Woensdag',
+            'Donderdag',
+            'Vrydag',
+            'Saterdag'
+          ],
+          SHORTWEEKDAYS: const [
+            'So.',
+            'Ma.',
+            'Di.',
+            'Wo.',
+            'Do.',
+            'Vr.',
+            'Sa.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'So.',
+            'Ma.',
+            'Di.',
+            'Wo.',
+            'Do.',
+            'Vr.',
+            'Sa.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'D', 'W', 'D', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'W', 'D', 'V', 'S'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1ste kwartaal',
+            '2de kwartaal',
+            '3de kwartaal',
+            '4de kwartaal'
+          ],
+          AMPMS: const ['vm.', 'nm.'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM y',
+            'dd MMMM y',
+            'dd MMM y',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale am.
+      "am": new DateSymbols(
+          NAME: "am",
+          ERAS: const ['ዓ/ዓ', 'ዓ/ም'],
+          ERANAMES: const ['ዓመተ ዓለም', 'ዓመተ ምሕረት'],
+          NARROWMONTHS: const [
+            'ጃ',
+            'ፌ',
+            'ማ',
+            'ኤ',
+            'ሜ',
+            'ጁ',
+            'ጁ',
+            'ኦ',
+            'ሴ',
+            'ኦ',
+            'ኖ',
+            'ዲ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ጃ',
+            'ፌ',
+            'ማ',
+            'ኤ',
+            'ሜ',
+            'ጁ',
+            'ጁ',
+            'ኦ',
+            'ሴ',
+            'ኦ',
+            'ኖ',
+            'ዲ'
+          ],
+          MONTHS: const [
+            'ጃንዩወሪ',
+            'ፌብሩወሪ',
+            'ማርች',
+            'ኤፕሪል',
+            'ሜይ',
+            'ጁን',
+            'ጁላይ',
+            'ኦገስት',
+            'ሴፕቴምበር',
+            'ኦክቶበር',
+            'ኖቬምበር',
+            'ዲሴምበር'
+          ],
+          STANDALONEMONTHS: const [
+            'ጃንዩወሪ',
+            'ፌብሩወሪ',
+            'ማርች',
+            'ኤፕሪል',
+            'ሜይ',
+            'ጁን',
+            'ጁላይ',
+            'ኦገስት',
+            'ሴፕቴምበር',
+            'ኦክቶበር',
+            'ኖቬምበር',
+            'ዲሴምበር'
+          ],
+          SHORTMONTHS: const [
+            'ጃንዩ',
+            'ፌብሩ',
+            'ማርች',
+            'ኤፕሪ',
+            'ሜይ',
+            'ጁን',
+            'ጁላይ',
+            'ኦገስ',
+            'ሴፕቴ',
+            'ኦክቶ',
+            'ኖቬም',
+            'ዲሴም'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ጃንዩ',
+            'ፌብሩ',
+            'ማርች',
+            'ኤፕሪ',
+            'ሜይ',
+            'ጁን',
+            'ጁላይ',
+            'ኦገስ',
+            'ሴፕቴ',
+            'ኦክቶ',
+            'ኖቬም',
+            'ዲሴም'
+          ],
+          WEEKDAYS: const ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],
+          STANDALONEWEEKDAYS: const [
+            'እሑድ',
+            'ሰኞ',
+            'ማክሰኞ',
+            'ረቡዕ',
+            'ሐሙስ',
+            'ዓርብ',
+            'ቅዳሜ'
+          ],
+          SHORTWEEKDAYS: const ['እሑድ', 'ሰኞ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],
+          STANDALONESHORTWEEKDAYS: const [
+            'እሑድ',
+            'ሰኞ',
+            'ማክሰ',
+            'ረቡዕ',
+            'ሐሙስ',
+            'ዓርብ',
+            'ቅዳሜ'
+          ],
+          NARROWWEEKDAYS: const ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],
+          STANDALONENARROWWEEKDAYS: const ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],
+          SHORTQUARTERS: const ['ሩብ1', 'ሩብ2', 'ሩብ3', 'ሩብ4'],
+          QUARTERS: const ['1ኛው ሩብ', '2ኛው ሩብ', '3ኛው ሩብ', '4ኛው ሩብ'],
+          AMPMS: const ['ጥዋት', 'ከሰዓት'],
+          DATEFORMATS: const [
+            'EEEE ፣d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ar.
+      "ar": new DateSymbols(
+          NAME: "ar",
+          ERAS: const ['ق.م', 'م'],
+          ERANAMES: const ['قبل الميلاد', 'ميلادي'],
+          NARROWMONTHS: const [
+            'ي',
+            'ف',
+            'م',
+            'أ',
+            'و',
+            'ن',
+            'ل',
+            'غ',
+            'س',
+            'ك',
+            'ب',
+            'د'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ي',
+            'ف',
+            'م',
+            'أ',
+            'و',
+            'ن',
+            'ل',
+            'غ',
+            'س',
+            'ك',
+            'ب',
+            'د'
+          ],
+          MONTHS: const [
+            'يناير',
+            'فبراير',
+            'مارس',
+            'أبريل',
+            'مايو',
+            'يونيو',
+            'يوليو',
+            'أغسطس',
+            'سبتمبر',
+            'أكتوبر',
+            'نوفمبر',
+            'ديسمبر'
+          ],
+          STANDALONEMONTHS: const [
+            'يناير',
+            'فبراير',
+            'مارس',
+            'أبريل',
+            'مايو',
+            'يونيو',
+            'يوليو',
+            'أغسطس',
+            'سبتمبر',
+            'أكتوبر',
+            'نوفمبر',
+            'ديسمبر'
+          ],
+          SHORTMONTHS: const [
+            'يناير',
+            'فبراير',
+            'مارس',
+            'أبريل',
+            'مايو',
+            'يونيو',
+            'يوليو',
+            'أغسطس',
+            'سبتمبر',
+            'أكتوبر',
+            'نوفمبر',
+            'ديسمبر'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'يناير',
+            'فبراير',
+            'مارس',
+            'أبريل',
+            'مايو',
+            'يونيو',
+            'يوليو',
+            'أغسطس',
+            'سبتمبر',
+            'أكتوبر',
+            'نوفمبر',
+            'ديسمبر'
+          ],
+          WEEKDAYS: const [
+            'الأحد',
+            'الاثنين',
+            'الثلاثاء',
+            'الأربعاء',
+            'الخميس',
+            'الجمعة',
+            'السبت'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'الأحد',
+            'الاثنين',
+            'الثلاثاء',
+            'الأربعاء',
+            'الخميس',
+            'الجمعة',
+            'السبت'
+          ],
+          SHORTWEEKDAYS: const [
+            'الأحد',
+            'الاثنين',
+            'الثلاثاء',
+            'الأربعاء',
+            'الخميس',
+            'الجمعة',
+            'السبت'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'الأحد',
+            'الاثنين',
+            'الثلاثاء',
+            'الأربعاء',
+            'الخميس',
+            'الجمعة',
+            'السبت'
+          ],
+          NARROWWEEKDAYS: const ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
+          STANDALONENARROWWEEKDAYS: const ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
+          SHORTQUARTERS: const [
+            'الربع الأول',
+            'الربع الثاني',
+            'الربع الثالث',
+            'الربع الرابع'
+          ],
+          QUARTERS: const [
+            'الربع الأول',
+            'الربع الثاني',
+            'الربع الثالث',
+            'الربع الرابع'
+          ],
+          AMPMS: const ['ص', 'م'],
+          DATEFORMATS: const [
+            'EEEE، d MMMM، y',
+            'd MMMM، y',
+            'dd‏/MM‏/y',
+            'd‏/M‏/y'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 5,
+          WEEKENDRANGE: const [4, 5],
+          FIRSTWEEKCUTOFFDAY: 4),
+      // Date/time formatting symbols for locale az.
+      "az": new DateSymbols(
+          NAME: "az",
+          ERAS: const ['e.ə.', 'y.e.'],
+          ERANAMES: const ['eramızdan əvvəl', 'yeni era'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'yanvar',
+            'fevral',
+            'mart',
+            'aprel',
+            'may',
+            'iyun',
+            'iyul',
+            'avqust',
+            'sentyabr',
+            'oktyabr',
+            'noyabr',
+            'dekabr'
+          ],
+          STANDALONEMONTHS: const [
+            'Yanvar',
+            'Fevral',
+            'Mart',
+            'Aprel',
+            'May',
+            'İyun',
+            'İyul',
+            'Avqust',
+            'Sentyabr',
+            'Oktyabr',
+            'Noyabr',
+            'Dekabr'
+          ],
+          SHORTMONTHS: const [
+            'yan',
+            'fev',
+            'mar',
+            'apr',
+            'may',
+            'iyn',
+            'iyl',
+            'avq',
+            'sen',
+            'okt',
+            'noy',
+            'dek'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'yan',
+            'fev',
+            'mar',
+            'apr',
+            'may',
+            'iyn',
+            'iyl',
+            'avq',
+            'sen',
+            'okt',
+            'noy',
+            'dek'
+          ],
+          WEEKDAYS: const [
+            'bazar',
+            'bazar ertəsi',
+            'çərşənbə axşamı',
+            'çərşənbə',
+            'cümə axşamı',
+            'cümə',
+            'şənbə'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'bazar',
+            'bazar ertəsi',
+            'çərşənbə axşamı',
+            'çərşənbə',
+            'cümə axşamı',
+            'cümə',
+            'şənbə'
+          ],
+          SHORTWEEKDAYS: const ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],
+          STANDALONESHORTWEEKDAYS: const [
+            'B.',
+            'B.E.',
+            'Ç.A.',
+            'Ç.',
+            'C.A.',
+            'C.',
+            'Ş.'
+          ],
+          NARROWWEEKDAYS: const ['7', '1', '2', '3', '4', '5', '6'],
+          STANDALONENARROWWEEKDAYS: const ['7', '1', '2', '3', '4', '5', '6'],
+          SHORTQUARTERS: const ['1-ci kv.', '2-ci kv.', '3-cü kv.', '4-cü kv.'],
+          QUARTERS: const [
+            '1-ci kvartal',
+            '2-ci kvartal',
+            '3-cü kvartal',
+            '4-cü kvartal'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'd MMMM y, EEEE',
+            'd MMMM y',
+            'd MMM y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale be.
+      "be": new DateSymbols(
+          NAME: "be",
+          ERAS: const ['да н.э.', 'н.э.'],
+          ERANAMES: const ['да нараджэння Хрыстова', 'ад нараджэння Хрыстова'],
+          NARROWMONTHS: const [
+            'с',
+            'л',
+            'с',
+            'к',
+            'м',
+            'ч',
+            'л',
+            'ж',
+            'в',
+            'к',
+            'л',
+            'с'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'с',
+            'л',
+            'с',
+            'к',
+            'м',
+            'ч',
+            'л',
+            'ж',
+            'в',
+            'к',
+            'л',
+            'с'
+          ],
+          MONTHS: const [
+            'студзеня',
+            'лютага',
+            'сакавіка',
+            'красавіка',
+            'мая',
+            'чэрвеня',
+            'ліпеня',
+            'жніўня',
+            'верасня',
+            'кастрычніка',
+            'лістапада',
+            'снежня'
+          ],
+          STANDALONEMONTHS: const [
+            'студзень',
+            'люты',
+            'сакавік',
+            'красавік',
+            'май',
+            'чэрвень',
+            'ліпень',
+            'жнівень',
+            'верасень',
+            'кастрычнік',
+            'лістапад',
+            'снежань'
+          ],
+          SHORTMONTHS: const [
+            'сту',
+            'лют',
+            'сак',
+            'кра',
+            'мая',
+            'чэр',
+            'ліп',
+            'жні',
+            'вер',
+            'кас',
+            'ліс',
+            'сне'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'сту',
+            'лют',
+            'сак',
+            'кра',
+            'май',
+            'чэр',
+            'ліп',
+            'жні',
+            'вер',
+            'кас',
+            'ліс',
+            'сне'
+          ],
+          WEEKDAYS: const [
+            'нядзеля',
+            'панядзелак',
+            'аўторак',
+            'серада',
+            'чацвер',
+            'пятніца',
+            'субота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'нядзеля',
+            'панядзелак',
+            'аўторак',
+            'серада',
+            'чацвер',
+            'пятніца',
+            'субота'
+          ],
+          SHORTWEEKDAYS: const ['нд', 'пн', 'аў', 'ср', 'чц', 'пт', 'сб'],
+          STANDALONESHORTWEEKDAYS: const [
+            'нд',
+            'пн',
+            'аў',
+            'ср',
+            'чц',
+            'пт',
+            'сб'
+          ],
+          NARROWWEEKDAYS: const ['н', 'п', 'а', 'с', 'ч', 'п', 'с'],
+          STANDALONENARROWWEEKDAYS: const ['н', 'п', 'а', 'с', 'ч', 'п', 'с'],
+          SHORTQUARTERS: const ['1-шы кв.', '2-гі кв.', '3-ці кв.', '4-ты кв.'],
+          QUARTERS: const [
+            '1-шы квартал',
+            '2-гі квартал',
+            '3-ці квартал',
+            '4-ты квартал'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y \'г\'.',
+            'd MMMM y \'г\'.',
+            'd.MM.y',
+            'd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss, zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'у\' {0}',
+            '{1} \'у\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale bg.
+      "bg": new DateSymbols(
+          NAME: "bg",
+          ERAS: const ['пр.Хр.', 'сл.Хр.'],
+          ERANAMES: const ['преди Христа', 'след Христа'],
+          NARROWMONTHS: const [
+            'я',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ю',
+            'ю',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'я',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ю',
+            'ю',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          MONTHS: const [
+            'януари',
+            'февруари',
+            'март',
+            'април',
+            'май',
+            'юни',
+            'юли',
+            'август',
+            'септември',
+            'октомври',
+            'ноември',
+            'декември'
+          ],
+          STANDALONEMONTHS: const [
+            'януари',
+            'февруари',
+            'март',
+            'април',
+            'май',
+            'юни',
+            'юли',
+            'август',
+            'септември',
+            'октомври',
+            'ноември',
+            'декември'
+          ],
+          SHORTMONTHS: const [
+            'яну',
+            'фев',
+            'март',
+            'апр',
+            'май',
+            'юни',
+            'юли',
+            'авг',
+            'сеп',
+            'окт',
+            'ное',
+            'дек'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'яну',
+            'фев',
+            'март',
+            'апр',
+            'май',
+            'юни',
+            'юли',
+            'авг',
+            'сеп',
+            'окт',
+            'ное',
+            'дек'
+          ],
+          WEEKDAYS: const [
+            'неделя',
+            'понеделник',
+            'вторник',
+            'сряда',
+            'четвъртък',
+            'петък',
+            'събота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'неделя',
+            'понеделник',
+            'вторник',
+            'сряда',
+            'четвъртък',
+            'петък',
+            'събота'
+          ],
+          SHORTWEEKDAYS: const ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+          STANDALONESHORTWEEKDAYS: const [
+            'нд',
+            'пн',
+            'вт',
+            'ср',
+            'чт',
+            'пт',
+            'сб'
+          ],
+          NARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
+          STANDALONENARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
+          SHORTQUARTERS: const ['1. трим.', '2. трим.', '3. трим.', '4. трим.'],
+          QUARTERS: const [
+            '1. тримесечие',
+            '2. тримесечие',
+            '3. тримесечие',
+            '4. тримесечие'
+          ],
+          AMPMS: const ['пр.об.', 'сл.об.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y \'г\'.',
+            'd MMMM y \'г\'.',
+            'd.MM.y \'г\'.',
+            'd.MM.yy \'г\'.'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale bn.
+      "bn": new DateSymbols(
+          NAME: "bn",
+          ERAS: const ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],
+          ERANAMES: const ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],
+          NARROWMONTHS: const [
+            'জা',
+            'ফে',
+            'মা',
+            'এ',
+            'মে',
+            'জুন',
+            'জু',
+            'আ',
+            'সে',
+            'অ',
+            'ন',
+            'ডি'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'জা',
+            'ফে',
+            'মা',
+            'এ',
+            'মে',
+            'জুন',
+            'জু',
+            'আ',
+            'সে',
+            'অ',
+            'ন',
+            'ডি'
+          ],
+          MONTHS: const [
+            'জানুয়ারী',
+            'ফেব্রুয়ারী',
+            'মার্চ',
+            'এপ্রিল',
+            'মে',
+            'জুন',
+            'জুলাই',
+            'আগস্ট',
+            'সেপ্টেম্বর',
+            'অক্টোবর',
+            'নভেম্বর',
+            'ডিসেম্বর'
+          ],
+          STANDALONEMONTHS: const [
+            'জানুয়ারী',
+            'ফেব্রুয়ারী',
+            'মার্চ',
+            'এপ্রিল',
+            'মে',
+            'জুন',
+            'জুলাই',
+            'আগস্ট',
+            'সেপ্টেম্বর',
+            'অক্টোবর',
+            'নভেম্বর',
+            'ডিসেম্বর'
+          ],
+          SHORTMONTHS: const [
+            'জানু',
+            'ফেব',
+            'মার্চ',
+            'এপ্রিল',
+            'মে',
+            'জুন',
+            'জুলাই',
+            'আগস্ট',
+            'সেপ্টেম্বর',
+            'অক্টোবর',
+            'নভেম্বর',
+            'ডিসেম্বর'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'জানুয়ারী',
+            'ফেব্রুয়ারী',
+            'মার্চ',
+            'এপ্রিল',
+            'মে',
+            'জুন',
+            'জুলাই',
+            'আগস্ট',
+            'সেপ্টেম্বর',
+            'অক্টোবর',
+            'নভেম্বর',
+            'ডিসেম্বর'
+          ],
+          WEEKDAYS: const [
+            'রবিবার',
+            'সোমবার',
+            'মঙ্গলবার',
+            'বুধবার',
+            'বৃহস্পতিবার',
+            'শুক্রবার',
+            'শনিবার'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'রবিবার',
+            'সোমবার',
+            'মঙ্গলবার',
+            'বুধবার',
+            'বৃহষ্পতিবার',
+            'শুক্রবার',
+            'শনিবার'
+          ],
+          SHORTWEEKDAYS: const [
+            'রবি',
+            'সোম',
+            'মঙ্গল',
+            'বুধ',
+            'বৃহস্পতি',
+            'শুক্র',
+            'শনি'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'রবি',
+            'সোম',
+            'মঙ্গল',
+            'বুধ',
+            'বৃহস্পতি',
+            'শুক্র',
+            'শনি'
+          ],
+          NARROWWEEKDAYS: const ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'র',
+            'সো',
+            'ম',
+            'বু',
+            'বৃ',
+            'শু',
+            'শ'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            'ত্রৈমাসিক',
+            'দ্বিতীয় ত্রৈমাসিক',
+            'তৃতীয় ত্রৈমাসিক',
+            'চতুর্থ ত্রৈমাসিক'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM, y',
+            'd MMMM, y',
+            'd MMM, y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 4,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale br.
+      "br": new DateSymbols(
+          NAME: "br",
+          ERAS: const ['a-raok J.K.', 'goude J.K.'],
+          ERANAMES: const ['a-raok Jezuz-Krist', 'goude Jezuz-Krist'],
+          NARROWMONTHS: const [
+            '01',
+            '02',
+            '03',
+            '04',
+            '05',
+            '06',
+            '07',
+            '08',
+            '09',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '01',
+            '02',
+            '03',
+            '04',
+            '05',
+            '06',
+            '07',
+            '08',
+            '09',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'Genver',
+            'Cʼhwevrer',
+            'Meurzh',
+            'Ebrel',
+            'Mae',
+            'Mezheven',
+            'Gouere',
+            'Eost',
+            'Gwengolo',
+            'Here',
+            'Du',
+            'Kerzu'
+          ],
+          STANDALONEMONTHS: const [
+            'Genver',
+            'Cʼhwevrer',
+            'Meurzh',
+            'Ebrel',
+            'Mae',
+            'Mezheven',
+            'Gouere',
+            'Eost',
+            'Gwengolo',
+            'Here',
+            'Du',
+            'Kerzu'
+          ],
+          SHORTMONTHS: const [
+            'Gen.',
+            'Cʼhwe.',
+            'Meur.',
+            'Ebr.',
+            'Mae',
+            'Mezh.',
+            'Goue.',
+            'Eost',
+            'Gwen.',
+            'Here',
+            'Du',
+            'Kzu.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Gen.',
+            'Cʼhwe.',
+            'Meur.',
+            'Ebr.',
+            'Mae',
+            'Mezh.',
+            'Goue.',
+            'Eost',
+            'Gwen.',
+            'Here',
+            'Du',
+            'Ker.'
+          ],
+          WEEKDAYS: const [
+            'Sul',
+            'Lun',
+            'Meurzh',
+            'Mercʼher',
+            'Yaou',
+            'Gwener',
+            'Sadorn'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sul',
+            'Lun',
+            'Meurzh',
+            'Mercʼher',
+            'Yaou',
+            'Gwener',
+            'Sadorn'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sul',
+            'Lun',
+            'Meu.',
+            'Mer.',
+            'Yaou',
+            'Gwe.',
+            'Sad.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sul',
+            'Lun',
+            'Meu.',
+            'Mer.',
+            'Yaou',
+            'Gwe.',
+            'Sad.'
+          ],
+          NARROWWEEKDAYS: const ['Su', 'L', 'Mz', 'Mc', 'Y', 'G', 'Sa'],
+          STANDALONENARROWWEEKDAYS: const [
+            'Su',
+            'L',
+            'Mz',
+            'Mc',
+            'Y',
+            'G',
+            'Sa'
+          ],
+          SHORTQUARTERS: const [
+            '1añ trim.',
+            '2l trim.',
+            '3e trim.',
+            '4e trim.'
+          ],
+          QUARTERS: const [
+            '1añ trimiziad',
+            '2l trimiziad',
+            '3e trimiziad',
+            '4e trimiziad'
+          ],
+          AMPMS: const ['A.M.', 'G.M.'],
+          DATEFORMATS: const [
+            'y MMMM d, EEEE',
+            'y MMMM d',
+            'y MMM d',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'da\' {0}',
+            '{1} \'da\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale bs.
+      "bs": new DateSymbols(
+          NAME: "bs",
+          ERAS: const ['p. n. e.', 'n. e.'],
+          ERANAMES: const ['prije nove ere', 'nove ere'],
+          NARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'mart',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'avgust',
+            'septembar',
+            'oktobar',
+            'novembar',
+            'decembar'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'mart',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'avgust',
+            'septembar',
+            'oktobar',
+            'novembar',
+            'decembar'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'maj',
+            'jun',
+            'jul',
+            'avg',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'maj',
+            'jun',
+            'jul',
+            'avg',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          WEEKDAYS: const [
+            'nedjelja',
+            'ponedjeljak',
+            'utorak',
+            'srijeda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'nedjelja',
+            'ponedjeljak',
+            'utorak',
+            'srijeda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          SHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sri',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sri',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          NARROWWEEKDAYS: const ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'č', 'p', 's'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            'Prvi kvartal',
+            'Drugi kvartal',
+            'Treći kvartal',
+            'Četvrti kvartal'
+          ],
+          AMPMS: const ['prijepodne', 'popodne'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y.',
+            'd. MMMM y.',
+            'd. MMM. y.',
+            'd.M.yy.'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'u\' {0}',
+            '{1} \'u\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ca.
+      "ca": new DateSymbols(
+          NAME: "ca",
+          ERAS: const ['aC', 'dC'],
+          ERANAMES: const ['abans de Crist', 'després de Crist'],
+          NARROWMONTHS: const [
+            'GN',
+            'FB',
+            'MÇ',
+            'AB',
+            'MG',
+            'JN',
+            'JL',
+            'AG',
+            'ST',
+            'OC',
+            'NV',
+            'DS'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'GN',
+            'FB',
+            'MÇ',
+            'AB',
+            'MG',
+            'JN',
+            'JL',
+            'AG',
+            'ST',
+            'OC',
+            'NV',
+            'DS'
+          ],
+          MONTHS: const [
+            'de gener',
+            'de febrer',
+            'de març',
+            'd’abril',
+            'de maig',
+            'de juny',
+            'de juliol',
+            'd’agost',
+            'de setembre',
+            'd’octubre',
+            'de novembre',
+            'de desembre'
+          ],
+          STANDALONEMONTHS: const [
+            'gener',
+            'febrer',
+            'març',
+            'abril',
+            'maig',
+            'juny',
+            'juliol',
+            'agost',
+            'setembre',
+            'octubre',
+            'novembre',
+            'desembre'
+          ],
+          SHORTMONTHS: const [
+            'de gen.',
+            'de febr.',
+            'de març',
+            'd’abr.',
+            'de maig',
+            'de juny',
+            'de jul.',
+            'd’ag.',
+            'de set.',
+            'd’oct.',
+            'de nov.',
+            'de des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'gen.',
+            'febr.',
+            'març',
+            'abr.',
+            'maig',
+            'juny',
+            'jul.',
+            'ag.',
+            'set.',
+            'oct.',
+            'nov.',
+            'des.'
+          ],
+          WEEKDAYS: const [
+            'diumenge',
+            'dilluns',
+            'dimarts',
+            'dimecres',
+            'dijous',
+            'divendres',
+            'dissabte'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'diumenge',
+            'dilluns',
+            'dimarts',
+            'dimecres',
+            'dijous',
+            'divendres',
+            'dissabte'
+          ],
+          SHORTWEEKDAYS: const [
+            'dg.',
+            'dl.',
+            'dt.',
+            'dc.',
+            'dj.',
+            'dv.',
+            'ds.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dg.',
+            'dl.',
+            'dt.',
+            'dc.',
+            'dj.',
+            'dv.',
+            'ds.'
+          ],
+          NARROWWEEKDAYS: const ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],
+          STANDALONENARROWWEEKDAYS: const [
+            'dg',
+            'dl',
+            'dt',
+            'dc',
+            'dj',
+            'dv',
+            'ds'
+          ],
+          SHORTQUARTERS: const ['1T', '2T', '3T', '4T'],
+          QUARTERS: const [
+            '1r trimestre',
+            '2n trimestre',
+            '3r trimestre',
+            '4t trimestre'
+          ],
+          AMPMS: const ['a. m.', 'p. m.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM \'de\' y',
+            'd MMMM \'de\' y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1} \'a\' \'les\' {0}',
+            '{1} \'a\' \'les\' {0}',
+            '{1}, {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale chr.
+      "chr": new DateSymbols(
+          NAME: "chr",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ', 'ᎠᏃ ᏙᎻᏂ'],
+          NARROWMONTHS: const [
+            'Ꭴ',
+            'Ꭷ',
+            'Ꭰ',
+            'Ꭷ',
+            'Ꭰ',
+            'Ꮥ',
+            'Ꭻ',
+            'Ꭶ',
+            'Ꮪ',
+            'Ꮪ',
+            'Ꮕ',
+            'Ꭵ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Ꭴ',
+            'Ꭷ',
+            'Ꭰ',
+            'Ꭷ',
+            'Ꭰ',
+            'Ꮥ',
+            'Ꭻ',
+            'Ꭶ',
+            'Ꮪ',
+            'Ꮪ',
+            'Ꮕ',
+            'Ꭵ'
+          ],
+          MONTHS: const [
+            'ᎤᏃᎸᏔᏅ',
+            'ᎧᎦᎵ',
+            'ᎠᏅᏱ',
+            'ᎧᏬᏂ',
+            'ᎠᏂᏍᎬᏘ',
+            'ᏕᎭᎷᏱ',
+            'ᎫᏰᏉᏂ',
+            'ᎦᎶᏂ',
+            'ᏚᎵᏍᏗ',
+            'ᏚᏂᏅᏗ',
+            'ᏅᏓᏕᏆ',
+            'ᎥᏍᎩᏱ'
+          ],
+          STANDALONEMONTHS: const [
+            'ᎤᏃᎸᏔᏅ',
+            'ᎧᎦᎵ',
+            'ᎠᏅᏱ',
+            'ᎧᏬᏂ',
+            'ᎠᏂᏍᎬᏘ',
+            'ᏕᎭᎷᏱ',
+            'ᎫᏰᏉᏂ',
+            'ᎦᎶᏂ',
+            'ᏚᎵᏍᏗ',
+            'ᏚᏂᏅᏗ',
+            'ᏅᏓᏕᏆ',
+            'ᎥᏍᎩᏱ'
+          ],
+          SHORTMONTHS: const [
+            'ᎤᏃ',
+            'ᎧᎦ',
+            'ᎠᏅ',
+            'ᎧᏬ',
+            'ᎠᏂ',
+            'ᏕᎭ',
+            'ᎫᏰ',
+            'ᎦᎶ',
+            'ᏚᎵ',
+            'ᏚᏂ',
+            'ᏅᏓ',
+            'ᎥᏍ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ᎤᏃ',
+            'ᎧᎦ',
+            'ᎠᏅ',
+            'ᎧᏬ',
+            'ᎠᏂ',
+            'ᏕᎭ',
+            'ᎫᏰ',
+            'ᎦᎶ',
+            'ᏚᎵ',
+            'ᏚᏂ',
+            'ᏅᏓ',
+            'ᎥᏍ'
+          ],
+          WEEKDAYS: const [
+            'ᎤᎾᏙᏓᏆᏍᎬ',
+            'ᎤᎾᏙᏓᏉᏅᎯ',
+            'ᏔᎵᏁᎢᎦ',
+            'ᏦᎢᏁᎢᎦ',
+            'ᏅᎩᏁᎢᎦ',
+            'ᏧᎾᎩᎶᏍᏗ',
+            'ᎤᎾᏙᏓᏈᏕᎾ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ᎤᎾᏙᏓᏆᏍᎬ',
+            'ᎤᎾᏙᏓᏉᏅᎯ',
+            'ᏔᎵᏁᎢᎦ',
+            'ᏦᎢᏁᎢᎦ',
+            'ᏅᎩᏁᎢᎦ',
+            'ᏧᎾᎩᎶᏍᏗ',
+            'ᎤᎾᏙᏓᏈᏕᎾ'
+          ],
+          SHORTWEEKDAYS: const [
+            'ᏆᏍᎬ',
+            'ᏉᏅᎯ',
+            'ᏔᎵᏁ',
+            'ᏦᎢᏁ',
+            'ᏅᎩᏁ',
+            'ᏧᎾᎩ',
+            'ᏈᏕᎾ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ᏆᏍᎬ',
+            'ᏉᏅᎯ',
+            'ᏔᎵᏁ',
+            'ᏦᎢᏁ',
+            'ᏅᎩᏁ',
+            'ᏧᎾᎩ',
+            'ᏈᏕᎾ'
+          ],
+          NARROWWEEKDAYS: const ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],
+          STANDALONENARROWWEEKDAYS: const ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['1st ᎩᏄᏙᏗ', '2nd ᎩᏄᏙᏗ', '3rd ᎩᏄᏙᏗ', '4th ᎩᏄᏙᏗ'],
+          AMPMS: const ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} ᎤᎾᎢ {0}',
+            '{1} ᎤᎾᎢ {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale cs.
+      "cs": new DateSymbols(
+          NAME: "cs",
+          ERAS: const ['př. n. l.', 'n. l.'],
+          ERANAMES: const ['př. n. l.', 'n. l.'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'ledna',
+            'února',
+            'března',
+            'dubna',
+            'května',
+            'června',
+            'července',
+            'srpna',
+            'září',
+            'října',
+            'listopadu',
+            'prosince'
+          ],
+          STANDALONEMONTHS: const [
+            'leden',
+            'únor',
+            'březen',
+            'duben',
+            'květen',
+            'červen',
+            'červenec',
+            'srpen',
+            'září',
+            'říjen',
+            'listopad',
+            'prosinec'
+          ],
+          SHORTMONTHS: const [
+            'led',
+            'úno',
+            'bře',
+            'dub',
+            'kvě',
+            'čvn',
+            'čvc',
+            'srp',
+            'zář',
+            'říj',
+            'lis',
+            'pro'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'led',
+            'úno',
+            'bře',
+            'dub',
+            'kvě',
+            'čvn',
+            'čvc',
+            'srp',
+            'zář',
+            'říj',
+            'lis',
+            'pro'
+          ],
+          WEEKDAYS: const [
+            'neděle',
+            'pondělí',
+            'úterý',
+            'středa',
+            'čtvrtek',
+            'pátek',
+            'sobota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'neděle',
+            'pondělí',
+            'úterý',
+            'středa',
+            'čtvrtek',
+            'pátek',
+            'sobota'
+          ],
+          SHORTWEEKDAYS: const ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+          STANDALONESHORTWEEKDAYS: const [
+            'ne',
+            'po',
+            'út',
+            'st',
+            'čt',
+            'pá',
+            'so'
+          ],
+          NARROWWEEKDAYS: const ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. čtvrtletí',
+            '2. čtvrtletí',
+            '3. čtvrtletí',
+            '4. čtvrtletí'
+          ],
+          AMPMS: const ['dop.', 'odp.'],
+          DATEFORMATS: const [
+            'EEEE d. MMMM y',
+            'd. MMMM y',
+            'd. M. y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale cy.
+      "cy": new DateSymbols(
+          NAME: "cy",
+          ERAS: const ['CC', 'OC'],
+          ERANAMES: const ['Cyn Crist', 'Oed Crist'],
+          NARROWMONTHS: const [
+            'I',
+            'Ch',
+            'M',
+            'E',
+            'M',
+            'M',
+            'G',
+            'A',
+            'M',
+            'H',
+            'T',
+            'Rh'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'I',
+            'Ch',
+            'M',
+            'E',
+            'M',
+            'M',
+            'G',
+            'A',
+            'M',
+            'H',
+            'T',
+            'Rh'
+          ],
+          MONTHS: const [
+            'Ionawr',
+            'Chwefror',
+            'Mawrth',
+            'Ebrill',
+            'Mai',
+            'Mehefin',
+            'Gorffennaf',
+            'Awst',
+            'Medi',
+            'Hydref',
+            'Tachwedd',
+            'Rhagfyr'
+          ],
+          STANDALONEMONTHS: const [
+            'Ionawr',
+            'Chwefror',
+            'Mawrth',
+            'Ebrill',
+            'Mai',
+            'Mehefin',
+            'Gorffennaf',
+            'Awst',
+            'Medi',
+            'Hydref',
+            'Tachwedd',
+            'Rhagfyr'
+          ],
+          SHORTMONTHS: const [
+            'Ion',
+            'Chwef',
+            'Maw',
+            'Ebrill',
+            'Mai',
+            'Meh',
+            'Gorff',
+            'Awst',
+            'Medi',
+            'Hyd',
+            'Tach',
+            'Rhag'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ion',
+            'Chw',
+            'Maw',
+            'Ebr',
+            'Mai',
+            'Meh',
+            'Gor',
+            'Awst',
+            'Medi',
+            'Hyd',
+            'Tach',
+            'Rhag'
+          ],
+          WEEKDAYS: const [
+            'Dydd Sul',
+            'Dydd Llun',
+            'Dydd Mawrth',
+            'Dydd Mercher',
+            'Dydd Iau',
+            'Dydd Gwener',
+            'Dydd Sadwrn'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Dydd Sul',
+            'Dydd Llun',
+            'Dydd Mawrth',
+            'Dydd Mercher',
+            'Dydd Iau',
+            'Dydd Gwener',
+            'Dydd Sadwrn'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sul',
+            'Llun',
+            'Maw',
+            'Mer',
+            'Iau',
+            'Gwen',
+            'Sad'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sul',
+            'Llun',
+            'Maw',
+            'Mer',
+            'Iau',
+            'Gwe',
+            'Sad'
+          ],
+          NARROWWEEKDAYS: const ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],
+          SHORTQUARTERS: const ['Ch1', 'Ch2', 'Ch3', 'Ch4'],
+          QUARTERS: const [
+            'chwarter 1af',
+            '2il chwarter',
+            '3ydd chwarter',
+            '4ydd chwarter'
+          ],
+          AMPMS: const ['yb', 'yh'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'am\' {0}',
+            '{1} \'am\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale da.
+      "da": new DateSymbols(
+          NAME: "da",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['f.Kr.', 'e.Kr.'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'marts',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'marts',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maj',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maj',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          SHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'søn',
+            'man',
+            'tir',
+            'ons',
+            'tor',
+            'fre',
+            'lør'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          SHORTQUARTERS: const ['1. kvt.', '2. kvt.', '3. kvt.', '4. kvt.'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE \'den\' d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH.mm.ss zzzz',
+            'HH.mm.ss z',
+            'HH.mm.ss',
+            'HH.mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'kl\'. {0}',
+            '{1} \'kl\'. {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale de.
+      "de": new DateSymbols(
+          NAME: "de",
+          ERAS: const ['v. Chr.', 'n. Chr.'],
+          ERANAMES: const ['v. Chr.', 'n. Chr.'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          SHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'März',
+            'Apr.',
+            'Mai',
+            'Juni',
+            'Juli',
+            'Aug.',
+            'Sep.',
+            'Okt.',
+            'Nov.',
+            'Dez.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mär',
+            'Apr',
+            'Mai',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dez'
+          ],
+          WEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          SHORTWEEKDAYS: const [
+            'So.',
+            'Mo.',
+            'Di.',
+            'Mi.',
+            'Do.',
+            'Fr.',
+            'Sa.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'So',
+            'Mo',
+            'Di',
+            'Mi',
+            'Do',
+            'Fr',
+            'Sa'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. Quartal',
+            '2. Quartal',
+            '3. Quartal',
+            '4. Quartal'
+          ],
+          AMPMS: const ['vorm.', 'nachm.'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'dd.MM.y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'um\' {0}',
+            '{1} \'um\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale de_AT.
+      "de_AT": new DateSymbols(
+          NAME: "de_AT",
+          ERAS: const ['v. Chr.', 'n. Chr.'],
+          ERANAMES: const ['v. Chr.', 'n. Chr.'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Jänner',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          STANDALONEMONTHS: const [
+            'Jänner',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          SHORTMONTHS: const [
+            'Jän.',
+            'Feb.',
+            'März',
+            'Apr.',
+            'Mai',
+            'Juni',
+            'Juli',
+            'Aug.',
+            'Sep.',
+            'Okt.',
+            'Nov.',
+            'Dez.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jän',
+            'Feb',
+            'Mär',
+            'Apr',
+            'Mai',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dez'
+          ],
+          WEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          SHORTWEEKDAYS: const [
+            'So.',
+            'Mo.',
+            'Di.',
+            'Mi.',
+            'Do.',
+            'Fr.',
+            'Sa.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'So',
+            'Mo',
+            'Di',
+            'Mi',
+            'Do',
+            'Fr',
+            'Sa'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. Quartal',
+            '2. Quartal',
+            '3. Quartal',
+            '4. Quartal'
+          ],
+          AMPMS: const ['vorm.', 'nachm.'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'dd.MM.y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'um\' {0}',
+            '{1} \'um\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale de_CH.
+      // Date/time formatting symbols for locale de_CH.
+      "de_CH": new DateSymbols(
+          NAME: "de_CH",
+          ERAS: const ['v. Chr.', 'n. Chr.'],
+          ERANAMES: const ['v. Chr.', 'n. Chr.'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'August',
+            'September',
+            'Oktober',
+            'November',
+            'Dezember'
+          ],
+          SHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'März',
+            'Apr.',
+            'Mai',
+            'Juni',
+            'Juli',
+            'Aug.',
+            'Sep.',
+            'Okt.',
+            'Nov.',
+            'Dez.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mär',
+            'Apr',
+            'Mai',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dez'
+          ],
+          WEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sonntag',
+            'Montag',
+            'Dienstag',
+            'Mittwoch',
+            'Donnerstag',
+            'Freitag',
+            'Samstag'
+          ],
+          SHORTWEEKDAYS: const [
+            'So.',
+            'Mo.',
+            'Di.',
+            'Mi.',
+            'Do.',
+            'Fr.',
+            'Sa.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'So',
+            'Mo',
+            'Di',
+            'Mi',
+            'Do',
+            'Fr',
+            'Sa'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. Quartal',
+            '2. Quartal',
+            '3. Quartal',
+            '4. Quartal'
+          ],
+          AMPMS: const ['vorm.', 'nachm.'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'dd.MM.y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'um\' {0}',
+            '{1} \'um\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale el.
+      "el": new DateSymbols(
+          NAME: "el",
+          ERAS: const ['π.Χ.', 'μ.Χ.'],
+          ERANAMES: const ['προ Χριστού', 'μετά Χριστόν'],
+          NARROWMONTHS: const [
+            'Ι',
+            'Φ',
+            'Μ',
+            'Α',
+            'Μ',
+            'Ι',
+            'Ι',
+            'Α',
+            'Σ',
+            'Ο',
+            'Ν',
+            'Δ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Ι',
+            'Φ',
+            'Μ',
+            'Α',
+            'Μ',
+            'Ι',
+            'Ι',
+            'Α',
+            'Σ',
+            'Ο',
+            'Ν',
+            'Δ'
+          ],
+          MONTHS: const [
+            'Ιανουαρίου',
+            'Φεβρουαρίου',
+            'Μαρτίου',
+            'Απριλίου',
+            'Μαΐου',
+            'Ιουνίου',
+            'Ιουλίου',
+            'Αυγούστου',
+            'Σεπτεμβρίου',
+            'Οκτωβρίου',
+            'Νοεμβρίου',
+            'Δεκεμβρίου'
+          ],
+          STANDALONEMONTHS: const [
+            'Ιανουάριος',
+            'Φεβρουάριος',
+            'Μάρτιος',
+            'Απρίλιος',
+            'Μάιος',
+            'Ιούνιος',
+            'Ιούλιος',
+            'Αύγουστος',
+            'Σεπτέμβριος',
+            'Οκτώβριος',
+            'Νοέμβριος',
+            'Δεκέμβριος'
+          ],
+          SHORTMONTHS: const [
+            'Ιαν',
+            'Φεβ',
+            'Μαρ',
+            'Απρ',
+            'Μαΐ',
+            'Ιουν',
+            'Ιουλ',
+            'Αυγ',
+            'Σεπ',
+            'Οκτ',
+            'Νοε',
+            'Δεκ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ιαν',
+            'Φεβ',
+            'Μάρ',
+            'Απρ',
+            'Μάι',
+            'Ιούν',
+            'Ιούλ',
+            'Αύγ',
+            'Σεπ',
+            'Οκτ',
+            'Νοέ',
+            'Δεκ'
+          ],
+          WEEKDAYS: const [
+            'Κυριακή',
+            'Δευτέρα',
+            'Τρίτη',
+            'Τετάρτη',
+            'Πέμπτη',
+            'Παρασκευή',
+            'Σάββατο'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Κυριακή',
+            'Δευτέρα',
+            'Τρίτη',
+            'Τετάρτη',
+            'Πέμπτη',
+            'Παρασκευή',
+            'Σάββατο'
+          ],
+          SHORTWEEKDAYS: const [
+            'Κυρ',
+            'Δευ',
+            'Τρί',
+            'Τετ',
+            'Πέμ',
+            'Παρ',
+            'Σάβ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Κυρ',
+            'Δευ',
+            'Τρί',
+            'Τετ',
+            'Πέμ',
+            'Παρ',
+            'Σάβ'
+          ],
+          NARROWWEEKDAYS: const ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],
+          STANDALONENARROWWEEKDAYS: const ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],
+          SHORTQUARTERS: const ['Τ1', 'Τ2', 'Τ3', 'Τ4'],
+          QUARTERS: const [
+            '1ο τρίμηνο',
+            '2ο τρίμηνο',
+            '3ο τρίμηνο',
+            '4ο τρίμηνο'
+          ],
+          AMPMS: const ['π.μ.', 'μ.μ.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} - {0}',
+            '{1} - {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale en.
+      "en": new DateSymbols(
+          NAME: "en",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_AU.
+      "en_AU": new DateSymbols(
+          NAME: "en_AU",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'Mar.',
+            'Apr.',
+            'May',
+            'Jun.',
+            'Jul.',
+            'Aug.',
+            'Sep.',
+            'Oct.',
+            'Nov.',
+            'Dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan.',
+            'Feb.',
+            'Mar.',
+            'Apr.',
+            'May',
+            'Jun.',
+            'Jul.',
+            'Aug.',
+            'Sep.',
+            'Oct.',
+            'Nov.',
+            'Dec.'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun.',
+            'Mon.',
+            'Tue.',
+            'Wed.',
+            'Thu.',
+            'Fri.',
+            'Sat.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun.',
+            'Mon.',
+            'Tue.',
+            'Wed.',
+            'Thu.',
+            'Fri.',
+            'Sat.'
+          ],
+          NARROWWEEKDAYS: const ['Su.', 'M.', 'Tu.', 'W.', 'Th.', 'F.', 'Sa.'],
+          STANDALONENARROWWEEKDAYS: const [
+            'Su.',
+            'M.',
+            'Tu.',
+            'W.',
+            'Th.',
+            'F.',
+            'Sa.'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['am', 'pm'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_CA.
+      "en_CA": new DateSymbols(
+          NAME: "en_CA",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_GB.
+      "en_GB": new DateSymbols(
+          NAME: "en_GB",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['am', 'pm'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale en_IE.
+      "en_IE": new DateSymbols(
+          NAME: "en_IE",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 2),
+      // Date/time formatting symbols for locale en_IN.
+      "en_IN": new DateSymbols(
+          NAME: "en_IN",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'dd-MMM-y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_SG.
+      "en_SG": new DateSymbols(
+          NAME: "en_SG",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_US.
+      // Date/time formatting symbols for locale en_US.
+      "en_US": new DateSymbols(
+          NAME: "en_US",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale en_ZA.
+      "en_ZA": new DateSymbols(
+          NAME: "en_ZA",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['Before Christ', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          STANDALONEMONTHS: const [
+            'January',
+            'February',
+            'March',
+            'April',
+            'May',
+            'June',
+            'July',
+            'August',
+            'September',
+            'October',
+            'November',
+            'December'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'May',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Oct',
+            'Nov',
+            'Dec'
+          ],
+          WEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunday',
+            'Monday',
+            'Tuesday',
+            'Wednesday',
+            'Thursday',
+            'Friday',
+            'Saturday'
+          ],
+          SHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Sun',
+            'Mon',
+            'Tue',
+            'Wed',
+            'Thu',
+            'Fri',
+            'Sat'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1st quarter',
+            '2nd quarter',
+            '3rd quarter',
+            '4th quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM y',
+            'dd MMMM y',
+            'dd MMM y',
+            'y/MM/dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'at\' {0}',
+            '{1} \'at\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale es.
+      "es": new DateSymbols(
+          NAME: "es",
+          ERAS: const ['a. C.', 'd. C.'],
+          ERANAMES: const ['antes de Cristo', 'después de Cristo'],
+          NARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          STANDALONEMONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          SHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.er trimestre',
+            '2.º trimestre',
+            '3.er trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['a. m.', 'p. m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale es_419.
+      "es_419": new DateSymbols(
+          NAME: "es_419",
+          ERAS: const ['a. C.', 'd. C.'],
+          ERANAMES: const ['antes de Cristo', 'después de Cristo'],
+          NARROWMONTHS: const [
+            'e',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          STANDALONEMONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          SHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sep.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sep.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          NARROWWEEKDAYS: const ['d', 'l', 'm', 'm', 'j', 'v', 's'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.er trimestre',
+            '2.º trimestre',
+            '3.er trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale es_ES.
+      // Date/time formatting symbols for locale es_ES.
+      "es_ES": new DateSymbols(
+          NAME: "es_ES",
+          ERAS: const ['a. C.', 'd. C.'],
+          ERANAMES: const ['antes de Cristo', 'después de Cristo'],
+          NARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          STANDALONEMONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          SHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'X', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.er trimestre',
+            '2.º trimestre',
+            '3.er trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['a. m.', 'p. m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale es_MX.
+      "es_MX": new DateSymbols(
+          NAME: "es_MX",
+          ERAS: const ['a. C.', 'd. C.'],
+          ERANAMES: const ['antes de Cristo', 'después de Cristo'],
+          NARROWMONTHS: const [
+            'e',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          STANDALONEMONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          SHORTMONTHS: const [
+            'ene',
+            'feb',
+            'mar',
+            'abr',
+            'may',
+            'jun',
+            'jul',
+            'ago',
+            'sep',
+            'oct',
+            'nov',
+            'dic'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sep.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const [
+            '1er. trim.',
+            '2º. trim.',
+            '3er. trim.',
+            '4º trim.'
+          ],
+          QUARTERS: const [
+            '1er. trimestre',
+            '2º. trimestre',
+            '3er. trimestre',
+            '4o. trimestre'
+          ],
+          AMPMS: const ['a. m.', 'p. m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'dd/MM/y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale es_US.
+      "es_US": new DateSymbols(
+          NAME: "es_US",
+          ERAS: const ['a. C.', 'd. C.'],
+          ERANAMES: const ['antes de Cristo', 'después de Cristo'],
+          NARROWMONTHS: const [
+            'e',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          STANDALONEMONTHS: const [
+            'enero',
+            'febrero',
+            'marzo',
+            'abril',
+            'mayo',
+            'junio',
+            'julio',
+            'agosto',
+            'septiembre',
+            'octubre',
+            'noviembre',
+            'diciembre'
+          ],
+          SHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sep.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ene.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'may.',
+            'jun.',
+            'jul.',
+            'ago.',
+            'sep.',
+            'oct.',
+            'nov.',
+            'dic.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'lunes',
+            'martes',
+            'miércoles',
+            'jueves',
+            'viernes',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom.',
+            'lun.',
+            'mar.',
+            'mié.',
+            'jue.',
+            'vie.',
+            'sáb.'
+          ],
+          NARROWWEEKDAYS: const ['d', 'l', 'm', 'm', 'j', 'v', 's'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.er trimestre',
+            '2.º trimestre',
+            '3.er trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['a. m.', 'p. m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale et.
+      "et": new DateSymbols(
+          NAME: "et",
+          ERAS: const ['eKr', 'pKr'],
+          ERANAMES: const ['enne Kristust', 'pärast Kristust'],
+          NARROWMONTHS: const [
+            'J',
+            'V',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'V',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'jaanuar',
+            'veebruar',
+            'märts',
+            'aprill',
+            'mai',
+            'juuni',
+            'juuli',
+            'august',
+            'september',
+            'oktoober',
+            'november',
+            'detsember'
+          ],
+          STANDALONEMONTHS: const [
+            'jaanuar',
+            'veebruar',
+            'märts',
+            'aprill',
+            'mai',
+            'juuni',
+            'juuli',
+            'august',
+            'september',
+            'oktoober',
+            'november',
+            'detsember'
+          ],
+          SHORTMONTHS: const [
+            'jaan',
+            'veebr',
+            'märts',
+            'apr',
+            'mai',
+            'juuni',
+            'juuli',
+            'aug',
+            'sept',
+            'okt',
+            'nov',
+            'dets'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jaan',
+            'veebr',
+            'märts',
+            'apr',
+            'mai',
+            'juuni',
+            'juuli',
+            'aug',
+            'sept',
+            'okt',
+            'nov',
+            'dets'
+          ],
+          WEEKDAYS: const [
+            'pühapäev',
+            'esmaspäev',
+            'teisipäev',
+            'kolmapäev',
+            'neljapäev',
+            'reede',
+            'laupäev'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'pühapäev',
+            'esmaspäev',
+            'teisipäev',
+            'kolmapäev',
+            'neljapäev',
+            'reede',
+            'laupäev'
+          ],
+          SHORTWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
+          STANDALONESHORTWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
+          NARROWWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale eu.
+      "eu": new DateSymbols(
+          NAME: "eu",
+          ERAS: const ['K.a.', 'K.o.'],
+          ERANAMES: const ['K.a.', 'Kristo ondoren'],
+          NARROWMONTHS: const [
+            'U',
+            'O',
+            'M',
+            'A',
+            'M',
+            'E',
+            'U',
+            'A',
+            'I',
+            'U',
+            'A',
+            'A'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'U',
+            'O',
+            'M',
+            'A',
+            'M',
+            'E',
+            'U',
+            'A',
+            'I',
+            'U',
+            'A',
+            'A'
+          ],
+          MONTHS: const [
+            'urtarrila',
+            'otsaila',
+            'martxoa',
+            'apirila',
+            'maiatza',
+            'ekaina',
+            'uztaila',
+            'abuztua',
+            'iraila',
+            'urria',
+            'azaroa',
+            'abendua'
+          ],
+          STANDALONEMONTHS: const [
+            'urtarrila',
+            'Otsaila',
+            'Martxoa',
+            'Apirila',
+            'Maiatza',
+            'Ekaina',
+            'Uztaila',
+            'Abuztua',
+            'Iraila',
+            'Urria',
+            'Azaroa',
+            'Abendua'
+          ],
+          SHORTMONTHS: const [
+            'urt.',
+            'ots.',
+            'mar.',
+            'api.',
+            'mai.',
+            'eka.',
+            'uzt.',
+            'abu.',
+            'ira.',
+            'urr.',
+            'aza.',
+            'abe.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'urt.',
+            'ots.',
+            'mar.',
+            'api.',
+            'mai.',
+            'eka.',
+            'uzt.',
+            'abu.',
+            'ira.',
+            'urr.',
+            'aza.',
+            'abe.'
+          ],
+          WEEKDAYS: const [
+            'igandea',
+            'astelehena',
+            'asteartea',
+            'asteazkena',
+            'osteguna',
+            'ostirala',
+            'larunbata'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Igandea',
+            'Astelehena',
+            'Asteartea',
+            'Asteazkena',
+            'Osteguna',
+            'Ostirala',
+            'Larunbata'
+          ],
+          SHORTWEEKDAYS: const [
+            'ig.',
+            'al.',
+            'ar.',
+            'az.',
+            'og.',
+            'or.',
+            'lr.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ig.',
+            'al.',
+            'ar.',
+            'az.',
+            'og.',
+            'or.',
+            'lr.'
+          ],
+          NARROWWEEKDAYS: const ['I', 'A', 'A', 'A', 'O', 'O', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['I', 'A', 'A', 'A', 'O', 'O', 'L'],
+          SHORTQUARTERS: const ['1Hh', '2Hh', '3Hh', '4Hh'],
+          QUARTERS: const [
+            '1. hiruhilekoa',
+            '2. hiruhilekoa',
+            '3. hiruhilekoa',
+            '4. hiruhilekoa'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'y(\'e\')\'ko\' MMMM d, EEEE',
+            'y(\'e\')\'ko\' MMMM d',
+            'y MMM d',
+            'yy/M/d'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss (zzzz)',
+            'HH:mm:ss (z)',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale fa.
+      "fa": new DateSymbols(
+          NAME: "fa",
+          ERAS: const ['ق.م.', 'م.'],
+          ERANAMES: const ['قبل از میلاد', 'میلادی'],
+          NARROWMONTHS: const [
+            'ژ',
+            'ف',
+            'م',
+            'آ',
+            'م',
+            'ژ',
+            'ژ',
+            'ا',
+            'س',
+            'ا',
+            'ن',
+            'د'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ژ',
+            'ف',
+            'م',
+            'آ',
+            'م',
+            'ژ',
+            'ژ',
+            'ا',
+            'س',
+            'ا',
+            'ن',
+            'د'
+          ],
+          MONTHS: const [
+            'ژانویهٔ',
+            'فوریهٔ',
+            'مارس',
+            'آوریل',
+            'مهٔ',
+            'ژوئن',
+            'ژوئیهٔ',
+            'اوت',
+            'سپتامبر',
+            'اکتبر',
+            'نوامبر',
+            'دسامبر'
+          ],
+          STANDALONEMONTHS: const [
+            'ژانویه',
+            'فوریه',
+            'مارس',
+            'آوریل',
+            'مه',
+            'ژوئن',
+            'ژوئیه',
+            'اوت',
+            'سپتامبر',
+            'اکتبر',
+            'نوامبر',
+            'دسامبر'
+          ],
+          SHORTMONTHS: const [
+            'ژانویهٔ',
+            'فوریهٔ',
+            'مارس',
+            'آوریل',
+            'مهٔ',
+            'ژوئن',
+            'ژوئیهٔ',
+            'اوت',
+            'سپتامبر',
+            'اکتبر',
+            'نوامبر',
+            'دسامبر'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ژانویه',
+            'فوریه',
+            'مارس',
+            'آوریل',
+            'مه',
+            'ژوئن',
+            'ژوئیه',
+            'اوت',
+            'سپتامبر',
+            'اکتبر',
+            'نوامبر',
+            'دسامبر'
+          ],
+          WEEKDAYS: const [
+            'یکشنبه',
+            'دوشنبه',
+            'سه‌شنبه',
+            'چهارشنبه',
+            'پنجشنبه',
+            'جمعه',
+            'شنبه'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'یکشنبه',
+            'دوشنبه',
+            'سه‌شنبه',
+            'چهارشنبه',
+            'پنجشنبه',
+            'جمعه',
+            'شنبه'
+          ],
+          SHORTWEEKDAYS: const [
+            'یکشنبه',
+            'دوشنبه',
+            'سه‌شنبه',
+            'چهارشنبه',
+            'پنجشنبه',
+            'جمعه',
+            'شنبه'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'یکشنبه',
+            'دوشنبه',
+            'سه‌شنبه',
+            'چهارشنبه',
+            'پنجشنبه',
+            'جمعه',
+            'شنبه'
+          ],
+          NARROWWEEKDAYS: const ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
+          STANDALONENARROWWEEKDAYS: const ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
+          SHORTQUARTERS: const ['س‌م۱', 'س‌م۲', 'س‌م۳', 'س‌م۴'],
+          QUARTERS: const [
+            'سه‌ماههٔ اول',
+            'سه‌ماههٔ دوم',
+            'سه‌ماههٔ سوم',
+            'سه‌ماههٔ چهارم'
+          ],
+          AMPMS: const ['قبل‌ازظهر', 'بعدازظهر'],
+          DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y/M/d'],
+          TIMEFORMATS: const [
+            'H:mm:ss (zzzz)',
+            'H:mm:ss (z)',
+            'H:mm:ss',
+            'H:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}، ساعت {0}',
+            '{1}، ساعت {0}',
+            '{1}،‏ {0}',
+            '{1}،‏ {0}'
+          ],
+          FIRSTDAYOFWEEK: 5,
+          WEEKENDRANGE: const [4, 4],
+          FIRSTWEEKCUTOFFDAY: 4),
+      // Date/time formatting symbols for locale fi.
+      "fi": new DateSymbols(
+          NAME: "fi",
+          ERAS: const ['eKr.', 'jKr.'],
+          ERANAMES: const [
+            'ennen Kristuksen syntymää',
+            'jälkeen Kristuksen syntymän'
+          ],
+          NARROWMONTHS: const [
+            'T',
+            'H',
+            'M',
+            'H',
+            'T',
+            'K',
+            'H',
+            'E',
+            'S',
+            'L',
+            'M',
+            'J'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'T',
+            'H',
+            'M',
+            'H',
+            'T',
+            'K',
+            'H',
+            'E',
+            'S',
+            'L',
+            'M',
+            'J'
+          ],
+          MONTHS: const [
+            'tammikuuta',
+            'helmikuuta',
+            'maaliskuuta',
+            'huhtikuuta',
+            'toukokuuta',
+            'kesäkuuta',
+            'heinäkuuta',
+            'elokuuta',
+            'syyskuuta',
+            'lokakuuta',
+            'marraskuuta',
+            'joulukuuta'
+          ],
+          STANDALONEMONTHS: const [
+            'tammikuu',
+            'helmikuu',
+            'maaliskuu',
+            'huhtikuu',
+            'toukokuu',
+            'kesäkuu',
+            'heinäkuu',
+            'elokuu',
+            'syyskuu',
+            'lokakuu',
+            'marraskuu',
+            'joulukuu'
+          ],
+          SHORTMONTHS: const [
+            'tammik.',
+            'helmik.',
+            'maalisk.',
+            'huhtik.',
+            'toukok.',
+            'kesäk.',
+            'heinäk.',
+            'elok.',
+            'syysk.',
+            'lokak.',
+            'marrask.',
+            'jouluk.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'tammi',
+            'helmi',
+            'maalis',
+            'huhti',
+            'touko',
+            'kesä',
+            'heinä',
+            'elo',
+            'syys',
+            'loka',
+            'marras',
+            'joulu'
+          ],
+          WEEKDAYS: const [
+            'sunnuntaina',
+            'maanantaina',
+            'tiistaina',
+            'keskiviikkona',
+            'torstaina',
+            'perjantaina',
+            'lauantaina'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'sunnuntai',
+            'maanantai',
+            'tiistai',
+            'keskiviikko',
+            'torstai',
+            'perjantai',
+            'lauantai'
+          ],
+          SHORTWEEKDAYS: const ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
+          STANDALONESHORTWEEKDAYS: const [
+            'su',
+            'ma',
+            'ti',
+            'ke',
+            'to',
+            'pe',
+            'la'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'K', 'T', 'P', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'K', 'T', 'P', 'L'],
+          SHORTQUARTERS: const ['1. nelj.', '2. nelj.', '3. nelj.', '4. nelj.'],
+          QUARTERS: const [
+            '1. neljännes',
+            '2. neljännes',
+            '3. neljännes',
+            '4. neljännes'
+          ],
+          AMPMS: const ['ap.', 'ip.'],
+          DATEFORMATS: const ['cccc d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.y'],
+          TIMEFORMATS: const ['H.mm.ss zzzz', 'H.mm.ss z', 'H.mm.ss', 'H.mm'],
+          DATETIMEFORMATS: const [
+            '{1} \'klo\' {0}',
+            '{1} \'klo\' {0}',
+            '{1} \'klo\' {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale fil.
+      "fil": new DateSymbols(
+          NAME: "fil",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['BC', 'AD'],
+          NARROWMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'P',
+            'M',
+            'A',
+            'M',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          MONTHS: const [
+            'Enero',
+            'Pebrero',
+            'Marso',
+            'Abril',
+            'Mayo',
+            'Hunyo',
+            'Hulyo',
+            'Agosto',
+            'Setyembre',
+            'Oktubre',
+            'Nobyembre',
+            'Disyembre'
+          ],
+          STANDALONEMONTHS: const [
+            'Enero',
+            'Pebrero',
+            'Marso',
+            'Abril',
+            'Mayo',
+            'Hunyo',
+            'Hulyo',
+            'Agosto',
+            'Setyembre',
+            'Oktubre',
+            'Nobyembre',
+            'Disyembre'
+          ],
+          SHORTMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          WEEKDAYS: const [
+            'Linggo',
+            'Lunes',
+            'Martes',
+            'Miyerkules',
+            'Huwebes',
+            'Biyernes',
+            'Sabado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Linggo',
+            'Lunes',
+            'Martes',
+            'Miyerkules',
+            'Huwebes',
+            'Biyernes',
+            'Sabado'
+          ],
+          SHORTWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          NARROWWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          STANDALONENARROWWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            'ika-1 quarter',
+            'ika-2 quarter',
+            'ika-3 quarter',
+            'ika-4 na quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'nang\' {0}',
+            '{1} \'nang\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale fr.
+      "fr": new DateSymbols(
+          NAME: "fr",
+          ERAS: const ['av. J.-C.', 'ap. J.-C.'],
+          ERANAMES: const ['avant Jésus-Christ', 'après Jésus-Christ'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janvier',
+            'février',
+            'mars',
+            'avril',
+            'mai',
+            'juin',
+            'juillet',
+            'août',
+            'septembre',
+            'octobre',
+            'novembre',
+            'décembre'
+          ],
+          STANDALONEMONTHS: const [
+            'janvier',
+            'février',
+            'mars',
+            'avril',
+            'mai',
+            'juin',
+            'juillet',
+            'août',
+            'septembre',
+            'octobre',
+            'novembre',
+            'décembre'
+          ],
+          SHORTMONTHS: const [
+            'janv.',
+            'févr.',
+            'mars',
+            'avr.',
+            'mai',
+            'juin',
+            'juil.',
+            'août',
+            'sept.',
+            'oct.',
+            'nov.',
+            'déc.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'janv.',
+            'févr.',
+            'mars',
+            'avr.',
+            'mai',
+            'juin',
+            'juil.',
+            'août',
+            'sept.',
+            'oct.',
+            'nov.',
+            'déc.'
+          ],
+          WEEKDAYS: const [
+            'dimanche',
+            'lundi',
+            'mardi',
+            'mercredi',
+            'jeudi',
+            'vendredi',
+            'samedi'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'dimanche',
+            'lundi',
+            'mardi',
+            'mercredi',
+            'jeudi',
+            'vendredi',
+            'samedi'
+          ],
+          SHORTWEEKDAYS: const [
+            'dim.',
+            'lun.',
+            'mar.',
+            'mer.',
+            'jeu.',
+            'ven.',
+            'sam.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dim.',
+            'lun.',
+            'mar.',
+            'mer.',
+            'jeu.',
+            'ven.',
+            'sam.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1er trimestre',
+            '2e trimestre',
+            '3e trimestre',
+            '4e trimestre'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'à\' {0}',
+            '{1} \'à\' {0}',
+            '{1} \'à\' {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale fr_CA.
+      "fr_CA": new DateSymbols(
+          NAME: "fr_CA",
+          ERAS: const ['av. J.-C.', 'ap. J.-C.'],
+          ERANAMES: const ['avant Jésus-Christ', 'après Jésus-Christ'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janvier',
+            'février',
+            'mars',
+            'avril',
+            'mai',
+            'juin',
+            'juillet',
+            'août',
+            'septembre',
+            'octobre',
+            'novembre',
+            'décembre'
+          ],
+          STANDALONEMONTHS: const [
+            'janvier',
+            'février',
+            'mars',
+            'avril',
+            'mai',
+            'juin',
+            'juillet',
+            'août',
+            'septembre',
+            'octobre',
+            'novembre',
+            'décembre'
+          ],
+          SHORTMONTHS: const [
+            'janv.',
+            'févr.',
+            'mars',
+            'avr.',
+            'mai',
+            'juin',
+            'juill.',
+            'août',
+            'sept.',
+            'oct.',
+            'nov.',
+            'déc.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'janv.',
+            'févr.',
+            'mars',
+            'avr.',
+            'mai',
+            'juin',
+            'juill.',
+            'août',
+            'sept.',
+            'oct.',
+            'nov.',
+            'déc.'
+          ],
+          WEEKDAYS: const [
+            'dimanche',
+            'lundi',
+            'mardi',
+            'mercredi',
+            'jeudi',
+            'vendredi',
+            'samedi'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'dimanche',
+            'lundi',
+            'mardi',
+            'mercredi',
+            'jeudi',
+            'vendredi',
+            'samedi'
+          ],
+          SHORTWEEKDAYS: const [
+            'dim.',
+            'lun.',
+            'mar.',
+            'mer.',
+            'jeu.',
+            'ven.',
+            'sam.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dim.',
+            'lun.',
+            'mar.',
+            'mer.',
+            'jeu.',
+            'ven.',
+            'sam.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1er trimestre',
+            '2e trimestre',
+            '3e trimestre',
+            '4e trimestre'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'yy-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH \'h\' mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'à\' {0}',
+            '{1} \'à\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ga.
+      "ga": new DateSymbols(
+          NAME: "ga",
+          ERAS: const ['RC', 'AD'],
+          ERANAMES: const ['Roimh Chríost', 'Anno Domini'],
+          NARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'B',
+            'M',
+            'I',
+            'L',
+            'M',
+            'D',
+            'S',
+            'N'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'F',
+            'M',
+            'A',
+            'B',
+            'M',
+            'I',
+            'L',
+            'M',
+            'D',
+            'S',
+            'N'
+          ],
+          MONTHS: const [
+            'Eanáir',
+            'Feabhra',
+            'Márta',
+            'Aibreán',
+            'Bealtaine',
+            'Meitheamh',
+            'Iúil',
+            'Lúnasa',
+            'Meán Fómhair',
+            'Deireadh Fómhair',
+            'Samhain',
+            'Nollaig'
+          ],
+          STANDALONEMONTHS: const [
+            'Eanáir',
+            'Feabhra',
+            'Márta',
+            'Aibreán',
+            'Bealtaine',
+            'Meitheamh',
+            'Iúil',
+            'Lúnasa',
+            'Meán Fómhair',
+            'Deireadh Fómhair',
+            'Samhain',
+            'Nollaig'
+          ],
+          SHORTMONTHS: const [
+            'Ean',
+            'Feabh',
+            'Márta',
+            'Aib',
+            'Beal',
+            'Meith',
+            'Iúil',
+            'Lún',
+            'MFómh',
+            'DFómh',
+            'Samh',
+            'Noll'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ean',
+            'Feabh',
+            'Márta',
+            'Aib',
+            'Beal',
+            'Meith',
+            'Iúil',
+            'Lún',
+            'MFómh',
+            'DFómh',
+            'Samh',
+            'Noll'
+          ],
+          WEEKDAYS: const [
+            'Dé Domhnaigh',
+            'Dé Luain',
+            'Dé Máirt',
+            'Dé Céadaoin',
+            'Déardaoin',
+            'Dé hAoine',
+            'Dé Sathairn'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Dé Domhnaigh',
+            'Dé Luain',
+            'Dé Máirt',
+            'Dé Céadaoin',
+            'Déardaoin',
+            'Dé hAoine',
+            'Dé Sathairn'
+          ],
+          SHORTWEEKDAYS: const [
+            'Domh',
+            'Luan',
+            'Máirt',
+            'Céad',
+            'Déar',
+            'Aoine',
+            'Sath'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Domh',
+            'Luan',
+            'Máirt',
+            'Céad',
+            'Déar',
+            'Aoine',
+            'Sath'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'C', 'D', 'A', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'C', 'D', 'A', 'S'],
+          SHORTQUARTERS: const ['R1', 'R2', 'R3', 'R4'],
+          QUARTERS: const ['1ú ráithe', '2ú ráithe', '3ú ráithe', '4ú ráithe'],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 2),
+      // Date/time formatting symbols for locale gl.
+      "gl": new DateSymbols(
+          NAME: "gl",
+          ERAS: const ['a.C.', 'd.C.'],
+          ERANAMES: const ['antes de Cristo', 'despois de Cristo'],
+          NARROWMONTHS: const [
+            'x.',
+            'f.',
+            'm.',
+            'a.',
+            'm.',
+            'x.',
+            'x.',
+            'a.',
+            's.',
+            'o.',
+            'n.',
+            'd.'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'X',
+            'F',
+            'M',
+            'A',
+            'M',
+            'X',
+            'X',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'xaneiro',
+            'febreiro',
+            'marzo',
+            'abril',
+            'maio',
+            'xuño',
+            'xullo',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'decembro'
+          ],
+          STANDALONEMONTHS: const [
+            'Xaneiro',
+            'Febreiro',
+            'Marzo',
+            'Abril',
+            'Maio',
+            'Xuño',
+            'Xullo',
+            'Agosto',
+            'Setembro',
+            'Outubro',
+            'Novembro',
+            'Decembro'
+          ],
+          SHORTMONTHS: const [
+            'xan.',
+            'feb.',
+            'mar.',
+            'abr.',
+            'maio',
+            'xuño',
+            'xul.',
+            'ago.',
+            'set.',
+            'out.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Xan.',
+            'Feb.',
+            'Mar.',
+            'Abr.',
+            'Maio',
+            'Xuño',
+            'Xul.',
+            'Ago.',
+            'Set.',
+            'Out.',
+            'Nov.',
+            'Dec.'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'luns',
+            'martes',
+            'mércores',
+            'xoves',
+            'venres',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Domingo',
+            'Luns',
+            'Martes',
+            'Mércores',
+            'Xoves',
+            'Venres',
+            'Sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom.',
+            'luns',
+            'mar.',
+            'mér.',
+            'xov.',
+            'ven.',
+            'sáb.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Dom.',
+            'Luns',
+            'Mar.',
+            'Mér.',
+            'Xov.',
+            'Ven.',
+            'Sáb.'
+          ],
+          NARROWWEEKDAYS: const ['d.', 'l.', 'm.', 'm.', 'x.', 'v.', 's.'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'X', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.º trimestre',
+            '2.º trimestre',
+            '3.º trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd \'de\' MMM \'de\' y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{0} \'do\' {1}',
+            '{0} \'do\' {1}',
+            '{0}, {1}',
+            '{0}, {1}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale gsw.
+      "gsw": new DateSymbols(
+          NAME: "gsw",
+          ERAS: const ['v. Chr.', 'n. Chr.'],
+          ERANAMES: const ['v. Chr.', 'n. Chr.'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'Auguscht',
+            'Septämber',
+            'Oktoober',
+            'Novämber',
+            'Dezämber'
+          ],
+          STANDALONEMONTHS: const [
+            'Januar',
+            'Februar',
+            'März',
+            'April',
+            'Mai',
+            'Juni',
+            'Juli',
+            'Auguscht',
+            'Septämber',
+            'Oktoober',
+            'Novämber',
+            'Dezämber'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mär',
+            'Apr',
+            'Mai',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dez'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mär',
+            'Apr',
+            'Mai',
+            'Jun',
+            'Jul',
+            'Aug',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dez'
+          ],
+          WEEKDAYS: const [
+            'Sunntig',
+            'Määntig',
+            'Ziischtig',
+            'Mittwuch',
+            'Dunschtig',
+            'Friitig',
+            'Samschtig'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Sunntig',
+            'Määntig',
+            'Ziischtig',
+            'Mittwuch',
+            'Dunschtig',
+            'Friitig',
+            'Samschtig'
+          ],
+          SHORTWEEKDAYS: const [
+            'Su.',
+            'Mä.',
+            'Zi.',
+            'Mi.',
+            'Du.',
+            'Fr.',
+            'Sa.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Su.',
+            'Mä.',
+            'Zi.',
+            'Mi.',
+            'Du.',
+            'Fr.',
+            'Sa.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'D', 'M', 'D', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. Quartal',
+            '2. Quartal',
+            '3. Quartal',
+            '4. Quartal'
+          ],
+          AMPMS: const ['vorm.', 'nam.'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'dd.MM.y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale gu.
+      "gu": new DateSymbols(
+          NAME: "gu",
+          ERAS: const ['ઈ.સ.પૂર્વે', 'ઈ.સ.'],
+          ERANAMES: const ['ઈસવીસન પૂર્વે', 'ઇસવીસન'],
+          NARROWMONTHS: const [
+            'જા',
+            'ફે',
+            'મા',
+            'એ',
+            'મે',
+            'જૂ',
+            'જુ',
+            'ઑ',
+            'સ',
+            'ઑ',
+            'ન',
+            'ડિ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'જા',
+            'ફે',
+            'મા',
+            'એ',
+            'મે',
+            'જૂ',
+            'જુ',
+            'ઑ',
+            'સ',
+            'ઑ',
+            'ન',
+            'ડિ'
+          ],
+          MONTHS: const [
+            'જાન્યુઆરી',
+            'ફેબ્રુઆરી',
+            'માર્ચ',
+            'એપ્રિલ',
+            'મે',
+            'જૂન',
+            'જુલાઈ',
+            'ઑગસ્ટ',
+            'સપ્ટેમ્બર',
+            'ઑક્ટોબર',
+            'નવેમ્બર',
+            'ડિસેમ્બર'
+          ],
+          STANDALONEMONTHS: const [
+            'જાન્યુઆરી',
+            'ફેબ્રુઆરી',
+            'માર્ચ',
+            'એપ્રિલ',
+            'મે',
+            'જૂન',
+            'જુલાઈ',
+            'ઑગસ્ટ',
+            'સપ્ટેમ્બર',
+            'ઑક્ટોબર',
+            'નવેમ્બર',
+            'ડિસેમ્બર'
+          ],
+          SHORTMONTHS: const [
+            'જાન્યુ',
+            'ફેબ્રુ',
+            'માર્ચ',
+            'એપ્રિલ',
+            'મે',
+            'જૂન',
+            'જુલાઈ',
+            'ઑગસ્ટ',
+            'સપ્ટે',
+            'ઑક્ટો',
+            'નવે',
+            'ડિસે'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'જાન્યુ',
+            'ફેબ્રુ',
+            'માર્ચ',
+            'એપ્રિલ',
+            'મે',
+            'જૂન',
+            'જુલાઈ',
+            'ઑગસ્ટ',
+            'સપ્ટે',
+            'ઑક્ટો',
+            'નવે',
+            'ડિસે'
+          ],
+          WEEKDAYS: const [
+            'રવિવાર',
+            'સોમવાર',
+            'મંગળવાર',
+            'બુધવાર',
+            'ગુરુવાર',
+            'શુક્રવાર',
+            'શનિવાર'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'રવિવાર',
+            'સોમવાર',
+            'મંગળવાર',
+            'બુધવાર',
+            'ગુરુવાર',
+            'શુક્રવાર',
+            'શનિવાર'
+          ],
+          SHORTWEEKDAYS: const [
+            'રવિ',
+            'સોમ',
+            'મંગળ',
+            'બુધ',
+            'ગુરુ',
+            'શુક્ર',
+            'શનિ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'રવિ',
+            'સોમ',
+            'મંગળ',
+            'બુધ',
+            'ગુરુ',
+            'શુક્ર',
+            'શનિ'
+          ],
+          NARROWWEEKDAYS: const ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ર',
+            'સો',
+            'મં',
+            'બુ',
+            'ગુ',
+            'શુ',
+            'શ'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            'પહેલો ત્રિમાસ',
+            'બીજો ત્રિમાસ',
+            'ત્રીજો ત્રિમાસ',
+            'ચોથો ત્રિમાસ'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM, y',
+            'd MMMM, y',
+            'd MMM, y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'hh:mm:ss a zzzz',
+            'hh:mm:ss a z',
+            'hh:mm:ss a',
+            'hh:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale haw.
+      "haw": new DateSymbols(
+          NAME: "haw",
+          ERAS: const ['BCE', 'CE'],
+          ERANAMES: const ['BCE', 'CE'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'Ianuali',
+            'Pepeluali',
+            'Malaki',
+            'ʻApelila',
+            'Mei',
+            'Iune',
+            'Iulai',
+            'ʻAukake',
+            'Kepakemapa',
+            'ʻOkakopa',
+            'Nowemapa',
+            'Kekemapa'
+          ],
+          STANDALONEMONTHS: const [
+            'Ianuali',
+            'Pepeluali',
+            'Malaki',
+            'ʻApelila',
+            'Mei',
+            'Iune',
+            'Iulai',
+            'ʻAukake',
+            'Kepakemapa',
+            'ʻOkakopa',
+            'Nowemapa',
+            'Kekemapa'
+          ],
+          SHORTMONTHS: const [
+            'Ian.',
+            'Pep.',
+            'Mal.',
+            'ʻAp.',
+            'Mei',
+            'Iun.',
+            'Iul.',
+            'ʻAu.',
+            'Kep.',
+            'ʻOk.',
+            'Now.',
+            'Kek.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ian.',
+            'Pep.',
+            'Mal.',
+            'ʻAp.',
+            'Mei',
+            'Iun.',
+            'Iul.',
+            'ʻAu.',
+            'Kep.',
+            'ʻOk.',
+            'Now.',
+            'Kek.'
+          ],
+          WEEKDAYS: const [
+            'Lāpule',
+            'Poʻakahi',
+            'Poʻalua',
+            'Poʻakolu',
+            'Poʻahā',
+            'Poʻalima',
+            'Poʻaono'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Lāpule',
+            'Poʻakahi',
+            'Poʻalua',
+            'Poʻakolu',
+            'Poʻahā',
+            'Poʻalima',
+            'Poʻaono'
+          ],
+          SHORTWEEKDAYS: const ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'],
+          STANDALONESHORTWEEKDAYS: const [
+            'LP',
+            'P1',
+            'P2',
+            'P3',
+            'P4',
+            'P5',
+            'P6'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale he.
+      "he": new DateSymbols(
+          NAME: "he",
+          ERAS: const ['לפנה״ס', 'לספירה'],
+          ERANAMES: const ['לפני הספירה', 'לספירה'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'ינואר',
+            'פברואר',
+            'מרץ',
+            'אפריל',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוגוסט',
+            'ספטמבר',
+            'אוקטובר',
+            'נובמבר',
+            'דצמבר'
+          ],
+          STANDALONEMONTHS: const [
+            'ינואר',
+            'פברואר',
+            'מרץ',
+            'אפריל',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוגוסט',
+            'ספטמבר',
+            'אוקטובר',
+            'נובמבר',
+            'דצמבר'
+          ],
+          SHORTMONTHS: const [
+            'ינו׳',
+            'פבר׳',
+            'מרץ',
+            'אפר׳',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוג׳',
+            'ספט׳',
+            'אוק׳',
+            'נוב׳',
+            'דצמ׳'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ינו׳',
+            'פבר׳',
+            'מרץ',
+            'אפר׳',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוג׳',
+            'ספט׳',
+            'אוק׳',
+            'נוב׳',
+            'דצמ׳'
+          ],
+          WEEKDAYS: const [
+            'יום ראשון',
+            'יום שני',
+            'יום שלישי',
+            'יום רביעי',
+            'יום חמישי',
+            'יום שישי',
+            'יום שבת'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'יום ראשון',
+            'יום שני',
+            'יום שלישי',
+            'יום רביעי',
+            'יום חמישי',
+            'יום שישי',
+            'יום שבת'
+          ],
+          SHORTWEEKDAYS: const [
+            'יום א׳',
+            'יום ב׳',
+            'יום ג׳',
+            'יום ד׳',
+            'יום ה׳',
+            'יום ו׳',
+            'שבת'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'יום א׳',
+            'יום ב׳',
+            'יום ג׳',
+            'יום ד׳',
+            'יום ה׳',
+            'יום ו׳',
+            'שבת'
+          ],
+          NARROWWEEKDAYS: const ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
+          STANDALONENARROWWEEKDAYS: const [
+            'א׳',
+            'ב׳',
+            'ג׳',
+            'ד׳',
+            'ה׳',
+            'ו׳',
+            'ש׳'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
+          AMPMS: const ['לפנה״צ', 'אחה״צ'],
+          DATEFORMATS: const [
+            'EEEE, d בMMMM y',
+            'd בMMMM y',
+            'd בMMM y',
+            'd.M.y'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1} בשעה {0}',
+            '{1} בשעה {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [4, 5],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale hi.
+      "hi": new DateSymbols(
+          NAME: "hi",
+          ERAS: const ['ईसा-पूर्व', 'ईस्वी'],
+          ERANAMES: const ['ईसा-पूर्व', 'ईसवी सन'],
+          NARROWMONTHS: const [
+            'ज',
+            'फ़',
+            'मा',
+            'अ',
+            'म',
+            'जू',
+            'जु',
+            'अ',
+            'सि',
+            'अ',
+            'न',
+            'दि'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ज',
+            'फ़',
+            'मा',
+            'अ',
+            'म',
+            'जू',
+            'जु',
+            'अ',
+            'सि',
+            'अ',
+            'न',
+            'दि'
+          ],
+          MONTHS: const [
+            'जनवरी',
+            'फ़रवरी',
+            'मार्च',
+            'अप्रैल',
+            'मई',
+            'जून',
+            'जुलाई',
+            'अगस्त',
+            'सितंबर',
+            'अक्तूबर',
+            'नवंबर',
+            'दिसंबर'
+          ],
+          STANDALONEMONTHS: const [
+            'जनवरी',
+            'फ़रवरी',
+            'मार्च',
+            'अप्रैल',
+            'मई',
+            'जून',
+            'जुलाई',
+            'अगस्त',
+            'सितंबर',
+            'अक्तूबर',
+            'नवंबर',
+            'दिसंबर'
+          ],
+          SHORTMONTHS: const [
+            'जन॰',
+            'फ़र॰',
+            'मार्च',
+            'अप्रैल',
+            'मई',
+            'जून',
+            'जुल॰',
+            'अग॰',
+            'सित॰',
+            'अक्तू॰',
+            'नव॰',
+            'दिस॰'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'जन॰',
+            'फ़र॰',
+            'मार्च',
+            'अप्रैल',
+            'मई',
+            'जून',
+            'जुल॰',
+            'अग॰',
+            'सित॰',
+            'अक्तू॰',
+            'नव॰',
+            'दिस॰'
+          ],
+          WEEKDAYS: const [
+            'रविवार',
+            'सोमवार',
+            'मंगलवार',
+            'बुधवार',
+            'गुरुवार',
+            'शुक्रवार',
+            'शनिवार'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'रविवार',
+            'सोमवार',
+            'मंगलवार',
+            'बुधवार',
+            'गुरुवार',
+            'शुक्रवार',
+            'शनिवार'
+          ],
+          SHORTWEEKDAYS: const [
+            'रवि',
+            'सोम',
+            'मंगल',
+            'बुध',
+            'गुरु',
+            'शुक्र',
+            'शनि'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'रवि',
+            'सोम',
+            'मंगल',
+            'बुध',
+            'गुरु',
+            'शुक्र',
+            'शनि'
+          ],
+          NARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
+          STANDALONENARROWWEEKDAYS: const [
+            'र',
+            'सो',
+            'मं',
+            'बु',
+            'गु',
+            'शु',
+            'श'
+          ],
+          SHORTQUARTERS: const ['ति1', 'ति2', 'ति3', 'ति4'],
+          QUARTERS: const [
+            'पहली तिमाही',
+            'दूसरी तिमाही',
+            'तीसरी तिमाही',
+            'चौथी तिमाही'
+          ],
+          AMPMS: const ['am', 'pm'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'dd/MM/y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} को {0}',
+            '{1} को {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale hr.
+      "hr": new DateSymbols(
+          NAME: "hr",
+          ERAS: const ['pr. Kr.', 'po. Kr.'],
+          ERANAMES: const ['prije Krista', 'poslije Krista'],
+          NARROWMONTHS: const [
+            '1.',
+            '2.',
+            '3.',
+            '4.',
+            '5.',
+            '6.',
+            '7.',
+            '8.',
+            '9.',
+            '10.',
+            '11.',
+            '12.'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1.',
+            '2.',
+            '3.',
+            '4.',
+            '5.',
+            '6.',
+            '7.',
+            '8.',
+            '9.',
+            '10.',
+            '11.',
+            '12.'
+          ],
+          MONTHS: const [
+            'siječnja',
+            'veljače',
+            'ožujka',
+            'travnja',
+            'svibnja',
+            'lipnja',
+            'srpnja',
+            'kolovoza',
+            'rujna',
+            'listopada',
+            'studenoga',
+            'prosinca'
+          ],
+          STANDALONEMONTHS: const [
+            'siječanj',
+            'veljača',
+            'ožujak',
+            'travanj',
+            'svibanj',
+            'lipanj',
+            'srpanj',
+            'kolovoz',
+            'rujan',
+            'listopad',
+            'studeni',
+            'prosinac'
+          ],
+          SHORTMONTHS: const [
+            'sij',
+            'velj',
+            'ožu',
+            'tra',
+            'svi',
+            'lip',
+            'srp',
+            'kol',
+            'ruj',
+            'lis',
+            'stu',
+            'pro'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'sij',
+            'velj',
+            'ožu',
+            'tra',
+            'svi',
+            'lip',
+            'srp',
+            'kol',
+            'ruj',
+            'lis',
+            'stu',
+            'pro'
+          ],
+          WEEKDAYS: const [
+            'nedjelja',
+            'ponedjeljak',
+            'utorak',
+            'srijeda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'nedjelja',
+            'ponedjeljak',
+            'utorak',
+            'srijeda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          SHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sri',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sri',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          NARROWWEEKDAYS: const ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'č', 'p', 's'],
+          SHORTQUARTERS: const ['1kv', '2kv', '3kv', '4kv'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y.',
+            'd. MMMM y.',
+            'd. MMM y.',
+            'dd. MM. y.'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss (zzzz)',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'u\' {0}',
+            '{1} \'u\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale hu.
+      "hu": new DateSymbols(
+          NAME: "hu",
+          ERAS: const ['i. e.', 'i. sz.'],
+          ERANAMES: const ['időszámításunk előtt', 'időszámításunk szerint'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'Á',
+            'M',
+            'J',
+            'J',
+            'A',
+            'Sz',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'Á',
+            'M',
+            'J',
+            'J',
+            'A',
+            'Sz',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'január',
+            'február',
+            'március',
+            'április',
+            'május',
+            'június',
+            'július',
+            'augusztus',
+            'szeptember',
+            'október',
+            'november',
+            'december'
+          ],
+          STANDALONEMONTHS: const [
+            'január',
+            'február',
+            'március',
+            'április',
+            'május',
+            'június',
+            'július',
+            'augusztus',
+            'szeptember',
+            'október',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'febr.',
+            'márc.',
+            'ápr.',
+            'máj.',
+            'jún.',
+            'júl.',
+            'aug.',
+            'szept.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'febr.',
+            'márc.',
+            'ápr.',
+            'máj.',
+            'jún.',
+            'júl.',
+            'aug.',
+            'szept.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'vasárnap',
+            'hétfő',
+            'kedd',
+            'szerda',
+            'csütörtök',
+            'péntek',
+            'szombat'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'vasárnap',
+            'hétfő',
+            'kedd',
+            'szerda',
+            'csütörtök',
+            'péntek',
+            'szombat'
+          ],
+          SHORTWEEKDAYS: const ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+          STANDALONESHORTWEEKDAYS: const [
+            'V',
+            'H',
+            'K',
+            'Sze',
+            'Cs',
+            'P',
+            'Szo'
+          ],
+          NARROWWEEKDAYS: const ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
+          STANDALONENARROWWEEKDAYS: const [
+            'V',
+            'H',
+            'K',
+            'Sz',
+            'Cs',
+            'P',
+            'Sz'
+          ],
+          SHORTQUARTERS: const ['N1', 'N2', 'N3', 'N4'],
+          QUARTERS: const [
+            'I. negyedév',
+            'II. negyedév',
+            'III. negyedév',
+            'IV. negyedév'
+          ],
+          AMPMS: const ['de.', 'du.'],
+          DATEFORMATS: const [
+            'y. MMMM d., EEEE',
+            'y. MMMM d.',
+            'y. MMM d.',
+            'y. MM. dd.'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale hy.
+      "hy": new DateSymbols(
+          NAME: "hy",
+          ERAS: const ['մ.թ.ա.', 'մ.թ.'],
+          ERANAMES: const ['Քրիստոսից առաջ', 'Քրիստոսից հետո'],
+          NARROWMONTHS: const [
+            'Հ',
+            'Փ',
+            'Մ',
+            'Ա',
+            'Մ',
+            'Հ',
+            'Հ',
+            'Օ',
+            'Ս',
+            'Հ',
+            'Ն',
+            'Դ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Հ',
+            'Փ',
+            'Մ',
+            'Ա',
+            'Մ',
+            'Հ',
+            'Հ',
+            'Օ',
+            'Ս',
+            'Հ',
+            'Ն',
+            'Դ'
+          ],
+          MONTHS: const [
+            'հունվարի',
+            'փետրվարի',
+            'մարտի',
+            'ապրիլի',
+            'մայիսի',
+            'հունիսի',
+            'հուլիսի',
+            'օգոստոսի',
+            'սեպտեմբերի',
+            'հոկտեմբերի',
+            'նոյեմբերի',
+            'դեկտեմբերի'
+          ],
+          STANDALONEMONTHS: const [
+            'հունվար',
+            'փետրվար',
+            'մարտ',
+            'ապրիլ',
+            'մայիս',
+            'հունիս',
+            'հուլիս',
+            'օգոստոս',
+            'սեպտեմբեր',
+            'հոկտեմբեր',
+            'նոյեմբեր',
+            'դեկտեմբեր'
+          ],
+          SHORTMONTHS: const [
+            'հնվ',
+            'փտվ',
+            'մրտ',
+            'ապր',
+            'մյս',
+            'հնս',
+            'հլս',
+            'օգս',
+            'սեպ',
+            'հոկ',
+            'նոյ',
+            'դեկ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'հնվ',
+            'փտվ',
+            'մրտ',
+            'ապր',
+            'մյս',
+            'հնս',
+            'հլս',
+            'օգս',
+            'սեպ',
+            'հոկ',
+            'նոյ',
+            'դեկ'
+          ],
+          WEEKDAYS: const [
+            'կիրակի',
+            'երկուշաբթի',
+            'երեքշաբթի',
+            'չորեքշաբթի',
+            'հինգշաբթի',
+            'ուրբաթ',
+            'շաբաթ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'կիրակի',
+            'երկուշաբթի',
+            'երեքշաբթի',
+            'չորեքշաբթի',
+            'հինգշաբթի',
+            'ուրբաթ',
+            'շաբաթ'
+          ],
+          SHORTWEEKDAYS: const [
+            'կիր',
+            'երկ',
+            'երք',
+            'չրք',
+            'հնգ',
+            'ուր',
+            'շբթ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'կիր',
+            'երկ',
+            'երք',
+            'չրք',
+            'հնգ',
+            'ուր',
+            'շբթ'
+          ],
+          NARROWWEEKDAYS: const ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ո', 'Շ'],
+          STANDALONENARROWWEEKDAYS: const ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ո', 'Շ'],
+          SHORTQUARTERS: const [
+            '1-ին եռմս.',
+            '2-րդ եռմս.',
+            '3-րդ եռմս.',
+            '4-րդ եռմս.'
+          ],
+          QUARTERS: const [
+            '1-ին եռամսյակ',
+            '2-րդ եռամսյակ',
+            '3-րդ եռամսյակ',
+            '4-րդ եռամսյակ'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'y թ. MMMM d, EEEE',
+            'dd MMMM, y թ.',
+            'dd MMM, y թ.',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale id.
+      "id": new DateSymbols(
+          NAME: "id",
+          ERAS: const ['SM', 'M'],
+          ERANAMES: const ['Sebelum Masehi', 'Masehi'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januari',
+            'Februari',
+            'Maret',
+            'April',
+            'Mei',
+            'Juni',
+            'Juli',
+            'Agustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januari',
+            'Februari',
+            'Maret',
+            'April',
+            'Mei',
+            'Juni',
+            'Juli',
+            'Agustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Agt',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Agt',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          WEEKDAYS: const [
+            'Minggu',
+            'Senin',
+            'Selasa',
+            'Rabu',
+            'Kamis',
+            'Jumat',
+            'Sabtu'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Minggu',
+            'Senin',
+            'Selasa',
+            'Rabu',
+            'Kamis',
+            'Jumat',
+            'Sabtu'
+          ],
+          SHORTWEEKDAYS: const [
+            'Min',
+            'Sen',
+            'Sel',
+            'Rab',
+            'Kam',
+            'Jum',
+            'Sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Min',
+            'Sen',
+            'Sel',
+            'Rab',
+            'Kam',
+            'Jum',
+            'Sab'
+          ],
+          NARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            'Kuartal ke-1',
+            'Kuartal ke-2',
+            'Kuartal ke-3',
+            'Kuartal ke-4'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH.mm.ss zzzz',
+            'HH.mm.ss z',
+            'HH.mm.ss',
+            'HH.mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale in.
+      "in": new DateSymbols(
+          NAME: "in",
+          ERAS: const ['SM', 'M'],
+          ERANAMES: const ['Sebelum Masehi', 'Masehi'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januari',
+            'Februari',
+            'Maret',
+            'April',
+            'Mei',
+            'Juni',
+            'Juli',
+            'Agustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januari',
+            'Februari',
+            'Maret',
+            'April',
+            'Mei',
+            'Juni',
+            'Juli',
+            'Agustus',
+            'September',
+            'Oktober',
+            'November',
+            'Desember'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Agt',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mar',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Agt',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          WEEKDAYS: const [
+            'Minggu',
+            'Senin',
+            'Selasa',
+            'Rabu',
+            'Kamis',
+            'Jumat',
+            'Sabtu'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Minggu',
+            'Senin',
+            'Selasa',
+            'Rabu',
+            'Kamis',
+            'Jumat',
+            'Sabtu'
+          ],
+          SHORTWEEKDAYS: const [
+            'Min',
+            'Sen',
+            'Sel',
+            'Rab',
+            'Kam',
+            'Jum',
+            'Sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Min',
+            'Sen',
+            'Sel',
+            'Rab',
+            'Kam',
+            'Jum',
+            'Sab'
+          ],
+          NARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['M', 'S', 'S', 'R', 'K', 'J', 'S'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            'Kuartal ke-1',
+            'Kuartal ke-2',
+            'Kuartal ke-3',
+            'Kuartal ke-4'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH.mm.ss zzzz',
+            'HH.mm.ss z',
+            'HH.mm.ss',
+            'HH.mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale is.
+      "is": new DateSymbols(
+          NAME: "is",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['fyrir Krist', 'eftir Krist'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'Á',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'Á',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janúar',
+            'febrúar',
+            'mars',
+            'apríl',
+            'maí',
+            'júní',
+            'júlí',
+            'ágúst',
+            'september',
+            'október',
+            'nóvember',
+            'desember'
+          ],
+          STANDALONEMONTHS: const [
+            'janúar',
+            'febrúar',
+            'mars',
+            'apríl',
+            'maí',
+            'júní',
+            'júlí',
+            'ágúst',
+            'september',
+            'október',
+            'nóvember',
+            'desember'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maí',
+            'jún.',
+            'júl.',
+            'ágú.',
+            'sep.',
+            'okt.',
+            'nóv.',
+            'des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maí',
+            'jún.',
+            'júl.',
+            'ágú.',
+            'sep.',
+            'okt.',
+            'nóv.',
+            'des.'
+          ],
+          WEEKDAYS: const [
+            'sunnudagur',
+            'mánudagur',
+            'þriðjudagur',
+            'miðvikudagur',
+            'fimmtudagur',
+            'föstudagur',
+            'laugardagur'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'sunnudagur',
+            'mánudagur',
+            'þriðjudagur',
+            'miðvikudagur',
+            'fimmtudagur',
+            'föstudagur',
+            'laugardagur'
+          ],
+          SHORTWEEKDAYS: const [
+            'sun.',
+            'mán.',
+            'þri.',
+            'mið.',
+            'fim.',
+            'fös.',
+            'lau.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'sun.',
+            'mán.',
+            'þri.',
+            'mið.',
+            'fim.',
+            'fös.',
+            'lau.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],
+          SHORTQUARTERS: const ['F1', 'F2', 'F3', 'F4'],
+          QUARTERS: const [
+            '1. fjórðungur',
+            '2. fjórðungur',
+            '3. fjórðungur',
+            '4. fjórðungur'
+          ],
+          AMPMS: const ['f.h.', 'e.h.'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'd.M.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'kl\'. {0}',
+            '{1} \'kl\'. {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale it.
+      "it": new DateSymbols(
+          NAME: "it",
+          ERAS: const ['a.C.', 'd.C.'],
+          ERANAMES: const ['avanti Cristo', 'dopo Cristo'],
+          NARROWMONTHS: const [
+            'G',
+            'F',
+            'M',
+            'A',
+            'M',
+            'G',
+            'L',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'G',
+            'F',
+            'M',
+            'A',
+            'M',
+            'G',
+            'L',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'gennaio',
+            'febbraio',
+            'marzo',
+            'aprile',
+            'maggio',
+            'giugno',
+            'luglio',
+            'agosto',
+            'settembre',
+            'ottobre',
+            'novembre',
+            'dicembre'
+          ],
+          STANDALONEMONTHS: const [
+            'gennaio',
+            'febbraio',
+            'marzo',
+            'aprile',
+            'maggio',
+            'giugno',
+            'luglio',
+            'agosto',
+            'settembre',
+            'ottobre',
+            'novembre',
+            'dicembre'
+          ],
+          SHORTMONTHS: const [
+            'gen',
+            'feb',
+            'mar',
+            'apr',
+            'mag',
+            'giu',
+            'lug',
+            'ago',
+            'set',
+            'ott',
+            'nov',
+            'dic'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'gen',
+            'feb',
+            'mar',
+            'apr',
+            'mag',
+            'giu',
+            'lug',
+            'ago',
+            'set',
+            'ott',
+            'nov',
+            'dic'
+          ],
+          WEEKDAYS: const [
+            'domenica',
+            'lunedì',
+            'martedì',
+            'mercoledì',
+            'giovedì',
+            'venerdì',
+            'sabato'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domenica',
+            'lunedì',
+            'martedì',
+            'mercoledì',
+            'giovedì',
+            'venerdì',
+            'sabato'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom',
+            'lun',
+            'mar',
+            'mer',
+            'gio',
+            'ven',
+            'sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom',
+            'lun',
+            'mar',
+            'mer',
+            'gio',
+            'ven',
+            'sab'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'G', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'G', 'V', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1º trimestre',
+            '2º trimestre',
+            '3º trimestre',
+            '4º trimestre'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'dd MMM y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale iw.
+      "iw": new DateSymbols(
+          NAME: "iw",
+          ERAS: const ['לפנה״ס', 'לספירה'],
+          ERANAMES: const ['לפני הספירה', 'לספירה'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'ינואר',
+            'פברואר',
+            'מרץ',
+            'אפריל',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוגוסט',
+            'ספטמבר',
+            'אוקטובר',
+            'נובמבר',
+            'דצמבר'
+          ],
+          STANDALONEMONTHS: const [
+            'ינואר',
+            'פברואר',
+            'מרץ',
+            'אפריל',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוגוסט',
+            'ספטמבר',
+            'אוקטובר',
+            'נובמבר',
+            'דצמבר'
+          ],
+          SHORTMONTHS: const [
+            'ינו׳',
+            'פבר׳',
+            'מרץ',
+            'אפר׳',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוג׳',
+            'ספט׳',
+            'אוק׳',
+            'נוב׳',
+            'דצמ׳'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ינו׳',
+            'פבר׳',
+            'מרץ',
+            'אפר׳',
+            'מאי',
+            'יוני',
+            'יולי',
+            'אוג׳',
+            'ספט׳',
+            'אוק׳',
+            'נוב׳',
+            'דצמ׳'
+          ],
+          WEEKDAYS: const [
+            'יום ראשון',
+            'יום שני',
+            'יום שלישי',
+            'יום רביעי',
+            'יום חמישי',
+            'יום שישי',
+            'יום שבת'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'יום ראשון',
+            'יום שני',
+            'יום שלישי',
+            'יום רביעי',
+            'יום חמישי',
+            'יום שישי',
+            'יום שבת'
+          ],
+          SHORTWEEKDAYS: const [
+            'יום א׳',
+            'יום ב׳',
+            'יום ג׳',
+            'יום ד׳',
+            'יום ה׳',
+            'יום ו׳',
+            'שבת'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'יום א׳',
+            'יום ב׳',
+            'יום ג׳',
+            'יום ד׳',
+            'יום ה׳',
+            'יום ו׳',
+            'שבת'
+          ],
+          NARROWWEEKDAYS: const ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],
+          STANDALONENARROWWEEKDAYS: const [
+            'א׳',
+            'ב׳',
+            'ג׳',
+            'ד׳',
+            'ה׳',
+            'ו׳',
+            'ש׳'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],
+          AMPMS: const ['לפנה״צ', 'אחה״צ'],
+          DATEFORMATS: const [
+            'EEEE, d בMMMM y',
+            'd בMMMM y',
+            'd בMMM y',
+            'd.M.y'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1} בשעה {0}',
+            '{1} בשעה {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [4, 5],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ja.
+      "ja": new DateSymbols(
+          NAME: "ja",
+          ERAS: const ['紀元前', '西暦'],
+          ERANAMES: const ['紀元前', '西暦'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONEMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          SHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          WEEKDAYS: const ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
+          STANDALONEWEEKDAYS: const [
+            '日曜日',
+            '月曜日',
+            '火曜日',
+            '水曜日',
+            '木曜日',
+            '金曜日',
+            '土曜日'
+          ],
+          SHORTWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
+          STANDALONESHORTWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
+          NARROWWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
+          STANDALONENARROWWEEKDAYS: const ['日', '月', '火', '水', '木', '金', '土'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['第1四半期', '第2四半期', '第3四半期', '第4四半期'],
+          AMPMS: const ['午前', '午後'],
+          DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y/MM/dd', 'y/MM/dd'],
+          TIMEFORMATS: const ['H時mm分ss秒 zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ka.
+      "ka": new DateSymbols(
+          NAME: "ka",
+          ERAS: const ['ძვ. წ.', 'ახ. წ.'],
+          ERANAMES: const ['ძველი წელთაღრიცხვით', 'ახალი წელთაღრიცხვით'],
+          NARROWMONTHS: const [
+            'ი',
+            'თ',
+            'მ',
+            'ა',
+            'მ',
+            'ი',
+            'ი',
+            'ა',
+            'ს',
+            'ო',
+            'ნ',
+            'დ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ი',
+            'თ',
+            'მ',
+            'ა',
+            'მ',
+            'ი',
+            'ი',
+            'ა',
+            'ს',
+            'ო',
+            'ნ',
+            'დ'
+          ],
+          MONTHS: const [
+            'იანვარი',
+            'თებერვალი',
+            'მარტი',
+            'აპრილი',
+            'მაისი',
+            'ივნისი',
+            'ივლისი',
+            'აგვისტო',
+            'სექტემბერი',
+            'ოქტომბერი',
+            'ნოემბერი',
+            'დეკემბერი'
+          ],
+          STANDALONEMONTHS: const [
+            'იანვარი',
+            'თებერვალი',
+            'მარტი',
+            'აპრილი',
+            'მაისი',
+            'ივნისი',
+            'ივლისი',
+            'აგვისტო',
+            'სექტემბერი',
+            'ოქტომბერი',
+            'ნოემბერი',
+            'დეკემბერი'
+          ],
+          SHORTMONTHS: const [
+            'იან',
+            'თებ',
+            'მარ',
+            'აპრ',
+            'მაი',
+            'ივნ',
+            'ივლ',
+            'აგვ',
+            'სექ',
+            'ოქტ',
+            'ნოე',
+            'დეკ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'იან',
+            'თებ',
+            'მარ',
+            'აპრ',
+            'მაი',
+            'ივნ',
+            'ივლ',
+            'აგვ',
+            'სექ',
+            'ოქტ',
+            'ნოე',
+            'დეკ'
+          ],
+          WEEKDAYS: const [
+            'კვირა',
+            'ორშაბათი',
+            'სამშაბათი',
+            'ოთხშაბათი',
+            'ხუთშაბათი',
+            'პარასკევი',
+            'შაბათი'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'კვირა',
+            'ორშაბათი',
+            'სამშაბათი',
+            'ოთხშაბათი',
+            'ხუთშაბათი',
+            'პარასკევი',
+            'შაბათი'
+          ],
+          SHORTWEEKDAYS: const [
+            'კვი',
+            'ორშ',
+            'სამ',
+            'ოთხ',
+            'ხუთ',
+            'პარ',
+            'შაბ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'კვი',
+            'ორშ',
+            'სამ',
+            'ოთხ',
+            'ხუთ',
+            'პარ',
+            'შაბ'
+          ],
+          NARROWWEEKDAYS: const ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],
+          STANDALONENARROWWEEKDAYS: const ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],
+          SHORTQUARTERS: const ['I კვ.', 'II კვ.', 'III კვ.', 'IV კვ.'],
+          QUARTERS: const [
+            'I კვარტალი',
+            'II კვარტალი',
+            'III კვარტალი',
+            'IV კვარტალი'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM, y',
+            'd MMMM, y',
+            'd MMM. y',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale kk.
+      "kk": new DateSymbols(
+          NAME: "kk",
+          ERAS: const ['б.з.д.', 'б.з.'],
+          ERANAMES: const ['Біздің заманымызға дейін', 'Біздің заманымыз'],
+          NARROWMONTHS: const [
+            'Қ',
+            'А',
+            'Н',
+            'С',
+            'М',
+            'М',
+            'Ш',
+            'Т',
+            'Қ',
+            'Қ',
+            'Қ',
+            'Ж'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Қ',
+            'А',
+            'Н',
+            'С',
+            'М',
+            'М',
+            'Ш',
+            'Т',
+            'Қ',
+            'Қ',
+            'Қ',
+            'Ж'
+          ],
+          MONTHS: const [
+            'қаңтар',
+            'ақпан',
+            'наурыз',
+            'сәуір',
+            'мамыр',
+            'маусым',
+            'шілде',
+            'тамыз',
+            'қыркүйек',
+            'қазан',
+            'қараша',
+            'желтоқсан'
+          ],
+          STANDALONEMONTHS: const [
+            'Қаңтар',
+            'Ақпан',
+            'Наурыз',
+            'Сәуір',
+            'Мамыр',
+            'Маусым',
+            'Шілде',
+            'Тамыз',
+            'Қыркүйек',
+            'Қазан',
+            'Қараша',
+            'Желтоқсан'
+          ],
+          SHORTMONTHS: const [
+            'қаң.',
+            'ақп.',
+            'нау.',
+            'сәу.',
+            'мам.',
+            'мау.',
+            'шіл.',
+            'там.',
+            'қыр.',
+            'қаз.',
+            'қар.',
+            'жел.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Қаң.',
+            'Ақп.',
+            'Нау.',
+            'Сәу.',
+            'Мам.',
+            'Мау.',
+            'Шіл.',
+            'Там.',
+            'Қыр.',
+            'Қаз.',
+            'Қар.',
+            'Жел.'
+          ],
+          WEEKDAYS: const [
+            'жексенбі',
+            'дүйсенбі',
+            'сейсенбі',
+            'сәрсенбі',
+            'бейсенбі',
+            'жұма',
+            'сенбі'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Жексенбі',
+            'Дүйсенбі',
+            'Сейсенбі',
+            'Сәрсенбі',
+            'Бейсенбі',
+            'Жұма',
+            'Сенбі'
+          ],
+          SHORTWEEKDAYS: const ['Жс', 'Дс', 'Сс', 'Ср', 'Бс', 'Жм', 'Сб'],
+          STANDALONESHORTWEEKDAYS: const [
+            'Жс',
+            'Дс',
+            'Сс',
+            'Ср',
+            'Бс',
+            'Жм',
+            'Сб'
+          ],
+          NARROWWEEKDAYS: const ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],
+          STANDALONENARROWWEEKDAYS: const ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],
+          SHORTQUARTERS: const ['І ш.', 'ІІ ш.', 'ІІІ ш.', 'IV ш.'],
+          QUARTERS: const ['І ширек', 'ІІ ширек', 'ІІІ ширек', 'IV ширек'],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'y \'ж\'. d MMMM, EEEE',
+            'y \'ж\'. d MMMM',
+            'y \'ж\'. dd MMM',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale km.
+      "km": new DateSymbols(
+          NAME: "km",
+          ERAS: const ['មុន គ.ស.', 'គ.ស.'],
+          ERANAMES: const ['មុន​គ្រិស្តសករាជ', 'គ្រិស្តសករាជ'],
+          NARROWMONTHS: const [
+            'ម',
+            'ក',
+            'ម',
+            'ម',
+            'ឧ',
+            'ម',
+            'ក',
+            'ស',
+            'ក',
+            'ត',
+            'វ',
+            'ធ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ម',
+            'ក',
+            'ម',
+            'ម',
+            'ឧ',
+            'ម',
+            'ក',
+            'ស',
+            'ក',
+            'ត',
+            'វ',
+            'ធ'
+          ],
+          MONTHS: const [
+            'មករា',
+            'កុម្ភៈ',
+            'មីនា',
+            'មេសា',
+            'ឧសភា',
+            'មិថុនា',
+            'កក្កដា',
+            'សីហា',
+            'កញ្ញា',
+            'តុលា',
+            'វិច្ឆិកា',
+            'ធ្នូ'
+          ],
+          STANDALONEMONTHS: const [
+            'មករា',
+            'កុម្ភៈ',
+            'មីនា',
+            'មេសា',
+            'ឧសភា',
+            'មិថុនា',
+            'កក្កដា',
+            'សីហា',
+            'កញ្ញា',
+            'តុលា',
+            'វិច្ឆិកា',
+            'ធ្នូ'
+          ],
+          SHORTMONTHS: const [
+            'មករា',
+            'កុម្ភៈ',
+            'មីនា',
+            'មេសា',
+            'ឧសភា',
+            'មិថុនា',
+            'កក្កដា',
+            'សីហា',
+            'កញ្ញា',
+            'តុលា',
+            'វិច្ឆិកា',
+            'ធ្នូ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'មករា',
+            'កុម្ភៈ',
+            'មីនា',
+            'មេសា',
+            'ឧសភា',
+            'មិថុនា',
+            'កក្កដា',
+            'សីហា',
+            'កញ្ញា',
+            'តុលា',
+            'វិច្ឆិកា',
+            'ធ្នូ'
+          ],
+          WEEKDAYS: const [
+            'អាទិត្យ',
+            'ច័ន្ទ',
+            'អង្គារ',
+            'ពុធ',
+            'ព្រហស្បតិ៍',
+            'សុក្រ',
+            'សៅរ៍'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'អាទិត្យ',
+            'ច័ន្ទ',
+            'អង្គារ',
+            'ពុធ',
+            'ព្រហស្បតិ៍',
+            'សុក្រ',
+            'សៅរ៍'
+          ],
+          SHORTWEEKDAYS: const [
+            'អាទិត្យ',
+            'ច័ន្ទ',
+            'អង្គារ',
+            'ពុធ',
+            'ព្រហស្បតិ៍',
+            'សុក្រ',
+            'សៅរ៍'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'អាទិត្យ',
+            'ច័ន្ទ',
+            'អង្គារ',
+            'ពុធ',
+            'ព្រហស្បតិ៍',
+            'សុក្រ',
+            'សៅរ៍'
+          ],
+          NARROWWEEKDAYS: const ['អ', 'ច', 'អ', 'ព', 'ព', 'ស', 'ស'],
+          STANDALONENARROWWEEKDAYS: const ['អ', 'ច', 'អ', 'ព', 'ព', 'ស', 'ស'],
+          SHORTQUARTERS: const [
+            'ត្រីមាសទី 1',
+            'ត្រីមាសទី 2',
+            'ត្រីមាសទី 3',
+            'ត្រីមាសទី 4'
+          ],
+          QUARTERS: const [
+            'ត្រីមាសទី 1',
+            'ត្រីមាសទី 2',
+            'ត្រីមាសទី 3',
+            'ត្រីមាសទី 4'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} នៅ​ម៉ោង {0}',
+            '{1} នៅ​ម៉ោង {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale kn.
+      "kn": new DateSymbols(
+          NAME: "kn",
+          ERAS: const ['ಕ್ರಿ.ಪೂ', 'ಕ್ರಿ.ಶ'],
+          ERANAMES: const ['ಕ್ರಿಸ್ತ ಪೂರ್ವ', 'ಕ್ರಿಸ್ತ ಶಕ'],
+          NARROWMONTHS: const [
+            'ಜ',
+            'ಫೆ',
+            'ಮಾ',
+            'ಏ',
+            'ಮೇ',
+            'ಜೂ',
+            'ಜು',
+            'ಆ',
+            'ಸೆ',
+            'ಅ',
+            'ನ',
+            'ಡಿ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ಜ',
+            'ಫೆ',
+            'ಮಾ',
+            'ಏ',
+            'ಮೇ',
+            'ಜೂ',
+            'ಜು',
+            'ಆ',
+            'ಸೆ',
+            'ಅ',
+            'ನ',
+            'ಡಿ'
+          ],
+          MONTHS: const [
+            'ಜನವರಿ',
+            'ಫೆಬ್ರವರಿ',
+            'ಮಾರ್ಚ್',
+            'ಏಪ್ರಿಲ್',
+            'ಮೇ',
+            'ಜೂನ್',
+            'ಜುಲೈ',
+            'ಆಗಸ್ಟ್',
+            'ಸೆಪ್ಟೆಂಬರ್',
+            'ಅಕ್ಟೋಬರ್',
+            'ನವೆಂಬರ್',
+            'ಡಿಸೆಂಬರ್'
+          ],
+          STANDALONEMONTHS: const [
+            'ಜನವರಿ',
+            'ಫೆಬ್ರವರಿ',
+            'ಮಾರ್ಚ್',
+            'ಏಪ್ರಿಲ್',
+            'ಮೇ',
+            'ಜೂನ್',
+            'ಜುಲೈ',
+            'ಆಗಸ್ಟ್',
+            'ಸೆಪ್ಟೆಂಬರ್',
+            'ಅಕ್ಟೋಬರ್',
+            'ನವೆಂಬರ್',
+            'ಡಿಸೆಂಬರ್'
+          ],
+          SHORTMONTHS: const [
+            'ಜನ',
+            'ಫೆಬ್ರ',
+            'ಮಾರ್ಚ್',
+            'ಏಪ್ರಿ',
+            'ಮೇ',
+            'ಜೂನ್',
+            'ಜುಲೈ',
+            'ಆಗ',
+            'ಸೆಪ್ಟೆಂ',
+            'ಅಕ್ಟೋ',
+            'ನವೆಂ',
+            'ಡಿಸೆಂ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ಜನ',
+            'ಫೆಬ್ರ',
+            'ಮಾರ್ಚ್',
+            'ಏಪ್ರಿ',
+            'ಮೇ',
+            'ಜೂನ್',
+            'ಜುಲೈ',
+            'ಆಗ',
+            'ಸೆಪ್ಟೆಂ',
+            'ಅಕ್ಟೋ',
+            'ನವೆಂ',
+            'ಡಿಸೆಂ'
+          ],
+          WEEKDAYS: const [
+            'ಭಾನುವಾರ',
+            'ಸೋಮವಾರ',
+            'ಮಂಗಳವಾರ',
+            'ಬುಧವಾರ',
+            'ಗುರುವಾರ',
+            'ಶುಕ್ರವಾರ',
+            'ಶನಿವಾರ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ಭಾನುವಾರ',
+            'ಸೋಮವಾರ',
+            'ಮಂಗಳವಾರ',
+            'ಬುಧವಾರ',
+            'ಗುರುವಾರ',
+            'ಶುಕ್ರವಾರ',
+            'ಶನಿವಾರ'
+          ],
+          SHORTWEEKDAYS: const [
+            'ಭಾನು',
+            'ಸೋಮ',
+            'ಮಂಗಳ',
+            'ಬುಧ',
+            'ಗುರು',
+            'ಶುಕ್ರ',
+            'ಶನಿ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ಭಾನು',
+            'ಸೋಮ',
+            'ಮಂಗಳ',
+            'ಬುಧ',
+            'ಗುರು',
+            'ಶುಕ್ರ',
+            'ಶನಿ'
+          ],
+          NARROWWEEKDAYS: const ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ಭಾ',
+            'ಸೋ',
+            'ಮಂ',
+            'ಬು',
+            'ಗು',
+            'ಶು',
+            'ಶ'
+          ],
+          SHORTQUARTERS: const ['ತ್ರೈ 1', 'ತ್ರೈ 2', 'ತ್ರೈ 3', 'ತ್ರೈ 4'],
+          QUARTERS: const [
+            '1ನೇ ತ್ರೈಮಾಸಿಕ',
+            '2ನೇ ತ್ರೈಮಾಸಿಕ',
+            '3ನೇ ತ್ರೈಮಾಸಿಕ',
+            '4ನೇ ತ್ರೈಮಾಸಿಕ'
+          ],
+          AMPMS: const ['ಪೂರ್ವಾಹ್ನ', 'ಅಪರಾಹ್ನ'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'hh:mm:ss a zzzz',
+            'hh:mm:ss a z',
+            'hh:mm:ss a',
+            'hh:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ko.
+      "ko": new DateSymbols(
+          NAME: "ko",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['기원전', '서기'],
+          NARROWMONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          MONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          STANDALONEMONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          SHORTMONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1월',
+            '2월',
+            '3월',
+            '4월',
+            '5월',
+            '6월',
+            '7월',
+            '8월',
+            '9월',
+            '10월',
+            '11월',
+            '12월'
+          ],
+          WEEKDAYS: const ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],
+          STANDALONEWEEKDAYS: const [
+            '일요일',
+            '월요일',
+            '화요일',
+            '수요일',
+            '목요일',
+            '금요일',
+            '토요일'
+          ],
+          SHORTWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
+          STANDALONESHORTWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
+          NARROWWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
+          STANDALONENARROWWEEKDAYS: const ['일', '월', '화', '수', '목', '금', '토'],
+          SHORTQUARTERS: const ['1분기', '2분기', '3분기', '4분기'],
+          QUARTERS: const ['제 1/4분기', '제 2/4분기', '제 3/4분기', '제 4/4분기'],
+          AMPMS: const ['오전', '오후'],
+          DATEFORMATS: const [
+            'y년 M월 d일 EEEE',
+            'y년 M월 d일',
+            'y. M. d.',
+            'yy. M. d.'
+          ],
+          TIMEFORMATS: const [
+            'a h시 m분 s초 zzzz',
+            'a h시 m분 s초 z',
+            'a h:mm:ss',
+            'a h:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ky.
+      "ky": new DateSymbols(
+          NAME: "ky",
+          ERAS: const ['б.з.ч.', 'б.з.'],
+          ERANAMES: const ['биздин заманга чейин', 'биздин заман'],
+          NARROWMONTHS: const [
+            'Я',
+            'Ф',
+            'М',
+            'А',
+            'М',
+            'И',
+            'И',
+            'А',
+            'С',
+            'О',
+            'Н',
+            'Д'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Я',
+            'Ф',
+            'М',
+            'А',
+            'М',
+            'И',
+            'И',
+            'А',
+            'С',
+            'О',
+            'Н',
+            'Д'
+          ],
+          MONTHS: const [
+            'январь',
+            'февраль',
+            'март',
+            'апрель',
+            'май',
+            'июнь',
+            'июль',
+            'август',
+            'сентябрь',
+            'октябрь',
+            'ноябрь',
+            'декабрь'
+          ],
+          STANDALONEMONTHS: const [
+            'Январь',
+            'Февраль',
+            'Март',
+            'Апрель',
+            'Май',
+            'Июнь',
+            'Июль',
+            'Август',
+            'Сентябрь',
+            'Октябрь',
+            'Ноябрь',
+            'Декабрь'
+          ],
+          SHORTMONTHS: const [
+            'янв.',
+            'фев.',
+            'мар.',
+            'апр.',
+            'май',
+            'июн.',
+            'июл.',
+            'авг.',
+            'сен.',
+            'окт.',
+            'ноя.',
+            'дек.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Янв',
+            'Фев',
+            'Мар',
+            'Апр',
+            'Май',
+            'Июн',
+            'Июл',
+            'Авг',
+            'Сен',
+            'Окт',
+            'Ноя',
+            'Дек'
+          ],
+          WEEKDAYS: const [
+            'жекшемби',
+            'дүйшөмбү',
+            'шейшемби',
+            'шаршемби',
+            'бейшемби',
+            'жума',
+            'ишемби'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'жекшемби',
+            'дүйшөмбү',
+            'шейшемби',
+            'шаршемби',
+            'бейшемби',
+            'жума',
+            'ишемби'
+          ],
+          SHORTWEEKDAYS: const [
+            'жек.',
+            'дүй.',
+            'шейш.',
+            'шарш.',
+            'бейш.',
+            'жума',
+            'ишм.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'жек.',
+            'дүй.',
+            'шейш.',
+            'шарш.',
+            'бейш.',
+            'жума',
+            'ишм.'
+          ],
+          NARROWWEEKDAYS: const ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],
+          STANDALONENARROWWEEKDAYS: const ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],
+          SHORTQUARTERS: const ['1-чей.', '2-чей.', '3-чей.', '4-чей.'],
+          QUARTERS: const ['1-чейрек', '2-чейрек', '3-чейрек', '4-чейрек'],
+          AMPMS: const ['таңкы', 'түштөн кийинки'],
+          DATEFORMATS: const [
+            'y-\'ж\'., d-MMMM, EEEE',
+            'y-\'ж\'., d-MMMM',
+            'y-\'ж\'., d-MMM',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ln.
+      "ln": new DateSymbols(
+          NAME: "ln",
+          ERAS: const ['libóso ya', 'nsima ya Y'],
+          ERANAMES: const ['Yambo ya Yézu Krís', 'Nsima ya Yézu Krís'],
+          NARROWMONTHS: const [
+            'y',
+            'f',
+            'm',
+            'a',
+            'm',
+            'y',
+            'y',
+            'a',
+            's',
+            'ɔ',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'y',
+            'f',
+            'm',
+            'a',
+            'm',
+            'y',
+            'y',
+            'a',
+            's',
+            'ɔ',
+            'n',
+            'd'
+          ],
+          MONTHS: const [
+            'sánzá ya yambo',
+            'sánzá ya míbalé',
+            'sánzá ya mísáto',
+            'sánzá ya mínei',
+            'sánzá ya mítáno',
+            'sánzá ya motóbá',
+            'sánzá ya nsambo',
+            'sánzá ya mwambe',
+            'sánzá ya libwa',
+            'sánzá ya zómi',
+            'sánzá ya zómi na mɔ̌kɔ́',
+            'sánzá ya zómi na míbalé'
+          ],
+          STANDALONEMONTHS: const [
+            'sánzá ya yambo',
+            'sánzá ya míbalé',
+            'sánzá ya mísáto',
+            'sánzá ya mínei',
+            'sánzá ya mítáno',
+            'sánzá ya motóbá',
+            'sánzá ya nsambo',
+            'sánzá ya mwambe',
+            'sánzá ya libwa',
+            'sánzá ya zómi',
+            'sánzá ya zómi na mɔ̌kɔ́',
+            'sánzá ya zómi na míbalé'
+          ],
+          SHORTMONTHS: const [
+            'yan',
+            'fbl',
+            'msi',
+            'apl',
+            'mai',
+            'yun',
+            'yul',
+            'agt',
+            'stb',
+            'ɔtb',
+            'nvb',
+            'dsb'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'yan',
+            'fbl',
+            'msi',
+            'apl',
+            'mai',
+            'yun',
+            'yul',
+            'agt',
+            'stb',
+            'ɔtb',
+            'nvb',
+            'dsb'
+          ],
+          WEEKDAYS: const [
+            'eyenga',
+            'mokɔlɔ mwa yambo',
+            'mokɔlɔ mwa míbalé',
+            'mokɔlɔ mwa mísáto',
+            'mokɔlɔ ya mínéi',
+            'mokɔlɔ ya mítáno',
+            'mpɔ́sɔ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'eyenga',
+            'mokɔlɔ mwa yambo',
+            'mokɔlɔ mwa míbalé',
+            'mokɔlɔ mwa mísáto',
+            'mokɔlɔ ya mínéi',
+            'mokɔlɔ ya mítáno',
+            'mpɔ́sɔ'
+          ],
+          SHORTWEEKDAYS: const [
+            'eye',
+            'ybo',
+            'mbl',
+            'mst',
+            'min',
+            'mtn',
+            'mps'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'eye',
+            'ybo',
+            'mbl',
+            'mst',
+            'min',
+            'mtn',
+            'mps'
+          ],
+          NARROWWEEKDAYS: const ['e', 'y', 'm', 'm', 'm', 'm', 'p'],
+          STANDALONENARROWWEEKDAYS: const ['e', 'y', 'm', 'm', 'm', 'm', 'p'],
+          SHORTQUARTERS: const ['SM1', 'SM2', 'SM3', 'SM4'],
+          QUARTERS: const [
+            'sánzá mísáto ya yambo',
+            'sánzá mísáto ya míbalé',
+            'sánzá mísáto ya mísáto',
+            'sánzá mísáto ya mínei'
+          ],
+          AMPMS: const ['ntɔ́ngɔ́', 'mpókwa'],
+          DATEFORMATS: const ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale lo.
+      "lo": new DateSymbols(
+          NAME: "lo",
+          ERAS: const ['ກ່ອນ ຄ.ສ.', 'ຄ.ສ.'],
+          ERANAMES: const ['ກ່ອນຄຣິດສັກກະລາດ', 'ຄຣິດສັກກະລາດ'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'ມັງກອນ',
+            'ກຸມພາ',
+            'ມີນາ',
+            'ເມສາ',
+            'ພຶດສະພາ',
+            'ມິຖຸນາ',
+            'ກໍລະກົດ',
+            'ສິງຫາ',
+            'ກັນຍາ',
+            'ຕຸລາ',
+            'ພະຈິກ',
+            'ທັນວາ'
+          ],
+          STANDALONEMONTHS: const [
+            'ມັງກອນ',
+            'ກຸມພາ',
+            'ມີນາ',
+            'ເມສາ',
+            'ພຶດສະພາ',
+            'ມິຖຸນາ',
+            'ກໍລະກົດ',
+            'ສິງຫາ',
+            'ກັນຍາ',
+            'ຕຸລາ',
+            'ພະຈິກ',
+            'ທັນວາ'
+          ],
+          SHORTMONTHS: const [
+            'ມ.ກ.',
+            'ກ.ພ.',
+            'ມ.ນ.',
+            'ມ.ສ.',
+            'ພ.ພ.',
+            'ມິ.ຖ.',
+            'ກ.ລ.',
+            'ສ.ຫ.',
+            'ກ.ຍ.',
+            'ຕ.ລ.',
+            'ພ.ຈ.',
+            'ທ.ວ.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ມ.ກ.',
+            'ກ.ພ.',
+            'ມ.ນ.',
+            'ມ.ສ.',
+            'ພ.ພ.',
+            'ມິ.ຖ.',
+            'ກ.ລ.',
+            'ສ.ຫ.',
+            'ກ.ຍ.',
+            'ຕ.ລ.',
+            'ພ.ຈ.',
+            'ທ.ວ.'
+          ],
+          WEEKDAYS: const [
+            'ວັນອາທິດ',
+            'ວັນຈັນ',
+            'ວັນອັງຄານ',
+            'ວັນພຸດ',
+            'ວັນພະຫັດ',
+            'ວັນສຸກ',
+            'ວັນເສົາ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ວັນອາທິດ',
+            'ວັນຈັນ',
+            'ວັນອັງຄານ',
+            'ວັນພຸດ',
+            'ວັນພະຫັດ',
+            'ວັນສຸກ',
+            'ວັນເສົາ'
+          ],
+          SHORTWEEKDAYS: const [
+            'ອາທິດ',
+            'ຈັນ',
+            'ອັງຄານ',
+            'ພຸດ',
+            'ພະຫັດ',
+            'ສຸກ',
+            'ເສົາ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ອາທິດ',
+            'ຈັນ',
+            'ອັງຄານ',
+            'ພຸດ',
+            'ພະຫັດ',
+            'ສຸກ',
+            'ເສົາ'
+          ],
+          NARROWWEEKDAYS: const ['ອາ', 'ຈ', 'ອ', 'ພ', 'ພຫ', 'ສຸ', 'ສ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ອາ',
+            'ຈ',
+            'ອ',
+            'ພ',
+            'ພຫ',
+            'ສຸ',
+            'ສ'
+          ],
+          SHORTQUARTERS: const ['ຕມ1', 'ຕມ2', 'ຕມ3', 'ຕມ4'],
+          QUARTERS: const ['ໄຕຣມາດ 1', 'ໄຕຣມາດ 2', 'ໄຕຣມາດ 3', 'ໄຕຣມາດ 4'],
+          AMPMS: const ['ກ່ອນທ່ຽງ', 'ຫຼັງທ່ຽງ'],
+          DATEFORMATS: const [
+            'EEEE ທີ d MMMM G y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/y'
+          ],
+          TIMEFORMATS: const [
+            'H ໂມງ m ນາທີ ss ວິນາທີ zzzz',
+            'H ໂມງ m ນາທີ ss ວິນາທີ z',
+            'H:mm:ss',
+            'H:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale lt.
+      "lt": new DateSymbols(
+          NAME: "lt",
+          ERAS: const ['pr. Kr.', 'po Kr.'],
+          ERANAMES: const ['prieš Kristų', 'po Kristaus'],
+          NARROWMONTHS: const [
+            'S',
+            'V',
+            'K',
+            'B',
+            'G',
+            'B',
+            'L',
+            'R',
+            'R',
+            'S',
+            'L',
+            'G'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'S',
+            'V',
+            'K',
+            'B',
+            'G',
+            'B',
+            'L',
+            'R',
+            'R',
+            'S',
+            'L',
+            'G'
+          ],
+          MONTHS: const [
+            'sausio',
+            'vasario',
+            'kovo',
+            'balandžio',
+            'gegužės',
+            'birželio',
+            'liepos',
+            'rugpjūčio',
+            'rugsėjo',
+            'spalio',
+            'lapkričio',
+            'gruodžio'
+          ],
+          STANDALONEMONTHS: const [
+            'sausis',
+            'vasaris',
+            'kovas',
+            'balandis',
+            'gegužė',
+            'birželis',
+            'liepa',
+            'rugpjūtis',
+            'rugsėjis',
+            'spalis',
+            'lapkritis',
+            'gruodis'
+          ],
+          SHORTMONTHS: const [
+            'saus.',
+            'vas.',
+            'kov.',
+            'bal.',
+            'geg.',
+            'birž.',
+            'liep.',
+            'rugp.',
+            'rugs.',
+            'spal.',
+            'lapkr.',
+            'gruod.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'saus.',
+            'vas.',
+            'kov.',
+            'bal.',
+            'geg.',
+            'birž.',
+            'liep.',
+            'rugp.',
+            'rugs.',
+            'spal.',
+            'lapkr.',
+            'gruod.'
+          ],
+          WEEKDAYS: const [
+            'sekmadienis',
+            'pirmadienis',
+            'antradienis',
+            'trečiadienis',
+            'ketvirtadienis',
+            'penktadienis',
+            'šeštadienis'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'sekmadienis',
+            'pirmadienis',
+            'antradienis',
+            'trečiadienis',
+            'ketvirtadienis',
+            'penktadienis',
+            'šeštadienis'
+          ],
+          SHORTWEEKDAYS: const ['sk', 'pr', 'an', 'tr', 'kt', 'pn', 'št'],
+          STANDALONESHORTWEEKDAYS: const [
+            'sk',
+            'pr',
+            'an',
+            'tr',
+            'kt',
+            'pn',
+            'št'
+          ],
+          NARROWWEEKDAYS: const ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],
+          SHORTQUARTERS: const ['I k.', 'II k.', 'III k.', 'IV k.'],
+          QUARTERS: const [
+            'I ketvirtis',
+            'II ketvirtis',
+            'III ketvirtis',
+            'IV ketvirtis'
+          ],
+          AMPMS: const ['priešpiet', 'popiet'],
+          DATEFORMATS: const [
+            'y \'m\'. MMMM d \'d\'., EEEE',
+            'y \'m\'. MMMM d \'d\'.',
+            'y-MM-dd',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale lv.
+      "lv": new DateSymbols(
+          NAME: "lv",
+          ERAS: const ['p.m.ē.', 'm.ē.'],
+          ERANAMES: const ['pirms mūsu ēras', 'mūsu ērā'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janvāris',
+            'februāris',
+            'marts',
+            'aprīlis',
+            'maijs',
+            'jūnijs',
+            'jūlijs',
+            'augusts',
+            'septembris',
+            'oktobris',
+            'novembris',
+            'decembris'
+          ],
+          STANDALONEMONTHS: const [
+            'janvāris',
+            'februāris',
+            'marts',
+            'aprīlis',
+            'maijs',
+            'jūnijs',
+            'jūlijs',
+            'augusts',
+            'septembris',
+            'oktobris',
+            'novembris',
+            'decembris'
+          ],
+          SHORTMONTHS: const [
+            'janv.',
+            'febr.',
+            'marts',
+            'apr.',
+            'maijs',
+            'jūn.',
+            'jūl.',
+            'aug.',
+            'sept.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'janv.',
+            'febr.',
+            'marts',
+            'apr.',
+            'maijs',
+            'jūn.',
+            'jūl.',
+            'aug.',
+            'sept.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'svētdiena',
+            'pirmdiena',
+            'otrdiena',
+            'trešdiena',
+            'ceturtdiena',
+            'piektdiena',
+            'sestdiena'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Svētdiena',
+            'Pirmdiena',
+            'Otrdiena',
+            'Trešdiena',
+            'Ceturtdiena',
+            'Piektdiena',
+            'Sestdiena'
+          ],
+          SHORTWEEKDAYS: const [
+            'svētd.',
+            'pirmd.',
+            'otrd.',
+            'trešd.',
+            'ceturtd.',
+            'piektd.',
+            'sestd.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Svētd.',
+            'Pirmd.',
+            'Otrd.',
+            'Trešd.',
+            'Ceturtd.',
+            'Piektd.',
+            'Sestd.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'P', 'O', 'T', 'C', 'P', 'S'],
+          SHORTQUARTERS: const ['1. cet.', '2. cet.', '3. cet.', '4. cet.'],
+          QUARTERS: const [
+            '1. ceturksnis',
+            '2. ceturksnis',
+            '3. ceturksnis',
+            '4. ceturksnis'
+          ],
+          AMPMS: const ['priekšpusdienā', 'pēcpusdienā'],
+          DATEFORMATS: const [
+            'EEEE, y. \'gada\' d. MMMM',
+            'y. \'gada\' d. MMMM',
+            'y. \'gada\' d. MMM',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale mk.
+      "mk": new DateSymbols(
+          NAME: "mk",
+          ERAS: const ['пр.н.е.', 'н.е.'],
+          ERANAMES: const ['пред нашата ера', 'од нашата ера'],
+          NARROWMONTHS: const [
+            'ј',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ј',
+            'ј',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ј',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ј',
+            'ј',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          MONTHS: const [
+            'јануари',
+            'февруари',
+            'март',
+            'април',
+            'мај',
+            'јуни',
+            'јули',
+            'август',
+            'септември',
+            'октомври',
+            'ноември',
+            'декември'
+          ],
+          STANDALONEMONTHS: const [
+            'јануари',
+            'февруари',
+            'март',
+            'април',
+            'мај',
+            'јуни',
+            'јули',
+            'август',
+            'септември',
+            'октомври',
+            'ноември',
+            'декември'
+          ],
+          SHORTMONTHS: const [
+            'јан.',
+            'фев.',
+            'мар.',
+            'апр.',
+            'мај',
+            'јун.',
+            'јул.',
+            'авг.',
+            'септ.',
+            'окт.',
+            'ноем.',
+            'дек.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'јан.',
+            'фев.',
+            'мар.',
+            'апр.',
+            'мај',
+            'јун.',
+            'јул.',
+            'авг.',
+            'септ.',
+            'окт.',
+            'ноем.',
+            'дек.'
+          ],
+          WEEKDAYS: const [
+            'недела',
+            'понеделник',
+            'вторник',
+            'среда',
+            'четврток',
+            'петок',
+            'сабота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'недела',
+            'понеделник',
+            'вторник',
+            'среда',
+            'четврток',
+            'петок',
+            'сабота'
+          ],
+          SHORTWEEKDAYS: const [
+            'нед.',
+            'пон.',
+            'вт.',
+            'сре.',
+            'чет.',
+            'пет.',
+            'саб.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'нед.',
+            'пон.',
+            'вто.',
+            'сре.',
+            'чет.',
+            'пет.',
+            'саб.'
+          ],
+          NARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
+          STANDALONENARROWWEEKDAYS: const ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],
+          SHORTQUARTERS: const ['јан-мар', 'апр-јун', 'јул-сеп', 'окт-дек'],
+          QUARTERS: const [
+            'прво тромесечје',
+            'второ тромесечје',
+            'трето тромесечје',
+            'четврто тромесечје'
+          ],
+          AMPMS: const ['претпладне', 'попладне'],
+          DATEFORMATS: const [
+            'EEEE, dd MMMM y',
+            'dd MMMM y',
+            'dd.M.y',
+            'dd.M.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ml.
+      "ml": new DateSymbols(
+          NAME: "ml",
+          ERAS: const ['ക്രി.മു.', 'എഡി'],
+          ERANAMES: const ['ക്രിസ്‌തുവിന് മുമ്പ്', 'ആന്നോ ഡൊമിനി'],
+          NARROWMONTHS: const [
+            'ജ',
+            'ഫ',
+            'മാ',
+            'ഏ',
+            'മെ',
+            'ജൂൺ',
+            'ജൂ',
+            'ഓ',
+            'സെ',
+            'ഒ',
+            'ന',
+            'ഡി'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ജ',
+            'ഫെ',
+            'മാ',
+            'ഏ',
+            'മെ',
+            'ജൂൺ',
+            'ജൂ',
+            'ഓ',
+            'സെ',
+            'ഒ',
+            'ന',
+            'ഡി'
+          ],
+          MONTHS: const [
+            'ജനുവരി',
+            'ഫെബ്രുവരി',
+            'മാർച്ച്',
+            'ഏപ്രിൽ',
+            'മേയ്',
+            'ജൂൺ',
+            'ജൂലൈ',
+            'ഓഗസ്റ്റ്',
+            'സെപ്റ്റംബർ',
+            'ഒക്‌ടോബർ',
+            'നവംബർ',
+            'ഡിസംബർ'
+          ],
+          STANDALONEMONTHS: const [
+            'ജനുവരി',
+            'ഫെബ്രുവരി',
+            'മാർച്ച്',
+            'ഏപ്രിൽ',
+            'മേയ്',
+            'ജൂൺ',
+            'ജൂലൈ',
+            'ഓഗസ്റ്റ്',
+            'സെപ്റ്റംബർ',
+            'ഒക്‌ടോബർ',
+            'നവംബർ',
+            'ഡിസംബർ'
+          ],
+          SHORTMONTHS: const [
+            'ജനു',
+            'ഫെബ്രു',
+            'മാർ',
+            'ഏപ്രി',
+            'മേയ്',
+            'ജൂൺ',
+            'ജൂലൈ',
+            'ഓഗ',
+            'സെപ്റ്റം',
+            'ഒക്ടോ',
+            'നവം',
+            'ഡിസം'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ജനു',
+            'ഫെബ്രു',
+            'മാർ',
+            'ഏപ്രി',
+            'മേയ്',
+            'ജൂൺ',
+            'ജൂലൈ',
+            'ഓഗ',
+            'സെപ്റ്റം',
+            'ഒക്ടോ',
+            'നവം',
+            'ഡിസം'
+          ],
+          WEEKDAYS: const [
+            'ഞായറാഴ്‌ച',
+            'തിങ്കളാഴ്‌ച',
+            'ചൊവ്വാഴ്ച',
+            'ബുധനാഴ്‌ച',
+            'വ്യാഴാഴ്‌ച',
+            'വെള്ളിയാഴ്‌ച',
+            'ശനിയാഴ്‌ച'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ഞായറാഴ്‌ച',
+            'തിങ്കളാഴ്‌ച',
+            'ചൊവ്വാഴ്‌ച',
+            'ബുധനാഴ്‌ച',
+            'വ്യാഴാഴ്‌ച',
+            'വെള്ളിയാഴ്‌ച',
+            'ശനിയാഴ്‌ച'
+          ],
+          SHORTWEEKDAYS: const [
+            'ഞായർ',
+            'തിങ്കൾ',
+            'ചൊവ്വ',
+            'ബുധൻ',
+            'വ്യാഴം',
+            'വെള്ളി',
+            'ശനി'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ഞായർ',
+            'തിങ്കൾ',
+            'ചൊവ്വ',
+            'ബുധൻ',
+            'വ്യാഴം',
+            'വെള്ളി',
+            'ശനി'
+          ],
+          NARROWWEEKDAYS: const ['ഞ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ഞാ',
+            'തി',
+            'ചൊ',
+            'ബു',
+            'വ്യാ',
+            'വെ',
+            'ശ'
+          ],
+          SHORTQUARTERS: const [
+            'ഒന്നാം പാദം',
+            'രണ്ടാം പാദം',
+            'മൂന്നാം പാദം',
+            'നാലാം പാദം'
+          ],
+          QUARTERS: const [
+            'ഒന്നാം പാദം',
+            'രണ്ടാം പാദം',
+            'മൂന്നാം പാദം',
+            'നാലാം പാദം'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'y, MMMM d, EEEE',
+            'y, MMMM d',
+            'y, MMM d',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale mn.
+      "mn": new DateSymbols(
+          NAME: "mn",
+          ERAS: const ['м.э.ө', 'м.э.'],
+          ERANAMES: const ['манай эриний өмнөх', 'манай эриний'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'Нэгдүгээр сар',
+            'Хоёрдугаар сар',
+            'Гуравдугаар сар',
+            'Дөрөвдүгээр сар',
+            'Тавдугаар сар',
+            'Зургадугаар сар',
+            'Долдугаар сар',
+            'Наймдугаар сар',
+            'Есдүгээр сар',
+            'Аравдугаар сар',
+            'Арван нэгдүгээр сар',
+            'Арван хоёрдугаар сар'
+          ],
+          STANDALONEMONTHS: const [
+            'Нэгдүгээр сар',
+            'Хоёрдугаар сар',
+            'Гуравдугаар сар',
+            'Дөрөвдүгээр сар',
+            'Тавдугаар сар',
+            'Зургадугаар сар',
+            'Долдугаар сар',
+            'Наймдугаар сар',
+            'Есдүгээр сар',
+            'Аравдугаар сар',
+            'Арван нэгдүгээр сар',
+            'Арван хоёрдугаар сар'
+          ],
+          SHORTMONTHS: const [
+            '1-р сар',
+            '2-р сар',
+            '3-р сар',
+            '4-р сар',
+            '5-р сар',
+            '6-р сар',
+            '7-р сар',
+            '8-р сар',
+            '9-р сар',
+            '10-р сар',
+            '11-р сар',
+            '12-р сар'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1-р сар',
+            '2-р сар',
+            '3-р сар',
+            '4-р сар',
+            '5-р сар',
+            '6-р сар',
+            '7-р сар',
+            '8-р сар',
+            '9-р сар',
+            '10-р сар',
+            '11-р сар',
+            '12-р сар'
+          ],
+          WEEKDAYS: const [
+            'ням',
+            'даваа',
+            'мягмар',
+            'лхагва',
+            'пүрэв',
+            'баасан',
+            'бямба'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ням',
+            'даваа',
+            'мягмар',
+            'лхагва',
+            'пүрэв',
+            'баасан',
+            'бямба'
+          ],
+          SHORTWEEKDAYS: const ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],
+          STANDALONESHORTWEEKDAYS: const [
+            'Ня',
+            'Да',
+            'Мя',
+            'Лх',
+            'Пү',
+            'Ба',
+            'Бя'
+          ],
+          NARROWWEEKDAYS: const ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],
+          STANDALONENARROWWEEKDAYS: const [
+            'Ня',
+            'Да',
+            'Мя',
+            'Лх',
+            'Пү',
+            'Ба',
+            'Бя'
+          ],
+          SHORTQUARTERS: const ['У1', 'У2', 'У3', 'У4'],
+          QUARTERS: const [
+            '1-р улирал',
+            '2-р улирал',
+            '3-р улирал',
+            '4-р улирал'
+          ],
+          AMPMS: const ['ү.ө', 'ү.х'],
+          DATEFORMATS: const [
+            'EEEE, y \'оны\' MM \'сарын\' d',
+            'y\'оны\' MMMM\'сарын\' d\'өдөр\'',
+            'y MMM d',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1}, {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale mr.
+      "mr": new DateSymbols(
+          NAME: "mr",
+          ERAS: const ['इ. स. पू.', 'इ. स.'],
+          ERANAMES: const ['ईसवीसनपूर्व', 'ईसवीसन'],
+          NARROWMONTHS: const [
+            'जा',
+            'फे',
+            'मा',
+            'ए',
+            'मे',
+            'जू',
+            'जु',
+            'ऑ',
+            'स',
+            'ऑ',
+            'नो',
+            'डि'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'जा',
+            'फे',
+            'मा',
+            'ए',
+            'मे',
+            'जू',
+            'जु',
+            'ऑ',
+            'स',
+            'ऑ',
+            'नो',
+            'डि'
+          ],
+          MONTHS: const [
+            'जानेवारी',
+            'फेब्रुवारी',
+            'मार्च',
+            'एप्रिल',
+            'मे',
+            'जून',
+            'जुलै',
+            'ऑगस्ट',
+            'सप्टेंबर',
+            'ऑक्टोबर',
+            'नोव्हेंबर',
+            'डिसेंबर'
+          ],
+          STANDALONEMONTHS: const [
+            'जानेवारी',
+            'फेब्रुवारी',
+            'मार्च',
+            'एप्रिल',
+            'मे',
+            'जून',
+            'जुलै',
+            'ऑगस्ट',
+            'सप्टेंबर',
+            'ऑक्टोबर',
+            'नोव्हेंबर',
+            'डिसेंबर'
+          ],
+          SHORTMONTHS: const [
+            'जाने',
+            'फेब्रु',
+            'मार्च',
+            'एप्रि',
+            'मे',
+            'जून',
+            'जुलै',
+            'ऑग',
+            'सप्टें',
+            'ऑक्टो',
+            'नोव्हें',
+            'डिसें'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'जाने',
+            'फेब्रु',
+            'मार्च',
+            'एप्रि',
+            'मे',
+            'जून',
+            'जुलै',
+            'ऑग',
+            'सप्टें',
+            'ऑक्टो',
+            'नोव्हें',
+            'डिसें'
+          ],
+          WEEKDAYS: const [
+            'रविवार',
+            'सोमवार',
+            'मंगळवार',
+            'बुधवार',
+            'गुरुवार',
+            'शुक्रवार',
+            'शनिवार'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'रविवार',
+            'सोमवार',
+            'मंगळवार',
+            'बुधवार',
+            'गुरुवार',
+            'शुक्रवार',
+            'शनिवार'
+          ],
+          SHORTWEEKDAYS: const [
+            'रवि',
+            'सोम',
+            'मंगळ',
+            'बुध',
+            'गुरु',
+            'शुक्र',
+            'शनि'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'रवि',
+            'सोम',
+            'मंगळ',
+            'बुध',
+            'गुरु',
+            'शुक्र',
+            'शनि'
+          ],
+          NARROWWEEKDAYS: const ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],
+          STANDALONENARROWWEEKDAYS: const [
+            'र',
+            'सो',
+            'मं',
+            'बु',
+            'गु',
+            'शु',
+            'श'
+          ],
+          SHORTQUARTERS: const ['ति१', 'ति२', 'ति३', 'ति४'],
+          QUARTERS: const [
+            'प्रथम तिमाही',
+            'द्वितीय तिमाही',
+            'तृतीय तिमाही',
+            'चतुर्थ तिमाही'
+          ],
+          AMPMS: const ['म.पू.', 'म.उ.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM, y',
+            'd MMMM, y',
+            'd MMM, y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} रोजी {0}',
+            '{1} रोजी {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale ms.
+      "ms": new DateSymbols(
+          NAME: "ms",
+          ERAS: const ['S.M.', 'TM'],
+          ERANAMES: const ['S.M.', 'TM'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'O',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'O',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januari',
+            'Februari',
+            'Mac',
+            'April',
+            'Mei',
+            'Jun',
+            'Julai',
+            'Ogos',
+            'September',
+            'Oktober',
+            'November',
+            'Disember'
+          ],
+          STANDALONEMONTHS: const [
+            'Januari',
+            'Februari',
+            'Mac',
+            'April',
+            'Mei',
+            'Jun',
+            'Julai',
+            'Ogos',
+            'September',
+            'Oktober',
+            'November',
+            'Disember'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mac',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Ogo',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dis'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mac',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Ogo',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dis'
+          ],
+          WEEKDAYS: const [
+            'Ahad',
+            'Isnin',
+            'Selasa',
+            'Rabu',
+            'Khamis',
+            'Jumaat',
+            'Sabtu'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Ahad',
+            'Isnin',
+            'Selasa',
+            'Rabu',
+            'Khamis',
+            'Jumaat',
+            'Sabtu'
+          ],
+          SHORTWEEKDAYS: const [
+            'Ahd',
+            'Isn',
+            'Sel',
+            'Rab',
+            'Kha',
+            'Jum',
+            'Sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Ahd',
+            'Isn',
+            'Sel',
+            'Rab',
+            'Kha',
+            'Jum',
+            'Sab'
+          ],
+          NARROWWEEKDAYS: const ['A', 'I', 'S', 'R', 'K', 'J', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['A', 'I', 'S', 'R', 'K', 'J', 'S'],
+          SHORTQUARTERS: const ['S1', 'S2', 'S3', 'S4'],
+          QUARTERS: const [
+            'Suku pertama',
+            'Suku Ke-2',
+            'Suku Ke-3',
+            'Suku Ke-4'
+          ],
+          AMPMS: const ['PG', 'PTG'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale mt.
+      "mt": new DateSymbols(
+          NAME: "mt",
+          ERAS: const ['QK', 'WK'],
+          ERANAMES: const ['Qabel Kristu', 'Wara Kristu'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'Ġ',
+            'L',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Jn',
+            'Fr',
+            'Mz',
+            'Ap',
+            'Mj',
+            'Ġn',
+            'Lj',
+            'Aw',
+            'St',
+            'Ob',
+            'Nv',
+            'Dċ'
+          ],
+          MONTHS: const [
+            'Jannar',
+            'Frar',
+            'Marzu',
+            'April',
+            'Mejju',
+            'Ġunju',
+            'Lulju',
+            'Awwissu',
+            'Settembru',
+            'Ottubru',
+            'Novembru',
+            'Diċembru'
+          ],
+          STANDALONEMONTHS: const [
+            'Jannar',
+            'Frar',
+            'Marzu',
+            'April',
+            'Mejju',
+            'Ġunju',
+            'Lulju',
+            'Awwissu',
+            'Settembru',
+            'Ottubru',
+            'Novembru',
+            'Diċembru'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Fra',
+            'Mar',
+            'Apr',
+            'Mej',
+            'Ġun',
+            'Lul',
+            'Aww',
+            'Set',
+            'Ott',
+            'Nov',
+            'Diċ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Fra',
+            'Mar',
+            'Apr',
+            'Mej',
+            'Ġun',
+            'Lul',
+            'Aww',
+            'Set',
+            'Ott',
+            'Nov',
+            'Diċ'
+          ],
+          WEEKDAYS: const [
+            'Il-Ħadd',
+            'It-Tnejn',
+            'It-Tlieta',
+            'L-Erbgħa',
+            'Il-Ħamis',
+            'Il-Ġimgħa',
+            'Is-Sibt'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Il-Ħadd',
+            'It-Tnejn',
+            'It-Tlieta',
+            'L-Erbgħa',
+            'Il-Ħamis',
+            'Il-Ġimgħa',
+            'Is-Sibt'
+          ],
+          SHORTWEEKDAYS: const [
+            'Ħad',
+            'Tne',
+            'Tli',
+            'Erb',
+            'Ħam',
+            'Ġim',
+            'Sib'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Ħad',
+            'Tne',
+            'Tli',
+            'Erb',
+            'Ħam',
+            'Ġim',
+            'Sib'
+          ],
+          NARROWWEEKDAYS: const ['Ħd', 'T', 'Tl', 'Er', 'Ħm', 'Ġm', 'Sb'],
+          STANDALONENARROWWEEKDAYS: const [
+            'Ħd',
+            'Tn',
+            'Tl',
+            'Er',
+            'Ħm',
+            'Ġm',
+            'Sb'
+          ],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const ['1el kwart', '2ni kwart', '3et kwart', '4ba’ kwart'],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d \'ta\'’ MMMM y',
+            'd \'ta\'’ MMMM y',
+            'dd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale my.
+      "my": new DateSymbols(
+          NAME: "my",
+          ERAS: const ['ဘီစီ', 'အေဒီ'],
+          ERANAMES: const ['ခရစ်တော် မပေါ်မီနှစ်', 'ခရစ်နှစ်'],
+          NARROWMONTHS: const [
+            'ဇ',
+            'ဖ',
+            'မ',
+            'ဧ',
+            'မ',
+            'ဇ',
+            'ဇ',
+            'ဩ',
+            'စ',
+            'အ',
+            'န',
+            'ဒ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ဇ',
+            'ဖ',
+            'မ',
+            'ဧ',
+            'မ',
+            'ဇ',
+            'ဇ',
+            'ဩ',
+            'စ',
+            'အ',
+            'န',
+            'ဒ'
+          ],
+          MONTHS: const [
+            'ဇန်နဝါရီ',
+            'ဖေဖော်ဝါရီ',
+            'မတ်',
+            'ဧပြီ',
+            'မေ',
+            'ဇွန်',
+            'ဇူလိုင်',
+            'ဩဂုတ်',
+            'စက်တင်ဘာ',
+            'အောက်တိုဘာ',
+            'နိုဝင်ဘာ',
+            'ဒီဇင်ဘာ'
+          ],
+          STANDALONEMONTHS: const [
+            'ဇန်နဝါရီ',
+            'ဖေဖော်ဝါရီ',
+            'မတ်',
+            'ဧပြီ',
+            'မေ',
+            'ဇွန်',
+            'ဇူလိုင်',
+            'ဩဂုတ်',
+            'စက်တင်ဘာ',
+            'အောက်တိုဘာ',
+            'နိုဝင်ဘာ',
+            'ဒီဇင်ဘာ'
+          ],
+          SHORTMONTHS: const [
+            'ဇန်',
+            'ဖေ',
+            'မတ်',
+            'ဧ',
+            'မေ',
+            'ဇွန်',
+            'ဇူ',
+            'ဩ',
+            'စက်',
+            'အောက်',
+            'နို',
+            'ဒီ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ဇန်',
+            'ဖေ',
+            'မတ်',
+            'ဧ',
+            'မေ',
+            'ဇွန်',
+            'ဇူ',
+            'ဩ',
+            'စက်',
+            'အောက်',
+            'နို',
+            'ဒီ'
+          ],
+          WEEKDAYS: const [
+            'တနင်္ဂနွေ',
+            'တနင်္လာ',
+            'အင်္ဂါ',
+            'ဗုဒ္ဓဟူး',
+            'ကြာသပတေး',
+            'သောကြာ',
+            'စနေ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'တနင်္ဂနွေ',
+            'တနင်္လာ',
+            'အင်္ဂါ',
+            'ဗုဒ္ဓဟူး',
+            'ကြာသပတေး',
+            'သောကြာ',
+            'စနေ'
+          ],
+          SHORTWEEKDAYS: const [
+            'တနင်္ဂနွေ',
+            'တနင်္လာ',
+            'အင်္ဂါ',
+            'ဗုဒ္ဓဟူး',
+            'ကြာသပတေး',
+            'သောကြာ',
+            'စနေ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'တနင်္ဂနွေ',
+            'တနင်္လာ',
+            'အင်္ဂါ',
+            'ဗုဒ္ဓဟူး',
+            'ကြာသပတေး',
+            'သောကြာ',
+            'စနေ'
+          ],
+          NARROWWEEKDAYS: const ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],
+          STANDALONENARROWWEEKDAYS: const ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],
+          SHORTQUARTERS: const [
+            'ပထမ သုံးလပတ်',
+            'ဒုတိယ သုံးလပတ်',
+            'တတိယ သုံးလပတ်',
+            'စတုတ္ထ သုံးလပတ်'
+          ],
+          QUARTERS: const [
+            'ပထမ သုံးလပတ်',
+            'ဒုတိယ သုံးလပတ်',
+            'တတိယ သုံးလပတ်',
+            'စတုတ္ထ သုံးလပတ်'
+          ],
+          AMPMS: const ['နံနက်', 'ညနေ'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd-MM-yy'
+          ],
+          TIMEFORMATS: const [
+            'zzzz HH:mm:ss',
+            'z HH:mm:ss',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale nb.
+      "nb": new DateSymbols(
+          NAME: "nb",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['før Kristus', 'etter Kristus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'mai',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'mai',
+            'jun',
+            'jul',
+            'aug',
+            'sep',
+            'okt',
+            'nov',
+            'des'
+          ],
+          WEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          SHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} {0}',
+            '{1} \'kl\'. {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale ne.
+      "ne": new DateSymbols(
+          NAME: "ne",
+          ERAS: const ['ईसा पूर्व', 'सन्'],
+          ERANAMES: const ['ईसा पूर्व', 'सन्'],
+          NARROWMONTHS: const [
+            '१',
+            '२',
+            '३',
+            '४',
+            '५',
+            '६',
+            '७',
+            '८',
+            '९',
+            '१०',
+            '११',
+            '१२'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '१',
+            '२',
+            '३',
+            '४',
+            '५',
+            '६',
+            '७',
+            '८',
+            '९',
+            '१०',
+            '११',
+            '१२'
+          ],
+          MONTHS: const [
+            'जनवरी',
+            'फेब्रुअरी',
+            'मार्च',
+            'अप्रिल',
+            'मई',
+            'जुन',
+            'जुलाई',
+            'अगस्ट',
+            'सेप्टेम्बर',
+            'अक्टोबर',
+            'नोभेम्बर',
+            'डिसेम्बर'
+          ],
+          STANDALONEMONTHS: const [
+            'जनवरी',
+            'फेब्रुअरी',
+            'मार्च',
+            'अप्रिल',
+            'मे',
+            'जुन',
+            'जुलाई',
+            'अगस्ट',
+            'सेप्टेम्बर',
+            'अक्टोबर',
+            'नोभेम्बर',
+            'डिसेम्बर'
+          ],
+          SHORTMONTHS: const [
+            'जनवरी',
+            'फेब्रुअरी',
+            'मार्च',
+            'अप्रिल',
+            'मे',
+            'जुन',
+            'जुलाई',
+            'अगस्ट',
+            'सेप्टेम्बर',
+            'अक्टोबर',
+            'नोभेम्बर',
+            'डिसेम्बर'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'जनवरी',
+            'फेब्रुअरी',
+            'मार्च',
+            'अप्रिल',
+            'मे',
+            'जुन',
+            'जुलाई',
+            'अगस्ट',
+            'सेप्टेम्बर',
+            'अक्टोबर',
+            'नोभेम्बर',
+            'डिसेम्बर'
+          ],
+          WEEKDAYS: const [
+            'आइतबार',
+            'सोमबार',
+            'मङ्गलबार',
+            'बुधबार',
+            'बिहिबार',
+            'शुक्रबार',
+            'शनिबार'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'आइतबार',
+            'सोमबार',
+            'मङ्गलबार',
+            'बुधबार',
+            'बिहिबार',
+            'शुक्रबार',
+            'शनिबार'
+          ],
+          SHORTWEEKDAYS: const [
+            'आइत',
+            'सोम',
+            'मङ्गल',
+            'बुध',
+            'बिहि',
+            'शुक्र',
+            'शनि'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'आइत',
+            'सोम',
+            'मङ्गल',
+            'बुध',
+            'बिहि',
+            'शुक्र',
+            'शनि'
+          ],
+          NARROWWEEKDAYS: const ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],
+          STANDALONENARROWWEEKDAYS: const [
+            'आ',
+            'सो',
+            'म',
+            'बु',
+            'बि',
+            'शु',
+            'श'
+          ],
+          SHORTQUARTERS: const [
+            'पहिलो सत्र',
+            'दोस्रो सत्र',
+            'तेस्रो सत्र',
+            'चौथो सत्र'
+          ],
+          QUARTERS: const [
+            'पहिलो सत्र',
+            'दोस्रो सत्र',
+            'तेस्रो सत्र',
+            'चौथो सत्र'
+          ],
+          AMPMS: const ['पूर्वाह्न', 'अपराह्न'],
+          DATEFORMATS: const [
+            'y MMMM d, EEEE',
+            'y MMMM d',
+            'y MMM d',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale nl.
+      "nl": new DateSymbols(
+          NAME: "nl",
+          ERAS: const ['v.Chr.', 'n.Chr.'],
+          ERANAMES: const ['voor Christus', 'na Christus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januari',
+            'februari',
+            'maart',
+            'april',
+            'mei',
+            'juni',
+            'juli',
+            'augustus',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          STANDALONEMONTHS: const [
+            'januari',
+            'februari',
+            'maart',
+            'april',
+            'mei',
+            'juni',
+            'juli',
+            'augustus',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mrt.',
+            'apr.',
+            'mei',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mrt.',
+            'apr.',
+            'mei',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'zondag',
+            'maandag',
+            'dinsdag',
+            'woensdag',
+            'donderdag',
+            'vrijdag',
+            'zaterdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'zondag',
+            'maandag',
+            'dinsdag',
+            'woensdag',
+            'donderdag',
+            'vrijdag',
+            'zaterdag'
+          ],
+          SHORTWEEKDAYS: const ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+          STANDALONESHORTWEEKDAYS: const [
+            'zo',
+            'ma',
+            'di',
+            'wo',
+            'do',
+            'vr',
+            'za'
+          ],
+          NARROWWEEKDAYS: const ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],
+          STANDALONENARROWWEEKDAYS: const ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1e kwartaal',
+            '2e kwartaal',
+            '3e kwartaal',
+            '4e kwartaal'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd-MM-yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'om\' {0}',
+            '{1} \'om\' {0}',
+            '{1} {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale no.
+      "no": new DateSymbols(
+          NAME: "no",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['før Kristus', 'etter Kristus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'mai',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'mai',
+            'jun',
+            'jul',
+            'aug',
+            'sep',
+            'okt',
+            'nov',
+            'des'
+          ],
+          WEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          SHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} {0}',
+            '{1} \'kl\'. {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale no_NO.
+      // Date/time formatting symbols for locale no_NO.
+      "no_NO": new DateSymbols(
+          NAME: "no_NO",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['før Kristus', 'etter Kristus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'mars',
+            'april',
+            'mai',
+            'juni',
+            'juli',
+            'august',
+            'september',
+            'oktober',
+            'november',
+            'desember'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'mai',
+            'jun.',
+            'jul.',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'des.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'mai',
+            'jun',
+            'jul',
+            'aug',
+            'sep',
+            'okt',
+            'nov',
+            'des'
+          ],
+          WEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'søndag',
+            'mandag',
+            'tirsdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lørdag'
+          ],
+          SHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'søn.',
+            'man.',
+            'tir.',
+            'ons.',
+            'tor.',
+            'fre.',
+            'lør.'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1. kvartal',
+            '2. kvartal',
+            '3. kvartal',
+            '4. kvartal'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE d. MMMM y',
+            'd. MMMM y',
+            'd. MMM y',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} {0}',
+            '{1} \'kl\'. {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale or.
+      "or": new DateSymbols(
+          NAME: "or",
+          ERAS: const ['BCE', 'CE'],
+          ERANAMES: const ['BCE', 'CE'],
+          NARROWMONTHS: const [
+            'ଜା',
+            'ଫେ',
+            'ମା',
+            'ଅ',
+            'ମଇ',
+            'ଜୁ',
+            'ଜୁ',
+            'ଅ',
+            'ସେ',
+            'ଅ',
+            'ନ',
+            'ଡି'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ଜା',
+            'ଫେ',
+            'ମା',
+            'ଅ',
+            'ମଇ',
+            'ଜୁ',
+            'ଜୁ',
+            'ଅ',
+            'ସେ',
+            'ଅ',
+            'ନ',
+            'ଡି'
+          ],
+          MONTHS: const [
+            'ଜାନୁଆରୀ',
+            'ଫେବୃଆରୀ',
+            'ମାର୍ଚ୍ଚ',
+            'ଅପ୍ରେଲ',
+            'ମଇ',
+            'ଜୁନ',
+            'ଜୁଲାଇ',
+            'ଅଗଷ୍ଟ',
+            'ସେପ୍ଟେମ୍ବର',
+            'ଅକ୍ଟୋବର',
+            'ନଭେମ୍ବର',
+            'ଡିସେମ୍ବର'
+          ],
+          STANDALONEMONTHS: const [
+            'ଜାନୁଆରୀ',
+            'ଫେବୃଆରୀ',
+            'ମାର୍ଚ୍ଚ',
+            'ଅପ୍ରେଲ',
+            'ମଇ',
+            'ଜୁନ',
+            'ଜୁଲାଇ',
+            'ଅଗଷ୍ଟ',
+            'ସେପ୍ଟେମ୍ବର',
+            'ଅକ୍ଟୋବର',
+            'ନଭେମ୍ବର',
+            'ଡିସେମ୍ବର'
+          ],
+          SHORTMONTHS: const [
+            'ଜାନୁଆରୀ',
+            'ଫେବୃଆରୀ',
+            'ମାର୍ଚ୍ଚ',
+            'ଅପ୍ରେଲ',
+            'ମଇ',
+            'ଜୁନ',
+            'ଜୁଲାଇ',
+            'ଅଗଷ୍ଟ',
+            'ସେପ୍ଟେମ୍ବର',
+            'ଅକ୍ଟୋବର',
+            'ନଭେମ୍ବର',
+            'ଡିସେମ୍ବର'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ଜାନୁଆରୀ',
+            'ଫେବୃଆରୀ',
+            'ମାର୍ଚ୍ଚ',
+            'ଅପ୍ରେଲ',
+            'ମଇ',
+            'ଜୁନ',
+            'ଜୁଲାଇ',
+            'ଅଗଷ୍ଟ',
+            'ସେପ୍ଟେମ୍ବର',
+            'ଅକ୍ଟୋବର',
+            'ନଭେମ୍ବର',
+            'ଡିସେମ୍ବର'
+          ],
+          WEEKDAYS: const [
+            'ରବିବାର',
+            'ସୋମବାର',
+            'ମଙ୍ଗଳବାର',
+            'ବୁଧବାର',
+            'ଗୁରୁବାର',
+            'ଶୁକ୍ରବାର',
+            'ଶନିବାର'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ରବିବାର',
+            'ସୋମବାର',
+            'ମଙ୍ଗଳବାର',
+            'ବୁଧବାର',
+            'ଗୁରୁବାର',
+            'ଶୁକ୍ରବାର',
+            'ଶନିବାର'
+          ],
+          SHORTWEEKDAYS: const [
+            'ରବି',
+            'ସୋମ',
+            'ମଙ୍ଗଳ',
+            'ବୁଧ',
+            'ଗୁରୁ',
+            'ଶୁକ୍ର',
+            'ଶନି'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ରବି',
+            'ସୋମ',
+            'ମଙ୍ଗଳ',
+            'ବୁଧ',
+            'ଗୁରୁ',
+            'ଶୁକ୍ର',
+            'ଶନି'
+          ],
+          NARROWWEEKDAYS: const ['ର', 'ସୋ', 'ମ', 'ବୁ', 'ଗୁ', 'ଶୁ', 'ଶ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ର',
+            'ସୋ',
+            'ମ',
+            'ବୁ',
+            'ଗୁ',
+            'ଶୁ',
+            'ଶ'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          AMPMS: const ['am', 'pm'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd-M-yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale pa.
+      "pa": new DateSymbols(
+          NAME: "pa",
+          ERAS: const ['ਈ. ਪੂ.', 'ਸੰਨ'],
+          ERANAMES: const ['ਈਸਵੀ ਪੂਰਵ', 'ਈਸਵੀ ਸੰਨ'],
+          NARROWMONTHS: const [
+            'ਜ',
+            'ਫ਼',
+            'ਮਾ',
+            'ਅ',
+            'ਮ',
+            'ਜੂ',
+            'ਜੁ',
+            'ਅ',
+            'ਸ',
+            'ਅ',
+            'ਨ',
+            'ਦ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ਜ',
+            'ਫ਼',
+            'ਮਾ',
+            'ਅ',
+            'ਮ',
+            'ਜੂ',
+            'ਜੁ',
+            'ਅ',
+            'ਸ',
+            'ਅ',
+            'ਨ',
+            'ਦ'
+          ],
+          MONTHS: const [
+            'ਜਨਵਰੀ',
+            'ਫ਼ਰਵਰੀ',
+            'ਮਾਰਚ',
+            'ਅਪ੍ਰੈਲ',
+            'ਮਈ',
+            'ਜੂਨ',
+            'ਜੁਲਾਈ',
+            'ਅਗਸਤ',
+            'ਸਤੰਬਰ',
+            'ਅਕਤੂਬਰ',
+            'ਨਵੰਬਰ',
+            'ਦਸੰਬਰ'
+          ],
+          STANDALONEMONTHS: const [
+            'ਜਨਵਰੀ',
+            'ਫ਼ਰਵਰੀ',
+            'ਮਾਰਚ',
+            'ਅਪ੍ਰੈਲ',
+            'ਮਈ',
+            'ਜੂਨ',
+            'ਜੁਲਾਈ',
+            'ਅਗਸਤ',
+            'ਸਤੰਬਰ',
+            'ਅਕਤੂਬਰ',
+            'ਨਵੰਬਰ',
+            'ਦਸੰਬਰ'
+          ],
+          SHORTMONTHS: const [
+            'ਜਨ',
+            'ਫ਼ਰ',
+            'ਮਾਰਚ',
+            'ਅਪ੍ਰੈ',
+            'ਮਈ',
+            'ਜੂਨ',
+            'ਜੁਲਾ',
+            'ਅਗ',
+            'ਸਤੰ',
+            'ਅਕਤੂ',
+            'ਨਵੰ',
+            'ਦਸੰ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ਜਨ',
+            'ਫ਼ਰ',
+            'ਮਾਰਚ',
+            'ਅਪ੍ਰੈ',
+            'ਮਈ',
+            'ਜੂਨ',
+            'ਜੁਲਾ',
+            'ਅਗ',
+            'ਸਤੰ',
+            'ਅਕਤੂ',
+            'ਨਵੰ',
+            'ਦਸੰ'
+          ],
+          WEEKDAYS: const [
+            'ਐਤਵਾਰ',
+            'ਸੋਮਵਾਰ',
+            'ਮੰਗਲਵਾਰ',
+            'ਬੁੱਧਵਾਰ',
+            'ਵੀਰਵਾਰ',
+            'ਸ਼ੁੱਕਰਵਾਰ',
+            'ਸ਼ਨਿੱਚਰਵਾਰ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ਐਤਵਾਰ',
+            'ਸੋਮਵਾਰ',
+            'ਮੰਗਲਵਾਰ',
+            'ਬੁੱਧਵਾਰ',
+            'ਵੀਰਵਾਰ',
+            'ਸ਼ੁੱਕਰਵਾਰ',
+            'ਸ਼ਨਿੱਚਰਵਾਰ'
+          ],
+          SHORTWEEKDAYS: const [
+            'ਐਤ',
+            'ਸੋਮ',
+            'ਮੰਗਲ',
+            'ਬੁੱਧ',
+            'ਵੀਰ',
+            'ਸ਼ੁੱਕਰ',
+            'ਸ਼ਨਿੱਚਰ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ਐਤ',
+            'ਸੋਮ',
+            'ਮੰਗਲ',
+            'ਬੁੱਧ',
+            'ਵੀਰ',
+            'ਸ਼ੁੱਕਰ',
+            'ਸ਼ਨਿੱਚਰ'
+          ],
+          NARROWWEEKDAYS: const ['ਐ', 'ਸੋ', 'ਮੰ', 'ਬੁੱ', 'ਵੀ', 'ਸ਼ੁੱ', 'ਸ਼'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ਐ',
+            'ਸੋ',
+            'ਮੰ',
+            'ਬੁੱ',
+            'ਵੀ',
+            'ਸ਼ੁੱ',
+            'ਸ਼'
+          ],
+          SHORTQUARTERS: const ['ਤਿਮਾਹੀ1', 'ਤਿਮਾਹੀ2', 'ਤਿਮਾਹੀ3', 'ਤਿਮਾਹੀ4'],
+          QUARTERS: const [
+            'ਪਹਿਲੀ ਤਿਮਾਹੀ',
+            'ਦੂਜੀ ਤਿਮਾਹੀ',
+            'ਤੀਜੀ ਤਿਮਾਹੀ',
+            'ਚੌਥੀ ਤਿਮਾਹੀ'
+          ],
+          AMPMS: const ['ਪੂ.ਦੁ.', 'ਬਾ.ਦੁ.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale pl.
+      "pl": new DateSymbols(
+          NAME: "pl",
+          ERAS: const ['p.n.e.', 'n.e.'],
+          ERANAMES: const ['przed naszą erą', 'naszej ery'],
+          NARROWMONTHS: const [
+            's',
+            'l',
+            'm',
+            'k',
+            'm',
+            'c',
+            'l',
+            's',
+            'w',
+            'p',
+            'l',
+            'g'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'S',
+            'L',
+            'M',
+            'K',
+            'M',
+            'C',
+            'L',
+            'S',
+            'W',
+            'P',
+            'L',
+            'G'
+          ],
+          MONTHS: const [
+            'stycznia',
+            'lutego',
+            'marca',
+            'kwietnia',
+            'maja',
+            'czerwca',
+            'lipca',
+            'sierpnia',
+            'września',
+            'października',
+            'listopada',
+            'grudnia'
+          ],
+          STANDALONEMONTHS: const [
+            'styczeń',
+            'luty',
+            'marzec',
+            'kwiecień',
+            'maj',
+            'czerwiec',
+            'lipiec',
+            'sierpień',
+            'wrzesień',
+            'październik',
+            'listopad',
+            'grudzień'
+          ],
+          SHORTMONTHS: const [
+            'sty',
+            'lut',
+            'mar',
+            'kwi',
+            'maj',
+            'cze',
+            'lip',
+            'sie',
+            'wrz',
+            'paź',
+            'lis',
+            'gru'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'sty',
+            'lut',
+            'mar',
+            'kwi',
+            'maj',
+            'cze',
+            'lip',
+            'sie',
+            'wrz',
+            'paź',
+            'lis',
+            'gru'
+          ],
+          WEEKDAYS: const [
+            'niedziela',
+            'poniedziałek',
+            'wtorek',
+            'środa',
+            'czwartek',
+            'piątek',
+            'sobota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'niedziela',
+            'poniedziałek',
+            'wtorek',
+            'środa',
+            'czwartek',
+            'piątek',
+            'sobota'
+          ],
+          SHORTWEEKDAYS: const [
+            'niedz.',
+            'pon.',
+            'wt.',
+            'śr.',
+            'czw.',
+            'pt.',
+            'sob.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'niedz.',
+            'pon.',
+            'wt.',
+            'śr.',
+            'czw.',
+            'pt.',
+            'sob.'
+          ],
+          NARROWWEEKDAYS: const ['n', 'p', 'w', 'ś', 'c', 'p', 's'],
+          STANDALONENARROWWEEKDAYS: const ['N', 'P', 'W', 'Ś', 'C', 'P', 'S'],
+          SHORTQUARTERS: const ['I kw.', 'II kw.', 'III kw.', 'IV kw.'],
+          QUARTERS: const [
+            'I kwartał',
+            'II kwartał',
+            'III kwartał',
+            'IV kwartał'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale pt.
+      "pt": new DateSymbols(
+          NAME: "pt",
+          ERAS: const ['a.C.', 'd.C.'],
+          ERANAMES: const ['antes de Cristo', 'depois de Cristo'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          STANDALONEMONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom',
+            'seg',
+            'ter',
+            'qua',
+            'qui',
+            'sex',
+            'sáb'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom',
+            'seg',
+            'ter',
+            'qua',
+            'qui',
+            'sex',
+            'sáb'
+          ],
+          NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1º trimestre',
+            '2º trimestre',
+            '3º trimestre',
+            '4º trimestre'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd \'de\' MMM \'de\' y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale pt_BR.
+      // Date/time formatting symbols for locale pt_BR.
+      "pt_BR": new DateSymbols(
+          NAME: "pt_BR",
+          ERAS: const ['a.C.', 'd.C.'],
+          ERANAMES: const ['antes de Cristo', 'depois de Cristo'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          STANDALONEMONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'dom',
+            'seg',
+            'ter',
+            'qua',
+            'qui',
+            'sex',
+            'sáb'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dom',
+            'seg',
+            'ter',
+            'qua',
+            'qui',
+            'sex',
+            'sáb'
+          ],
+          NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1º trimestre',
+            '2º trimestre',
+            '3º trimestre',
+            '4º trimestre'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'd \'de\' MMM \'de\' y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale pt_PT.
+      "pt_PT": new DateSymbols(
+          NAME: "pt_PT",
+          ERAS: const ['a.C.', 'd.C.'],
+          ERANAMES: const ['antes de Cristo', 'depois de Cristo'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          STANDALONEMONTHS: const [
+            'janeiro',
+            'fevereiro',
+            'março',
+            'abril',
+            'maio',
+            'junho',
+            'julho',
+            'agosto',
+            'setembro',
+            'outubro',
+            'novembro',
+            'dezembro'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'fev',
+            'mar',
+            'abr',
+            'mai',
+            'jun',
+            'jul',
+            'ago',
+            'set',
+            'out',
+            'nov',
+            'dez'
+          ],
+          WEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'domingo',
+            'segunda-feira',
+            'terça-feira',
+            'quarta-feira',
+            'quinta-feira',
+            'sexta-feira',
+            'sábado'
+          ],
+          SHORTWEEKDAYS: const [
+            'domingo',
+            'segunda',
+            'terça',
+            'quarta',
+            'quinta',
+            'sexta',
+            'sábado'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'domingo',
+            'segunda',
+            'terça',
+            'quarta',
+            'quinta',
+            'sexta',
+            'sábado'
+          ],
+          NARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
+          SHORTQUARTERS: const ['T1', 'T2', 'T3', 'T4'],
+          QUARTERS: const [
+            '1.º trimestre',
+            '2.º trimestre',
+            '3.º trimestre',
+            '4.º trimestre'
+          ],
+          AMPMS: const ['da manhã', 'da tarde'],
+          DATEFORMATS: const [
+            'EEEE, d \'de\' MMMM \'de\' y',
+            'd \'de\' MMMM \'de\' y',
+            'dd/MM/y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'às\' {0}',
+            '{1} \'às\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale ro.
+      "ro": new DateSymbols(
+          NAME: "ro",
+          ERAS: const ['î.Hr.', 'd.Hr.'],
+          ERANAMES: const ['înainte de Hristos', 'după Hristos'],
+          NARROWMONTHS: const [
+            'I',
+            'F',
+            'M',
+            'A',
+            'M',
+            'I',
+            'I',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'I',
+            'F',
+            'M',
+            'A',
+            'M',
+            'I',
+            'I',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'ianuarie',
+            'februarie',
+            'martie',
+            'aprilie',
+            'mai',
+            'iunie',
+            'iulie',
+            'august',
+            'septembrie',
+            'octombrie',
+            'noiembrie',
+            'decembrie'
+          ],
+          STANDALONEMONTHS: const [
+            'ianuarie',
+            'februarie',
+            'martie',
+            'aprilie',
+            'mai',
+            'iunie',
+            'iulie',
+            'august',
+            'septembrie',
+            'octombrie',
+            'noiembrie',
+            'decembrie'
+          ],
+          SHORTMONTHS: const [
+            'ian.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'mai',
+            'iun.',
+            'iul.',
+            'aug.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ian.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'mai',
+            'iun.',
+            'iul.',
+            'aug.',
+            'sept.',
+            'oct.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'duminică',
+            'luni',
+            'marți',
+            'miercuri',
+            'joi',
+            'vineri',
+            'sâmbătă'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'duminică',
+            'luni',
+            'marți',
+            'miercuri',
+            'joi',
+            'vineri',
+            'sâmbătă'
+          ],
+          SHORTWEEKDAYS: const [
+            'dum.',
+            'lun.',
+            'mar.',
+            'mie.',
+            'joi',
+            'vin.',
+            'sâm.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'dum.',
+            'lun.',
+            'mar.',
+            'mie.',
+            'joi',
+            'vin.',
+            'sâm.'
+          ],
+          NARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+          SHORTQUARTERS: const ['trim. I', 'trim. II', 'trim. III', 'trim. IV'],
+          QUARTERS: const [
+            'trimestrul I',
+            'trimestrul al II-lea',
+            'trimestrul al III-lea',
+            'trimestrul al IV-lea'
+          ],
+          AMPMS: const ['a.m.', 'p.m.'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ru.
+      "ru": new DateSymbols(
+          NAME: "ru",
+          ERAS: const ['до н. э.', 'н. э.'],
+          ERANAMES: const ['до Рождества Христова', 'от Рождества Христова'],
+          NARROWMONTHS: const [
+            'Я',
+            'Ф',
+            'М',
+            'А',
+            'М',
+            'И',
+            'И',
+            'А',
+            'С',
+            'О',
+            'Н',
+            'Д'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Я',
+            'Ф',
+            'М',
+            'А',
+            'М',
+            'И',
+            'И',
+            'А',
+            'С',
+            'О',
+            'Н',
+            'Д'
+          ],
+          MONTHS: const [
+            'января',
+            'февраля',
+            'марта',
+            'апреля',
+            'мая',
+            'июня',
+            'июля',
+            'августа',
+            'сентября',
+            'октября',
+            'ноября',
+            'декабря'
+          ],
+          STANDALONEMONTHS: const [
+            'январь',
+            'февраль',
+            'март',
+            'апрель',
+            'май',
+            'июнь',
+            'июль',
+            'август',
+            'сентябрь',
+            'октябрь',
+            'ноябрь',
+            'декабрь'
+          ],
+          SHORTMONTHS: const [
+            'янв.',
+            'февр.',
+            'мар.',
+            'апр.',
+            'мая',
+            'июн.',
+            'июл.',
+            'авг.',
+            'сент.',
+            'окт.',
+            'нояб.',
+            'дек.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'янв.',
+            'февр.',
+            'март',
+            'апр.',
+            'май',
+            'июнь',
+            'июль',
+            'авг.',
+            'сент.',
+            'окт.',
+            'нояб.',
+            'дек.'
+          ],
+          WEEKDAYS: const [
+            'воскресенье',
+            'понедельник',
+            'вторник',
+            'среда',
+            'четверг',
+            'пятница',
+            'суббота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'воскресенье',
+            'понедельник',
+            'вторник',
+            'среда',
+            'четверг',
+            'пятница',
+            'суббота'
+          ],
+          SHORTWEEKDAYS: const ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+          STANDALONESHORTWEEKDAYS: const [
+            'вс',
+            'пн',
+            'вт',
+            'ср',
+            'чт',
+            'пт',
+            'сб'
+          ],
+          NARROWWEEKDAYS: const ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+          STANDALONENARROWWEEKDAYS: const ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],
+          SHORTQUARTERS: const ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],
+          QUARTERS: const [
+            '1-й квартал',
+            '2-й квартал',
+            '3-й квартал',
+            '4-й квартал'
+          ],
+          AMPMS: const ['ДП', 'ПП'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y \'г\'.',
+            'd MMMM y \'г\'.',
+            'd MMM y \'г\'.',
+            'dd.MM.y'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale si.
+      "si": new DateSymbols(
+          NAME: "si",
+          ERAS: const ['ක්‍රි.පූ.', 'ක්‍රි.ව.'],
+          ERANAMES: const ['ක්‍රිස්තු පූර්ව', 'ක්‍රිස්තු වර්ෂ'],
+          NARROWMONTHS: const [
+            'ජ',
+            'පෙ',
+            'මා',
+            'අ',
+            'මැ',
+            'ජූ',
+            'ජූ',
+            'අ',
+            'සැ',
+            'ඔ',
+            'නෙ',
+            'දෙ'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ජ',
+            'පෙ',
+            'මා',
+            'අ',
+            'මැ',
+            'ජූ',
+            'ජූ',
+            'අ',
+            'සැ',
+            'ඔ',
+            'නෙ',
+            'දෙ'
+          ],
+          MONTHS: const [
+            'ජනවාරි',
+            'පෙබරවාරි',
+            'මාර්තු',
+            'අප්‍රේල්',
+            'මැයි',
+            'ජූනි',
+            'ජූලි',
+            'අගෝස්තු',
+            'සැප්තැම්බර්',
+            'ඔක්තෝබර්',
+            'නොවැම්බර්',
+            'දෙසැම්බර්'
+          ],
+          STANDALONEMONTHS: const [
+            'ජනවාරි',
+            'පෙබරවාරි',
+            'මාර්තු',
+            'අප්‍රේල්',
+            'මැයි',
+            'ජූනි',
+            'ජූලි',
+            'අගෝස්තු',
+            'සැප්තැම්බර්',
+            'ඔක්තෝබර්',
+            'නොවැම්බර්',
+            'දෙසැම්බර්'
+          ],
+          SHORTMONTHS: const [
+            'ජන',
+            'පෙබ',
+            'මාර්තු',
+            'අප්‍රේල්',
+            'මැයි',
+            'ජූනි',
+            'ජූලි',
+            'අගෝ',
+            'සැප්',
+            'ඔක්',
+            'නොවැ',
+            'දෙසැ'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ජන',
+            'පෙබ',
+            'මාර්',
+            'අප්‍රේල්',
+            'මැයි',
+            'ජූනි',
+            'ජූලි',
+            'අගෝ',
+            'සැප්',
+            'ඔක්',
+            'නොවැ',
+            'දෙසැ'
+          ],
+          WEEKDAYS: const [
+            'ඉරිදා',
+            'සඳුදා',
+            'අඟහරුවාදා',
+            'බදාදා',
+            'බ්‍රහස්පතින්දා',
+            'සිකුරාදා',
+            'සෙනසුරාදා'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ඉරිදා',
+            'සඳුදා',
+            'අඟහරුවාදා',
+            'බදාදා',
+            'බ්‍රහස්පතින්දා',
+            'සිකුරාදා',
+            'සෙනසුරාදා'
+          ],
+          SHORTWEEKDAYS: const [
+            'ඉරිදා',
+            'සඳුදා',
+            'අඟහ',
+            'බදාදා',
+            'බ්‍රහස්',
+            'සිකු',
+            'සෙන'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ඉරිදා',
+            'සඳුදා',
+            'අඟහ',
+            'බදාදා',
+            'බ්‍රහස්',
+            'සිකු',
+            'සෙන'
+          ],
+          NARROWWEEKDAYS: const ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ඉ',
+            'ස',
+            'අ',
+            'බ',
+            'බ්‍ර',
+            'සි',
+            'සෙ'
+          ],
+          SHORTQUARTERS: const ['කාර්:1', 'කාර්:2', 'කාර්:3', 'කාර්:4'],
+          QUARTERS: const [
+            '1 වන කාර්තුව',
+            '2 වන කාර්තුව',
+            '3 වන කාර්තුව',
+            '4 වන කාර්තුව'
+          ],
+          AMPMS: const ['පෙ.ව.', 'ප.ව.'],
+          DATEFORMATS: const [
+            'y MMMM d, EEEE',
+            'y MMMM d',
+            'y MMM d',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            'HH.mm.ss zzzz',
+            'HH.mm.ss z',
+            'HH.mm.ss',
+            'HH.mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale sk.
+      "sk": new DateSymbols(
+          NAME: "sk",
+          ERAS: const ['pred Kr.', 'po Kr.'],
+          ERANAMES: const ['pred Kristom', 'po Kristovi'],
+          NARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          MONTHS: const [
+            'januára',
+            'februára',
+            'marca',
+            'apríla',
+            'mája',
+            'júna',
+            'júla',
+            'augusta',
+            'septembra',
+            'októbra',
+            'novembra',
+            'decembra'
+          ],
+          STANDALONEMONTHS: const [
+            'január',
+            'február',
+            'marec',
+            'apríl',
+            'máj',
+            'jún',
+            'júl',
+            'august',
+            'september',
+            'október',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'máj',
+            'jún',
+            'júl',
+            'aug',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'máj',
+            'jún',
+            'júl',
+            'aug',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          WEEKDAYS: const [
+            'nedeľa',
+            'pondelok',
+            'utorok',
+            'streda',
+            'štvrtok',
+            'piatok',
+            'sobota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'nedeľa',
+            'pondelok',
+            'utorok',
+            'streda',
+            'štvrtok',
+            'piatok',
+            'sobota'
+          ],
+          SHORTWEEKDAYS: const ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],
+          STANDALONESHORTWEEKDAYS: const [
+            'ne',
+            'po',
+            'ut',
+            'st',
+            'št',
+            'pi',
+            'so'
+          ],
+          NARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'š', 'p', 's'],
+          STANDALONENARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'š', 'p', 's'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            '1. štvrťrok',
+            '2. štvrťrok',
+            '3. štvrťrok',
+            '4. štvrťrok'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, d. MMMM y',
+            'd. MMMM y',
+            'd. M. y',
+            'd. M. y'
+          ],
+          TIMEFORMATS: const ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1} {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale sl.
+      "sl": new DateSymbols(
+          NAME: "sl",
+          ERAS: const ['pr. Kr.', 'po Kr.'],
+          ERANAMES: const ['pred Kristusom', 'po Kristusu'],
+          NARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'marec',
+            'april',
+            'maj',
+            'junij',
+            'julij',
+            'avgust',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'marec',
+            'april',
+            'maj',
+            'junij',
+            'julij',
+            'avgust',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maj',
+            'jun.',
+            'jul.',
+            'avg.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mar.',
+            'apr.',
+            'maj',
+            'jun.',
+            'jul.',
+            'avg.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'nedelja',
+            'ponedeljek',
+            'torek',
+            'sreda',
+            'četrtek',
+            'petek',
+            'sobota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'nedelja',
+            'ponedeljek',
+            'torek',
+            'sreda',
+            'četrtek',
+            'petek',
+            'sobota'
+          ],
+          SHORTWEEKDAYS: const [
+            'ned.',
+            'pon.',
+            'tor.',
+            'sre.',
+            'čet.',
+            'pet.',
+            'sob.'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ned.',
+            'pon.',
+            'tor.',
+            'sre.',
+            'čet.',
+            'pet.',
+            'sob.'
+          ],
+          NARROWWEEKDAYS: const ['n', 'p', 't', 's', 'č', 'p', 's'],
+          STANDALONENARROWWEEKDAYS: const ['n', 'p', 't', 's', 'č', 'p', 's'],
+          SHORTQUARTERS: const ['1. čet.', '2. čet.', '3. čet.', '4. čet.'],
+          QUARTERS: const [
+            '1. četrtletje',
+            '2. četrtletje',
+            '3. četrtletje',
+            '4. četrtletje'
+          ],
+          AMPMS: const ['dop.', 'pop.'],
+          DATEFORMATS: const [
+            'EEEE, dd. MMMM y',
+            'dd. MMMM y',
+            'd. MMM y',
+            'd. MM. yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale sq.
+      "sq": new DateSymbols(
+          NAME: "sq",
+          ERAS: const ['p.K.', 'mb.K.'],
+          ERANAMES: const ['para Krishtit', 'mbas Krishtit'],
+          NARROWMONTHS: const [
+            'j',
+            's',
+            'm',
+            'p',
+            'm',
+            'q',
+            'k',
+            'g',
+            's',
+            't',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'S',
+            'M',
+            'P',
+            'M',
+            'Q',
+            'K',
+            'G',
+            'S',
+            'T',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'janar',
+            'shkurt',
+            'mars',
+            'prill',
+            'maj',
+            'qershor',
+            'korrik',
+            'gusht',
+            'shtator',
+            'tetor',
+            'nëntor',
+            'dhjetor'
+          ],
+          STANDALONEMONTHS: const [
+            'Janar',
+            'Shkurt',
+            'Mars',
+            'Prill',
+            'Maj',
+            'Qershor',
+            'Korrik',
+            'Gusht',
+            'Shtator',
+            'Tetor',
+            'Nëntor',
+            'Dhjetor'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'shk',
+            'mar',
+            'pri',
+            'maj',
+            'qer',
+            'kor',
+            'gsh',
+            'sht',
+            'tet',
+            'nën',
+            'dhj'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Shk',
+            'Mar',
+            'Pri',
+            'Maj',
+            'Qer',
+            'Kor',
+            'Gsh',
+            'Sht',
+            'Tet',
+            'Nën',
+            'Dhj'
+          ],
+          WEEKDAYS: const [
+            'e diel',
+            'e hënë',
+            'e martë',
+            'e mërkurë',
+            'e enjte',
+            'e premte',
+            'e shtunë'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'E diel',
+            'E hënë',
+            'E martë',
+            'E mërkurë',
+            'E enjte',
+            'E premte',
+            'E shtunë'
+          ],
+          SHORTWEEKDAYS: const [
+            'Die',
+            'Hën',
+            'Mar',
+            'Mër',
+            'Enj',
+            'Pre',
+            'Sht'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Die',
+            'Hën',
+            'Mar',
+            'Mër',
+            'Enj',
+            'Pre',
+            'Sht'
+          ],
+          NARROWWEEKDAYS: const ['D', 'H', 'M', 'M', 'E', 'P', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['D', 'H', 'M', 'M', 'E', 'P', 'S'],
+          SHORTQUARTERS: const [
+            'tremujori I',
+            'tremujori II',
+            'tremujori III',
+            'tremujori IV'
+          ],
+          QUARTERS: const [
+            'tremujori i parë',
+            'tremujori i dytë',
+            'tremujori i tretë',
+            'tremujori i katërt'
+          ],
+          AMPMS: const ['e paradites', 'e pasdites'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'd.M.yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a, zzzz',
+            'h:mm:ss a, z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'në\' {0}',
+            '{1} \'në\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale sr.
+      "sr": new DateSymbols(
+          NAME: "sr",
+          ERAS: const ['п. н. е.', 'н. е.'],
+          ERANAMES: const ['пре нове ере', 'нове ере'],
+          NARROWMONTHS: const [
+            'ј',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ј',
+            'ј',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ј',
+            'ф',
+            'м',
+            'а',
+            'м',
+            'ј',
+            'ј',
+            'а',
+            'с',
+            'о',
+            'н',
+            'д'
+          ],
+          MONTHS: const [
+            'јануар',
+            'фебруар',
+            'март',
+            'април',
+            'мај',
+            'јун',
+            'јул',
+            'август',
+            'септембар',
+            'октобар',
+            'новембар',
+            'децембар'
+          ],
+          STANDALONEMONTHS: const [
+            'јануар',
+            'фебруар',
+            'март',
+            'април',
+            'мај',
+            'јун',
+            'јул',
+            'август',
+            'септембар',
+            'октобар',
+            'новембар',
+            'децембар'
+          ],
+          SHORTMONTHS: const [
+            'јан',
+            'феб',
+            'мар',
+            'апр',
+            'мај',
+            'јун',
+            'јул',
+            'авг',
+            'сеп',
+            'окт',
+            'нов',
+            'дец'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'јан',
+            'феб',
+            'мар',
+            'апр',
+            'мај',
+            'јун',
+            'јул',
+            'авг',
+            'сеп',
+            'окт',
+            'нов',
+            'дец'
+          ],
+          WEEKDAYS: const [
+            'недеља',
+            'понедељак',
+            'уторак',
+            'среда',
+            'четвртак',
+            'петак',
+            'субота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'недеља',
+            'понедељак',
+            'уторак',
+            'среда',
+            'четвртак',
+            'петак',
+            'субота'
+          ],
+          SHORTWEEKDAYS: const [
+            'нед',
+            'пон',
+            'уто',
+            'сре',
+            'чет',
+            'пет',
+            'суб'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'нед',
+            'пон',
+            'уто',
+            'сре',
+            'чет',
+            'пет',
+            'суб'
+          ],
+          NARROWWEEKDAYS: const ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],
+          STANDALONENARROWWEEKDAYS: const ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],
+          SHORTQUARTERS: const ['К1', 'К2', 'К3', 'К4'],
+          QUARTERS: const [
+            'први квартал',
+            'други квартал',
+            'трећи квартал',
+            'четврти квартал'
+          ],
+          AMPMS: const ['пре подне', 'по подне'],
+          DATEFORMATS: const [
+            'EEEE, dd. MMMM y.',
+            'dd. MMMM y.',
+            'dd.MM.y.',
+            'd.M.yy.'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale sr_Latn.
+      "sr_Latn": new DateSymbols(
+          NAME: "sr_Latn",
+          ERAS: const ['p. n. e.', 'n. e.'],
+          ERANAMES: const ['pre nove ere', 'nove ere'],
+          NARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'j',
+            'f',
+            'm',
+            'a',
+            'm',
+            'j',
+            'j',
+            'a',
+            's',
+            'o',
+            'n',
+            'd'
+          ],
+          MONTHS: const [
+            'januar',
+            'februar',
+            'mart',
+            'april',
+            'maj',
+            'jun',
+            'jul',
+            'avgust',
+            'septembar',
+            'oktobar',
+            'novembar',
+            'decembar'
+          ],
+          STANDALONEMONTHS: const [
+            'januar',
+            'februar',
+            'mart',
+            'april',
+            'maj',
+            'jun',
+            'jul',
+            'avgust',
+            'septembar',
+            'oktobar',
+            'novembar',
+            'decembar'
+          ],
+          SHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'maj',
+            'jun',
+            'jul',
+            'avg',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan',
+            'feb',
+            'mar',
+            'apr',
+            'maj',
+            'jun',
+            'jul',
+            'avg',
+            'sep',
+            'okt',
+            'nov',
+            'dec'
+          ],
+          WEEKDAYS: const [
+            'nedelja',
+            'ponedeljak',
+            'utorak',
+            'sreda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'nedelja',
+            'ponedeljak',
+            'utorak',
+            'sreda',
+            'četvrtak',
+            'petak',
+            'subota'
+          ],
+          SHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sre',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ned',
+            'pon',
+            'uto',
+            'sre',
+            'čet',
+            'pet',
+            'sub'
+          ],
+          NARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'č', 'p', 's'],
+          STANDALONENARROWWEEKDAYS: const ['n', 'p', 'u', 's', 'č', 'p', 's'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            'prvi kvartal',
+            'drugi kvartal',
+            'treći kvartal',
+            'četvrti kvartal'
+          ],
+          AMPMS: const ['pre podne', 'po podne'],
+          DATEFORMATS: const [
+            'EEEE, dd. MMMM y.',
+            'dd. MMMM y.',
+            'dd.MM.y.',
+            'd.M.yy.'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale sv.
+      "sv": new DateSymbols(
+          NAME: "sv",
+          ERAS: const ['f.Kr.', 'e.Kr.'],
+          ERANAMES: const ['före Kristus', 'efter Kristus'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'januari',
+            'februari',
+            'mars',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'augusti',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          STANDALONEMONTHS: const [
+            'januari',
+            'februari',
+            'mars',
+            'april',
+            'maj',
+            'juni',
+            'juli',
+            'augusti',
+            'september',
+            'oktober',
+            'november',
+            'december'
+          ],
+          SHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mars',
+            'apr.',
+            'maj',
+            'juni',
+            'juli',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'jan.',
+            'feb.',
+            'mars',
+            'apr.',
+            'maj',
+            'juni',
+            'juli',
+            'aug.',
+            'sep.',
+            'okt.',
+            'nov.',
+            'dec.'
+          ],
+          WEEKDAYS: const [
+            'söndag',
+            'måndag',
+            'tisdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lördag'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'söndag',
+            'måndag',
+            'tisdag',
+            'onsdag',
+            'torsdag',
+            'fredag',
+            'lördag'
+          ],
+          SHORTWEEKDAYS: const [
+            'sön',
+            'mån',
+            'tis',
+            'ons',
+            'tors',
+            'fre',
+            'lör'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'sön',
+            'mån',
+            'tis',
+            'ons',
+            'tors',
+            'fre',
+            'lör'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'O', 'T', 'F', 'L'],
+          SHORTQUARTERS: const ['K1', 'K2', 'K3', 'K4'],
+          QUARTERS: const [
+            '1:a kvartalet',
+            '2:a kvartalet',
+            '3:e kvartalet',
+            '4:e kvartalet'
+          ],
+          AMPMS: const ['fm', 'em'],
+          DATEFORMATS: const [
+            'EEEE d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'y-MM-dd'
+          ],
+          TIMEFORMATS: const [
+            '\'kl\'. HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 3),
+      // Date/time formatting symbols for locale sw.
+      "sw": new DateSymbols(
+          NAME: "sw",
+          ERAS: const ['KK', 'BK'],
+          ERANAMES: const ['Kabla ya Kristo', 'Baada ya Kristo'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'Januari',
+            'Februari',
+            'Machi',
+            'Aprili',
+            'Mei',
+            'Juni',
+            'Julai',
+            'Agosti',
+            'Septemba',
+            'Oktoba',
+            'Novemba',
+            'Desemba'
+          ],
+          STANDALONEMONTHS: const [
+            'Januari',
+            'Februari',
+            'Machi',
+            'Aprili',
+            'Mei',
+            'Juni',
+            'Julai',
+            'Agosti',
+            'Septemba',
+            'Oktoba',
+            'Novemba',
+            'Desemba'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mac',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Ago',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mac',
+            'Apr',
+            'Mei',
+            'Jun',
+            'Jul',
+            'Ago',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Des'
+          ],
+          WEEKDAYS: const [
+            'Jumapili',
+            'Jumatatu',
+            'Jumanne',
+            'Jumatano',
+            'Alhamisi',
+            'Ijumaa',
+            'Jumamosi'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Jumapili',
+            'Jumatatu',
+            'Jumanne',
+            'Jumatano',
+            'Alhamisi',
+            'Ijumaa',
+            'Jumamosi'
+          ],
+          SHORTWEEKDAYS: const [
+            'Jumapili',
+            'Jumatatu',
+            'Jumanne',
+            'Jumatano',
+            'Alhamisi',
+            'Ijumaa',
+            'Jumamosi'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Jumapili',
+            'Jumatatu',
+            'Jumanne',
+            'Jumatano',
+            'Alhamisi',
+            'Ijumaa',
+            'Jumamosi'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const [
+            'Robo ya 1',
+            'Robo ya 2',
+            'Robo ya 3',
+            'Robo ya 4'
+          ],
+          QUARTERS: const ['Robo ya 1', 'Robo ya 2', 'Robo ya 3', 'Robo ya 4'],
+          AMPMS: const ['Asubuhi', 'Mchana'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y',
+            'd MMMM y',
+            'd MMM y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ta.
+      "ta": new DateSymbols(
+          NAME: "ta",
+          ERAS: const ['கி.மு.', 'கி.பி.'],
+          ERANAMES: const ['கிறிஸ்துவுக்கு முன்', 'அன்னோ டோமினி'],
+          NARROWMONTHS: const [
+            'ஜ',
+            'பி',
+            'மா',
+            'ஏ',
+            'மே',
+            'ஜூ',
+            'ஜூ',
+            'ஆ',
+            'செ',
+            'அ',
+            'ந',
+            'டி'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ஜ',
+            'பி',
+            'மா',
+            'ஏ',
+            'மே',
+            'ஜூ',
+            'ஜூ',
+            'ஆ',
+            'செ',
+            'அ',
+            'ந',
+            'டி'
+          ],
+          MONTHS: const [
+            'ஜனவரி',
+            'பிப்ரவரி',
+            'மார்ச்',
+            'ஏப்ரல்',
+            'மே',
+            'ஜூன்',
+            'ஜூலை',
+            'ஆகஸ்ட்',
+            'செப்டம்பர்',
+            'அக்டோபர்',
+            'நவம்பர்',
+            'டிசம்பர்'
+          ],
+          STANDALONEMONTHS: const [
+            'ஜனவரி',
+            'பிப்ரவரி',
+            'மார்ச்',
+            'ஏப்ரல்',
+            'மே',
+            'ஜூன்',
+            'ஜூலை',
+            'ஆகஸ்ட்',
+            'செப்டம்பர்',
+            'அக்டோபர்',
+            'நவம்பர்',
+            'டிசம்பர்'
+          ],
+          SHORTMONTHS: const [
+            'ஜன.',
+            'பிப்.',
+            'மார்.',
+            'ஏப்.',
+            'மே',
+            'ஜூன்',
+            'ஜூலை',
+            'ஆக.',
+            'செப்.',
+            'அக்.',
+            'நவ.',
+            'டிச.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ஜன.',
+            'பிப்.',
+            'மார்.',
+            'ஏப்.',
+            'மே',
+            'ஜூன்',
+            'ஜூலை',
+            'ஆக.',
+            'செப்.',
+            'அக்.',
+            'நவ.',
+            'டிச.'
+          ],
+          WEEKDAYS: const [
+            'ஞாயிறு',
+            'திங்கள்',
+            'செவ்வாய்',
+            'புதன்',
+            'வியாழன்',
+            'வெள்ளி',
+            'சனி'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ஞாயிறு',
+            'திங்கள்',
+            'செவ்வாய்',
+            'புதன்',
+            'வியாழன்',
+            'வெள்ளி',
+            'சனி'
+          ],
+          SHORTWEEKDAYS: const [
+            'ஞாயி.',
+            'திங்.',
+            'செவ்.',
+            'புத.',
+            'வியா.',
+            'வெள்.',
+            'சனி'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ஞாயி.',
+            'திங்.',
+            'செவ்.',
+            'புத.',
+            'வியா.',
+            'வெள்.',
+            'சனி'
+          ],
+          NARROWWEEKDAYS: const ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ஞா',
+            'தி',
+            'செ',
+            'பு',
+            'வி',
+            'வெ',
+            'ச'
+          ],
+          SHORTQUARTERS: const ['காலா.1', 'காலா.2', 'காலா.3', 'காலா.4'],
+          QUARTERS: const [
+            'ஒன்றாம் காலாண்டு',
+            'இரண்டாம் காலாண்டு',
+            'மூன்றாம் காலாண்டு',
+            'நான்காம் காலாண்டு'
+          ],
+          AMPMS: const ['முற்பகல்', 'பிற்பகல்'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM, y',
+            'd MMMM, y',
+            'd MMM, y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'a h:mm:ss zzzz',
+            'a h:mm:ss z',
+            'a h:mm:ss',
+            'a h:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} ’அன்று’ {0}',
+            '{1} ’அன்று’ {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale te.
+      "te": new DateSymbols(
+          NAME: "te",
+          ERAS: const ['క్రీపూ', 'క్రీశ'],
+          ERANAMES: const ['క్రీస్తు పూర్వం', 'క్రీస్తు శకం'],
+          NARROWMONTHS: const [
+            'జ',
+            'ఫి',
+            'మా',
+            'ఏ',
+            'మే',
+            'జూ',
+            'జు',
+            'ఆ',
+            'సె',
+            'అ',
+            'న',
+            'డి'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'జ',
+            'ఫి',
+            'మా',
+            'ఏ',
+            'మే',
+            'జూ',
+            'జు',
+            'ఆ',
+            'సె',
+            'అ',
+            'న',
+            'డి'
+          ],
+          MONTHS: const [
+            'జనవరి',
+            'ఫిబ్రవరి',
+            'మార్చి',
+            'ఏప్రిల్',
+            'మే',
+            'జూన్',
+            'జులై',
+            'ఆగస్టు',
+            'సెప్టెంబర్',
+            'అక్టోబర్',
+            'నవంబర్',
+            'డిసెంబర్'
+          ],
+          STANDALONEMONTHS: const [
+            'జనవరి',
+            'ఫిబ్రవరి',
+            'మార్చి',
+            'ఏప్రిల్',
+            'మే',
+            'జూన్',
+            'జులై',
+            'ఆగస్టు',
+            'సెప్టెంబర్',
+            'అక్టోబర్',
+            'నవంబర్',
+            'డిసెంబర్'
+          ],
+          SHORTMONTHS: const [
+            'జన',
+            'ఫిబ్ర',
+            'మార్చి',
+            'ఏప్రి',
+            'మే',
+            'జూన్',
+            'జులై',
+            'ఆగ',
+            'సెప్టెం',
+            'అక్టో',
+            'నవం',
+            'డిసెం'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'జన',
+            'ఫిబ్ర',
+            'మార్చి',
+            'ఏప్రి',
+            'మే',
+            'జూన్',
+            'జులై',
+            'ఆగస్టు',
+            'సెప్టెం',
+            'అక్టో',
+            'నవం',
+            'డిసెం'
+          ],
+          WEEKDAYS: const [
+            'ఆదివారం',
+            'సోమవారం',
+            'మంగళవారం',
+            'బుధవారం',
+            'గురువారం',
+            'శుక్రవారం',
+            'శనివారం'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ఆదివారం',
+            'సోమవారం',
+            'మంగళవారం',
+            'బుధవారం',
+            'గురువారం',
+            'శుక్రవారం',
+            'శనివారం'
+          ],
+          SHORTWEEKDAYS: const [
+            'ఆది',
+            'సోమ',
+            'మంగళ',
+            'బుధ',
+            'గురు',
+            'శుక్ర',
+            'శని'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'ఆది',
+            'సోమ',
+            'మంగళ',
+            'బుధ',
+            'గురు',
+            'శుక్ర',
+            'శని'
+          ],
+          NARROWWEEKDAYS: const ['ఆ', 'సో', 'మ', 'బు', 'గు', 'శు', 'శ'],
+          STANDALONENARROWWEEKDAYS: const [
+            'ఆ',
+            'సో',
+            'మ',
+            'బు',
+            'గు',
+            'శు',
+            'శ'
+          ],
+          SHORTQUARTERS: const ['త్రై1', 'త్రై2', 'త్రై3', 'త్రై4'],
+          QUARTERS: const [
+            '1వ త్రైమాసం',
+            '2వ త్రైమాసం',
+            '3వ త్రైమాసం',
+            '4వ త్రైమాసం'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'd, MMMM y, EEEE',
+            'd MMMM, y',
+            'd MMM, y',
+            'dd-MM-yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [6, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale th.
+      "th": new DateSymbols(
+          NAME: "th",
+          ERAS: const ['ปีก่อน ค.ศ.', 'ค.ศ.'],
+          ERANAMES: const ['ปีก่อนคริสต์ศักราช', 'คริสต์ศักราช'],
+          NARROWMONTHS: const [
+            'ม.ค.',
+            'ก.พ.',
+            'มี.ค.',
+            'เม.ย.',
+            'พ.ค.',
+            'มิ.ย.',
+            'ก.ค.',
+            'ส.ค.',
+            'ก.ย.',
+            'ต.ค.',
+            'พ.ย.',
+            'ธ.ค.'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'ม.ค.',
+            'ก.พ.',
+            'มี.ค.',
+            'เม.ย.',
+            'พ.ค.',
+            'มิ.ย.',
+            'ก.ค.',
+            'ส.ค.',
+            'ก.ย.',
+            'ต.ค.',
+            'พ.ย.',
+            'ธ.ค.'
+          ],
+          MONTHS: const [
+            'มกราคม',
+            'กุมภาพันธ์',
+            'มีนาคม',
+            'เมษายน',
+            'พฤษภาคม',
+            'มิถุนายน',
+            'กรกฎาคม',
+            'สิงหาคม',
+            'กันยายน',
+            'ตุลาคม',
+            'พฤศจิกายน',
+            'ธันวาคม'
+          ],
+          STANDALONEMONTHS: const [
+            'มกราคม',
+            'กุมภาพันธ์',
+            'มีนาคม',
+            'เมษายน',
+            'พฤษภาคม',
+            'มิถุนายน',
+            'กรกฎาคม',
+            'สิงหาคม',
+            'กันยายน',
+            'ตุลาคม',
+            'พฤศจิกายน',
+            'ธันวาคม'
+          ],
+          SHORTMONTHS: const [
+            'ม.ค.',
+            'ก.พ.',
+            'มี.ค.',
+            'เม.ย.',
+            'พ.ค.',
+            'มิ.ย.',
+            'ก.ค.',
+            'ส.ค.',
+            'ก.ย.',
+            'ต.ค.',
+            'พ.ย.',
+            'ธ.ค.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'ม.ค.',
+            'ก.พ.',
+            'มี.ค.',
+            'เม.ย.',
+            'พ.ค.',
+            'มิ.ย.',
+            'ก.ค.',
+            'ส.ค.',
+            'ก.ย.',
+            'ต.ค.',
+            'พ.ย.',
+            'ธ.ค.'
+          ],
+          WEEKDAYS: const [
+            'วันอาทิตย์',
+            'วันจันทร์',
+            'วันอังคาร',
+            'วันพุธ',
+            'วันพฤหัสบดี',
+            'วันศุกร์',
+            'วันเสาร์'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'วันอาทิตย์',
+            'วันจันทร์',
+            'วันอังคาร',
+            'วันพุธ',
+            'วันพฤหัสบดี',
+            'วันศุกร์',
+            'วันเสาร์'
+          ],
+          SHORTWEEKDAYS: const ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],
+          STANDALONESHORTWEEKDAYS: const [
+            'อา.',
+            'จ.',
+            'อ.',
+            'พ.',
+            'พฤ.',
+            'ศ.',
+            'ส.'
+          ],
+          NARROWWEEKDAYS: const ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
+          STANDALONENARROWWEEKDAYS: const ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],
+          SHORTQUARTERS: const ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],
+          QUARTERS: const ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],
+          AMPMS: const ['ก่อนเที่ยง', 'หลังเที่ยง'],
+          DATEFORMATS: const [
+            'EEEEที่ d MMMM G y',
+            'd MMMM G y',
+            'd MMM y',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'H นาฬิกา mm นาที ss วินาที zzzz',
+            'H นาฬิกา mm นาที ss วินาที z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale tl.
+      "tl": new DateSymbols(
+          NAME: "tl",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['BC', 'AD'],
+          NARROWMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'E',
+            'P',
+            'M',
+            'A',
+            'M',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          MONTHS: const [
+            'Enero',
+            'Pebrero',
+            'Marso',
+            'Abril',
+            'Mayo',
+            'Hunyo',
+            'Hulyo',
+            'Agosto',
+            'Setyembre',
+            'Oktubre',
+            'Nobyembre',
+            'Disyembre'
+          ],
+          STANDALONEMONTHS: const [
+            'Enero',
+            'Pebrero',
+            'Marso',
+            'Abril',
+            'Mayo',
+            'Hunyo',
+            'Hulyo',
+            'Agosto',
+            'Setyembre',
+            'Oktubre',
+            'Nobyembre',
+            'Disyembre'
+          ],
+          SHORTMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Ene',
+            'Peb',
+            'Mar',
+            'Abr',
+            'May',
+            'Hun',
+            'Hul',
+            'Ago',
+            'Set',
+            'Okt',
+            'Nob',
+            'Dis'
+          ],
+          WEEKDAYS: const [
+            'Linggo',
+            'Lunes',
+            'Martes',
+            'Miyerkules',
+            'Huwebes',
+            'Biyernes',
+            'Sabado'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Linggo',
+            'Lunes',
+            'Martes',
+            'Miyerkules',
+            'Huwebes',
+            'Biyernes',
+            'Sabado'
+          ],
+          SHORTWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          NARROWWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          STANDALONENARROWWEEKDAYS: const [
+            'Lin',
+            'Lun',
+            'Mar',
+            'Miy',
+            'Huw',
+            'Biy',
+            'Sab'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            'ika-1 quarter',
+            'ika-2 quarter',
+            'ika-3 quarter',
+            'ika-4 na quarter'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'nang\' {0}',
+            '{1} \'nang\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale tr.
+      "tr": new DateSymbols(
+          NAME: "tr",
+          ERAS: const ['MÖ', 'MS'],
+          ERANAMES: const ['Milattan Önce', 'Milattan Sonra'],
+          NARROWMONTHS: const [
+            'O',
+            'Ş',
+            'M',
+            'N',
+            'M',
+            'H',
+            'T',
+            'A',
+            'E',
+            'E',
+            'K',
+            'A'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'O',
+            'Ş',
+            'M',
+            'N',
+            'M',
+            'H',
+            'T',
+            'A',
+            'E',
+            'E',
+            'K',
+            'A'
+          ],
+          MONTHS: const [
+            'Ocak',
+            'Şubat',
+            'Mart',
+            'Nisan',
+            'Mayıs',
+            'Haziran',
+            'Temmuz',
+            'Ağustos',
+            'Eylül',
+            'Ekim',
+            'Kasım',
+            'Aralık'
+          ],
+          STANDALONEMONTHS: const [
+            'Ocak',
+            'Şubat',
+            'Mart',
+            'Nisan',
+            'Mayıs',
+            'Haziran',
+            'Temmuz',
+            'Ağustos',
+            'Eylül',
+            'Ekim',
+            'Kasım',
+            'Aralık'
+          ],
+          SHORTMONTHS: const [
+            'Oca',
+            'Şub',
+            'Mar',
+            'Nis',
+            'May',
+            'Haz',
+            'Tem',
+            'Ağu',
+            'Eyl',
+            'Eki',
+            'Kas',
+            'Ara'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Oca',
+            'Şub',
+            'Mar',
+            'Nis',
+            'May',
+            'Haz',
+            'Tem',
+            'Ağu',
+            'Eyl',
+            'Eki',
+            'Kas',
+            'Ara'
+          ],
+          WEEKDAYS: const [
+            'Pazar',
+            'Pazartesi',
+            'Salı',
+            'Çarşamba',
+            'Perşembe',
+            'Cuma',
+            'Cumartesi'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Pazar',
+            'Pazartesi',
+            'Salı',
+            'Çarşamba',
+            'Perşembe',
+            'Cuma',
+            'Cumartesi'
+          ],
+          SHORTWEEKDAYS: const [
+            'Paz',
+            'Pzt',
+            'Sal',
+            'Çar',
+            'Per',
+            'Cum',
+            'Cmt'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Paz',
+            'Pzt',
+            'Sal',
+            'Çar',
+            'Per',
+            'Cum',
+            'Cmt'
+          ],
+          NARROWWEEKDAYS: const ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],
+          STANDALONENARROWWEEKDAYS: const ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],
+          SHORTQUARTERS: const ['Ç1', 'Ç2', 'Ç3', 'Ç4'],
+          QUARTERS: const ['1. çeyrek', '2. çeyrek', '3. çeyrek', '4. çeyrek'],
+          AMPMS: const ['ÖÖ', 'ÖS'],
+          DATEFORMATS: const ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'd.MM.y'],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale uk.
+      "uk": new DateSymbols(
+          NAME: "uk",
+          ERAS: const ['до н. е.', 'н. е.'],
+          ERANAMES: const ['до нашої ери', 'нашої ери'],
+          NARROWMONTHS: const [
+            'с',
+            'л',
+            'б',
+            'к',
+            'т',
+            'ч',
+            'л',
+            'с',
+            'в',
+            'ж',
+            'л',
+            'г'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'С',
+            'Л',
+            'Б',
+            'К',
+            'Т',
+            'Ч',
+            'Л',
+            'С',
+            'В',
+            'Ж',
+            'Л',
+            'Г'
+          ],
+          MONTHS: const [
+            'січня',
+            'лютого',
+            'березня',
+            'квітня',
+            'травня',
+            'червня',
+            'липня',
+            'серпня',
+            'вересня',
+            'жовтня',
+            'листопада',
+            'грудня'
+          ],
+          STANDALONEMONTHS: const [
+            'січень',
+            'лютий',
+            'березень',
+            'квітень',
+            'травень',
+            'червень',
+            'липень',
+            'серпень',
+            'вересень',
+            'жовтень',
+            'листопад',
+            'грудень'
+          ],
+          SHORTMONTHS: const [
+            'січ.',
+            'лют.',
+            'бер.',
+            'квіт.',
+            'трав.',
+            'черв.',
+            'лип.',
+            'серп.',
+            'вер.',
+            'жовт.',
+            'лист.',
+            'груд.'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'січ',
+            'лют',
+            'бер',
+            'кві',
+            'тра',
+            'чер',
+            'лип',
+            'сер',
+            'вер',
+            'жов',
+            'лис',
+            'гру'
+          ],
+          WEEKDAYS: const [
+            'неділя',
+            'понеділок',
+            'вівторок',
+            'середа',
+            'четвер',
+            'пʼятниця',
+            'субота'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'неділя',
+            'понеділок',
+            'вівторок',
+            'середа',
+            'четвер',
+            'пʼятниця',
+            'субота'
+          ],
+          SHORTWEEKDAYS: const ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
+          STANDALONESHORTWEEKDAYS: const [
+            'нд',
+            'пн',
+            'вт',
+            'ср',
+            'чт',
+            'пт',
+            'сб'
+          ],
+          NARROWWEEKDAYS: const ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],
+          STANDALONENARROWWEEKDAYS: const ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],
+          SHORTQUARTERS: const ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],
+          QUARTERS: const [
+            '1-й квартал',
+            '2-й квартал',
+            '3-й квартал',
+            '4-й квартал'
+          ],
+          AMPMS: const ['дп', 'пп'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM y \'р\'.',
+            'd MMMM y \'р\'.',
+            'd MMM y \'р\'.',
+            'dd.MM.yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1} \'о\' {0}',
+            '{1} \'о\' {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale ur.
+      "ur": new DateSymbols(
+          NAME: "ur",
+          ERAS: const ['قبل مسیح', 'عیسوی'],
+          ERANAMES: const ['قبل مسیح', 'عیسوی'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'جنوری',
+            'فروری',
+            'مارچ',
+            'اپریل',
+            'مئی',
+            'جون',
+            'جولائی',
+            'اگست',
+            'ستمبر',
+            'اکتوبر',
+            'نومبر',
+            'دسمبر'
+          ],
+          STANDALONEMONTHS: const [
+            'جنوری',
+            'فروری',
+            'مارچ',
+            'اپریل',
+            'مئی',
+            'جون',
+            'جولائی',
+            'اگست',
+            'ستمبر',
+            'اکتوبر',
+            'نومبر',
+            'دسمبر'
+          ],
+          SHORTMONTHS: const [
+            'جنوری',
+            'فروری',
+            'مارچ',
+            'اپریل',
+            'مئی',
+            'جون',
+            'جولائی',
+            'اگست',
+            'ستمبر',
+            'اکتوبر',
+            'نومبر',
+            'دسمبر'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'جنوری',
+            'فروری',
+            'مارچ',
+            'اپریل',
+            'مئی',
+            'جون',
+            'جولائی',
+            'اگست',
+            'ستمبر',
+            'اکتوبر',
+            'نومبر',
+            'دسمبر'
+          ],
+          WEEKDAYS: const [
+            'اتوار',
+            'سوموار',
+            'منگل',
+            'بدھ',
+            'جمعرات',
+            'جمعہ',
+            'ہفتہ'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'اتوار',
+            'سوموار',
+            'منگل',
+            'بدھ',
+            'جمعرات',
+            'جمعہ',
+            'ہفتہ'
+          ],
+          SHORTWEEKDAYS: const [
+            'اتوار',
+            'سوموار',
+            'منگل',
+            'بدھ',
+            'جمعرات',
+            'جمعہ',
+            'ہفتہ'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'اتوار',
+            'سوموار',
+            'منگل',
+            'بدھ',
+            'جمعرات',
+            'جمعہ',
+            'ہفتہ'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+          SHORTQUARTERS: const [
+            'پہلی سہ ماہی',
+            'دوسری سہ ماہی',
+            'تیسری سہ ماہی',
+            'چوتهی سہ ماہی'
+          ],
+          QUARTERS: const [
+            'پہلی سہ ماہی',
+            'دوسری سہ ماہی',
+            'تیسری سہ ماہی',
+            'چوتهی سہ ماہی'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE، d MMMM، y',
+            'd MMMM، y',
+            'y MMM d',
+            'd/M/yy'
+          ],
+          TIMEFORMATS: const [
+            'h:mm:ss a zzzz',
+            'h:mm:ss a z',
+            'h:mm:ss a',
+            'h:mm a'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale uz.
+      "uz": new DateSymbols(
+          NAME: "uz",
+          ERAS: const ['m.a.', 'milodiy'],
+          ERANAMES: const ['miloddan avvalgi', 'milodiy'],
+          NARROWMONTHS: const [
+            'Y',
+            'F',
+            'M',
+            'A',
+            'M',
+            'I',
+            'I',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'Y',
+            'F',
+            'M',
+            'A',
+            'M',
+            'I',
+            'I',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'yanvar',
+            'fevral',
+            'mart',
+            'aprel',
+            'may',
+            'iyun',
+            'iyul',
+            'avgust',
+            'sentabr',
+            'oktabr',
+            'noyabr',
+            'dekabr'
+          ],
+          STANDALONEMONTHS: const [
+            'Yanvar',
+            'Fevral',
+            'Mart',
+            'Aprel',
+            'May',
+            'Iyun',
+            'Iyul',
+            'Avgust',
+            'Sentabr',
+            'Oktabr',
+            'Noyabr',
+            'Dekabr'
+          ],
+          SHORTMONTHS: const [
+            'yan',
+            'fev',
+            'mar',
+            'apr',
+            'may',
+            'iyn',
+            'iyl',
+            'avg',
+            'sen',
+            'okt',
+            'noy',
+            'dek'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Yan',
+            'Fev',
+            'Mar',
+            'Apr',
+            'May',
+            'Iyn',
+            'Iyl',
+            'Avg',
+            'Sen',
+            'Okt',
+            'Noy',
+            'Dek'
+          ],
+          WEEKDAYS: const [
+            'yakshanba',
+            'dushanba',
+            'seshanba',
+            'chorshanba',
+            'payshanba',
+            'juma',
+            'shanba'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'yakshanba',
+            'dushanba',
+            'seshanba',
+            'chorshanba',
+            'payshanba',
+            'juma',
+            'shanba'
+          ],
+          SHORTWEEKDAYS: const [
+            'Yak',
+            'Dush',
+            'Sesh',
+            'Chor',
+            'Pay',
+            'Jum',
+            'Shan'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Yak',
+            'Dush',
+            'Sesh',
+            'Chor',
+            'Pay',
+            'Jum',
+            'Shan'
+          ],
+          NARROWWEEKDAYS: const ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],
+          STANDALONENARROWWEEKDAYS: const ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],
+          SHORTQUARTERS: const ['1-ch', '2-ch', '3-ch', '4-ch'],
+          QUARTERS: const ['1-chorak', '2-chorak', '3-chorak', '4-chorak'],
+          AMPMS: const ['TO', 'TK'],
+          DATEFORMATS: const [
+            'EEEE, d-MMMM, y',
+            'd-MMMM, y',
+            'd-MMM, y',
+            'dd/MM/yy'
+          ],
+          TIMEFORMATS: const [
+            'H:mm:ss (zzzz)',
+            'H:mm:ss (z)',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const [
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}',
+            '{1}, {0}'
+          ],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale vi.
+      "vi": new DateSymbols(
+          NAME: "vi",
+          ERAS: const ['Trước CN', 'sau CN'],
+          ERANAMES: const ['Trước CN', 'sau CN'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            'tháng 1',
+            'tháng 2',
+            'tháng 3',
+            'tháng 4',
+            'tháng 5',
+            'tháng 6',
+            'tháng 7',
+            'tháng 8',
+            'tháng 9',
+            'tháng 10',
+            'tháng 11',
+            'tháng 12'
+          ],
+          STANDALONEMONTHS: const [
+            'Tháng 1',
+            'Tháng 2',
+            'Tháng 3',
+            'Tháng 4',
+            'Tháng 5',
+            'Tháng 6',
+            'Tháng 7',
+            'Tháng 8',
+            'Tháng 9',
+            'Tháng 10',
+            'Tháng 11',
+            'Tháng 12'
+          ],
+          SHORTMONTHS: const [
+            'thg 1',
+            'thg 2',
+            'thg 3',
+            'thg 4',
+            'thg 5',
+            'thg 6',
+            'thg 7',
+            'thg 8',
+            'thg 9',
+            'thg 10',
+            'thg 11',
+            'thg 12'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Thg 1',
+            'Thg 2',
+            'Thg 3',
+            'Thg 4',
+            'Thg 5',
+            'Thg 6',
+            'Thg 7',
+            'Thg 8',
+            'Thg 9',
+            'Thg 10',
+            'Thg 11',
+            'Thg 12'
+          ],
+          WEEKDAYS: const [
+            'Chủ Nhật',
+            'Thứ Hai',
+            'Thứ Ba',
+            'Thứ Tư',
+            'Thứ Năm',
+            'Thứ Sáu',
+            'Thứ Bảy'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'Chủ Nhật',
+            'Thứ Hai',
+            'Thứ Ba',
+            'Thứ Tư',
+            'Thứ Năm',
+            'Thứ Sáu',
+            'Thứ Bảy'
+          ],
+          SHORTWEEKDAYS: const [
+            'CN',
+            'Th 2',
+            'Th 3',
+            'Th 4',
+            'Th 5',
+            'Th 6',
+            'Th 7'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'CN',
+            'Th 2',
+            'Th 3',
+            'Th 4',
+            'Th 5',
+            'Th 6',
+            'Th 7'
+          ],
+          NARROWWEEKDAYS: const ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+          STANDALONENARROWWEEKDAYS: const [
+            'CN',
+            'T2',
+            'T3',
+            'T4',
+            'T5',
+            'T6',
+            'T7'
+          ],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['Quý 1', 'Quý 2', 'Quý 3', 'Quý 4'],
+          AMPMS: const ['SA', 'CH'],
+          DATEFORMATS: const [
+            'EEEE, d MMMM, y',
+            'd MMMM, y',
+            'd MMM, y',
+            'dd/MM/y'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{0} {1}', '{0} {1}', '{0}, {1}', '{0}, {1}'],
+          FIRSTDAYOFWEEK: 0,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 6),
+      // Date/time formatting symbols for locale zh.
+      "zh": new DateSymbols(
+          NAME: "zh",
+          ERAS: const ['公元前', '公元'],
+          ERANAMES: const ['公元前', '公元'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            '一月',
+            '二月',
+            '三月',
+            '四月',
+            '五月',
+            '六月',
+            '七月',
+            '八月',
+            '九月',
+            '十月',
+            '十一月',
+            '十二月'
+          ],
+          STANDALONEMONTHS: const [
+            '一月',
+            '二月',
+            '三月',
+            '四月',
+            '五月',
+            '六月',
+            '七月',
+            '八月',
+            '九月',
+            '十月',
+            '十一月',
+            '十二月'
+          ],
+          SHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+          STANDALONEWEEKDAYS: const [
+            '星期日',
+            '星期一',
+            '星期二',
+            '星期三',
+            '星期四',
+            '星期五',
+            '星期六'
+          ],
+          SHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+          STANDALONESHORTWEEKDAYS: const [
+            '周日',
+            '周一',
+            '周二',
+            '周三',
+            '周四',
+            '周五',
+            '周六'
+          ],
+          NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          SHORTQUARTERS: const ['1季度', '2季度', '3季度', '4季度'],
+          QUARTERS: const ['第一季度', '第二季度', '第三季度', '第四季度'],
+          AMPMS: const ['上午', '下午'],
+          DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],
+          TIMEFORMATS: const [
+            'zzzz ah:mm:ss',
+            'z ah:mm:ss',
+            'ah:mm:ss',
+            'ah:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale zh_CN.
+      // Date/time formatting symbols for locale zh_CN.
+      "zh_CN": new DateSymbols(
+          NAME: "zh_CN",
+          ERAS: const ['公元前', '公元'],
+          ERANAMES: const ['公元前', '公元'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            '一月',
+            '二月',
+            '三月',
+            '四月',
+            '五月',
+            '六月',
+            '七月',
+            '八月',
+            '九月',
+            '十月',
+            '十一月',
+            '十二月'
+          ],
+          STANDALONEMONTHS: const [
+            '一月',
+            '二月',
+            '三月',
+            '四月',
+            '五月',
+            '六月',
+            '七月',
+            '八月',
+            '九月',
+            '十月',
+            '十一月',
+            '十二月'
+          ],
+          SHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+          STANDALONEWEEKDAYS: const [
+            '星期日',
+            '星期一',
+            '星期二',
+            '星期三',
+            '星期四',
+            '星期五',
+            '星期六'
+          ],
+          SHORTWEEKDAYS: const ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+          STANDALONESHORTWEEKDAYS: const [
+            '周日',
+            '周一',
+            '周二',
+            '周三',
+            '周四',
+            '周五',
+            '周六'
+          ],
+          NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          SHORTQUARTERS: const ['1季度', '2季度', '3季度', '4季度'],
+          QUARTERS: const ['第一季度', '第二季度', '第三季度', '第四季度'],
+          AMPMS: const ['上午', '下午'],
+          DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],
+          TIMEFORMATS: const [
+            'zzzz ah:mm:ss',
+            'z ah:mm:ss',
+            'ah:mm:ss',
+            'ah:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale zh_HK.
+      "zh_HK": new DateSymbols(
+          NAME: "zh_HK",
+          ERAS: const ['公元前', '公元'],
+          ERANAMES: const ['公元前', '公元'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONEMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          SHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+          STANDALONEWEEKDAYS: const [
+            '星期日',
+            '星期一',
+            '星期二',
+            '星期三',
+            '星期四',
+            '星期五',
+            '星期六'
+          ],
+          SHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
+          STANDALONESHORTWEEKDAYS: const [
+            '週日',
+            '週一',
+            '週二',
+            '週三',
+            '週四',
+            '週五',
+            '週六'
+          ],
+          NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const ['第1季度', '第2季度', '第3季度', '第4季度'],
+          AMPMS: const ['上午', '下午'],
+          DATEFORMATS: const ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/y'],
+          TIMEFORMATS: const [
+            'ah:mm:ss [zzzz]',
+            'ah:mm:ss [z]',
+            'ah:mm:ss',
+            'ah:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale zh_TW.
+      "zh_TW": new DateSymbols(
+          NAME: "zh_TW",
+          ERAS: const ['西元前', '西元'],
+          ERANAMES: const ['西元前', '西元'],
+          NARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          STANDALONENARROWMONTHS: const [
+            '1',
+            '2',
+            '3',
+            '4',
+            '5',
+            '6',
+            '7',
+            '8',
+            '9',
+            '10',
+            '11',
+            '12'
+          ],
+          MONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONEMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          SHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          STANDALONESHORTMONTHS: const [
+            '1月',
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月',
+            '7月',
+            '8月',
+            '9月',
+            '10月',
+            '11月',
+            '12月'
+          ],
+          WEEKDAYS: const ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
+          STANDALONEWEEKDAYS: const [
+            '星期日',
+            '星期一',
+            '星期二',
+            '星期三',
+            '星期四',
+            '星期五',
+            '星期六'
+          ],
+          SHORTWEEKDAYS: const ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
+          STANDALONESHORTWEEKDAYS: const [
+            '週日',
+            '週一',
+            '週二',
+            '週三',
+            '週四',
+            '週五',
+            '週六'
+          ],
+          NARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          STANDALONENARROWWEEKDAYS: const ['日', '一', '二', '三', '四', '五', '六'],
+          SHORTQUARTERS: const ['1季', '2季', '3季', '4季'],
+          QUARTERS: const ['第1季', '第2季', '第3季', '第4季'],
+          AMPMS: const ['上午', '下午'],
+          DATEFORMATS: const ['y年M月d日 EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],
+          TIMEFORMATS: const [
+            'ah:mm:ss [zzzz]',
+            'ah:mm:ss [z]',
+            'ah:mm:ss',
+            'ah:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5),
+      // Date/time formatting symbols for locale zu.
+      "zu": new DateSymbols(
+          NAME: "zu",
+          ERAS: const ['BC', 'AD'],
+          ERANAMES: const ['BC', 'AD'],
+          NARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'E',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          STANDALONENARROWMONTHS: const [
+            'J',
+            'F',
+            'M',
+            'A',
+            'M',
+            'J',
+            'J',
+            'A',
+            'S',
+            'O',
+            'N',
+            'D'
+          ],
+          MONTHS: const [
+            'UMasingana',
+            'Februwari',
+            'Mashi',
+            'Ephreli',
+            'Meyi',
+            'Juni',
+            'Julayi',
+            'Agasti',
+            'Septhemba',
+            'Okthoba',
+            'Novemba',
+            'Disemba'
+          ],
+          STANDALONEMONTHS: const [
+            'Januwari',
+            'Februwari',
+            'Mashi',
+            'Ephreli',
+            'Meyi',
+            'Juni',
+            'Julayi',
+            'Agasti',
+            'Septhemba',
+            'Okthoba',
+            'Novemba',
+            'Disemba'
+          ],
+          SHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mas',
+            'Eph',
+            'Mey',
+            'Jun',
+            'Jul',
+            'Aga',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dis'
+          ],
+          STANDALONESHORTMONTHS: const [
+            'Jan',
+            'Feb',
+            'Mas',
+            'Eph',
+            'Mey',
+            'Jun',
+            'Jul',
+            'Aga',
+            'Sep',
+            'Okt',
+            'Nov',
+            'Dis'
+          ],
+          WEEKDAYS: const [
+            'ISonto',
+            'UMsombuluko',
+            'ULwesibili',
+            'ULwesithathu',
+            'ULwesine',
+            'ULwesihlanu',
+            'UMgqibelo'
+          ],
+          STANDALONEWEEKDAYS: const [
+            'ISonto',
+            'UMsombuluko',
+            'ULwesibili',
+            'ULwesithathu',
+            'ULwesine',
+            'ULwesihlanu',
+            'UMgqibelo'
+          ],
+          SHORTWEEKDAYS: const [
+            'Son',
+            'Mso',
+            'Bil',
+            'Tha',
+            'Sin',
+            'Hla',
+            'Mgq'
+          ],
+          STANDALONESHORTWEEKDAYS: const [
+            'Son',
+            'Mso',
+            'Bil',
+            'Tha',
+            'Sin',
+            'Hla',
+            'Mgq'
+          ],
+          NARROWWEEKDAYS: const ['S', 'M', 'B', 'T', 'S', 'H', 'M'],
+          STANDALONENARROWWEEKDAYS: const ['S', 'M', 'B', 'T', 'S', 'H', 'M'],
+          SHORTQUARTERS: const ['Q1', 'Q2', 'Q3', 'Q4'],
+          QUARTERS: const [
+            'ikota yesi-1',
+            'ikota yesi-2',
+            'ikota yesi-3',
+            'ikota yesi-4'
+          ],
+          AMPMS: const ['AM', 'PM'],
+          DATEFORMATS: const [
+            'EEEE, MMMM d, y',
+            'MMMM d, y',
+            'MMM d, y',
+            'M/d/yy'
+          ],
+          TIMEFORMATS: const [
+            'HH:mm:ss zzzz',
+            'HH:mm:ss z',
+            'HH:mm:ss',
+            'HH:mm'
+          ],
+          DATETIMEFORMATS: const ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],
+          FIRSTDAYOFWEEK: 6,
+          WEEKENDRANGE: const [5, 6],
+          FIRSTWEEKCUTOFFDAY: 5)
+    };
diff --git a/packages/intl/lib/date_symbols.dart b/packages/intl/lib/date_symbols.dart
index bbded50..80a0c4d 100644
--- a/packages/intl/lib/date_symbols.dart
+++ b/packages/intl/lib/date_symbols.dart
@@ -3,15 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 library date_symbols;
 
-/**
- * This holds onto information about how a particular locale formats dates. It
- * contains mostly strings, e.g. what the names of months or weekdays are,
- * but also indicates things like the first day of the week. We expect the data
- * for instances of these to be generated out of ICU or a similar reference
- * source. This is used in conjunction with the date_time_patterns, which
- * defines for a particular locale the different named formats that will
- * make use of this data.
- */
+/// This holds onto information about how a particular locale formats dates. It
+/// contains mostly strings, e.g. what the names of months or weekdays are,
+/// but also indicates things like the first day of the week. We expect the data
+/// for instances of these to be generated out of ICU or a similar reference
+/// source. This is used in conjunction with the date_time_patterns, which
+/// defines for a particular locale the different named formats that will
+/// make use of this data.
 class DateSymbols {
   String NAME;
   List<String> ERAS,
@@ -56,31 +54,32 @@
   // TODO(alanknight): Replace this with use of a more general serialization
   // facility once one is available. Issue 4926.
   DateSymbols.deserializeFromMap(Map map) {
+    List<String> _getStringList(String name) => new List<String>.from(map[name]);
     NAME = map["NAME"];
-    ERAS = map["ERAS"];
-    ERANAMES = map["ERANAMES"];
-    NARROWMONTHS = map["NARROWMONTHS"];
-    STANDALONENARROWMONTHS = map["STANDALONENARROWMONTHS"];
-    MONTHS = map["MONTHS"];
-    STANDALONEMONTHS = map["STANDALONEMONTHS"];
-    SHORTMONTHS = map["SHORTMONTHS"];
-    STANDALONESHORTMONTHS = map["STANDALONESHORTMONTHS"];
-    WEEKDAYS = map["WEEKDAYS"];
-    STANDALONEWEEKDAYS = map["STANDALONEWEEKDAYS"];
-    SHORTWEEKDAYS = map["SHORTWEEKDAYS"];
-    STANDALONESHORTWEEKDAYS = map["STANDALONESHORTWEEKDAYS"];
-    NARROWWEEKDAYS = map["NARROWWEEKDAYS"];
-    STANDALONENARROWWEEKDAYS = map["STANDALONENARROWWEEKDAYS"];
-    SHORTQUARTERS = map["SHORTQUARTERS"];
-    QUARTERS = map["QUARTERS"];
-    AMPMS = map["AMPMS"];
-    DATEFORMATS = map["DATEFORMATS"];
-    TIMEFORMATS = map["TIMEFORMATS"];
-    AVAILABLEFORMATS = map["AVAILABLEFORMATS"];
+    ERAS = _getStringList("ERAS");
+    ERANAMES = _getStringList("ERANAMES");
+    NARROWMONTHS = _getStringList("NARROWMONTHS");
+    STANDALONENARROWMONTHS = _getStringList("STANDALONENARROWMONTHS");
+    MONTHS = _getStringList("MONTHS");
+    STANDALONEMONTHS = _getStringList("STANDALONEMONTHS");
+    SHORTMONTHS = _getStringList("SHORTMONTHS");
+    STANDALONESHORTMONTHS = _getStringList("STANDALONESHORTMONTHS");
+    WEEKDAYS = _getStringList("WEEKDAYS");
+    STANDALONEWEEKDAYS = _getStringList("STANDALONEWEEKDAYS");
+    SHORTWEEKDAYS = _getStringList("SHORTWEEKDAYS");
+    STANDALONESHORTWEEKDAYS = _getStringList("STANDALONESHORTWEEKDAYS");
+    NARROWWEEKDAYS = _getStringList("NARROWWEEKDAYS");
+    STANDALONENARROWWEEKDAYS = _getStringList("STANDALONENARROWWEEKDAYS");
+    SHORTQUARTERS = _getStringList("SHORTQUARTERS");
+    QUARTERS = _getStringList("QUARTERS");
+    AMPMS = _getStringList("AMPMS");
+    DATEFORMATS = _getStringList("DATEFORMATS");
+    TIMEFORMATS = _getStringList("TIMEFORMATS");
+    AVAILABLEFORMATS = new Map<String, String>.from(map["AVAILABLEFORMATS"] ?? {});
     FIRSTDAYOFWEEK = map["FIRSTDAYOFWEEK"];
-    WEEKENDRANGE = map["WEEKENDRANGE"];
+    WEEKENDRANGE = new List<int>.from(map["WEEKENDRANGE"]);
     FIRSTWEEKCUTOFFDAY = map["FIRSTWEEKCUTOFFDAY"];
-    DATETIMEFORMATS = map["DATETIMEFORAMTS"];
+    DATETIMEFORMATS = _getStringList("DATETIMEFORMATS");
   }
 
   Map serializeToMap() => {
@@ -114,10 +113,8 @@
   toString() => NAME;
 }
 
-/**
- * We hard-code the locale data for en_US here so that there's at least one
- * locale always available.
- */
+/// We hard-code the locale data for en_US here so that there's at least one
+/// locale always available.
 var en_USSymbols = new DateSymbols(
     NAME: "en_US",
     ERAS: const ['BC', 'AD'],
diff --git a/packages/intl/lib/date_time_patterns.dart b/packages/intl/lib/date_time_patterns.dart
index e43c477..0ff874e 100644
--- a/packages/intl/lib/date_time_patterns.dart
+++ b/packages/intl/lib/date_time_patterns.dart
@@ -2,5170 +2,5295 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Date/time formatting symbols for a large subset of locales.
- *
- * DO NOT EDIT. This file is autogenerated from ICU data. See
- * 'http://go/generate_datetime_pattern_dart.cc' (Google internal)
- * File generated from CLDR ver. 25.0
- */
+/// Date/time formatting symbols for a large subset of locales.
+///
+/// DO NOT EDIT. This file is autogenerated from ICU data. See
+/// 'http://go/generate_datetime_pattern_dart.cc' (Google internal)
+/// File generated from CLDR ver. 30.0.2
 
 library date_time_patterns;
 
-/**
- * Returns a Map from locale names to another Map that goes from skeletons
- * to the locale-specific formatting patterns.
- * Internal use only. Call initializeDateFormatting instead.
- **/
+/// Returns a Map from locale names to another Map that goes from skeletons
+/// to the locale-specific formatting patterns.
+/// Internal use only. Call initializeDateFormatting instead.
 Map dateTimePatternMap() => const {
-  /**
-   * Extended set of localized date/time patterns for locale af.
-   */
-  'af': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale af.
+      'af': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd-MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM-y', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale am.
-   */
-  'am': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE፣ d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE፣ MMM d y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale am.
+      'am': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE፣ M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE፣ MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE፣ MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE፣ d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE፣ MMM d y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE ፣d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ar.
-   */
-  'ar': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/‏M', // NUM_MONTH_DAY
-    'MEd': 'EEE، d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE، d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE، d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M‏/y', // YEAR_NUM_MONTH
-    'yMd': 'd‏/M‏/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE، d/‏M/‏y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM، y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE، d MMM، y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM، y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE، d MMMM، y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ar.
+      'ar': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/‏M', // NUM_MONTH_DAY
+        'MEd': 'EEE، d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE، d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE، d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M‏/y', // YEAR_NUM_MONTH
+        'yMd': 'd‏/M‏/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE، d/‏M/‏y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM، y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE، d MMM، y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM، y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE، d MMMM، y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale az.
-   */
-  'az': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'dd.MM, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'd MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'd MMMM, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'dd.MM.y, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'd MMM y, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'd MMMM y, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale az.
+      'az': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'dd.MM, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'd MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'd MMMM, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'dd.MM.y, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'd MMM y, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'd MMMM y, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale bg.
-   */
-  'bg': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'MM', // ABBR_MONTH
-    'MMMd': 'd.MM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d.MM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y \'г\'.', // YEAR
-    'yM': 'M.y \'г\'.', // YEAR_NUM_MONTH
-    'yMd': 'd.MM.y \'г\'.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.MM.y \'г\'.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MM.y \'г\'.', // YEAR_ABBR_MONTH
-    'yMMMd': 'd.MM.y \'г\'.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d.MM.y \'г\'.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y \'г\'.', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale be.
+      'be': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale bn.
-   */
-  'bn': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d-M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale bg.
+      'bg': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'MM', // ABBR_MONTH
+        'MMMd': 'd.MM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d.MM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y \'г\'.', // YEAR
+        'yM': 'MM.y \'г\'.', // YEAR_NUM_MONTH
+        'yMd': 'd.MM.y \'г\'.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.MM.y \'г\'.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MM.y \'г\'.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd.MM.y \'г\'.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d.MM.y \'г\'.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y \'г\'.', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale br.
-   */
-  'br': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'MM-dd', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale bn.
+      'bn': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d-M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ca.
-   */
-  'ca': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale br.
+      'br': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'MM', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale chr.
-   */
-  'chr': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale bs.
+      'bs': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y.', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm (v)', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale cs.
-   */
-  'cs': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd. M.', // NUM_MONTH_DAY
-    'MEd': 'EEE d. M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. M.', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. M.', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd. M. y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. M. y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. M. y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ca.
+      'ca': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd LLL y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale cy.
-   */
-  'cy': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale chr.
+      'chr': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale da.
-   */
-  'da': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'MMM', // ABBR_STANDALONE_MONTH
-    'LLLL': 'MMMM', // STANDALONE_MONTH
-    'M': 'M', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'MMM', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'MMMM', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE \'den\' d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale cs.
+      'cs': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd. M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d. M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. M.', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. M.', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd. M. y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLLL y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. M. y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. M. y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale de.
-   */
-  'de': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH \'Uhr\'', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH \'Uhr\'', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale cy.
+      'cy': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale de_AT.
-   */
-  'de_AT': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH \'Uhr\'', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH \'Uhr\'', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale da.
+      'da': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'MMM', // ABBR_STANDALONE_MONTH
+        'LLLL': 'MMMM', // STANDALONE_MONTH
+        'M': 'M', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'MMM', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'MMMM', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE \'den\' d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH.mm', // HOUR24_MINUTE
+        'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH.mm', // HOUR_MINUTE
+        'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH.mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale de_CH.
-   */
-  'de_CH': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH \'Uhr\'', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH \'Uhr\'', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale de.
+      'de': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH \'Uhr\'', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH \'Uhr\'', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale el.
-   */
-  'el': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale de_AT.
+      'de_AT': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH \'Uhr\'', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH \'Uhr\'', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en.
-   */
-  'en': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale de_CH.
+      'de_CH': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH \'Uhr\'', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH \'Uhr\'', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH \'Uhr\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_AU.
-   */
-  'en_AU': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'dd/MM', // NUM_MONTH_DAY
-    'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale el.
+      'el': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'MMM', // ABBR_STANDALONE_MONTH
+        'LLLL': 'MMMM', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'MMM', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'MMMM', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_GB.
-   */
-  'en_GB': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'dd/MM', // NUM_MONTH_DAY
-    'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en.
+      'en': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_IE.
-   */
-  'en_IE': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_AU.
+      'en_AU': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_IN.
-   */
-  'en_IN': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'dd/MM', // NUM_MONTH_DAY
-    'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_CA.
+      'en_CA': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'MM-dd', // NUM_MONTH_DAY
+        'MEd': 'EEE, MM-dd', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_SG.
-   */
-  'en_SG': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'dd/MM', // NUM_MONTH_DAY
-    'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_GB.
+      'en_GB': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_US.
-   */
-  'en_US': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_IE.
+      'en_IE': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_ZA.
-   */
-  'en_ZA': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'MM/dd', // NUM_MONTH_DAY
-    'MEd': 'EEE MM/dd', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'dd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE dd MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'dd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE dd MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'y/MM/dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, y/MM/dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'dd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, dd MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_IN.
+      'en_IN': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale es.
-   */
-  'es': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_SG.
+      'en_SG': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale es_419.
-   */
-  'es_419': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_US.
+      'en_US': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale es_ES.
-   */
-  'es_ES': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale en_ZA.
+      'en_ZA': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'MM/dd', // NUM_MONTH_DAY
+        'MEd': 'EEE, MM/dd', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'dd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, dd MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, dd MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'y/MM/dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, y/MM/dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'dd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, dd MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale et.
-   */
-  'et': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'MMMM', // ABBR_STANDALONE_MONTH
-    'LLLL': 'MMMM', // STANDALONE_MONTH
-    'M': 'M', // NUM_MONTH
-    'Md': 'd.M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'MMMM', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'MMMM', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'H:mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale es.
+      'es': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale eu.
-   */
-  'eu': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'M/d, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y/M/d, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y(\'e\')\'ko\' MMMM', // YEAR_MONTH
-    'yMMMMd': 'y(\'e\')\'ko\' MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y(\'e\')\'ko\' MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y(\'e\')\'ko\' QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y(\'e\')\'ko\' QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm (v)', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
-    'jz': 'HH (z)', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale es_419.
+      'es_419': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMMM \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ \'de\' y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale fa.
-   */
-  'fa': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd LLL', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d LLL', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd LLLL', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d LLLL', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE y/M/d', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm (v)', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
-    'jz': 'H (z)', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale es_ES.
+      'es_ES': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale fi.
-   */
-  'fi': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'ccc d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'cccc d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'L.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H.mm', // HOUR24_MINUTE
-    'Hms': 'H.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H.mm', // HOUR_MINUTE
-    'jms': 'H.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H.mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale es_MX.
+      'es_MX': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMMM \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale fil.
-   */
-  'fil': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale es_US.
+      'es_US': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMMM \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ \'de\' y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale fr.
-   */
-  'fr': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH \'h\'', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH \'h\'', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH \'h\' z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale et.
+      'et': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'MMMM', // ABBR_STANDALONE_MONTH
+        'LLLL': 'MMMM', // STANDALONE_MONTH
+        'M': 'M', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'MMMM', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'MMMM', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale fr_CA.
-   */
-  'fr_CA': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M-d', // NUM_MONTH_DAY
-    'MEd': 'EEE M-d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH \'h\'', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH \'h\'', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH \'h\' z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale eu.
+      'eu': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'M/d, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y/M', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y/M/d, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y(\'e\')\'ko\' MMMM', // YEAR_MONTH
+        'yMMMMd': 'y(\'e\')\'ko\' MMMM d', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y(\'e\')\'ko\' MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y(\'e\')\'ko\' QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y(\'e\')\'ko\' QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH (z)', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale gl.
-   */
-  'gl': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d-M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale fa.
+      'fa': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd LLL', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d LLL', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd LLLL', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d LLLL', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y/M', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE y/M/d', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
+        'jz': 'H (z)', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale gsw.
-   */
-  'gsw': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-M', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, y-M-d', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale fi.
+      'fi': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'ccc d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'cccc d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'L.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H.mm', // HOUR24_MINUTE
+        'Hms': 'H.mm.ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H.mm', // HOUR_MINUTE
+        'jms': 'H.mm.ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H.mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H.mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale gu.
-   */
-  'gu': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale fil.
+      'fil': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale haw.
-   */
-  'haw': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale fr.
+      'fr': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH \'h\'', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH \'h\'', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH \'h\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale he.
-   */
-  'he': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd בMMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d בMMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd בMMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d בMMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd בMMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d בMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd בMMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d בMMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale fr_CA.
+      'fr_CA': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M-d', // NUM_MONTH_DAY
+        'MEd': 'EEE M-d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH \'h\'', // HOUR24
+        'Hm': 'HH \'h\' mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH \'h\'', // HOUR
+        'jm': 'HH \'h\' mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH \'h\' mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH \'h\' mm z', // HOUR_MINUTETZ
+        'jz': 'HH \'h\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale hi.
-   */
-  'hi': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ga.
+      'ga': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'LL', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale hr.
-   */
-  'hr': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L.', // NUM_MONTH
-    'Md': 'd. M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d. M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y.', // YEAR
-    'yM': 'M. y.', // YEAR_NUM_MONTH
-    'yMd': 'd. M. y.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d. M. y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y.', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y.', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y.', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y.', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale gl.
+      'gl': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'ccc, d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'cccc, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'ccc, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'ccc, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm (v)', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale hu.
-   */
-  'hu': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M. d.', // NUM_MONTH_DAY
-    'MEd': 'M. d., EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d.', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d., EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d.', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d., EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y.', // YEAR
-    'yM': 'y. M.', // YEAR_NUM_MONTH
-    'yMd': 'y. MM. dd.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y. MM. dd., EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y. MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y. MMM d.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y. MMM d., EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y. MMMM', // YEAR_MONTH
-    'yMMMMd': 'y. MMMM d.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y. MMMM d., EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y. QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y. QQQQ', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale gsw.
+      'gsw': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-M', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, y-M-d', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale hy.
-   */
-  'hy': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'dd.MM, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'd MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'd MMMM, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'd.MM.yթ., EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'yթ. LLL', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, yթ.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'yթ. MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'yթ. LLLL', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, yթ.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'yթ. MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y թ, QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y թ, QQQQ', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm, v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm, z', // HOUR_MINUTETZ
-    'jz': 'H, z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale gu.
+      'gu': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale id.
-   */
-  'id': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale haw.
+      'haw': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale in.
-   */
-  'in': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale he.
+      'he': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd בMMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d בMMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd בMMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d בMMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd בMMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d בMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd בMMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d בMMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale is.
-   */
-  'is': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M. y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale hi.
+      'hi': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale it.
-   */
-  'it': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale hr.
+      'hr': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L.', // NUM_MONTH
+        'Md': 'dd. MM.', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd. MM.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'MM. y.', // YEAR_NUM_MONTH
+        'yMd': 'dd. MM. y.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd. MM. y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y.', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH (z)', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale iw.
-   */
-  'iw': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd בMMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d בMMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd בMMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d בMMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd בMMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d בMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd בMMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d בMMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale hu.
+      'hu': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M. d.', // NUM_MONTH_DAY
+        'MEd': 'M. d., EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d.', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d., EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d.', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d., EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'y. M.', // YEAR_NUM_MONTH
+        'yMd': 'y. MM. dd.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y. MM. dd., EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y. MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y. MMM d.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y. MMM d., EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y. MMMM', // YEAR_MONTH
+        'yMMMMd': 'y. MMMM d.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y. MMMM d., EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y. QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y. QQQQ', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ja.
-   */
-  'ja': const {
-    'd': 'd日', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'M月', // ABBR_STANDALONE_MONTH
-    'LLLL': 'M月', // STANDALONE_MONTH
-    'M': 'M月', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'M/d(EEE)', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'M月', // ABBR_MONTH
-    'MMMd': 'M月d日', // ABBR_MONTH_DAY
-    'MMMEd': 'M月d日(EEE)', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'M月', // MONTH
-    'MMMMd': 'M月d日', // MONTH_DAY
-    'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y年', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y/M/d(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y年M月', // YEAR_ABBR_MONTH
-    'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y年M月d日(EEE)', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y年M月', // YEAR_MONTH
-    'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y/QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'yQQQQ', // YEAR_QUARTER
-    'H': 'H時', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H時', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H時 z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale hy.
+      'hy': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'dd.MM, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'd MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'd MMMM, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'd.MM.y թ., EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y թ. LLL', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y թ.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y թ. MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'yթ․ MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y թ.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y թ. MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y թ, QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y թ, QQQQ', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ka.
-   */
-  'ka': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM, y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM, y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ, y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ, y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale id.
+      'id': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH.mm', // HOUR24_MINUTE
+        'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH.mm', // HOUR_MINUTE
+        'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH.mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale in.
+      'in': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH.mm', // HOUR24_MINUTE
+        'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH.mm', // HOUR_MINUTE
+        'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH.mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale is.
+      'is': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M. y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale it.
+      'it': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale iw.
+      'iw': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd בMMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d בMMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd בMMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d בMMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd בMMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d בMMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd בMMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d בMMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale ja.
+      'ja': const {
+        'd': 'd日', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'M月', // ABBR_STANDALONE_MONTH
+        'LLLL': 'M月', // STANDALONE_MONTH
+        'M': 'M月', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'M/d(EEE)', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'M月', // ABBR_MONTH
+        'MMMd': 'M月d日', // ABBR_MONTH_DAY
+        'MMMEd': 'M月d日(EEE)', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'M月', // MONTH
+        'MMMMd': 'M月d日', // MONTH_DAY
+        'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y年', // YEAR
+        'yM': 'y/M', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y/M/d(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y年M月', // YEAR_ABBR_MONTH
+        'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y年M月d日(EEE)', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y年M月', // YEAR_MONTH
+        'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y/QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y年QQQQ', // YEAR_QUARTER
+        'H': 'H時', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H時', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H時 z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale ka.
+      'ka': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM. y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM. y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM. y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM, y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ, y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ, y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
+
+      /// Extended set of localized date/time patterns for locale kk.
+      'kk': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'dd.MM, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'd MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'd MMMM, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'dd.MM.y, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y \'ж\'. MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y \'ж\'. d MMM', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y \'ж\'. d MMM, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y \'ж\'. MMMM', // YEAR_MONTH
+        'yMMMMd': 'y \'ж\'. d MMMM', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y \'ж\'. d MMMM, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y \'ж\'. QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y \'ж\'. QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale kk.
-   */
-  'kk': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd-MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd-MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM-y', // YEAR_NUM_MONTH
-    'yMd': 'dd-MM-y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd-MM-y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y \'ж\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y \'ж\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale km.
+      'km': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale km.
-   */
-  'km': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE d MMM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd-M-y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d-M-y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale kn.
+      'kn': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'd/M, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d,y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale kn.
-   */
-  'kn': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'd/M, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd, MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'd MMM, y EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'd MMMM y, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ko.
+      'ko': const {
+        'd': 'd일', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M월', // NUM_MONTH
+        'Md': 'M. d.', // NUM_MONTH_DAY
+        'MEd': 'M. d. (EEE)', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d일', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d일 (EEE)', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d일', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d일 EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y년', // YEAR
+        'yM': 'y. M.', // YEAR_NUM_MONTH
+        'yMd': 'y. M. d.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y. M. d. (EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y년 MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y년 MMM d일', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y년 MMM d일 (EEE)', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y년 MMMM', // YEAR_MONTH
+        'yMMMMd': 'y년 MMMM d일', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y년 MMMM d일 EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y년 QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y년 QQQQ', // YEAR_QUARTER
+        'H': 'H시', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'H시 m분 s초', // HOUR24_MINUTE_SECOND
+        'j': 'a h시', // HOUR
+        'jm': 'a h:mm', // HOUR_MINUTE
+        'jms': 'a h:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'a h:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'a h:mm z', // HOUR_MINUTETZ
+        'jz': 'a h시 z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ko.
-   */
-  'ko': const {
-    'd': 'd일', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M월', // NUM_MONTH
-    'Md': 'M. d.', // NUM_MONTH_DAY
-    'MEd': 'M. d. (EEE)', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d일', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d일 (EEE)', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d일', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d일 EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y년', // YEAR
-    'yM': 'y. M.', // YEAR_NUM_MONTH
-    'yMd': 'y. M. d.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y. M. d. (EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y년 MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y년 MMM d일', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y년 MMM d일 (EEE)', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y년 MMMM', // YEAR_MONTH
-    'yMMMMd': 'y년 MMMM d일', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y년 MMMM d일 EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y년 QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y년 QQQQ', // YEAR_QUARTER
-    'H': 'H시', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'H시 m분 s초', // HOUR24_MINUTE_SECOND
-    'j': 'a h시', // HOUR
-    'jm': 'a h:mm', // HOUR_MINUTE
-    'jms': 'a h:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'a h:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'a h:mm z', // HOUR_MINUTETZ
-    'jz': 'a h시 z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ky.
+      'ky': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd-MM', // NUM_MONTH_DAY
+        'MEd': 'dd-MM, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd-MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'd-MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd-MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'd-MMMM, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-dd-MM', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-dd-MM, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y-\'ж\'. MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y-\'ж\'. d-MMM', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y-\'ж\'. d-MMM, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y-\'ж\'., MMMM', // YEAR_MONTH
+        'yMMMMd': 'y-\'ж\'., d-MMMM', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y-\'ж\'., d-MMMM, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y-\'ж\'., QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y-\'ж\'., QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ky.
-   */
-  'ky': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd-MM', // NUM_MONTH_DAY
-    'MEd': 'dd-MM, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd-MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'd-MMM, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd-MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'd-MMMM, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y-\'ж\'. MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y-\'ж\'. d-MMM', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y-\'ж\'. d-MMM, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y-\'ж\'. MMMM', // YEAR_MONTH
-    'yMMMMd': 'd-MMMM, y-\'ж\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d-MMMM, y-\'ж\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y-\'ж\'., QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y-\'ж\'., QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ln.
+      'ln': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ln.
-   */
-  'ln': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale lo.
+      'lo': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale lo.
-   */
-  'lo': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale lt.
+      'lt': const {
+        'd': 'dd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'MM', // NUM_MONTH
+        'Md': 'MM-d', // NUM_MONTH_DAY
+        'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'MM', // ABBR_MONTH
+        'MMMd': 'MM-dd', // ABBR_MONTH_DAY
+        'MMMEd': 'MM-dd, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d \'d\'.', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d \'d\'., EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y-MM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y-MM-dd', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y-MM-dd, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y \'m\'. LLLL', // YEAR_MONTH
+        'yMMMMd': 'y \'m\'. MMMM d \'d\'.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y \'m\'. MMMM d \'d\'., EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm; v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm; z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale lt.
-   */
-  'lt': const {
-    'd': 'dd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'LL', // NUM_MONTH
-    'Md': 'MM-d', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y \'m\'. MMMM d \'d\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y \'m\'. MMMM d \'d\'., EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale lv.
+      'lv': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM.', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd.MM.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y. \'g\'.', // YEAR
+        'yM': 'MM.y.', // YEAR_NUM_MONTH
+        'yMd': 'y.MM.d.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y. \'g\'. MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y. \'g\'. d. MMM', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, y. \'g\'. d. MMM', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y. \'g\'. MMMM', // YEAR_MONTH
+        'yMMMMd': 'y. \'gada\' d. MMMM', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, y. \'gada\' d. MMMM', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y. \'g\'. QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y. \'g\'. QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale lv.
-   */
-  'lv': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM.', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd.MM.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y. \'g\'.', // YEAR
-    'yM': 'MM.y.', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y. \'g\'. MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y. \'g\'. d. MMM', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, y. \'g\'. d. MMM', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y. \'g\'. MMMM', // YEAR_MONTH
-    'yMMMMd': 'y. \'gada\' d. MMMM', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, y. \'gada\' d. MMMM', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y. \'g\'. QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale mk.
+      'mk': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y \'г\'.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y \'г\'.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y \'г\'.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y \'г\'.', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale mk.
-   */
-  'mk': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y \'г\'.', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y \'г\'.', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y \'г\'.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y \'г\'.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y \'г\'.', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ml.
+      'ml': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'd/M, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'd-M-y, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'y, MMMM d', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y, MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ml.
-   */
-  'ml': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'M/d, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'd-M-y, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y, MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y, MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale mn.
+      'mn': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M-d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M-d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-M', // YEAR_NUM_MONTH
+        'yMd': 'y-M-d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, y-M-d', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, y MMM d', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'y\'оны\' MMMM\'сарын\' d\'өдөр\'', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, y MMMM d', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y \'оны\' QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale mn.
-   */
-  'mn': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M-d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M-d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-M', // YEAR_NUM_MONTH
-    'yMd': 'y-M-d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, y-M-d', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, y MMM d', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y \'оны\' MMMM \'сарын\' d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, y \'оны\' MMMM \'сарын\' d',
-    // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y \'оны\' QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale mo.
+      'mo': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale mo.
-   */
-  'mo': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale mr.
+      'mr': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d, MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale mr.
-   */
-  'mr': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d, MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ms.
+      'ms': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd-M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d-M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M-y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ms.
-   */
-  'ms': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d-M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale mt.
+      'mt': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'MM-dd', // NUM_MONTH_DAY
+        'MEd': 'EEE, M-d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d \'ta\'’ MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'ta\'’ MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'ta\'’ MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'ta\'’ MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'ta\'’ MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd \'ta\'’ MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'ta\'’ MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ - y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ - y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale mt.
-   */
-  'mt': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'MM-dd', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'd \'ta\'’ MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'ta\'’ MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale my.
+      'my': const {
+        'd': 'd', // DAY
+        'E': 'cccနေ့', // ABBR_WEEKDAY
+        'EEEE': 'ccccနေ့', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'd/M EEEနေ့', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d ရက် EEEနေ့', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d ရက် EEEEနေ့', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'dd-MM-y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'd-M-y EEEနေ့', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'd MMM y EEEနေ့', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'v HH:mm', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'z HH:mm', // HOUR_MINUTETZ
+        'jz': 'z HH', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale my.
-   */
-  'my': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, y/M/d', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, y MMM d', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, y MMMM d', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale nb.
+      'nb': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L.', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale nb.
-   */
-  'nb': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L.', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ne.
+      'ne': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'MM-dd', // NUM_MONTH_DAY
+        'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ne.
-   */
-  'ne': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'MM-dd', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale nl.
+      'nl': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd-M', // NUM_MONTH_DAY
+        'MEd': 'EEE d-M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M-y', // YEAR_NUM_MONTH
+        'yMd': 'd-M-y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d-M-y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale nl.
-   */
-  'nl': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE d-M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd-M-y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d-M-y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale no.
+      'no': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L.', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale no.
-   */
-  'no': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L.', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale no_NO.
+      'no_NO': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L.', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale no_NO.
-   */
-  'no_NO': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L.', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE d.M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale or.
+      'or': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M', // NUM_MONTH
+        'Md': 'd-M', // NUM_MONTH_DAY
+        'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M-y', // YEAR_NUM_MONTH
+        'yMd': 'd-M-y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale or.
-   */
-  'or': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd-M-y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale pa.
+      'pa': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd-MM.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale pa.
-   */
-  'pa': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd-MM.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M-y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale pl.
+      'pl': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale pl.
-   */
-  'pl': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale pt.
+      'pt': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ \'de\' y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale pt.
-   */
-  'pt': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale pt_BR.
+      'pt_BR': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ \'de\' y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale pt_BR.
-   */
-  'pt_BR': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd \'de\' MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d \'de\' MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM \'de\' y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d \'de\' MMM \'de\' y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale pt_PT.
+      'pt_PT': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd/MM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d/MM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'cccc, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MM/y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd/MM/y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d/MM/y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
+        'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQQ \'de\' y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale pt_PT.
-   */
-  'pt_PT': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd/MM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d/MM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd \'de\' MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d \'de\' MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MM/y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd/MM/y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d/MM/y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM \'de\' y', // YEAR_MONTH
-    'yMMMMd': 'd \'de\' MMMM \'de\' y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d \'de\' MMMM \'de\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQQ \'de\' y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ \'de\' y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ro.
+      'ro': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ro.
-   */
-  'ro': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ru.
+      'ru': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'ccc, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'cccc, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'ccc, d.MM.y \'г\'.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y \'г\'.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y \'г\'.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y \'г\'.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y \'г\'.', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ru.
-   */
-  'ru': const {
-    'd': 'd', // DAY
-    'E': 'ccc', // ABBR_WEEKDAY
-    'EEEE': 'cccc', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'ccc, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'cccc, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'ccc, d.MM.y \'г\'.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y \'г\'.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y \'г\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y \'г\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y \'г\'.', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y \'г\'.', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sh.
+      'sh': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'M.y.', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y.', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sh.
-   */
-  'sh': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, M-d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y.', // YEAR
-    'yM': 'M.y.', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y.', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ. y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ. y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale si.
+      'si': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M-d', // NUM_MONTH_DAY
+        'MEd': 'M-d, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-M', // YEAR_NUM_MONTH
+        'yMd': 'y-M-d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-M-d, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y MMM', // YEAR_ABBR_MONTH
+        'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH.mm', // HOUR24_MINUTE
+        'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH.mm', // HOUR_MINUTE
+        'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH.mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm.ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale si.
-   */
-  'si': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M-d', // NUM_MONTH_DAY
-    'MEd': 'M-d, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-M', // YEAR_NUM_MONTH
-    'yMd': 'y-M-d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-M-d, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y MMMM d, EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'a h', // HOUR
-    'jm': 'a h.mm', // HOUR_MINUTE
-    'jms': 'a h.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'a h.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'a h.mm z', // HOUR_MINUTETZ
-    'jz': 'a h z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sk.
+      'sk': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L.', // NUM_MONTH
+        'Md': 'd. M.', // NUM_MONTH_DAY
+        'MEd': 'EEE d. M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. M.', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. M.', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd. M. y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'M/y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. M. y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d. M. y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'H', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'H', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'H:mm z', // HOUR_MINUTETZ
+        'jz': 'H z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sk.
-   */
-  'sk': const {
-    'd': 'd.', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L.', // NUM_MONTH
-    'Md': 'd.M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM.', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM.', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M.y', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd.M.y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'H', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'H', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'H z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sl.
+      'sl': const {
+        'd': 'd.', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd. M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d. M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd. M. y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH\'h\'', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH\'h\'', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH\'h\' z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sl.
-   */
-  'sl': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd. M.', // NUM_MONTH_DAY
-    'MEd': 'EEE, d. MM.', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd. M. y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d. M. y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sq.
+      'sq': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M.y', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ, y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ, y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a, v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a, z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sq.
-   */
-  'sq': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sr.
+      'sr': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'M.y.', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y.', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sr.
-   */
-  'sr': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, M-d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd. MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd. MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d. MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y.', // YEAR
-    'yM': 'M.y.', // YEAR_NUM_MONTH
-    'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
-    'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y.', // YEAR_MONTH
-    'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ. y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ. y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH.mm', // HOUR24_MINUTE
-    'Hms': 'HH.mm.ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH.mm', // HOUR_MINUTE
-    'jms': 'HH.mm.ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH.mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH.mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm.ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sr_Latn.
+      'sr_Latn': const {
+        'd': 'd', // DAY
+        'E': 'EEE', // ABBR_WEEKDAY
+        'EEEE': 'EEEE', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd.M.', // NUM_MONTH_DAY
+        'MEd': 'EEE, d.M.', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd. MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d. MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd. MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d. MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y.', // YEAR
+        'yM': 'M.y.', // YEAR_NUM_MONTH
+        'yMd': 'd.M.y.', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d.M.y.', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y.', // YEAR_ABBR_MONTH
+        'yMMMd': 'd. MMM y.', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d. MMM y.', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y.', // YEAR_MONTH
+        'yMMMMd': 'd. MMMM y.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d. MMMM y.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y.', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sv.
-   */
-  'sv': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sv.
+      'sv': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, y-MM-dd', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale sw.
-   */
-  'sw': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale sw.
+      'sw': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ta.
-   */
-  'ta': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ta.
+      'ta': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'dd-MM, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'a h', // HOUR
+        'jm': 'a h:mm', // HOUR_MINUTE
+        'jms': 'a h:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'a h:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'a h:mm z', // HOUR_MINUTETZ
+        'jz': 'a h z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale te.
-   */
-  'te': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd, MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d, MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'd MMMM y EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale te.
+      'te': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd, MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d, MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'd, MMMM y, EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale th.
-   */
-  'th': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale th.
+      'th': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEEที่ d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM G y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM G y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEEที่ d MMMM G y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ G y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm น.', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm น.', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale tl.
-   */
-  'tl': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale tl.
+      'tl': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale tr.
-   */
-  'tr': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd/MM', // NUM_MONTH_DAY
-    'MEd': 'dd/MM EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'd MMMM EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'dd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'dd MMMM EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM/y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'dd.MM.y EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'dd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'd MMM y EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'd MMMM y EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y/QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y/QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale tr.
+      'tr': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'd/MM EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'd MMMM EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'd MMMM EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'd.M.y EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'd MMM y EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'd MMMM y EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale uk.
-   */
-  'uk': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd.MM', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'MM.y', // YEAR_NUM_MONTH
-    'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'LLL y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'LLLL y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y \'р\'.', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, d MMMM y \'р\'.', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y \'р\'.', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale uk.
+      'uk': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'LL', // NUM_MONTH
+        'Md': 'dd.MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd.MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM.y', // YEAR_NUM_MONTH
+        'yMd': 'dd.MM.y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd.MM.y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'LLL y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'LLLL y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM y \'р\'.', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM y \'р\'.', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y \'р\'.', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale ur.
-   */
-  'ur': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE، d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE، d MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE، d MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE، d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'd MMM، y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE، d MMM، y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM، y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE، d MMMM، y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale ur.
+      'ur': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE، d/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE، d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE، d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE، d/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM، y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE، d MMM، y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y MMMM', // YEAR_MONTH
+        'yMMMMd': 'd MMMM، y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE، d MMMM، y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale uz.
-   */
-  'uz': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'MM-dd', // NUM_MONTH_DAY
-    'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'MMM d, EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'MMMM d, EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'y-MM', // YEAR_NUM_MONTH
-    'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y MMM', // YEAR_ABBR_MONTH
-    'yMMMd': 'y MMM d', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y MMM d, EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y MMMM', // YEAR_MONTH
-    'yMMMMd': 'y MMMM d', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, y MMMM d', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y QQQQ', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'HH:mm', // HOUR_MINUTE
-    'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'HH:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale uz.
+      'uz': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'LL', // NUM_MONTH
+        'Md': 'dd/MM', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/MM', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd-MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d-MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd-MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d-MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'MM/y', // YEAR_NUM_MONTH
+        'yMd': 'dd/MM/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/MM/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM, y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd-MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d-MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM, y', // YEAR_MONTH
+        'yMMMMd': 'd-MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d-MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y, QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y, QQQQ', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm (v)', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm (z)', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale vi.
-   */
-  'vi': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'dd-M', // NUM_MONTH_DAY
-    'MEd': 'EEE, dd-M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'dd MMM', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, dd MMM', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'dd MMMM', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, dd MMMM', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': '\'Năm\' y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, dd-M-y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'dd MMM, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, dd MMM y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'dd MMMM, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, \'ngày\' d MMMM \'năm\' y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'H:mm', // HOUR24_MINUTE
-    'Hms': 'H:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'HH', // HOUR
-    'jm': 'H:mm', // HOUR_MINUTE
-    'jms': 'H:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'H:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'H:mm z', // HOUR_MINUTETZ
-    'jz': 'HH z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale vi.
+      'vi': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'dd/M', // NUM_MONTH_DAY
+        'MEd': 'EEE, dd/M', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'd MMM', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, d MMM', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'd MMMM', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, d MMMM', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, dd/M/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'd MMM, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, d MMM, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM \'năm\' y', // YEAR_MONTH
+        'yMMMMd': 'd MMMM, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, d MMMM, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ \'năm\' y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'H:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'H:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale zh.
-   */
-  'zh': const {
-    'd': 'd日', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M月', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'M/dEEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'M月d日', // ABBR_MONTH_DAY
-    'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'M月d日', // MONTH_DAY
-    'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y年', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y/M/dEEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y年M月', // YEAR_ABBR_MONTH
-    'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y年M月', // YEAR_MONTH
-    'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y年第Q季度', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y年第Q季度', // YEAR_QUARTER
-    'H': 'H时', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'ah时', // HOUR
-    'jm': 'ah:mm', // HOUR_MINUTE
-    'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'vah:mm', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'zah:mm', // HOUR_MINUTETZ
-    'jz': 'zah时', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale zh.
+      'zh': const {
+        'd': 'd日', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M月', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'M/dEEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'M月d日', // ABBR_MONTH_DAY
+        'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'M月d日', // MONTH_DAY
+        'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y年', // YEAR
+        'yM': 'y年M月', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y/M/dEEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y年M月', // YEAR_ABBR_MONTH
+        'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y年M月', // YEAR_MONTH
+        'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y年第Q季度', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y年第Q季度', // YEAR_QUARTER
+        'H': 'H时', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'ah时', // HOUR
+        'jm': 'ah:mm', // HOUR_MINUTE
+        'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'v ah:mm', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'z ah:mm', // HOUR_MINUTETZ
+        'jz': 'zah时', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale zh_CN.
-   */
-  'zh_CN': const {
-    'd': 'd日', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M月', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'M/dEEE', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'M月d日', // ABBR_MONTH_DAY
-    'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'M月d日', // MONTH_DAY
-    'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y年', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y/M/dEEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y年M月', // YEAR_ABBR_MONTH
-    'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y年M月', // YEAR_MONTH
-    'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y年第Q季度', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y年第Q季度', // YEAR_QUARTER
-    'H': 'H时', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'ah时', // HOUR
-    'jm': 'ah:mm', // HOUR_MINUTE
-    'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'vah:mm', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'zah:mm', // HOUR_MINUTETZ
-    'jz': 'zah时', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale zh_CN.
+      'zh_CN': const {
+        'd': 'd日', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M月', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'M/dEEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'M月d日', // ABBR_MONTH_DAY
+        'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'M月d日', // MONTH_DAY
+        'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y年', // YEAR
+        'yM': 'y年M月', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y/M/dEEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y年M月', // YEAR_ABBR_MONTH
+        'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y年M月', // YEAR_MONTH
+        'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y年第Q季度', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y年第Q季度', // YEAR_QUARTER
+        'H': 'H时', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'ah时', // HOUR
+        'jm': 'ah:mm', // HOUR_MINUTE
+        'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'v ah:mm', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'z ah:mm', // HOUR_MINUTETZ
+        'jz': 'zah时', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale zh_HK.
-   */
-  'zh_HK': const {
-    'd': 'd日', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M月', // NUM_MONTH
-    'Md': 'd/M', // NUM_MONTH_DAY
-    'MEd': 'EEE, d/M', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'M月d日', // ABBR_MONTH_DAY
-    'MMMEd': 'M月d日 (EEE)', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'M月d日', // MONTH_DAY
-    'MMMMEEEEd': 'M月d日 (EEEE)', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y年', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'd/M/y(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y 年 M 月', // YEAR_ABBR_MONTH
-    'yMMMd': 'y 年 M 月 d 日', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y 年 M 月 d 日 (EEE)', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y 年 M 月', // YEAR_MONTH
-    'yMMMMd': 'y 年 M 月 d 日', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y 年 M 月 d 日 (EEEE)', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y年QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y年QQQQ', // YEAR_QUARTER
-    'H': 'H時', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'ah時', // HOUR
-    'jm': 'ah:mm', // HOUR_MINUTE
-    'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'ah:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'ah:mm z', // HOUR_MINUTETZ
-    'jz': 'ah時 z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale zh_HK.
+      'zh_HK': const {
+        'd': 'd日', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M月', // NUM_MONTH
+        'Md': 'd/M', // NUM_MONTH_DAY
+        'MEd': 'd/M(EEE)', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'M月d日', // ABBR_MONTH_DAY
+        'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'M月d日', // MONTH_DAY
+        'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y年', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'd/M/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'd/M/y(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y年M月', // YEAR_ABBR_MONTH
+        'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y年M月', // YEAR_MONTH
+        'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y年QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y年QQQQ', // YEAR_QUARTER
+        'H': 'H時', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'ah時', // HOUR
+        'jm': 'ah:mm', // HOUR_MINUTE
+        'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'ah:mm [v]', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'ah:mm [z]', // HOUR_MINUTETZ
+        'jz': 'ah時 z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale zh_TW.
-   */
-  'zh_TW': const {
-    'd': 'd日', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'M月', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'M/d(EEE)', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'M月d日', // ABBR_MONTH_DAY
-    'MMMEd': 'M月d日EEE', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'M月d日', // MONTH_DAY
-    'MMMMEEEEd': 'M月d日EEEE', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y年', // YEAR
-    'yM': 'y/M', // YEAR_NUM_MONTH
-    'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'y/M/d(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'y年M月', // YEAR_ABBR_MONTH
-    'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'y年M月d日EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'y年M月', // YEAR_MONTH
-    'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'y年M月d日EEEE', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'y年QQQ', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'y年QQQQ', // YEAR_QUARTER
-    'H': 'H時', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'ah時', // HOUR
-    'jm': 'ah:mm', // HOUR_MINUTE
-    'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
-    'jmv': 'ah:mm v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'ah:mm z', // HOUR_MINUTETZ
-    'jz': 'ah時 z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale zh_TW.
+      'zh_TW': const {
+        'd': 'd日', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'M月', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'M/d(EEE)', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'M月d日', // ABBR_MONTH_DAY
+        'MMMEd': 'M月d日 EEE', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'M月d日', // MONTH_DAY
+        'MMMMEEEEd': 'M月d日 EEEE', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y年', // YEAR
+        'yM': 'y/M', // YEAR_NUM_MONTH
+        'yMd': 'y/M/d', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y/M/d(EEE)', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'y年M月', // YEAR_ABBR_MONTH
+        'yMMMd': 'y年M月d日', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'y年M月d日 EEE', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'y年M月', // YEAR_MONTH
+        'yMMMMd': 'y年M月d日', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'y年M月d日 EEEE', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'y年QQQ', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'y年QQQQ', // YEAR_QUARTER
+        'H': 'H時', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'ah時', // HOUR
+        'jm': 'ah:mm', // HOUR_MINUTE
+        'jms': 'ah:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'ah:mm [v]', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'ah:mm [z]', // HOUR_MINUTETZ
+        'jz': 'ah時 z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale zu.
-   */
-  'zu': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'd MMMM y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE d MMMM y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  },
+      /// Extended set of localized date/time patterns for locale zu.
+      'zu': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'MM-dd', // NUM_MONTH_DAY
+        'MEd': 'MM-dd, EEE', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'y-MM', // YEAR_NUM_MONTH
+        'yMd': 'y-MM-dd', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'y-MM-dd, EEE', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'HH', // HOUR
+        'jm': 'HH:mm', // HOUR_MINUTE
+        'jms': 'HH:mm:ss', // HOUR_MINUTE_SECOND
+        'jmv': 'HH:mm v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'HH:mm z', // HOUR_MINUTETZ
+        'jz': 'HH z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      },
 
-  /**
-   * Extended set of localized date/time patterns for locale en_ISO.
-   */
-  'en_ISO': const {
-    'd': 'd', // DAY
-    'E': 'EEE', // ABBR_WEEKDAY
-    'EEEE': 'EEEE', // WEEKDAY
-    'LLL': 'LLL', // ABBR_STANDALONE_MONTH
-    'LLLL': 'LLLL', // STANDALONE_MONTH
-    'M': 'L', // NUM_MONTH
-    'Md': 'M/d', // NUM_MONTH_DAY
-    'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
-    'MMM': 'LLL', // ABBR_MONTH
-    'MMMd': 'MMM d', // ABBR_MONTH_DAY
-    'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
-    'MMMM': 'LLLL', // MONTH
-    'MMMMd': 'MMMM d', // MONTH_DAY
-    'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
-    'QQQ': 'QQQ', // ABBR_QUARTER
-    'QQQQ': 'QQQQ', // QUARTER
-    'y': 'y', // YEAR
-    'yM': 'M/y', // YEAR_NUM_MONTH
-    'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
-    'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
-    'yMMM': 'MMM y', // YEAR_ABBR_MONTH
-    'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
-    'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
-    'yMMMM': 'MMMM y', // YEAR_MONTH
-    'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
-    'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
-    'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
-    'yQQQQ': 'QQQQ y', // YEAR_QUARTER
-    'H': 'HH', // HOUR24
-    'Hm': 'HH:mm', // HOUR24_MINUTE
-    'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
-    'j': 'h a', // HOUR
-    'jm': 'h:mm a', // HOUR_MINUTE
-    'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
-    'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
-    'jmz': 'h:mm a z', // HOUR_MINUTETZ
-    'jz': 'h a z', // HOURGENERIC_TZ
-    'm': 'm', // MINUTE
-    'ms': 'mm:ss', // MINUTE_SECOND
-    's': 's', // SECOND
-    'v': 'v', // ABBR_GENERIC_TZ
-    'z': 'z', // ABBR_SPECIFIC_TZ
-    'zzzz': 'zzzz', // SPECIFIC_TZ
-    'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
-  }
-};
+      /// Extended set of localized date/time patterns for locale en_ISO.
+      'en_ISO': const {
+        'd': 'd', // DAY
+        'E': 'ccc', // ABBR_WEEKDAY
+        'EEEE': 'cccc', // WEEKDAY
+        'LLL': 'LLL', // ABBR_STANDALONE_MONTH
+        'LLLL': 'LLLL', // STANDALONE_MONTH
+        'M': 'L', // NUM_MONTH
+        'Md': 'M/d', // NUM_MONTH_DAY
+        'MEd': 'EEE, M/d', // NUM_MONTH_WEEKDAY_DAY
+        'MMM': 'LLL', // ABBR_MONTH
+        'MMMd': 'MMM d', // ABBR_MONTH_DAY
+        'MMMEd': 'EEE, MMM d', // ABBR_MONTH_WEEKDAY_DAY
+        'MMMM': 'LLLL', // MONTH
+        'MMMMd': 'MMMM d', // MONTH_DAY
+        'MMMMEEEEd': 'EEEE, MMMM d', // MONTH_WEEKDAY_DAY
+        'QQQ': 'QQQ', // ABBR_QUARTER
+        'QQQQ': 'QQQQ', // QUARTER
+        'y': 'y', // YEAR
+        'yM': 'M/y', // YEAR_NUM_MONTH
+        'yMd': 'M/d/y', // YEAR_NUM_MONTH_DAY
+        'yMEd': 'EEE, M/d/y', // YEAR_NUM_MONTH_WEEKDAY_DAY
+        'yMMM': 'MMM y', // YEAR_ABBR_MONTH
+        'yMMMd': 'MMM d, y', // YEAR_ABBR_MONTH_DAY
+        'yMMMEd': 'EEE, MMM d, y', // YEAR_ABBR_MONTH_WEEKDAY_DAY
+        'yMMMM': 'MMMM y', // YEAR_MONTH
+        'yMMMMd': 'MMMM d, y', // YEAR_MONTH_DAY
+        'yMMMMEEEEd': 'EEEE, MMMM d, y', // YEAR_MONTH_WEEKDAY_DAY
+        'yQQQ': 'QQQ y', // YEAR_ABBR_QUARTER
+        'yQQQQ': 'QQQQ y', // YEAR_QUARTER
+        'H': 'HH', // HOUR24
+        'Hm': 'HH:mm', // HOUR24_MINUTE
+        'Hms': 'HH:mm:ss', // HOUR24_MINUTE_SECOND
+        'j': 'h a', // HOUR
+        'jm': 'h:mm a', // HOUR_MINUTE
+        'jms': 'h:mm:ss a', // HOUR_MINUTE_SECOND
+        'jmv': 'h:mm a v', // HOUR_MINUTE_GENERIC_TZ
+        'jmz': 'h:mm a z', // HOUR_MINUTETZ
+        'jz': 'h a z', // HOURGENERIC_TZ
+        'm': 'm', // MINUTE
+        'ms': 'mm:ss', // MINUTE_SECOND
+        's': 's', // SECOND
+        'v': 'v', // ABBR_GENERIC_TZ
+        'z': 'z', // ABBR_SPECIFIC_TZ
+        'zzzz': 'zzzz', // SPECIFIC_TZ
+        'ZZZZ': 'ZZZZ' // ABBR_UTC_TZ
+      }
+    };
diff --git a/packages/intl/lib/extract_messages.dart b/packages/intl/lib/extract_messages.dart
deleted file mode 100644
index 6bc7032..0000000
--- a/packages/intl/lib/extract_messages.dart
+++ /dev/null
@@ -1,512 +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.
-
-/**
- * This is for use in extracting messages from a Dart program
- * using the Intl.message() mechanism and writing them to a file for
- * translation. This provides only the stub of a mechanism, because it
- * doesn't define how the file should be written. It provides an
- * [IntlMessage] class that holds the extracted data and [parseString]
- * and [parseFile] methods which
- * can extract messages that conform to the expected pattern:
- *       (parameters) => Intl.message("Message $parameters", desc: ...);
- * It uses the analyzer package to do the parsing, so may
- * break if there are changes to the API that it provides.
- * An example can be found in test/message_extraction/extract_to_json.dart
- *
- * Note that this does not understand how to follow part directives, so it
- * has to explicitly be given all the files that it needs. A typical use case
- * is to run it on all .dart files in a directory.
- */
-library extract_messages;
-
-import 'dart:io';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:intl/src/intl_message.dart';
-
-/**
- * If this is true, print warnings for skipped messages. Otherwise, warnings
- * are suppressed.
- */
-bool suppressWarnings = false;
-
-/**
- * If this is true, then treat all warnings as errors.
- */
-bool warningsAreErrors = false;
-
-/**
- * This accumulates a list of all warnings/errors we have found. These are
- * saved as strings right now, so all that can really be done is print and
- * count them.
- */
-List<String> warnings = [];
-
-/** Were there any warnings or errors in extracting messages. */
-bool get hasWarnings => warnings.isNotEmpty;
-
-/** Are plural and gender expressions required to be at the top level
- * of an expression, or are they allowed to be embedded in string literals.
- *
- * For example, the following expression
- *     'There are ${Intl.plural(...)} items'.
- * is legal if [allowEmbeddedPluralsAndGenders] is true, but illegal
- * if [allowEmbeddedPluralsAndGenders] is false.
- */
-bool allowEmbeddedPluralsAndGenders = true;
-
-/**
- * Parse the source of the Dart program file [file] and return a Map from
- * message names to [IntlMessage] instances.
- */
-Map<String, MainMessage> parseFile(File file) {
-  try {
-    _root = parseDartFile(file.path);
-  } on AnalyzerErrorGroup catch (e) {
-    print("Error in parsing ${file.path}, no messages extracted.");
-    print("  $e");
-    return {};
-  }
-  _origin = file.path;
-  var visitor = new MessageFindingVisitor();
-  _root.accept(visitor);
-  return visitor.messages;
-}
-
-/**
- * The root of the compilation unit, and the first node we visit. We hold
- * on to this for error reporting, as it can give us line numbers of other
- * nodes.
- */
-CompilationUnit _root;
-
-/**
- * An arbitrary string describing where the source code came from. Most
- * obviously, this could be a file path. We use this when reporting
- * invalid messages.
- */
-String _origin;
-
-String _reportErrorLocation(AstNode node) {
-  var result = new StringBuffer();
-  if (_origin != null) result.write("    from $_origin");
-  var info = _root.lineInfo;
-  if (info != null) {
-    var line = info.getLocation(node.offset);
-    result.write("    line: ${line.lineNumber}, column: ${line.columnNumber}");
-  }
-  return result.toString();
-}
-
-/**
- * This visits the program source nodes looking for Intl.message uses
- * that conform to its pattern and then creating the corresponding
- * IntlMessage objects. We have to find both the enclosing function, and
- * the Intl.message invocation.
- */
-class MessageFindingVisitor extends GeneralizingAstVisitor {
-  MessageFindingVisitor();
-
-  /**
-   * Accumulates the messages we have found, keyed by name.
-   */
-  final Map<String, MainMessage> messages = new Map<String, MainMessage>();
-
-  /**
-   * We keep track of the data from the last MethodDeclaration,
-   * FunctionDeclaration or FunctionExpression that we saw on the way down,
-   * as that will be the nearest parent of the Intl.message invocation.
-   */
-  FormalParameterList parameters;
-  String name;
-
-  /** Return true if [node] matches the pattern we expect for Intl.message() */
-  bool looksLikeIntlMessage(MethodInvocation node) {
-    const validNames = const ["message", "plural", "gender", "select"];
-    if (!validNames.contains(node.methodName.name)) return false;
-    if (!(node.target is SimpleIdentifier)) return false;
-    SimpleIdentifier target = node.target;
-    return target.token.toString() == "Intl";
-  }
-
-  Message _expectedInstance(String type) {
-    switch (type) {
-      case 'message':
-        return new MainMessage();
-      case 'plural':
-        return new Plural();
-      case 'gender':
-        return new Gender();
-      case 'select':
-        return new Select();
-      default:
-        return null;
-    }
-  }
-
-  /**
-   * Returns a String describing why the node is invalid, or null if no
-   * reason is found, so it's presumed valid.
-   */
-  String checkValidity(MethodInvocation node) {
-    // The containing function cannot have named parameters.
-    if (parameters.parameters.any((each) => each.kind == ParameterKind.NAMED)) {
-      return "Named parameters on message functions are not supported.";
-    }
-    var arguments = node.argumentList.arguments;
-    var instance = _expectedInstance(node.methodName.name);
-    return instance.checkValidity(node, arguments, name, parameters);
-  }
-
-  /**
-   * Record the parameters of the function or method declaration we last
-   * encountered before seeing the Intl.message call.
-   */
-  void visitMethodDeclaration(MethodDeclaration node) {
-    parameters = node.parameters;
-    if (parameters == null) {
-      parameters = new FormalParameterList(null, [], null, null, null);
-    }
-    name = node.name.name;
-    super.visitMethodDeclaration(node);
-  }
-
-  /**
-   * Record the parameters of the function or method declaration we last
-   * encountered before seeing the Intl.message call.
-   */
-  void visitFunctionDeclaration(FunctionDeclaration node) {
-    parameters = node.functionExpression.parameters;
-    if (parameters == null) {
-      parameters = new FormalParameterList(null, [], null, null, null);
-    }
-    name = node.name.name;
-    super.visitFunctionDeclaration(node);
-  }
-
-  /**
-   * Examine method invocations to see if they look like calls to Intl.message.
-   * If we've found one, stop recursing. This is important because we can have
-   * Intl.message(...Intl.plural...) and we don't want to treat the inner
-   * plural as if it was an outermost message.
-   */
-  void visitMethodInvocation(MethodInvocation node) {
-    if (!addIntlMessage(node)) {
-      super.visitMethodInvocation(node);
-    }
-  }
-
-  /**
-   * Check that the node looks like an Intl.message invocation, and create
-   * the [IntlMessage] object from it and store it in [messages]. Return true
-   * if we successfully extracted a message and should stop looking. Return
-   * false if we didn't, so should continue recursing.
-   */
-  bool addIntlMessage(MethodInvocation node) {
-    if (!looksLikeIntlMessage(node)) return false;
-    var reason = checkValidity(node);
-    if (reason != null) {
-      if (!suppressWarnings) {
-        var err = new StringBuffer()
-          ..write("Skipping invalid Intl.message invocation\n    <$node>\n")
-          ..writeAll(["    reason: $reason\n", _reportErrorLocation(node)]);
-        warnings.add(err.toString());
-        print(err);
-      }
-      // We found one, but it's not valid. Stop recursing.
-      return true;
-    }
-    var message;
-    if (node.methodName.name == "message") {
-      message = messageFromIntlMessageCall(node);
-    } else {
-      message = messageFromDirectPluralOrGenderCall(node);
-    }
-    if (message != null) messages[message.name] = message;
-    return true;
-  }
-
-  /**
-   * Create a MainMessage from [node] using the name and
-   * parameters of the last function/method declaration we encountered,
-   * and the values we get by calling [extract]. We set those values
-   * by calling [setAttribute]. This is the common parts between
-   * [messageFromIntlMessageCall] and [messageFromDirectPluralOrGenderCall].
-   */
-  MainMessage _messageFromNode(
-      MethodInvocation node, Function extract, Function setAttribute) {
-    var message = new MainMessage();
-    message.name = name;
-    message.arguments =
-        parameters.parameters.map((x) => x.identifier.name).toList();
-    var arguments = node.argumentList.arguments;
-    var extractionResult = extract(message, arguments);
-    if (extractionResult == null) return null;
-
-    for (var namedArgument in arguments.where((x) => x is NamedExpression)) {
-      var name = namedArgument.name.label.name;
-      var exp = namedArgument.expression;
-      var evaluator = new ConstantEvaluator();
-      var basicValue = exp.accept(evaluator);
-      var value = basicValue == ConstantEvaluator.NOT_A_CONSTANT
-          ? exp.toString()
-          : basicValue;
-      setAttribute(message, name, value);
-    }
-    return message;
-  }
-
-  /**
-   * Create a MainMessage from [node] using the name and
-   * parameters of the last function/method declaration we encountered
-   * and the parameters to the Intl.message call.
-   */
-  MainMessage messageFromIntlMessageCall(MethodInvocation node) {
-    MainMessage extractFromIntlCall(MainMessage message, List arguments) {
-      try {
-        var interpolation = new InterpolationVisitor(message);
-        arguments.first.accept(interpolation);
-        if (interpolation.pieces.any((x) => x is Plural || x is Gender) &&
-            !allowEmbeddedPluralsAndGenders) {
-          if (interpolation.pieces.any((x) => x is String && x.isNotEmpty)) {
-            throw new IntlMessageExtractionException(
-                "Plural and gender expressions must be at the top level, "
-                "they cannot be embedded in larger string literals.\n"
-                "Error at $node");
-          }
-        }
-        message.messagePieces.addAll(interpolation.pieces);
-      } on IntlMessageExtractionException catch (e) {
-        message = null;
-        var err = new StringBuffer()
-          ..writeAll(["Error ", e, "\nProcessing <", node, ">\n"])
-          ..write(_reportErrorLocation(node));
-        print(err);
-        warnings.add(err.toString());
-      }
-      return message; // Because we may have set it to null on an error.
-    }
-
-    void setValue(MainMessage message, String fieldName, Object fieldValue) {
-      message[fieldName] = fieldValue;
-    }
-
-    return _messageFromNode(node, extractFromIntlCall, setValue);
-  }
-
-  /**
-   * Create a MainMessage from [node] using the name and
-   * parameters of the last function/method declaration we encountered
-   * and the parameters to the Intl.plural or Intl.gender call.
-   */
-  MainMessage messageFromDirectPluralOrGenderCall(MethodInvocation node) {
-    MainMessage extractFromPluralOrGender(MainMessage message, _) {
-      var visitor = new PluralAndGenderVisitor(message.messagePieces, message);
-      node.accept(visitor);
-      return message;
-    }
-
-    void setAttribute(MainMessage msg, String fieldName, String fieldValue) {
-      if (msg.attributeNames.contains(fieldName)) {
-        msg[fieldName] = fieldValue;
-      }
-    }
-    return _messageFromNode(node, extractFromPluralOrGender, setAttribute);
-  }
-}
-
-/**
- * Given an interpolation, find all of its chunks, validate that they are only
- * simple variable substitutions or else Intl.plural/gender calls,
- * and keep track of the pieces of text so that other parts
- * of the program can deal with the simple string sections and the generated
- * parts separately. Note that this is a SimpleAstVisitor, so it only
- * traverses one level of children rather than automatically recursing. If we
- * find a plural or gender, which requires recursion, we do it with a separate
- * special-purpose visitor.
- */
-class InterpolationVisitor extends SimpleAstVisitor {
-  final Message message;
-
-  InterpolationVisitor(this.message);
-
-  List pieces = [];
-  String get extractedMessage => pieces.join();
-
-  void visitAdjacentStrings(AdjacentStrings node) {
-    node.visitChildren(this);
-    super.visitAdjacentStrings(node);
-  }
-
-  void visitStringInterpolation(StringInterpolation node) {
-    node.visitChildren(this);
-    super.visitStringInterpolation(node);
-  }
-
-  void visitSimpleStringLiteral(SimpleStringLiteral node) {
-    pieces.add(node.value);
-    super.visitSimpleStringLiteral(node);
-  }
-
-  void visitInterpolationString(InterpolationString node) {
-    pieces.add(node.value);
-    super.visitInterpolationString(node);
-  }
-
-  void visitInterpolationExpression(InterpolationExpression node) {
-    if (node.expression is SimpleIdentifier) {
-      return handleSimpleInterpolation(node);
-    } else {
-      return lookForPluralOrGender(node);
-    }
-    // Note that we never end up calling super.
-  }
-
-  lookForPluralOrGender(InterpolationExpression node) {
-    var visitor = new PluralAndGenderVisitor(pieces, message);
-    node.accept(visitor);
-    if (!visitor.foundPluralOrGender) {
-      throw new IntlMessageExtractionException(
-          "Only simple identifiers and Intl.plural/gender/select expressions "
-          "are allowed in message "
-          "interpolation expressions.\nError at $node");
-    }
-  }
-
-  void handleSimpleInterpolation(InterpolationExpression node) {
-    var index = arguments.indexOf(node.expression.toString());
-    if (index == -1) {
-      throw new IntlMessageExtractionException(
-          "Cannot find argument ${node.expression}");
-    }
-    pieces.add(index);
-  }
-
-  List get arguments => message.arguments;
-}
-
-/**
- * A visitor to extract information from Intl.plural/gender sends. Note that
- * this is a SimpleAstVisitor, so it doesn't automatically recurse. So this
- * needs to be called where we expect a plural or gender immediately below.
- */
-class PluralAndGenderVisitor extends SimpleAstVisitor {
-  /**
-   * A plural or gender always exists in the context of a parent message,
-   * which could in turn also be a plural or gender.
-   */
-  final ComplexMessage parent;
-
-  /**
-   * The pieces of the message. We are given an initial version of this
-   * from our parent and we add to it as we find additional information.
-   */
-  List pieces;
-
-  /** This will be set to true if we find a plural or gender. */
-  bool foundPluralOrGender = false;
-
-  PluralAndGenderVisitor(this.pieces, this.parent) : super();
-
-  visitInterpolationExpression(InterpolationExpression node) {
-    // TODO(alanknight): Provide better errors for malformed expressions.
-    if (!looksLikePluralOrGender(node.expression)) return;
-    var reason = checkValidity(node.expression);
-    if (reason != null) throw reason;
-    var message = messageFromMethodInvocation(node.expression);
-    foundPluralOrGender = true;
-    pieces.add(message);
-    super.visitInterpolationExpression(node);
-  }
-
-  visitMethodInvocation(MethodInvocation node) {
-    pieces.add(messageFromMethodInvocation(node));
-    super.visitMethodInvocation(node);
-  }
-
-  /** Return true if [node] matches the pattern for plural or gender message.*/
-  bool looksLikePluralOrGender(MethodInvocation node) {
-    if (!["plural", "gender", "select"].contains(node.methodName.name)) {
-      return false;
-    }
-    if (!(node.target is SimpleIdentifier)) return false;
-    SimpleIdentifier target = node.target;
-    return target.token.toString() == "Intl";
-  }
-
-  /**
-   * Returns a String describing why the node is invalid, or null if no
-   * reason is found, so it's presumed valid.
-   */
-  String checkValidity(MethodInvocation node) {
-    // TODO(alanknight): Add reasonable validity checks.
-    return null;
-  }
-
-  /**
-   * Create a MainMessage from [node] using the name and
-   * parameters of the last function/method declaration we encountered
-   * and the parameters to the Intl.message call.
-   */
-  Message messageFromMethodInvocation(MethodInvocation node) {
-    var message;
-    switch (node.methodName.name) {
-      case "gender":
-        message = new Gender();
-        break;
-      case "plural":
-        message = new Plural();
-        break;
-      case "select":
-        message = new Select();
-        break;
-      default:
-        throw new IntlMessageExtractionException(
-            "Invalid plural/gender/select message");
-    }
-    message.parent = parent;
-
-    var arguments = message.argumentsOfInterestFor(node);
-    arguments.forEach((key, value) {
-      try {
-        var interpolation = new InterpolationVisitor(message);
-        value.accept(interpolation);
-        message[key] = interpolation.pieces;
-      } on IntlMessageExtractionException catch (e) {
-        message = null;
-        var err = new StringBuffer()
-          ..writeAll(["Error ", e, "\nProcessing <", node, ">"])
-          ..write(_reportErrorLocation(node));
-        print(err);
-        warnings.add(err.toString());
-      }
-    });
-    var mainArg = node.argumentList.arguments
-        .firstWhere((each) => each is! NamedExpression);
-    if (mainArg is SimpleStringLiteral) {
-      message.mainArgument = mainArg.toString();
-    } else {
-      message.mainArgument = mainArg.name;
-    }
-    return message;
-  }
-}
-
-/**
- * Exception thrown when we cannot process a message properly.
- */
-class IntlMessageExtractionException implements Exception {
-  /**
-   * A message describing the error.
-   */
-  final String message;
-
-  /**
-   * Creates a new exception with an optional error [message].
-   */
-  const IntlMessageExtractionException([this.message = ""]);
-
-  String toString() => "IntlMessageExtractionException: $message";
-}
diff --git a/packages/intl/lib/generate_localized.dart b/packages/intl/lib/generate_localized.dart
deleted file mode 100644
index 80ab958..0000000
--- a/packages/intl/lib/generate_localized.dart
+++ /dev/null
@@ -1,253 +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.
-
-/**
- * This provides utilities for generating localized versions of
- * messages. It does not stand alone, but expects to be given
- * TranslatedMessage objects and generate code for a particular locale
- * based on them.
- *
- * An example of usage can be found
- * in test/message_extract/generate_from_json.dart
- */
-library generate_localized;
-
-import 'intl.dart';
-import 'src/intl_message.dart';
-import 'dart:io';
-import 'package:path/path.dart' as path;
-
-/**
- * If the import path following package: is something else, modify the
- * [intlImportPath] variable to change the import directives in the generated
- * code.
- */
-var intlImportPath = 'intl';
-
-/**
- * If the path to the generated files is something other than the current
- * directory, update the [generatedImportPath] variable to change the import
- * directives in the generated code.
- */
-var generatedImportPath = '';
-
-/**
- * Given a base file, return the file prefixed with the path to import it.
- * By default, that is in the current directory, but if [generatedImportPath]
- * has been set, then use that as a prefix.
- */
-String importForGeneratedFile(String file) =>
-    generatedImportPath.isEmpty ? file : "$generatedImportPath/$file";
-
-/**
- * A list of all the locales for which we have translations. Code that does
- * the reading of translations should add to this.
- */
-List<String> allLocales = [];
-
-/**
- * If we have more than one set of messages to generate in a particular
- * directory we may want to prefix some to distinguish them.
- */
-String generatedFilePrefix = '';
-
-/**
- * Should we use deferred loading for the generated libraries.
- */
-bool useDeferredLoading = true;
-
-/**
- * This represents a message and its translation. We assume that the translation
- * has some identifier that allows us to figure out the original message it
- * corresponds to, and that it may want to transform the translated text in
- * some way, e.g. to turn whatever format the translation uses for variables
- * into a Dart string interpolation. Specific translation
- * mechanisms are expected to subclass this.
- */
-abstract class TranslatedMessage {
-  /**
-   * The identifier for this message. In the simplest case, this is the name
-   * parameter from the Intl.message call,
-   * but it can be any identifier that this program and the output of the
-   * translation can agree on as identifying a message.
-   */
-  final String id;
-
-  /** Our translated version of all the [originalMessages]. */
-  final Message translated;
-
-  /**
-   * The original messages that we are a translation of. There can
-   *  be more than one original message for the same translation.
-   */
-  List<MainMessage> originalMessages;
-
-  /**
-   * For backward compatibility, we still have the originalMessage API.
-   */
-  MainMessage get originalMessage => originalMessages.first;
-  set originalMessage(MainMessage m) => originalMessages = [m];
-
-  TranslatedMessage(this.id, this.translated);
-
-  Message get message => translated;
-
-  toString() => id.toString();
-}
-
-/**
- * We can't use a hyphen in a Dart library name, so convert the locale
- * separator to an underscore.
- */
-String _libraryName(String x) => 'messages_' + x.replaceAll('-', '_');
-
-/**
- * Generate a file <[generated_file_prefix]>_messages_<[locale]>.dart
- * for the [translations] in [locale] and put it in [targetDir].
- */
-void generateIndividualMessageFile(String basicLocale,
-    Iterable<TranslatedMessage> translations, String targetDir) {
-  var result = new StringBuffer();
-  var locale = new MainMessage()
-      .escapeAndValidateString(Intl.canonicalizedLocale(basicLocale));
-  result.write(prologue(locale));
-  // Exclude messages with no translation and translations with no matching
-  // original message (e.g. if we're using some messages from a larger catalog)
-  var usableTranslations = translations
-      .where((each) => each.originalMessages != null && each.message != null)
-      .toList();
-  for (var each in usableTranslations) {
-    for (var original in each.originalMessages) {
-      original.addTranslation(locale, each.message);
-    }
-  }
-  usableTranslations.sort((a, b) =>
-      a.originalMessages.first.name.compareTo(b.originalMessages.first.name));
-  for (var translation in usableTranslations) {
-    for (var original in translation.originalMessages) {
-      result
-        ..write("  ")
-        ..write(original.toCodeForLocale(locale))
-        ..write("\n\n");
-    }
-  }
-  result.write("\n  final messages = const {\n");
-  var entries = usableTranslations
-      .expand((translation) => translation.originalMessages)
-      .map((original) => original.name)
-      .map((name) => "    \"$name\" : $name");
-  result
-    ..write(entries.join(",\n"))
-    ..write("\n  };\n}");
-
-  // To preserve compatibility, we don't use the canonical version of the locale
-  // in the file name.
-  var filename =
-      path.join(targetDir, "${generatedFilePrefix}messages_$basicLocale.dart");
-  new File(filename).writeAsStringSync(result.toString());
-}
-
-/**
- * This returns the mostly constant string used in
- * [generateIndividualMessageFile] for the beginning of the file,
- * parameterized by [locale].
- */
-String prologue(String locale) => """
-/**
- * DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
- * This is a library that provides messages for a $locale locale. All the
- * messages from the main program should be duplicated here with the same
- * function name.
- */
-
-library ${_libraryName(locale)};
-import 'package:$intlImportPath/intl.dart';
-import 'package:$intlImportPath/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-class MessageLookup extends MessageLookupByLibrary {
-
-  get localeName => '$locale';
-""";
-
-/**
- * This section generates the messages_all.dart file based on the list of
- * [allLocales].
- */
-String generateMainImportFile() {
-  var output = new StringBuffer();
-  output.write(mainPrologue);
-  for (var locale in allLocales) {
-    var baseFile = '${generatedFilePrefix}messages_$locale.dart';
-    var file = importForGeneratedFile(baseFile);
-    output.write("import '$file' ");
-    if (useDeferredLoading) output.write("deferred ");
-    output.write("as ${_libraryName(locale)};\n");
-  }
-  output.write("\n");
-  output.write("\nMap<String, Function> _deferredLibraries = {\n");
-  for (var rawLocale in allLocales) {
-    var locale = Intl.canonicalizedLocale(rawLocale);
-    var loadOperation = (useDeferredLoading)
-        ? "  '$locale' : () => ${_libraryName(locale)}.loadLibrary(),\n"
-        : "  '$locale' : () => new Future.value(null),\n";
-    output.write(loadOperation);
-  }
-  output.write("};\n");
-  output.write("\nMessageLookupByLibrary _findExact(localeName) {\n"
-      "  switch (localeName) {\n");
-  for (var rawLocale in allLocales) {
-    var locale = Intl.canonicalizedLocale(rawLocale);
-    output.write(
-        "    case '$locale' : return ${_libraryName(locale)}.messages;\n");
-  }
-  output.write(closing);
-  return output.toString();
-}
-
-/**
- * Constant string used in [generateMainImportFile] for the beginning of the
- * file.
- */
-var mainPrologue = """
-/**
- * DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
- * This is a library that looks up messages for specific locales by
- * delegating to the appropriate library.
- */
-
-library messages_all;
-
-import 'dart:async';
-import 'package:$intlImportPath/message_lookup_by_library.dart';
-import 'package:$intlImportPath/src/intl_helpers.dart';
-import 'package:$intlImportPath/intl.dart';
-
-""";
-
-/**
- * Constant string used in [generateMainImportFile] as the end of the file.
- */
-const closing = """
-    default: return null;
-  }
-}
-
-/** User programs should call this before using [localeName] for messages.*/
-Future initializeMessages(String localeName) {
-  initializeInternalMessageLookup(() => new CompositeMessageLookup());
-  var lib = _deferredLibraries[Intl.canonicalizedLocale(localeName)];
-  var load = lib == null ? new Future.value(false) : lib();
-  return load.then((_) =>
-      messageLookup.addLocale(localeName, _findGeneratedMessagesFor));
-}
-
-MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
-  var actualLocale = Intl.verifiedLocale(locale, (x) => _findExact(x) != null,
-      onFailure: (_) => null);
-  if (actualLocale == null) return null;
-  return _findExact(actualLocale);
-}
-""";
diff --git a/packages/intl/lib/intl.dart b/packages/intl/lib/intl.dart
index d952691..095eb71 100644
--- a/packages/intl/lib/intl.dart
+++ b/packages/intl/lib/intl.dart
@@ -2,22 +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.
 
-/**
- * This library provides internationalization and localization. This includes
- * message formatting and replacement, date and number formatting and parsing,
- * and utilities for working with Bidirectional text.
- *
- * This is part of the [intl package]
- * (https://pub.dartlang.org/packages/intl).
- *
- * For things that require locale or other data, there are multiple different
- * ways of making that data available, which may require importing different
- * libraries. See the class comments for more details.
- *
- * There is also a simple example application that can be found in the
- * [example/basic](https://github.com/dart-lang/intl/tree/master/example/basic)
- * directory.
- */
+/// This library provides internationalization and localization. This includes
+/// message formatting and replacement, date and number formatting and parsing,
+/// and utilities for working with Bidirectional text.
+///
+/// This is part of the [intl package]
+/// (https://pub.dartlang.org/packages/intl).
+///
+/// For things that require locale or other data, there are multiple different
+/// ways of making that data available, which may require importing different
+/// libraries. See the class comments for more details.
+///
+/// There is also a simple example application that can be found in the
+/// [example/basic](https://github.com/dart-lang/intl/tree/master/example/basic)
+/// directory.
 library intl;
 
 import 'dart:async';
@@ -30,182 +28,177 @@
 import 'number_symbols_data.dart';
 import 'src/date_format_internal.dart';
 import 'src/intl_helpers.dart';
+import 'package:intl/src/plural_rules.dart' as plural_rules;
 
 part 'src/intl/bidi_formatter.dart';
 part 'src/intl/bidi_utils.dart';
+
+part 'src/intl/compact_number_format.dart';
 part 'src/intl/date_format.dart';
 part 'src/intl/date_format_field.dart';
 part 'src/intl/date_format_helpers.dart';
 part 'src/intl/number_format.dart';
 
-/**
- * The Intl class provides a common entry point for internationalization
- * related tasks. An Intl instance can be created for a particular locale
- * and used to create a date format via `anIntl.date()`. Static methods
- * on this class are also used in message formatting.
- *
- * Examples:
- *      today(date) => Intl.message(
- *          "Today's date is $date",
- *          name: 'today',
- *          args: [date],
- *          desc: 'Indicate the current date',
- *          examples: {'date' : 'June 8, 2012'});
- *      print(today(new DateTime.now().toString());
- *
- *      howManyPeople(numberOfPeople, place) => Intl.plural(
- *            zero: 'I see no one at all',
- *            one: 'I see one other person',
- *            other: 'I see $numberOfPeople other people')} in $place.''',
- *          name: 'msg',
- *          args: [numberOfPeople, place],
- *          desc: 'Description of how many people are seen in a place.',
- *          examples: {'numberOfPeople': 3, 'place': 'London'});
- *
- * Calling `howManyPeople(2, 'Athens');` would
- * produce "I see 2 other people in Athens." as output in the default locale.
- * If run in a different locale it would produce appropriately translated
- * output.
- *
- * For more detailed information on messages and localizing them see
- * the main [package documentation](https://pub.dartlang.org/packages/intl)
- *
- * You can set the default locale.
- *       Intl.defaultLocale = "pt_BR";
- *
- * To temporarily use a locale other than the default, use the `withLocale`
- * function.
- *       var todayString = new DateFormat("pt_BR").format(new DateTime.now());
- *       print(withLocale("pt_BR", () => today(todayString));
- *
- * See `tests/message_format_test.dart` for more examples.
- */
+/// The Intl class provides a common entry point for internationalization
+/// related tasks. An Intl instance can be created for a particular locale
+/// and used to create a date format via `anIntl.date()`. Static methods
+/// on this class are also used in message formatting.
+///
+/// Examples:
+///      today(date) => Intl.message(
+///          "Today's date is $date",
+///          name: 'today',
+///          args: [date],
+///          desc: 'Indicate the current date',
+///          examples: const {'date' : 'June 8, 2012'});
+///      print(today(new DateTime.now().toString());
+///
+///      howManyPeople(numberOfPeople, place) => Intl.plural(
+///            zero: 'I see no one at all',
+///            one: 'I see one other person',
+///            other: 'I see $numberOfPeople other people')} in $place.''',
+///          name: 'msg',
+///          args: [numberOfPeople, place],
+///          desc: 'Description of how many people are seen in a place.',
+///          examples: const {'numberOfPeople': 3, 'place': 'London'});
+///
+/// Calling `howManyPeople(2, 'Athens');` would
+/// produce "I see 2 other people in Athens." as output in the default locale.
+/// If run in a different locale it would produce appropriately translated
+/// output.
+///
+/// For more detailed information on messages and localizing them see
+/// the main [package documentation](https://pub.dartlang.org/packages/intl)
+///
+/// You can set the default locale.
+///       Intl.defaultLocale = "pt_BR";
+///
+/// To temporarily use a locale other than the default, use the `withLocale`
+/// function.
+///       var todayString = new DateFormat("pt_BR").format(new DateTime.now());
+///       print(withLocale("pt_BR", () => today(todayString));
+///
+/// See `tests/message_format_test.dart` for more examples.
 //TODO(efortuna): documentation example involving the offset parameter?
 
 class Intl {
-  /**
-   * String indicating the locale code with which the message is to be
-   * formatted (such as en-CA).
-   */
+  /// String indicating the locale code with which the message is to be
+  /// formatted (such as en-CA).
   String _locale;
 
-  /**
-   * The default locale. This defaults to being set from systemLocale, but
-   * can also be set explicitly, and will then apply to any new instances where
-   * the locale isn't specified. Note that a locale parameter to
-   * [Intl.withLocale]
-   * will supercede this value while that operation is active. Using
-   * [Intl.withLocale] may be preferable if you are using different locales
-   * in the same application.
-   */
+  /// The default locale. This defaults to being set from systemLocale, but
+  /// can also be set explicitly, and will then apply to any new instances where
+  /// the locale isn't specified. Note that a locale parameter to
+  /// [Intl.withLocale]
+  /// will supercede this value while that operation is active. Using
+  /// [Intl.withLocale] may be preferable if you are using different locales
+  /// in the same application.
   static String get defaultLocale {
     var zoneLocale = Zone.current[#Intl.locale];
     return zoneLocale == null ? _defaultLocale : zoneLocale;
   }
-  static set defaultLocale(String newLocale) => _defaultLocale = newLocale;
+
+  static set defaultLocale(String newLocale) {
+    _defaultLocale = newLocale;
+  }
+
   static String _defaultLocale;
 
-  /**
-   * The system's locale, as obtained from the window.navigator.language
-   * or other operating system mechanism. Note that due to system limitations
-   * this is not automatically set, and must be set by importing one of
-   * intl_browser.dart or intl_standalone.dart and calling findSystemLocale().
-   */
+  /// The system's locale, as obtained from the window.navigator.language
+  /// or other operating system mechanism. Note that due to system limitations
+  /// this is not automatically set, and must be set by importing one of
+  /// intl_browser.dart or intl_standalone.dart and calling findSystemLocale().
   static String systemLocale = 'en_US';
 
-  /**
-   * Return a new date format using the specified [pattern].
-   * If [desiredLocale] is not specified, then we default to [locale].
-   */
+  /// Return a new date format using the specified [pattern].
+  /// If [desiredLocale] is not specified, then we default to [locale].
   DateFormat date([String pattern, String desiredLocale]) {
     var actualLocale = (desiredLocale == null) ? locale : desiredLocale;
     return new DateFormat(pattern, actualLocale);
   }
 
-  /**
-   * Constructor optionally [aLocale] for specifics of the language
-   * locale to be used, otherwise, we will attempt to infer it (acceptable if
-   * Dart is running on the client, we can infer from the browser/client
-   * preferences).
-   */
+  /// Constructor optionally [aLocale] for specifics of the language
+  /// locale to be used, otherwise, we will attempt to infer it (acceptable if
+  /// Dart is running on the client, we can infer from the browser/client
+  /// preferences).
   Intl([String aLocale]) {
     _locale = aLocale != null ? aLocale : getCurrentLocale();
   }
 
-  /**
-   * Use this for a message that will be translated for different locales. The
-   * expected usage is that this is inside an enclosing function that only
-   * returns the value of this call and provides a scope for the variables that
-   * will be substituted in the message.
-   *
-   * The [message_str] is the string to be translated, which may be interpolated
-   * based on one or more variables. The [name] of the message must 
-   * match the enclosing function name. For methods, it can also be 
-   * className_methodName. So for a method hello in class Simple, the name
-   * can be either "hello" or "Simple_hello". The name must also be globally
-   * unique in the program, so the second form can make it easier to distinguish
-   * messages with the same name but in different classes.
-   * The [args] repeats the arguments of the enclosing
-   * function, [desc] provides a description of usage, 
-   * [examples] is a Map of exmaples for each interpolated variable. For example
-   *       hello(yourName) => Intl.message(
-   *         "Hello, $yourName",
-   *         name: "hello",
-   *         args: [yourName],
-   *         desc: "Say hello",
-   *         examples = {"yourName": "Sparky"}.
-   * The source code will be processed via the analyzer to extract out the
-   * message data, so only a subset of valid Dart code is accepted. In
-   * particular, everything must be literal and cannot refer to variables
-   * outside the scope of the enclosing function. The [examples] map must
-   * be a valid const literal map. Similarly, the [desc] argument must
-   * be a single, simple string. These two arguments will not be used at runtime
-   * but will be extracted from
-   * the source code and used as additional data for translators. For more
-   * information see the "Messages" section of the main [package documentation]
-   * (https://pub.dartlang.org/packages/intl).
-   *
-   * The [name] and [args] arguments are required, and are used at runtime
-   * to look up the localized version and pass the appropriate arguments to it.
-   * We may in the future modify the code during compilation to make manually
-   * passing those arguments unnecessary.
-   */
-  static String message(String message_str, {String desc: '',
-      Map<String, String> examples: const {}, String locale, String name,
-      List<String> args, String meaning}) {
+  /// Use this for a message that will be translated for different locales. The
+  /// expected usage is that this is inside an enclosing function that only
+  /// returns the value of this call and provides a scope for the variables that
+  /// will be substituted in the message.
+  ///
+  /// The [message_str] is the string to be translated, which may be
+  /// interpolated based on one or more variables. The [name] of the message
+  /// must match the enclosing function name. For methods, it can also be
+  /// className_methodName. So for a method hello in class Simple, the name can
+  /// be either "hello" or "Simple_hello". The name must also be globally unique
+  /// in the program, so the second form can make it easier to distinguish
+  /// messages with the same name but in different classes.
+  ///
+  /// The [args] repeats the arguments of the enclosing
+  /// function, [desc] provides a description of usage,
+  /// [examples] is a Map of examples for each interpolated variable.
+  /// For example
+  ///
+  ///       hello(yourName) => Intl.message(
+  ///         "Hello, $yourName",
+  ///         name: "hello",
+  ///         args: [yourName],
+  ///         desc: "Say hello",
+  ///         examples = const {"yourName": "Sparky"}.
+  ///
+  /// The source code will be processed via the analyzer to extract out the
+  /// message data, so only a subset of valid Dart code is accepted. In
+  /// particular, everything must be literal and cannot refer to variables
+  /// outside the scope of the enclosing function. The [examples] map must be a
+  /// valid const literal map. Similarly, the [desc] argument must be a single,
+  /// simple string. These two arguments will not be used at runtime but will be
+  /// extracted from the source code and used as additional data for
+  /// translators. For more information see the "Messages" section of the main
+  /// [package documentation] (https://pub.dartlang.org/packages/intl).
+  ///
+  /// The [name] and [args] arguments are required, and are used at runtime
+  /// to look up the localized version and pass the appropriate arguments to it.
+  /// We may in the future modify the code during compilation to make manually
+  /// passing those arguments unnecessary.
+  static String message(String message_str,
+          {String desc: '',
+          Map<String, dynamic> examples: const {},
+          String locale,
+          String name,
+          List args,
+          String meaning}) =>
+      _message(message_str, locale, name, args, meaning);
+
+  /// Omit the compile-time only parameters so dart2js can see to drop them.
+  static _message(String message_str, String locale, String name, List args,
+      String meaning) {
     return messageLookup.lookupMessage(
-        message_str, desc, examples, locale, name, args, meaning);
+        message_str, locale, name, args, meaning);
   }
 
-  /**
-   * Return the locale for this instance. If none was set, the locale will
-   * be the default.
-   */
+  /// Return the locale for this instance. If none was set, the locale will
+  /// be the default.
   String get locale => _locale;
 
-  /**
-   * Return true if the locale exists, or if it is null. The null case
-   * is interpreted to mean that we use the default locale.
-   */
-  static bool _localeExists(localeName) => DateFormat.localeExists(localeName);
-
-  /**
-   * Given [newLocale] return a locale that we have data for that is similar
-   * to it, if possible.
-   *
-   * If [newLocale] is found directly, return it. If it can't be found, look up
-   * based on just the language (e.g. 'en_CA' -> 'en'). Also accepts '-'
-   * as a separator and changes it into '_' for lookup, and changes the
-   * country to uppercase.
-   *
-   * There is a special case that if a locale named "fallback" is present
-   * and has been initialized, this will return that name. This can be useful
-   * for messages where you don't want to just use the text from the original
-   * source code, but wish to have a universal fallback translation.
-   *
-   * Note that null is interpreted as meaning the default locale, so if
-   * [newLocale] is null it will be returned.
-   */
+  /// Given [newLocale] return a locale that we have data for that is similar
+  /// to it, if possible.
+  ///
+  /// If [newLocale] is found directly, return it. If it can't be found, look up
+  /// based on just the language (e.g. 'en_CA' -> 'en'). Also accepts '-'
+  /// as a separator and changes it into '_' for lookup, and changes the
+  /// country to uppercase.
+  ///
+  /// There is a special case that if a locale named "fallback" is present
+  /// and has been initialized, this will return that name. This can be useful
+  /// for messages where you don't want to just use the text from the original
+  /// source code, but wish to have a universal fallback translation.
+  ///
+  /// Note that null is interpreted as meaning the default locale, so if
+  /// [newLocale] is null the default locale will be returned.
   static String verifiedLocale(String newLocale, Function localeExists,
       {Function onFailure: _throwLocaleError}) {
     // TODO(alanknight): Previously we kept a single verified locale on the Intl
@@ -220,8 +213,11 @@
     if (localeExists(newLocale)) {
       return newLocale;
     }
-    for (var each in
-        [canonicalizedLocale(newLocale), shortLocale(newLocale), "fallback"]) {
+    for (var each in [
+      canonicalizedLocale(newLocale),
+      shortLocale(newLocale),
+      "fallback"
+    ]) {
       if (localeExists(each)) {
         return each;
       }
@@ -229,26 +225,22 @@
     return onFailure(newLocale);
   }
 
-  /**
-   * The default action if a locale isn't found in verifiedLocale. Throw
-   * an exception indicating the locale isn't correct.
-   */
+  /// The default action if a locale isn't found in verifiedLocale. Throw
+  /// an exception indicating the locale isn't correct.
   static String _throwLocaleError(String localeName) {
     throw new ArgumentError("Invalid locale '$localeName'");
   }
 
-  /** Return the short version of a locale name, e.g. 'en_US' => 'en' */
+  /// Return the short version of a locale name, e.g. 'en_US' => 'en'
   static String shortLocale(String aLocale) {
     if (aLocale.length < 2) return aLocale;
     return aLocale.substring(0, 2).toLowerCase();
   }
 
-  /**
-   * Return the name [aLocale] turned into xx_YY where it might possibly be
-   * in the wrong case or with a hyphen instead of an underscore. If
-   * [aLocale] is null, for example, if you tried to get it from IE,
-   * return the current system locale.
-   */
+  /// Return the name [aLocale] turned into xx_YY where it might possibly be
+  /// in the wrong case or with a hyphen instead of an underscore. If
+  /// [aLocale] is null, for example, if you tried to get it from IE,
+  /// return the current system locale.
   static String canonicalizedLocale(String aLocale) {
     // Locales of length < 5 are presumably two-letter forms, or else malformed.
     // We return them unmodified and if correct they will be found.
@@ -267,61 +259,116 @@
     return '${aLocale[0]}${aLocale[1]}_$region';
   }
 
-  /**
-   * Format a message differently depending on [howMany]. Normally used
-   * as part of an `Intl.message` text that is to be translated.
-   * Selects the correct plural form from
-   * the provided alternatives. The [other] named argument is mandatory.
-   */
-  static String plural(int howMany, {zero, one, two, few, many, other,
-      String desc, Map<String, String> examples, String locale, String name,
-      List<String> args, String meaning}) {
+  /// Format a message differently depending on [howMany]. Normally used
+  /// as part of an `Intl.message` text that is to be translated.
+  /// Selects the correct plural form from
+  /// the provided alternatives. The [other] named argument is mandatory.
+  static String plural(int howMany,
+      {zero,
+      one,
+      two,
+      few,
+      many,
+      other,
+      String desc,
+      Map<String, dynamic> examples,
+      String locale,
+      String name,
+      List args,
+      String meaning}) {
     // If we are passed a name and arguments, then we are operating as a
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
     if (name != null) {
-      return message(plural(howMany,
+      return message(
+          plural(howMany,
               zero: zero,
               one: one,
               two: two,
               few: few,
               many: many,
-              other: other),
-          name: name, args: args, locale: locale, meaning: meaning);
+              other: other,
+              locale: locale),
+          name: name,
+          args: args,
+          locale: locale,
+          meaning: meaning);
     }
     if (other == null) {
       throw new ArgumentError("The 'other' named argument must be provided");
     }
-    // TODO(alanknight): This algorithm needs to be locale-dependent.
-    switch (howMany) {
-      case 0:
-        return (zero == null) ? other : zero;
-      case 1:
-        return (one == null) ? other : one;
-      case 2:
-        return (two == null) ? ((few == null) ? other : few) : two;
-      default:
-        if ((howMany == 3 || howMany == 4) && few != null) return few;
-        if (howMany > 10 && howMany < 100 && many != null) return many;
-        return other;
+    if (howMany == null) {
+      throw new ArgumentError("The howMany argument to plural cannot be null");
     }
-    throw new ArgumentError("Invalid plural usage for $howMany");
+    // If there's an explicit case for the exact number, we use it. This is not
+    // strictly in accord with the CLDR rules, but it seems to be the
+    // expectation. At least I see e.g. Russian translations that have a zero
+    // case defined. The rule for that locale will never produce a zero, and
+    // treats it as other. But it seems reasonable that, even if the language
+    // rules treat zero as other, we might want a special message for zero.
+    if (howMany == 0 && zero != null) return zero;
+    if (howMany == 1 && one != null) return one;
+    if (howMany == 2 && two != null) return two;
+    var pluralRule = _pluralRule(locale, howMany);
+    var pluralCase = pluralRule();
+    switch (pluralCase) {
+      case plural_rules.PluralCase.ZERO:
+        return zero ?? other;
+      case plural_rules.PluralCase.ONE:
+        return one ?? other;
+      case plural_rules.PluralCase.TWO:
+        return two ?? few ?? other;
+      case plural_rules.PluralCase.FEW:
+        return few ?? other;
+      case plural_rules.PluralCase.MANY:
+        return many ?? other;
+      case plural_rules.PluralCase.OTHER:
+        return other;
+      default:
+        throw new ArgumentError.value(
+            howMany, "howMany", "Invalid plural argument");
+    }
   }
 
-  /**
-   * Format a message differently depending on [targetGender]. Normally used as
-   * part of an Intl.message message that is to be translated.
-   */
-  static String gender(String targetGender, {String male, String female,
-      String other, String desc, Map<String, String> examples, String locale,
-      String name, List<String> args, String meaning}) {
+  static var _cachedPluralRule;
+  static String _cachedPluralLocale;
+
+  static _pluralRule(String locale, int howMany) {
+    plural_rules.startRuleEvaluation(howMany);
+    var verifiedLocale = Intl.verifiedLocale(
+        locale, plural_rules.localeHasPluralRules,
+        onFailure: (locale) => 'default');
+    if (_cachedPluralLocale == verifiedLocale) {
+      return _cachedPluralRule;
+    } else {
+      _cachedPluralRule = plural_rules.pluralRules[verifiedLocale];
+      _cachedPluralLocale = verifiedLocale;
+      return _cachedPluralRule;
+    }
+  }
+
+  /// Format a message differently depending on [targetGender]. Normally used as
+  /// part of an Intl.message message that is to be translated.
+  static String gender(String targetGender,
+      {String male,
+      String female,
+      String other,
+      String desc,
+      Map<String, dynamic> examples,
+      String locale,
+      String name,
+      List args,
+      String meaning}) {
     // If we are passed a name and arguments, then we are operating as a
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
     if (name != null) {
       return message(
           gender(targetGender, male: male, female: female, other: other),
-          name: name, args: args, locale: locale, meaning: meaning);
+          name: name,
+          args: args,
+          locale: locale,
+          meaning: meaning);
     }
 
     if (other == null) {
@@ -337,15 +384,19 @@
     }
   }
 
-  /**
-   * Format a message differently depending on [choice]. We look up the value
-   * of [choice] in [cases] and return the result, or an empty string if
-   * it is not found. Normally used as part
-   * of an Intl.message message that is to be translated.
-   */
-  static String select(String choice, Map<String, String> cases, {String desc,
-      Map<String, String> examples, String locale, String name,
-      List<String> args, String meaning}) {
+  /// Format a message differently depending on [choice]. We look up the value
+  /// of [choice] in [cases] and return the result, or an empty string if
+  /// it is not found. Normally used as part
+  /// of an Intl.message message that is to be translated.
+  static String select(Object choice, Map<String, String> cases,
+      {String desc,
+      Map<String, dynamic> examples,
+      String locale,
+      String name,
+      List args,
+      String meaning}) {
+    // Allow passing non-strings, e.g. enums to a select.
+    choice = "$choice";
     // If we are passed a name and arguments, then we are operating as a
     // top-level message, so look up our translation by calling Intl.message
     // with ourselves as an argument.
@@ -356,46 +407,42 @@
     var exact = cases[choice];
     if (exact != null) return exact;
     var other = cases["other"];
-    if (other ==
-        null) throw new ArgumentError("The 'other' case must be specified");
+    if (other == null)
+      throw new ArgumentError("The 'other' case must be specified");
     return other;
   }
 
-  /**
-   * Run [function] with the default locale set to [locale] and
-   * return the result.
-   *
-   * This is run in a zone, so async operations invoked
-   * from within [function] will still have the locale set.
-   *
-   * In simple usage [function] might be a single
-   * `Intl.message()` call or number/date formatting operation. But it can
-   * also be an arbitrary function that calls multiple Intl operations.
-   *
-   * For example
-   *
-   *       Intl.withLocale("fr", () => new NumberFormat.format(123456));
-   *
-   * or
-   *
-   *       hello(name) => Intl.message(
-   *           "Hello $name.",
-   *           name: 'hello',
-   *           args: [name],
-   *           desc: 'Say Hello');
-   *       Intl.withLocale("zh", new Timer(new Duration(milliseconds:10),
-   *           () => print(hello("World")));
-   */
+  /// Run [function] with the default locale set to [locale] and
+  /// return the result.
+  ///
+  /// This is run in a zone, so async operations invoked
+  /// from within [function] will still have the locale set.
+  ///
+  /// In simple usage [function] might be a single
+  /// `Intl.message()` call or number/date formatting operation. But it can
+  /// also be an arbitrary function that calls multiple Intl operations.
+  ///
+  /// For example
+  ///
+  ///       Intl.withLocale("fr", () => new NumberFormat.format(123456));
+  ///
+  /// or
+  ///
+  ///       hello(name) => Intl.message(
+  ///           "Hello $name.",
+  ///           name: 'hello',
+  ///           args: [name],
+  ///           desc: 'Say Hello');
+  ///       Intl.withLocale("zh", new Timer(new Duration(milliseconds:10),
+  ///           () => print(hello("World")));
   static withLocale(String locale, function()) {
     var canonical = Intl.canonicalizedLocale(locale);
     return runZoned(function, zoneValues: {#Intl.locale: canonical});
   }
 
-  /**
-   * Accessor for the current locale. This should always == the default locale,
-   * unless for some reason this gets called inside a message that resets the
-   * locale.
-   */
+  /// Accessor for the current locale. This should always == the default locale,
+  /// unless for some reason this gets called inside a message that resets the
+  /// locale.
   static String getCurrentLocale() {
     if (defaultLocale == null) defaultLocale = systemLocale;
     return defaultLocale;
@@ -403,3 +450,34 @@
 
   toString() => "Intl($locale)";
 }
+
+/// Convert a string to beginning of sentence case, in a way appropriate to the
+/// locale.
+///
+/// Currently this just converts the first letter to uppercase, which works for
+/// many locales, and we have the option to extend this to handle more cases
+/// without changing the API for clients. It also hard-codes the case of
+/// dotted i in Turkish and Azeri.
+String toBeginningOfSentenceCase(String input, [String locale]) {
+  if (input == null || input.isEmpty) return input;
+  return "${_upperCaseLetter(input[0], locale)}${input.substring(1)}";
+}
+
+/// Convert the input single-letter string to upper case. A trivial
+/// hard-coded implementation that only handles simple upper case
+/// and the dotted i in Turkish/Azeri.
+///
+/// Private to the implementation of [toBeginningOfSentenceCase].
+// TODO(alanknight): Consider hard-coding other important cases.
+// See http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt
+// TODO(alanknight): Alternatively, consider toLocaleUpperCase in browsers.
+// See also https://github.com/dart-lang/sdk/issues/6706
+String _upperCaseLetter(String input, String locale) {
+  // Hard-code the important edge case of i->İ
+  if (locale != null) {
+    if (input == "i" && locale.startsWith("tr") || locale.startsWith("az")) {
+      return "\u0130";
+    }
+  }
+  return input.toUpperCase();
+}
diff --git a/packages/intl/lib/intl_browser.dart b/packages/intl/lib/intl_browser.dart
index 995b2c1..e38e9f0 100644
--- a/packages/intl/lib/intl_browser.dart
+++ b/packages/intl/lib/intl_browser.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * This provides facilities for Internationalization that are only available
- * when running in the web browser. You should import only one of this or
- * intl_standalone.dart. Right now the only thing provided here is the
- * ability to find the default locale from the browser.
- */
+/// This provides facilities for Internationalization that are only available
+/// when running in the web browser. You should import only one of this or
+/// intl_standalone.dart. Right now the only thing provided here is the
+/// ability to find the default locale from the browser.
 
 library intl_browser;
 
@@ -20,11 +18,9 @@
 // seems to be no graceful way to do this at all. Either mirror access on
 // dart2js or the ability to do spawnUri in the browser would be promising
 // as ways to get rid of this requirement.
-/**
- * Find the system locale, accessed as window.navigator.language, and
- * set it as the default for internationalization operations in the
- * [Intl.systemLocale] variable.
- */
+/// Find the system locale, accessed as window.navigator.language, and
+/// set it as the default for internationalization operations in the
+/// [Intl.systemLocale] variable.
 Future<String> findSystemLocale() {
   Intl.systemLocale = Intl.canonicalizedLocale(window.navigator.language);
   return new Future.value(Intl.systemLocale);
diff --git a/packages/intl/lib/intl_standalone.dart b/packages/intl/lib/intl_standalone.dart
index c69378d..7da66d0 100644
--- a/packages/intl/lib/intl_standalone.dart
+++ b/packages/intl/lib/intl_standalone.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * This provides facilities for Internationalization that are only available
- * when running standalone. You should import only one of this or
- * intl_browser.dart. Right now the only thing provided here is finding
- * the operating system locale.
- */
+/// This provides facilities for Internationalization that are only available
+/// when running standalone. You should import only one of this or
+/// intl_browser.dart. Right now the only thing provided here is finding
+/// the operating system locale.
 
 library intl_standalone;
 
@@ -20,81 +18,14 @@
 // seems to be no graceful way to do this at all. Either mirror access on
 // dart2js or the ability to do spawnUri in the browser would be promising
 // as ways to get rid of this requirement.
-/**
- * Find the system locale, accessed via the appropriate system APIs, and
- * set it as the default for internationalization operations in
- * the [Intl.systemLocale] variable. To find it, we
- * check the "LANG" environment variable on *nix, use the "systeminfo"
- * command on Windows, and on the Mac check the environment variable "LANG",
- * and if it's not found, use "defaults read -g AppleLocale". This
- * is not an ideal way of getting a single system locale, even if that
- * concept really made sense, but it's a reasonable first approximation that's
- * not too difficult to get. If it can't find the locale information, it will
- * not modify [Intl.systemLocale] and the Future will complete with null.
- */
+/// Find the system locale, accessed via the appropriate system APIs, and
+/// set it as the default for internationalization operations in
+/// the [Intl.systemLocale] variable.
 Future<String> findSystemLocale() {
-  // On *nix systems we expect this is an environment variable, which is the
-  // easiest thing to check. On a Mac the environment variable may be present
-  // so always check it first. We have no mechanism for this right now on
-  // Windows, so it will just fail.
-  String baseLocale = _checkEnvironmentVariable();
-  if (baseLocale != null) return _setLocale(baseLocale);
-  if (Platform.operatingSystem == 'macos') {
-    return _getAppleDefaults();
-  }
-  // We can't find anything, don't set the system locale and return null.
-  return new Future.value();
-}
-
-/**
- * Regular expression to match the expected output of reading the defaults
- * database for AppleLanguages on Mac systems.
- * e.g. {
- *     en,
- *     "pt-PT",
- *     ...
- */
-RegExp _appleDefaultsRegex = new RegExp(r'((\w\w)_\w+)');
-
-/**
- * Check to see if we have a "LANG" environment variable we can use and return
- * it if found. Otherwise return null;
- */
-String _checkEnvironmentVariable() {
   try {
-    return Platform.environment['LANG'];
-  } catch (e) {}
-  return null;
-}
-
-/**
- * Run the "defaults read -g AppleLocale" command and return the output in
- * a future.
- */
-Future _getAppleDefaults() {
-  var p = Process.run('defaults', ['read', '-g', 'AppleLocale']);
-  var myResult = p.then((result) => _checkResult(result, _appleDefaultsRegex));
-  return myResult;
-}
-
-/**
- * Given [result], find its text and extract the locale from it using
- * [regex], and set it as the system locale. If the process didn't run correctly
- * then don't set the variable and return a future that completes with null.
- */
-Future<String> _checkResult(ProcessResult result, RegExp regex) {
-  if (result.exitCode != 0) return new Future.value();
-  var match = regex.firstMatch(result.stdout);
-  if (match == null) return new Future.value();
-  var locale = match.group(1);
-  _setLocale(locale);
-  return new Future.value(locale);
-}
-
-/**
- * Set [Intl.systemLocale] to be the canonicalizedLocale of [aLocale].
- */
-Future<String> _setLocale(aLocale) {
-  Intl.systemLocale = Intl.canonicalizedLocale(aLocale);
+    Intl.systemLocale = Intl.canonicalizedLocale(Platform.localeName);
+  } catch (e) {
+    return new Future.value();
+  }
   return new Future.value(Intl.systemLocale);
 }
diff --git a/packages/intl/lib/message_lookup_by_library.dart b/packages/intl/lib/message_lookup_by_library.dart
index 3b668d4..7ef2a8d 100644
--- a/packages/intl/lib/message_lookup_by_library.dart
+++ b/packages/intl/lib/message_lookup_by_library.dart
@@ -2,113 +2,142 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Message/plural format library with locale support. This can have different
- * implementations based on the mechanism for finding the localized versions
- * of messages. This version expects them to be in a library named e.g.
- * 'messages_en_US'. The prefix is set in the "initializeMessages" call, which
- * must be made for a locale before any lookups can be done.
- *
- * See Intl class comment or `tests/message_format_test.dart` for more examples.
- */
+/// Message/plural format library with locale support. This can have different
+/// implementations based on the mechanism for finding the localized versions of
+/// messages. This version expects them to be in a library named e.g.
+/// 'messages_en_US'. The prefix is set in the "initializeMessages" call, which
+/// must be made for a locale before any lookups can be done.
+///
+/// See Intl class comment or `tests/message_format_test.dart` for more
+/// examples.
 library message_lookup_by_library;
 
-import 'intl.dart';
+import 'package:intl/intl.dart';
+import 'package:intl/src/intl_helpers.dart';
 
-/**
- * This is a message lookup mechanism that delegates to one of a collection
- * of individual [MessageLookupByLibrary] instances.
- */
-class CompositeMessageLookup {
-  /** A map from locale names to the corresponding lookups. */
+/// This is a message lookup mechanism that delegates to one of a collection
+/// of individual [MessageLookupByLibrary] instances.
+class CompositeMessageLookup implements MessageLookup {
+  /// A map from locale names to the corresponding lookups.
   Map<String, MessageLookupByLibrary> availableMessages = new Map();
 
-  /** Return true if we have a message lookup for [localeName]. */
+  /// Return true if we have a message lookup for [localeName].
   bool localeExists(localeName) => availableMessages.containsKey(localeName);
 
-  /**
-   * Look up the message with the given [name] and [locale] and return
-   * the translated version with the values in [args] interpolated.
-   * If nothing is found, return [message_str]. The [desc] and [examples]
-   * parameters are ignored
-   */
-  String lookupMessage(String message_str, [final String desc = '',
-      final Map examples = const {}, String locale, String name,
-      List<String> args, String meaning]) {
-    var actualLocale = (locale == null) ? Intl.getCurrentLocale() : locale;
-    // For this usage, if the locale doesn't exist for messages, just return
-    // it and we'll fall back to the original version.
-    var verifiedLocale = Intl.verifiedLocale(actualLocale, localeExists,
-        onFailure: (locale) => locale);
-    var messages = availableMessages[verifiedLocale];
-    if (messages == null) return message_str;
-    return messages.lookupMessage(
-        message_str, desc, examples, locale, name, args, meaning);
+  /// The last locale in which we looked up messages.
+  ///
+  ///  If this locale matches the new one then we can skip looking up the
+  ///  messages and assume they will be the same as last time.
+  String _lastLocale;
+
+  /// Caches the last messages that we found
+  MessageLookupByLibrary _lastLookup;
+
+  /// Look up the message with the given [name] and [locale] and return
+  /// the translated version with the values in [args] interpolated.
+  /// If nothing is found, return [message_str]. The [desc] and [examples]
+  /// parameters are ignored
+  String lookupMessage(
+      String message_str, String locale, String name, List args, String meaning,
+      {MessageIfAbsent ifAbsent: _useOriginal}) {
+    // If passed null, use the default.
+    var knownLocale = locale ?? Intl.getCurrentLocale();
+    var messages = (knownLocale == _lastLocale)
+        ? _lastLookup
+        : _lookupMessageCatalog(knownLocale);
+    // If we didn't find any messages for this locale, use the original string,
+    // faking interpolations if necessary.
+    if (messages == null) {
+      return ifAbsent(message_str, args);
+    }
+    return messages.lookupMessage(message_str, locale, name, args, meaning,
+        ifAbsent: ifAbsent);
   }
 
-  /**
-   * If we do not already have a locale for [localeName] then
-   * [findLocale] will be called and the result stored as the lookup
-   * mechanism for that locale.
-   */
-  addLocale(String localeName, Function findLocale) {
+  /// Find the right message lookup for [locale].
+  MessageLookupByLibrary _lookupMessageCatalog(String locale) {
+    var verifiedLocale = Intl.verifiedLocale(locale, localeExists,
+        onFailure: (locale) => locale);
+    _lastLocale = locale;
+    _lastLookup = availableMessages[verifiedLocale];
+    return _lastLookup;
+  }
+
+  /// If we do not already have a locale for [localeName] then
+  /// [findLocale] will be called and the result stored as the lookup
+  /// mechanism for that locale.
+  void addLocale(String localeName, Function findLocale) {
     if (localeExists(localeName)) return;
     var canonical = Intl.canonicalizedLocale(localeName);
     var newLocale = findLocale(canonical);
     if (newLocale != null) {
       availableMessages[localeName] = newLocale;
       availableMessages[canonical] = newLocale;
+      // If there was already a failed lookup for [newLocale], null the cache.
+      if (_lastLocale == newLocale) {
+        _lastLocale = null;
+        _lastLookup = null;
+      }
     }
   }
 }
 
-/**
- * This provides an abstract class for messages looked up in generated code.
- * Each locale will have a separate subclass of this class with its set of
- * messages. See generate_localized.dart.
- */
+/// The default ifAbsent method, just returns the message string.
+String _useOriginal(String message_str, List args) => message_str;
+
+/// This provides an abstract class for messages looked up in generated code.
+/// Each locale will have a separate subclass of this class with its set of
+/// messages. See generate_localized.dart.
 abstract class MessageLookupByLibrary {
-  /**
-   * Return the localized version of a message. We are passed the original
-   * version of the message, which consists of a
-   * [message_str] that will be translated, and which may be interpolated
-   * based on one or more variables, a [desc] providing a description of usage
-   * for the [message_str], and a map of [examples] for each data element to be
-   * substituted into the message.
-   *
-   * For example, if message="Hello, $name", then
-   * examples = {'name': 'Sparky'}. If not using the user's default locale, or
-   * if the locale is not easily detectable, explicitly pass [locale].
-   *
-   * The values of [desc] and [examples] are not used at run-time but are only
-   * made available to the translators, so they MUST be simple Strings available
-   * at compile time: no String interpolation or concatenation.
-   * The expected usage of this is inside a function that takes as parameters
-   * the variables used in the interpolated string.
-   *
-   * Ultimately, the information about the enclosing function and its arguments
-   * will be extracted automatically but for the time being it must be passed
-   * explicitly in the [name] and [args] arguments.
-   */
-  String lookupMessage(String message_str, [final String desc = '',
-      final Map examples = const {}, String locale, String name,
-      List<String> args, String meaning]) {
-    if (name == null) return message_str;
-    var function = this[name];
-    return function == null ? message_str : Function.apply(function, args);
+  /// Return the localized version of a message. We are passed the original
+  /// version of the message, which consists of a
+  /// [message_str] that will be translated, and which may be interpolated
+  /// based on one or more variables, a [desc] providing a description of usage
+  /// for the [message_str], and a map of [examples] for each data element to be
+  /// substituted into the message.
+  ///
+  /// For example, if message="Hello, $name", then
+  /// examples = {'name': 'Sparky'}. If not using the user's default locale, or
+  /// if the locale is not easily detectable, explicitly pass [locale].
+  ///
+  /// The values of [desc] and [examples] are not used at run-time but are only
+  /// made available to the translators, so they MUST be simple Strings
+  /// available at compile time: no String interpolation or concatenation.  The
+  /// expected usage of this is inside a function that takes as parameters the
+  /// variables used in the interpolated string.
+  ///
+  /// Ultimately, the information about the enclosing function and its arguments
+  /// will be extracted automatically but for the time being it must be passed
+  /// explicitly in the [name] and [args] arguments.
+  String lookupMessage(
+      String message_str, String locale, String name, List args, String meaning,
+      {MessageIfAbsent ifAbsent}) {
+    var notFound = false;
+    var actualName = computeMessageName(name, message_str, meaning);
+    if (actualName == null) notFound = true;
+    var function = this[actualName];
+    notFound = notFound || (function == null);
+    if (notFound) {
+      return ifAbsent == null ? message_str : ifAbsent(message_str, args);
+    } else {
+      args = args ?? [];
+      return Function.apply(function, args);
+    }
   }
 
-  /** Return our message with the given name */
+  /// Return our message with the given name
   operator [](String messageName) => messages[messageName];
 
-  /**
-   * Subclasses should override this to return a list of their message
-   * functions.
-   */
+  /// Subclasses should override this to return a list of their message
+  /// functions.
   Map<String, Function> get messages;
 
-  /** Subclasses should override this to return their locale, e.g. 'en_US' */
+  /// Subclasses should override this to return their locale, e.g. 'en_US'
   String get localeName;
 
   toString() => localeName;
+
+  /// Return a function that returns the given string.
+  /// An optimization for dart2js, used from the generated code.
+  static simpleMessage(translatedString) => () => translatedString;
 }
diff --git a/packages/intl/lib/number_symbols.dart b/packages/intl/lib/number_symbols.dart
index 3eece39..a18145b 100644
--- a/packages/intl/lib/number_symbols.dart
+++ b/packages/intl/lib/number_symbols.dart
@@ -3,12 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 library number_symbols;
 
-/**
- * This holds onto information about how a particular locale formats numbers. It
- * contains strings for things like the decimal separator, digit to use for "0"
- * and infinity. We expect the data for instances to be generated out of ICU
- * or a similar reference source.
- */
+/// This holds onto information about how a particular locale formats
+/// numbers. It contains strings for things like the decimal separator, digit to
+/// use for "0" and infinity. We expect the data for instances to be generated
+/// out of ICU or a similar reference source.
 class NumberSymbols {
   final String NAME;
   final String DECIMAL_SEP,
@@ -27,11 +25,33 @@
       CURRENCY_PATTERN,
       DEF_CURRENCY_CODE;
 
-  const NumberSymbols({this.NAME, this.DECIMAL_SEP, this.GROUP_SEP,
-      this.PERCENT, this.ZERO_DIGIT, this.PLUS_SIGN, this.MINUS_SIGN,
-      this.EXP_SYMBOL, this.PERMILL, this.INFINITY, this.NAN,
-      this.DECIMAL_PATTERN, this.SCIENTIFIC_PATTERN, this.PERCENT_PATTERN,
-      this.CURRENCY_PATTERN, this.DEF_CURRENCY_CODE});
+  const NumberSymbols(
+      {this.NAME,
+      this.DECIMAL_SEP,
+      this.GROUP_SEP,
+      this.PERCENT,
+      this.ZERO_DIGIT,
+      this.PLUS_SIGN,
+      this.MINUS_SIGN,
+      this.EXP_SYMBOL,
+      this.PERMILL,
+      this.INFINITY,
+      this.NAN,
+      this.DECIMAL_PATTERN,
+      this.SCIENTIFIC_PATTERN,
+      this.PERCENT_PATTERN,
+      this.CURRENCY_PATTERN,
+      this.DEF_CURRENCY_CODE});
 
   toString() => NAME;
 }
+
+class CompactNumberSymbols {
+  final Map<int, String> COMPACT_DECIMAL_SHORT_PATTERN;
+  final Map<int, String> COMPACT_DECIMAL_LONG_PATTERN;
+  final Map<int, String> COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN;
+  CompactNumberSymbols(
+      {this.COMPACT_DECIMAL_SHORT_PATTERN,
+      this.COMPACT_DECIMAL_LONG_PATTERN,
+      this.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN});
+}
diff --git a/packages/intl/lib/number_symbols_data.dart b/packages/intl/lib/number_symbols_data.dart
index a1f6821..1082193 100644
--- a/packages/intl/lib/number_symbols_data.dart
+++ b/packages/intl/lib/number_symbols_data.dart
@@ -4,27 +4,23 @@
 // code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Date/time formatting symbols for all locales.
- *
- * DO NOT EDIT. This file is autogenerated by script.  See
- * http://go/generate_number_constants.py using the --for_dart flag.
- *
- * Before checkin, this file could have been manually edited. This is
- * to incorporate changes before we could correct CLDR. All manual
- * modification must be documented in this section, and should be
- * removed after those changes land to CLDR.
- */
+/// Date/time formatting symbols for all locales.
+///
+/// DO NOT EDIT. This file is autogenerated by script.  See
+/// http://go/generate_number_constants.py using the --for_dart flag.
+///
+/// Before checkin, this file could have been manually edited. This is
+/// to incorporate changes before we could correct CLDR. All manual
+/// modification must be documented in this section, and should be
+/// removed after those changes land to CLDR.
 
 library number_symbol_data;
 
 import "number_symbols.dart";
 
-Map numberFormatSymbols = const {
-  /**
-   * Number formatting symbols for locale af.
-   */
-  "af": const NumberSymbols(
+Map numberFormatSymbols = {
+  // Number formatting symbols for locale af.
+  "af": new NumberSymbols(
       NAME: "af",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -41,10 +37,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'ZAR'),
-  /**
-   * Number formatting symbols for locale am.
-   */
-  "am": const NumberSymbols(
+  // Number formatting symbols for locale am.
+  "am": new NumberSymbols(
       NAME: "am",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -61,30 +55,26 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'ETB'),
-  /**
-   * Number formatting symbols for locale ar.
-   */
-  "ar": const NumberSymbols(
+  // Number formatting symbols for locale ar.
+  "ar": new NumberSymbols(
       NAME: "ar",
       DECIMAL_SEP: '\u066B',
       GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      PERCENT: '\u066A\u061C',
       ZERO_DIGIT: '\u0660',
-      PLUS_SIGN: '\u200F+',
-      MINUS_SIGN: '\u200F-',
+      PLUS_SIGN: '\u061C+',
+      MINUS_SIGN: '\u061C-',
       EXP_SYMBOL: '\u0627\u0633',
       PERMILL: '\u0609',
       INFINITY: '\u221E',
       NAN: '\u0644\u064A\u0633\u00A0\u0631\u0642\u0645',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EGP'),
-  /**
-   * Number formatting symbols for locale az.
-   */
-  "az": const NumberSymbols(
+  // Number formatting symbols for locale az.
+  "az": new NumberSymbols(
       NAME: "az",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -101,10 +91,26 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'AZN'),
-  /**
-   * Number formatting symbols for locale bg.
-   */
-  "bg": const NumberSymbols(
+  // Number formatting symbols for locale be.
+  "be": new NumberSymbols(
+      NAME: "be",
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '\u00A0',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      DEF_CURRENCY_CODE: 'BYN'),
+  // Number formatting symbols for locale bg.
+  "bg": new NumberSymbols(
       NAME: "bg",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -119,12 +125,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '#0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'BGN'),
-  /**
-   * Number formatting symbols for locale bn.
-   */
-  "bn": const NumberSymbols(
+  // Number formatting symbols for locale bn.
+  "bn": new NumberSymbols(
       NAME: "bn",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -135,16 +139,14 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u09B8\u0982\u0996\u09CD\u09AF\u09BE\u00A0\u09A8\u09BE',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
+      PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##,##0.00\u00A4',
       DEF_CURRENCY_CODE: 'BDT'),
-  /**
-   * Number formatting symbols for locale br.
-   */
-  "br": const NumberSymbols(
+  // Number formatting symbols for locale br.
+  "br": new NumberSymbols(
       NAME: "br",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -158,13 +160,29 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale ca.
-   */
-  "ca": const NumberSymbols(
+  // Number formatting symbols for locale bs.
+  "bs": new NumberSymbols(
+      NAME: "bs",
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '.',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      DEF_CURRENCY_CODE: 'BAM'),
+  // Number formatting symbols for locale ca.
+  "ca": new NumberSymbols(
       NAME: "ca",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -181,10 +199,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale chr.
-   */
-  "chr": const NumberSymbols(
+  // Number formatting symbols for locale chr.
+  "chr": new NumberSymbols(
       NAME: "chr",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -201,10 +217,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'USD'),
-  /**
-   * Number formatting symbols for locale cs.
-   */
-  "cs": const NumberSymbols(
+  // Number formatting symbols for locale cs.
+  "cs": new NumberSymbols(
       NAME: "cs",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -221,10 +235,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'CZK'),
-  /**
-   * Number formatting symbols for locale cy.
-   */
-  "cy": const NumberSymbols(
+  // Number formatting symbols for locale cy.
+  "cy": new NumberSymbols(
       NAME: "cy",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -241,10 +253,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'GBP'),
-  /**
-   * Number formatting symbols for locale da.
-   */
-  "da": const NumberSymbols(
+  // Number formatting symbols for locale da.
+  "da": new NumberSymbols(
       NAME: "da",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -261,10 +271,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'DKK'),
-  /**
-   * Number formatting symbols for locale de.
-   */
-  "de": const NumberSymbols(
+  // Number formatting symbols for locale de.
+  "de": new NumberSymbols(
       NAME: "de",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -281,13 +289,11 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale de_AT.
-   */
-  "de_AT": const NumberSymbols(
+  // Number formatting symbols for locale de_AT.
+  "de_AT": new NumberSymbols(
       NAME: "de_AT",
       DECIMAL_SEP: ',',
-      GROUP_SEP: '.',
+      GROUP_SEP: '\u00A0',
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
@@ -301,10 +307,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale de_CH.
-   */
-  "de_CH": const NumberSymbols(
+  // Number formatting symbols for locale de_CH.
+  "de_CH": new NumberSymbols(
       NAME: "de_CH",
       DECIMAL_SEP: '.',
       GROUP_SEP: '\'',
@@ -318,13 +322,11 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0\u00A0%',
+      PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4-#,##0.00',
       DEF_CURRENCY_CODE: 'CHF'),
-  /**
-   * Number formatting symbols for locale el.
-   */
-  "el": const NumberSymbols(
+  // Number formatting symbols for locale el.
+  "el": new NumberSymbols(
       NAME: "el",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -341,10 +343,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale en.
-   */
-  "en": const NumberSymbols(
+  // Number formatting symbols for locale en.
+  "en": new NumberSymbols(
       NAME: "en",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -361,10 +361,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'USD'),
-  /**
-   * Number formatting symbols for locale en_AU.
-   */
-  "en_AU": const NumberSymbols(
+  // Number formatting symbols for locale en_AU.
+  "en_AU": new NumberSymbols(
       NAME: "en_AU",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -372,6 +370,24 @@
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
+      EXP_SYMBOL: 'e',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      DEF_CURRENCY_CODE: 'AUD'),
+  // Number formatting symbols for locale en_CA.
+  "en_CA": new NumberSymbols(
+      NAME: "en_CA",
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
@@ -380,11 +396,9 @@
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
-      DEF_CURRENCY_CODE: 'AUD'),
-  /**
-   * Number formatting symbols for locale en_GB.
-   */
-  "en_GB": const NumberSymbols(
+      DEF_CURRENCY_CODE: 'CAD'),
+  // Number formatting symbols for locale en_GB.
+  "en_GB": new NumberSymbols(
       NAME: "en_GB",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -401,10 +415,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'GBP'),
-  /**
-   * Number formatting symbols for locale en_IE.
-   */
-  "en_IE": const NumberSymbols(
+  // Number formatting symbols for locale en_IE.
+  "en_IE": new NumberSymbols(
       NAME: "en_IE",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -421,10 +433,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale en_IN.
-   */
-  "en_IN": const NumberSymbols(
+  // Number formatting symbols for locale en_IN.
+  "en_IN": new NumberSymbols(
       NAME: "en_IN",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -441,10 +451,8 @@
       PERCENT_PATTERN: '#,##,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale en_SG.
-   */
-  "en_SG": const NumberSymbols(
+  // Number formatting symbols for locale en_SG.
+  "en_SG": new NumberSymbols(
       NAME: "en_SG",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -461,10 +469,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'SGD'),
-  /**
-   * Number formatting symbols for locale en_US.
-   */
-  "en_US": const NumberSymbols(
+  // Number formatting symbols for locale en_US.
+  "en_US": new NumberSymbols(
       NAME: "en_US",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -481,10 +487,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'USD'),
-  /**
-   * Number formatting symbols for locale en_ZA.
-   */
-  "en_ZA": const NumberSymbols(
+  // Number formatting symbols for locale en_ZA.
+  "en_ZA": new NumberSymbols(
       NAME: "en_ZA",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -501,10 +505,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'ZAR'),
-  /**
-   * Number formatting symbols for locale es.
-   */
-  "es": const NumberSymbols(
+  // Number formatting symbols for locale es.
+  "es": new NumberSymbols(
       NAME: "es",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -518,13 +520,11 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
+      PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale es_419.
-   */
-  "es_419": const NumberSymbols(
+  // Number formatting symbols for locale es_419.
+  "es_419": new NumberSymbols(
       NAME: "es_419",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -538,16 +538,50 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      DEF_CURRENCY_CODE: 'MXN'),
+  // Number formatting symbols for locale es_ES.
+  "es_ES": new NumberSymbols(
+      NAME: "es_ES",
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '.',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      DEF_CURRENCY_CODE: 'EUR'),
+  // Number formatting symbols for locale es_MX.
+  "es_MX": new NumberSymbols(
+      NAME: "es_MX",
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'MXN'),
-  /**
-   * Number formatting symbols for locale es_ES.
-   */
-  "es_ES": const NumberSymbols(
-      NAME: "es_ES",
-      DECIMAL_SEP: ',',
-      GROUP_SEP: '.',
+  // Number formatting symbols for locale es_US.
+  "es_US": new NumberSymbols(
+      NAME: "es_US",
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
@@ -558,20 +592,18 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
-      DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale et.
-   */
-  "et": const NumberSymbols(
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      DEF_CURRENCY_CODE: 'USD'),
+  // Number formatting symbols for locale et.
+  "et": new NumberSymbols(
       NAME: "et",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
-      MINUS_SIGN: '-',
+      MINUS_SIGN: '\u2212',
       EXP_SYMBOL: '\u00D710^',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
@@ -581,10 +613,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale eu.
-   */
-  "eu": const NumberSymbols(
+  // Number formatting symbols for locale eu.
+  "eu": new NumberSymbols(
       NAME: "eu",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -601,16 +631,14 @@
       PERCENT_PATTERN: '%\u00A0#,##0',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale fa.
-   */
-  "fa": const NumberSymbols(
+  // Number formatting symbols for locale fa.
+  "fa": new NumberSymbols(
       NAME: "fa",
       DECIMAL_SEP: '\u066B',
       GROUP_SEP: '\u066C',
-      PERCENT: '\u066A',
+      PERCENT: '\u200E\u066A',
       ZERO_DIGIT: '\u06F0',
-      PLUS_SIGN: '\u200E+\u200E',
+      PLUS_SIGN: '\u200E+',
       MINUS_SIGN: '\u200E\u2212',
       EXP_SYMBOL: '\u00D7\u06F1\u06F0^',
       PERMILL: '\u0609',
@@ -618,13 +646,12 @@
       NAN: '\u0646\u0627\u0639\u062F\u062F',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u200E\u00A4#,##0.00',
+      PERCENT_PATTERN: '%\u00A0#,##0;%\u00A0-#,##0',
+      CURRENCY_PATTERN:
+          '#,##0.00\u00A0\u061C\u00A4;\u061C-#,##0.00\u00A0\u061C\u00A4',
       DEF_CURRENCY_CODE: 'IRR'),
-  /**
-   * Number formatting symbols for locale fi.
-   */
-  "fi": const NumberSymbols(
+  // Number formatting symbols for locale fi.
+  "fi": new NumberSymbols(
       NAME: "fi",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -641,10 +668,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale fil.
-   */
-  "fil": const NumberSymbols(
+  // Number formatting symbols for locale fil.
+  "fil": new NumberSymbols(
       NAME: "fil",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -661,10 +686,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'PHP'),
-  /**
-   * Number formatting symbols for locale fr.
-   */
-  "fr": const NumberSymbols(
+  // Number formatting symbols for locale fr.
+  "fr": new NumberSymbols(
       NAME: "fr",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -681,10 +704,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale fr_CA.
-   */
-  "fr_CA": const NumberSymbols(
+  // Number formatting symbols for locale fr_CA.
+  "fr_CA": new NumberSymbols(
       NAME: "fr_CA",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -701,10 +722,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'CAD'),
-  /**
-   * Number formatting symbols for locale ga.
-   */
-  "ga": const NumberSymbols(
+  // Number formatting symbols for locale ga.
+  "ga": new NumberSymbols(
       NAME: "ga",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -721,10 +740,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale gl.
-   */
-  "gl": const NumberSymbols(
+  // Number formatting symbols for locale gl.
+  "gl": new NumberSymbols(
       NAME: "gl",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -738,13 +755,11 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale gsw.
-   */
-  "gsw": const NumberSymbols(
+  // Number formatting symbols for locale gsw.
+  "gsw": new NumberSymbols(
       NAME: "gsw",
       DECIMAL_SEP: '.',
       GROUP_SEP: '\u2019',
@@ -761,10 +776,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'CHF'),
-  /**
-   * Number formatting symbols for locale gu.
-   */
-  "gu": const NumberSymbols(
+  // Number formatting symbols for locale gu.
+  "gu": new NumberSymbols(
       NAME: "gu",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -777,14 +790,12 @@
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
+      SCIENTIFIC_PATTERN: '[#E0]',
       PERCENT_PATTERN: '#,##,##0%',
       CURRENCY_PATTERN: '\u00A4#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale haw.
-   */
-  "haw": const NumberSymbols(
+  // Number formatting symbols for locale haw.
+  "haw": new NumberSymbols(
       NAME: "haw",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -801,10 +812,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'USD'),
-  /**
-   * Number formatting symbols for locale he.
-   */
-  "he": const NumberSymbols(
+  // Number formatting symbols for locale he.
+  "he": new NumberSymbols(
       NAME: "he",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -819,12 +828,11 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN:
+          '\u200F#,##0.00\u00A0\u00A4;\u200F-#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'ILS'),
-  /**
-   * Number formatting symbols for locale hi.
-   */
-  "hi": const NumberSymbols(
+  // Number formatting symbols for locale hi.
+  "hi": new NumberSymbols(
       NAME: "hi",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -837,14 +845,12 @@
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
+      SCIENTIFIC_PATTERN: '[#E0]',
       PERCENT_PATTERN: '#,##,##0%',
       CURRENCY_PATTERN: '\u00A4#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale hr.
-   */
-  "hr": const NumberSymbols(
+  // Number formatting symbols for locale hr.
+  "hr": new NumberSymbols(
       NAME: "hr",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -861,10 +867,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'HRK'),
-  /**
-   * Number formatting symbols for locale hu.
-   */
-  "hu": const NumberSymbols(
+  // Number formatting symbols for locale hu.
+  "hu": new NumberSymbols(
       NAME: "hu",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -881,13 +885,11 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'HUF'),
-  /**
-   * Number formatting symbols for locale hy.
-   */
-  "hy": const NumberSymbols(
+  // Number formatting symbols for locale hy.
+  "hy": new NumberSymbols(
       NAME: "hy",
       DECIMAL_SEP: ',',
-      GROUP_SEP: '.',
+      GROUP_SEP: '\u00A0',
       PERCENT: '%',
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
@@ -895,16 +897,14 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'NaN',
-      DECIMAL_PATTERN: '#0.###',
+      NAN: '\u0548\u0579\u0539',
+      DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#0%',
-      CURRENCY_PATTERN: '#0.00\u00A0\u00A4',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'AMD'),
-  /**
-   * Number formatting symbols for locale id.
-   */
-  "id": const NumberSymbols(
+  // Number formatting symbols for locale id.
+  "id": new NumberSymbols(
       NAME: "id",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -921,10 +921,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'IDR'),
-  /**
-   * Number formatting symbols for locale in.
-   */
-  "in": const NumberSymbols(
+  // Number formatting symbols for locale in.
+  "in": new NumberSymbols(
       NAME: "in",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -941,10 +939,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'IDR'),
-  /**
-   * Number formatting symbols for locale is.
-   */
-  "is": const NumberSymbols(
+  // Number formatting symbols for locale is.
+  "is": new NumberSymbols(
       NAME: "is",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -961,10 +957,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'ISK'),
-  /**
-   * Number formatting symbols for locale it.
-   */
-  "it": const NumberSymbols(
+  // Number formatting symbols for locale it.
+  "it": new NumberSymbols(
       NAME: "it",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -981,10 +975,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale iw.
-   */
-  "iw": const NumberSymbols(
+  // Number formatting symbols for locale iw.
+  "iw": new NumberSymbols(
       NAME: "iw",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -999,12 +991,11 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN:
+          '\u200F#,##0.00\u00A0\u00A4;\u200F-#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'ILS'),
-  /**
-   * Number formatting symbols for locale ja.
-   */
-  "ja": const NumberSymbols(
+  // Number formatting symbols for locale ja.
+  "ja": new NumberSymbols(
       NAME: "ja",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1021,10 +1012,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'JPY'),
-  /**
-   * Number formatting symbols for locale ka.
-   */
-  "ka": const NumberSymbols(
+  // Number formatting symbols for locale ka.
+  "ka": new NumberSymbols(
       NAME: "ka",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1035,16 +1024,15 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u10D0\u10E0\u00A0\u10D0\u10E0\u10D8\u10E1\u00A0\u10E0\u10D8\u10EA\u10EE\u10D5\u10D8',
+      NAN:
+          '\u10D0\u10E0\u00A0\u10D0\u10E0\u10D8\u10E1\u00A0\u10E0\u10D8\u10EA\u10EE\u10D5\u10D8',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'GEL'),
-  /**
-   * Number formatting symbols for locale kk.
-   */
-  "kk": const NumberSymbols(
+  // Number formatting symbols for locale kk.
+  "kk": new NumberSymbols(
       NAME: "kk",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1055,16 +1043,14 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'NaN',
+      NAN: '\u0441\u0430\u043D\u00A0\u0435\u043C\u0435\u0441',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'KZT'),
-  /**
-   * Number formatting symbols for locale km.
-   */
-  "km": const NumberSymbols(
+  // Number formatting symbols for locale km.
+  "km": new NumberSymbols(
       NAME: "km",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1079,12 +1065,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '#,##0.00\u00A4',
       DEF_CURRENCY_CODE: 'KHR'),
-  /**
-   * Number formatting symbols for locale kn.
-   */
-  "kn": const NumberSymbols(
+  // Number formatting symbols for locale kn.
+  "kn": new NumberSymbols(
       NAME: "kn",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1092,7 +1076,7 @@
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: '\u0C88',
+      EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
@@ -1101,10 +1085,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale ko.
-   */
-  "ko": const NumberSymbols(
+  // Number formatting symbols for locale ko.
+  "ko": new NumberSymbols(
       NAME: "ko",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1121,10 +1103,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'KRW'),
-  /**
-   * Number formatting symbols for locale ky.
-   */
-  "ky": const NumberSymbols(
+  // Number formatting symbols for locale ky.
+  "ky": new NumberSymbols(
       NAME: "ky",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1141,10 +1121,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'KGS'),
-  /**
-   * Number formatting symbols for locale ln.
-   */
-  "ln": const NumberSymbols(
+  // Number formatting symbols for locale ln.
+  "ln": new NumberSymbols(
       NAME: "ln",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1161,10 +1139,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'CDF'),
-  /**
-   * Number formatting symbols for locale lo.
-   */
-  "lo": const NumberSymbols(
+  // Number formatting symbols for locale lo.
+  "lo": new NumberSymbols(
       NAME: "lo",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1175,16 +1151,15 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u0E9A\u0ECD\u0EC8\u0EC1\u0EA1\u0EC8\u0E99\u0EC2\u0E95\u0EC0\u0EA5\u0E81',
+      NAN:
+          '\u0E9A\u0ECD\u0EC8\u200B\u0EC1\u0EA1\u0EC8\u0E99\u200B\u0EC2\u0E95\u200B\u0EC0\u0EA5\u0E81',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00;\u00A4-#,##0.00',
       DEF_CURRENCY_CODE: 'LAK'),
-  /**
-   * Number formatting symbols for locale lt.
-   */
-  "lt": const NumberSymbols(
+  // Number formatting symbols for locale lt.
+  "lt": new NumberSymbols(
       NAME: "lt",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1200,11 +1175,9 @@
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
-      DEF_CURRENCY_CODE: 'LTL'),
-  /**
-   * Number formatting symbols for locale lv.
-   */
-  "lv": const NumberSymbols(
+      DEF_CURRENCY_CODE: 'EUR'),
+  // Number formatting symbols for locale lv.
+  "lv": new NumberSymbols(
       NAME: "lv",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1215,16 +1188,14 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'nav\u00A0skaitlis',
+      NAN: 'NS',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale mk.
-   */
-  "mk": const NumberSymbols(
+  // Number formatting symbols for locale mk.
+  "mk": new NumberSymbols(
       NAME: "mk",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1239,12 +1210,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'MKD'),
-  /**
-   * Number formatting symbols for locale ml.
-   */
-  "ml": const NumberSymbols(
+  // Number formatting symbols for locale ml.
+  "ml": new NumberSymbols(
       NAME: "ml",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1258,13 +1227,11 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '#,##,##0.00\u00A4',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale mn.
-   */
-  "mn": const NumberSymbols(
+  // Number formatting symbols for locale mn.
+  "mn": new NumberSymbols(
       NAME: "mn",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1281,10 +1248,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'MNT'),
-  /**
-   * Number formatting symbols for locale mr.
-   */
-  "mr": const NumberSymbols(
+  // Number formatting symbols for locale mr.
+  "mr": new NumberSymbols(
       NAME: "mr",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1296,15 +1261,13 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '#,##0.###',
+      DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '[#E0]',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale ms.
-   */
-  "ms": const NumberSymbols(
+  // Number formatting symbols for locale ms.
+  "ms": new NumberSymbols(
       NAME: "ms",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1321,10 +1284,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'MYR'),
-  /**
-   * Number formatting symbols for locale mt.
-   */
-  "mt": const NumberSymbols(
+  // Number formatting symbols for locale mt.
+  "mt": new NumberSymbols(
       NAME: "mt",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1341,10 +1302,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale my.
-   */
-  "my": const NumberSymbols(
+  // Number formatting symbols for locale my.
+  "my": new NumberSymbols(
       NAME: "my",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1355,16 +1314,15 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u1002\u100F\u1014\u103A\u1038\u1019\u101F\u102F\u1010\u103A\u101E\u1031\u102C',
+      NAN:
+          '\u1002\u100F\u1014\u103A\u1038\u1019\u101F\u102F\u1010\u103A\u101E\u1031\u102C',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'MMK'),
-  /**
-   * Number formatting symbols for locale nb.
-   */
-  "nb": const NumberSymbols(
+  // Number formatting symbols for locale nb.
+  "nb": new NumberSymbols(
       NAME: "nb",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1381,10 +1339,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'NOK'),
-  /**
-   * Number formatting symbols for locale ne.
-   */
-  "ne": const NumberSymbols(
+  // Number formatting symbols for locale ne.
+  "ne": new NumberSymbols(
       NAME: "ne",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1399,12 +1355,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'NPR'),
-  /**
-   * Number formatting symbols for locale nl.
-   */
-  "nl": const NumberSymbols(
+  // Number formatting symbols for locale nl.
+  "nl": new NumberSymbols(
       NAME: "nl",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1419,12 +1373,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0#,##0.00-',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00;\u00A4\u00A0-#,##0.00',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale no.
-   */
-  "no": const NumberSymbols(
+  // Number formatting symbols for locale no.
+  "no": new NumberSymbols(
       NAME: "no",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1441,10 +1393,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'NOK'),
-  /**
-   * Number formatting symbols for locale no_NO.
-   */
-  "no_NO": const NumberSymbols(
+  // Number formatting symbols for locale no_NO.
+  "no_NO": new NumberSymbols(
       NAME: "no_NO",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1461,10 +1411,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'NOK'),
-  /**
-   * Number formatting symbols for locale or.
-   */
-  "or": const NumberSymbols(
+  // Number formatting symbols for locale or.
+  "or": new NumberSymbols(
       NAME: "or",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1481,10 +1429,8 @@
       PERCENT_PATTERN: '#,##,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale pa.
-   */
-  "pa": const NumberSymbols(
+  // Number formatting symbols for locale pa.
+  "pa": new NumberSymbols(
       NAME: "pa",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1497,14 +1443,12 @@
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
+      SCIENTIFIC_PATTERN: '[#E0]',
       PERCENT_PATTERN: '#,##,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##,##0.00',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale pl.
-   */
-  "pl": const NumberSymbols(
+  // Number formatting symbols for locale pl.
+  "pl": new NumberSymbols(
       NAME: "pl",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1521,10 +1465,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'PLN'),
-  /**
-   * Number formatting symbols for locale pt.
-   */
-  "pt": const NumberSymbols(
+  // Number formatting symbols for locale pt.
+  "pt": new NumberSymbols(
       NAME: "pt",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1541,10 +1483,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'BRL'),
-  /**
-   * Number formatting symbols for locale pt_BR.
-   */
-  "pt_BR": const NumberSymbols(
+  // Number formatting symbols for locale pt_BR.
+  "pt_BR": new NumberSymbols(
       NAME: "pt_BR",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1561,10 +1501,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'BRL'),
-  /**
-   * Number formatting symbols for locale pt_PT.
-   */
-  "pt_PT": const NumberSymbols(
+  // Number formatting symbols for locale pt_PT.
+  "pt_PT": new NumberSymbols(
       NAME: "pt_PT",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1581,10 +1519,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale ro.
-   */
-  "ro": const NumberSymbols(
+  // Number formatting symbols for locale ro.
+  "ro": new NumberSymbols(
       NAME: "ro",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1601,10 +1537,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'RON'),
-  /**
-   * Number formatting symbols for locale ru.
-   */
-  "ru": const NumberSymbols(
+  // Number formatting symbols for locale ru.
+  "ru": new NumberSymbols(
       NAME: "ru",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1621,10 +1555,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'RUB'),
-  /**
-   * Number formatting symbols for locale si.
-   */
-  "si": const NumberSymbols(
+  // Number formatting symbols for locale si.
+  "si": new NumberSymbols(
       NAME: "si",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1637,14 +1569,12 @@
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
+      SCIENTIFIC_PATTERN: '#',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'LKR'),
-  /**
-   * Number formatting symbols for locale sk.
-   */
-  "sk": const NumberSymbols(
+  // Number formatting symbols for locale sk.
+  "sk": new NumberSymbols(
       NAME: "sk",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1652,39 +1582,35 @@
       ZERO_DIGIT: '0',
       PLUS_SIGN: '+',
       MINUS_SIGN: '-',
-      EXP_SYMBOL: 'E',
-      PERMILL: '\u2030',
-      INFINITY: '\u221E',
-      NAN: 'NaN',
-      DECIMAL_PATTERN: '#,##0.###',
-      SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0\u00A0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
-      DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale sl.
-   */
-  "sl": const NumberSymbols(
-      NAME: "sl",
-      DECIMAL_SEP: ',',
-      GROUP_SEP: '.',
-      PERCENT: '%',
-      ZERO_DIGIT: '0',
-      PLUS_SIGN: '+',
-      MINUS_SIGN: '-',
       EXP_SYMBOL: 'e',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
+      PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'EUR'),
-  /**
-   * Number formatting symbols for locale sq.
-   */
-  "sq": const NumberSymbols(
+  // Number formatting symbols for locale sl.
+  "sl": new NumberSymbols(
+      NAME: "sl",
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '.',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '\u2013',
+      EXP_SYMBOL: 'e',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0\u00A0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      DEF_CURRENCY_CODE: 'EUR'),
+  // Number formatting symbols for locale sq.
+  "sq": new NumberSymbols(
       NAME: "sq",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1701,10 +1627,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'ALL'),
-  /**
-   * Number formatting symbols for locale sr.
-   */
-  "sr": const NumberSymbols(
+  // Number formatting symbols for locale sr.
+  "sr": new NumberSymbols(
       NAME: "sr",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1721,10 +1645,26 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'RSD'),
-  /**
-   * Number formatting symbols for locale sv.
-   */
-  "sv": const NumberSymbols(
+  // Number formatting symbols for locale sr_Latn.
+  "sr_Latn": new NumberSymbols(
+      NAME: "sr_Latn",
+      DECIMAL_SEP: ',',
+      GROUP_SEP: '.',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      DEF_CURRENCY_CODE: 'RSD'),
+  // Number formatting symbols for locale sv.
+  "sv": new NumberSymbols(
       NAME: "sv",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1741,10 +1681,8 @@
       PERCENT_PATTERN: '#,##0\u00A0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'SEK'),
-  /**
-   * Number formatting symbols for locale sw.
-   */
-  "sw": const NumberSymbols(
+  // Number formatting symbols for locale sw.
+  "sw": new NumberSymbols(
       NAME: "sw",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1761,10 +1699,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'TZS'),
-  /**
-   * Number formatting symbols for locale ta.
-   */
-  "ta": const NumberSymbols(
+  // Number formatting symbols for locale ta.
+  "ta": new NumberSymbols(
       NAME: "ta",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1781,10 +1717,8 @@
       PERCENT_PATTERN: '#,##,##0%',
       CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale te.
-   */
-  "te": const NumberSymbols(
+  // Number formatting symbols for locale te.
+  "te": new NumberSymbols(
       NAME: "te",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1796,15 +1730,13 @@
       PERMILL: '\u2030',
       INFINITY: '\u221E',
       NAN: 'NaN',
-      DECIMAL_PATTERN: '#,##0.###',
+      DECIMAL_PATTERN: '#,##,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##,##0.00',
       DEF_CURRENCY_CODE: 'INR'),
-  /**
-   * Number formatting symbols for locale th.
-   */
-  "th": const NumberSymbols(
+  // Number formatting symbols for locale th.
+  "th": new NumberSymbols(
       NAME: "th",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1821,10 +1753,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'THB'),
-  /**
-   * Number formatting symbols for locale tl.
-   */
-  "tl": const NumberSymbols(
+  // Number formatting symbols for locale tl.
+  "tl": new NumberSymbols(
       NAME: "tl",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1841,10 +1771,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'PHP'),
-  /**
-   * Number formatting symbols for locale tr.
-   */
-  "tr": const NumberSymbols(
+  // Number formatting symbols for locale tr.
+  "tr": new NumberSymbols(
       NAME: "tr",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1859,12 +1787,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '%#,##0',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'TRY'),
-  /**
-   * Number formatting symbols for locale uk.
-   */
-  "uk": const NumberSymbols(
+  // Number formatting symbols for locale uk.
+  "uk": new NumberSymbols(
       NAME: "uk",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1875,16 +1801,14 @@
       EXP_SYMBOL: '\u0415',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: '\u041D\u0435\u00A0\u0447\u0438\u0441\u043B\u043E',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'UAH'),
-  /**
-   * Number formatting symbols for locale ur.
-   */
-  "ur": const NumberSymbols(
+  // Number formatting symbols for locale ur.
+  "ur": new NumberSymbols(
       NAME: "ur",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1898,13 +1822,11 @@
       NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
-      PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4#,##0.00\u200E',
+      PERCENT_PATTERN: '#,##,##0%',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##,##0.00',
       DEF_CURRENCY_CODE: 'PKR'),
-  /**
-   * Number formatting symbols for locale uz.
-   */
-  "uz": const NumberSymbols(
+  // Number formatting symbols for locale uz.
+  "uz": new NumberSymbols(
       NAME: "uz",
       DECIMAL_SEP: ',',
       GROUP_SEP: '\u00A0',
@@ -1915,16 +1837,14 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'NaN',
+      NAN: 'haqiqiy\u00A0son\u00A0emas',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
       DEF_CURRENCY_CODE: 'UZS'),
-  /**
-   * Number formatting symbols for locale vi.
-   */
-  "vi": const NumberSymbols(
+  // Number formatting symbols for locale vi.
+  "vi": new NumberSymbols(
       NAME: "vi",
       DECIMAL_SEP: ',',
       GROUP_SEP: '.',
@@ -1939,12 +1859,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '#,##0.00\u00A0\u00A4',
+      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
       DEF_CURRENCY_CODE: 'VND'),
-  /**
-   * Number formatting symbols for locale zh.
-   */
-  "zh": const NumberSymbols(
+  // Number formatting symbols for locale zh.
+  "zh": new NumberSymbols(
       NAME: "zh",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1959,12 +1877,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'CNY'),
-  /**
-   * Number formatting symbols for locale zh_CN.
-   */
-  "zh_CN": const NumberSymbols(
+  // Number formatting symbols for locale zh_CN.
+  "zh_CN": new NumberSymbols(
       NAME: "zh_CN",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -1979,12 +1895,10 @@
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
-      CURRENCY_PATTERN: '\u00A4\u00A0#,##0.00',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'CNY'),
-  /**
-   * Number formatting symbols for locale zh_HK.
-   */
-  "zh_HK": const NumberSymbols(
+  // Number formatting symbols for locale zh_HK.
+  "zh_HK": new NumberSymbols(
       NAME: "zh_HK",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -2001,10 +1915,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'HKD'),
-  /**
-   * Number formatting symbols for locale zh_TW.
-   */
-  "zh_TW": const NumberSymbols(
+  // Number formatting symbols for locale zh_TW.
+  "zh_TW": new NumberSymbols(
       NAME: "zh_TW",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -2021,10 +1933,8 @@
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'TWD'),
-  /**
-   * Number formatting symbols for locale zu.
-   */
-  "zu": const NumberSymbols(
+  // Number formatting symbols for locale zu.
+  "zu": new NumberSymbols(
       NAME: "zu",
       DECIMAL_SEP: '.',
       GROUP_SEP: ',',
@@ -2035,10 +1945,4405 @@
       EXP_SYMBOL: 'E',
       PERMILL: '\u2030',
       INFINITY: '\u221E',
-      NAN: 'I-NaN',
+      NAN: 'NaN',
       DECIMAL_PATTERN: '#,##0.###',
       SCIENTIFIC_PATTERN: '#E0',
       PERCENT_PATTERN: '#,##0%',
       CURRENCY_PATTERN: '\u00A4#,##0.00',
       DEF_CURRENCY_CODE: 'ZAR')
 };
+
+Map<String, CompactNumberSymbols> compactNumberSymbols = {
+  // Compact number symbols for locale af.
+  "af": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0\u00A0m',
+    7: '00\u00A0m',
+    8: '000\u00A0m',
+    9: '0\u00A0mjd',
+    10: '00\u00A0mjd',
+    11: '000\u00A0mjd',
+    12: '0\u00A0bn',
+    13: '00\u00A0bn',
+    14: '000\u00A0bn',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 duisend',
+    4: '00 duisend',
+    5: '000 duisend',
+    6: '0 miljoen',
+    7: '00 miljoen',
+    8: '000 miljoen',
+    9: '0 miljard',
+    10: '00 miljard',
+    11: '000 miljard',
+    12: '0 biljoen',
+    13: '00 biljoen',
+    14: '000 biljoen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4\u00A0000K',
+    6: '\u00A40\u00A0m',
+    7: '\u00A400\u00A0m',
+    8: '\u00A4000\u00A0m',
+    9: '\u00A40\u00A0mjd',
+    10: '\u00A400\u00A0mjd',
+    11: '\u00A4000\u00A0mjd',
+    12: '\u00A40\u00A0bn',
+    13: '\u00A400\u00A0bn',
+    14: '\u00A4000\u00A0bn',
+  }),
+  // Compact number symbols for locale am.
+  "am": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u123A',
+    4: '00\u00A0\u123A',
+    5: '000\u00A0\u123A',
+    6: '0\u00A0\u121C\u1275\u122D',
+    7: '00\u00A0\u121C\u1275\u122D',
+    8: '000\u121C',
+    9: '0\u00A0\u1262',
+    10: '00\u00A0\u1262',
+    11: '000\u00A0\u1262',
+    12: '0\u00A0\u1275',
+    13: '00\u00A0\u1275',
+    14: '000\u00A0\u1275',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u123A',
+    4: '00 \u123A',
+    5: '000 \u123A',
+    6: '0 \u121A\u120A\u12EE\u1295',
+    7: '00 \u121A\u120A\u12EE\u1295',
+    8: '000 \u121A\u120A\u12EE\u1295',
+    9: '0 \u1262\u120A\u12EE\u1295',
+    10: '00 \u1262\u120A\u12EE\u1295',
+    11: '000 \u1262\u120A\u12EE\u1295',
+    12: '0 \u1275\u122A\u120A\u12EE\u1295',
+    13: '00 \u1275\u122A\u120A\u12EE\u1295',
+    14: '000 \u1275\u122A\u120A\u12EE\u1295',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u123A',
+    4: '\u00A400\u00A0\u123A',
+    5: '\u00A4000\u00A0\u123A',
+    6: '\u00A40\u00A0\u121C\u1275\u122D',
+    7: '\u00A400\u00A0\u121C\u1275\u122D',
+    8: '\u00A4000\u00A0\u121C\u1275\u122D',
+    9: '\u00A40\u00A0\u1262',
+    10: '\u00A400\u00A0\u1262',
+    11: '\u00A4000\u00A0\u1262',
+    12: '\u00A40\u00A0\u1275',
+    13: '\u00A400\u00A0\u1275',
+    14: '\u00A4000\u00A0\u1275',
+  }),
+  // Compact number symbols for locale ar.
+  "ar": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0623\u0644\u0641',
+    4: '00\u00A0\u0623\u0644\u0641',
+    5: '000\u00A0\u0623\u0644\u0641',
+    6: '0\u00A0\u0645\u0644\u064A\u0648',
+    7: '00\u00A0\u0645\u0644\u064A\u0648',
+    8: '000\u00A0\u0645\u0644\u064A\u0648',
+    9: '0\u00A0\u0645\u0644\u064A\u0627',
+    10: '00\u00A0\u0645\u0644\u064A\u0627',
+    11: '000\u00A0\u0645\u0644\u064A\u0627',
+    12: '0\u00A0\u062A\u0631\u0644\u064A\u0648',
+    13: '00\u00A0\u062A\u0631\u0644\u064A\u0648',
+    14: '000\u00A0\u062A\u0631\u0644\u064A\u0648',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0623\u0644\u0641',
+    4: '00 \u0623\u0644\u0641',
+    5: '000 \u0623\u0644\u0641',
+    6: '0 \u0645\u0644\u064A\u0648\u0646',
+    7: '00 \u0645\u0644\u064A\u0648\u0646',
+    8: '000 \u0645\u0644\u064A\u0648\u0646',
+    9: '0 \u0645\u0644\u064A\u0627\u0631',
+    10: '00 \u0645\u0644\u064A\u0627\u0631',
+    11: '000 \u0645\u0644\u064A\u0627\u0631',
+    12: '0 \u062A\u0631\u064A\u0644\u064A\u0648\u0646',
+    13: '00 \u062A\u0631\u064A\u0644\u064A\u0648\u0646',
+    14: '000 \u062A\u0631\u064A\u0644\u064A\u0648\u0646',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u00A0\u0623\u0644\u0641',
+    4: '\u00A4\u00A000\u00A0\u0623\u0644\u0641',
+    5: '\u00A4\u00A0000\u00A0\u0623\u0644\u0641',
+    6: '\u00A4\u00A00\u00A0\u0645\u0644\u064A\u0648',
+    7: '\u00A4\u00A000\u00A0\u0645\u0644\u064A\u0648',
+    8: '\u00A4\u00A0000\u00A0\u0645\u0644\u064A\u0648',
+    9: '\u00A4\u00A00\u00A0\u0645\u0644\u064A\u0627',
+    10: '\u00A4\u00A000\u00A0\u0645\u0644\u064A\u0627',
+    11: '\u00A4\u00A0000\u00A0\u0645\u0644\u064A\u0627',
+    12: '\u00A4\u00A00\u00A0\u062A\u0631\u0644\u064A\u0648',
+    13: '\u00A4\u00A000\u00A0\u062A\u0631\u0644\u064A\u0648',
+    14: '\u00A4\u00A0000\u00A0\u062A\u0631\u0644\u064A\u0648',
+  }),
+  // Compact number symbols for locale az.
+  "az": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00K',
+    4: '\u00A4\u00A000K',
+    5: '\u00A4\u00A0000K',
+    6: '\u00A4\u00A00M',
+    7: '\u00A4\u00A000M',
+    8: '\u00A4\u00A0000M',
+    9: '\u00A4\u00A00G',
+    10: '\u00A4\u00A000G',
+    11: '\u00A4\u00A0000G',
+    12: '\u00A4\u00A00T',
+    13: '\u00A4\u00A000T',
+    14: '\u00A4\u00A0000T',
+  }),
+  // Compact number symbols for locale be.
+  "be": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0442\u044B\u0441.',
+    4: '00\u00A0\u0442\u044B\u0441.',
+    5: '000\u00A0\u0442\u044B\u0441.',
+    6: '0\u00A0\u043C\u043B\u043D',
+    7: '00\u00A0\u043C\u043B\u043D',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0440\u0434',
+    10: '00\u00A0\u043C\u043B\u0440\u0434',
+    11: '000\u00A0\u043C\u043B\u0440\u0434',
+    12: '0\u00A0\u0442\u0440\u043B\u043D',
+    13: '00\u00A0\u0442\u0440\u043B\u043D',
+    14: '000\u00A0\u0442\u0440\u043B\u043D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0442\u044B\u0441\u044F\u0447\u044B',
+    4: '00 \u0442\u044B\u0441\u044F\u0447\u044B',
+    5: '000 \u0442\u044B\u0441\u044F\u0447\u044B',
+    6: '0 \u043C\u0456\u043B\u044C\u0451\u043D\u0430',
+    7: '00 \u043C\u0456\u043B\u044C\u0451\u043D\u0430',
+    8: '000 \u043C\u0456\u043B\u044C\u0451\u043D\u0430',
+    9: '0 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    10: '00 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    11: '000 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    12: '0 \u0442\u0440\u044B\u043B\u044C\u0451\u043D\u0430',
+    13: '00 \u0442\u0440\u044B\u043B\u044C\u0451\u043D\u0430',
+    14: '000 \u0442\u0440\u044B\u043B\u044C\u0451\u043D\u0430',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    4: '00\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    5: '000\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4\u00A0',
+    10: '00\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale bg.
+  "bg": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0445\u0438\u043B.',
+    4: '00\u00A0\u0445\u0438\u043B.',
+    5: '000\u00A0\u0445\u0438\u043B.',
+    6: '0\u00A0\u043C\u043B\u043D.',
+    7: '00\u00A0\u043C\u043B\u043D.',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0440\u0434.',
+    10: '00\u00A0\u043C\u043B\u0440\u0434.',
+    11: '000\u00A0\u043C\u043B\u0440\u0434.',
+    12: '0\u00A0\u0442\u0440\u043B\u043D.',
+    13: '00\u00A0\u0442\u0440\u043B\u043D.',
+    14: '000\u00A0\u0442\u0440\u043B\u043D.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0445\u0438\u043B\u044F\u0434\u0438',
+    4: '00 \u0445\u0438\u043B\u044F\u0434\u0438',
+    5: '000 \u0445\u0438\u043B\u044F\u0434\u0438',
+    6: '0 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    7: '00 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    8: '000 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    9: '0 \u043C\u0438\u043B\u0438\u0430\u0440\u0434\u0430',
+    10: '00 \u043C\u0438\u043B\u0438\u0430\u0440\u0434\u0430',
+    11: '000 \u043C\u0438\u043B\u0438\u0430\u0440\u0434\u0430',
+    12: '0 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0430',
+    13: '00 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0430',
+    14: '000 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0430',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0445\u0438\u043B.\u00A0\u00A4',
+    4: '00\u00A0\u0445\u0438\u043B.\u00A0\u00A4',
+    5: '000\u00A0\u0445\u0438\u043B.\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D.\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D.\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D.\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D.\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D.\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale bn.
+  "bn": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u09B9\u09BE\u099C\u09BE\u09B0',
+    4: '00\u00A0\u09B9\u09BE\u099C\u09BE\u09B0',
+    5: '0\u00A0\u09B2\u09BE\u0996',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u09B9\u09BE\u099C\u09BE\u09B0',
+    4: '00 \u09B9\u09BE\u099C\u09BE\u09B0',
+    5: '0 \u09B2\u09BE\u0996',
+    6: '0 \u09AE\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    7: '00 \u09AE\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    8: '000 \u09AE\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    9: '0 \u09AC\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    10: '00 \u09AC\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    11: '000 \u09AC\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    12: '0 \u099F\u09CD\u09B0\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    13: '00 \u099F\u09CD\u09B0\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+    14: '000 \u099F\u09CD\u09B0\u09BF\u09B2\u09BF\u09AF\u09BC\u09A8',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u09B9\u09BE\u099C\u09BE\u09B0\u00A4',
+    4: '00\u00A0\u09B9\u09BE\u099C\u09BE\u09B0\u00A4',
+    5: '0\u00A0\u09B2\u09BE\u0996\u00A4',
+    6: '0\u00A0\u09B2\u09BE\u0996\u00A4',
+    7: '00\u00A0\u0995\u09CB\u099F\u09BF\u00A4',
+    8: '000\u00A0\u0995\u09CB\u099F\u09BF\u00A4',
+    9: '0\u00A0\u098F\u0995\u09B6\u09CB\u00A0\u0995\u09CB\u099F\u09BF\u00A4',
+    10: '00\u00A0\u09B9\u09BE\u099C\u09BE\u09B0\u00A0\u0995\u09CB\u099F\u09BF\u00A4',
+    11: '000\u00A0\u09B8\u09B9\u09B8\u09CD\u09B0\u00A0\u0995\u09CB\u099F\u09BF\u00A4',
+    12: '0\u00A0\u09A6\u09B6\u00A0\u09B8\u09B9\u09B8\u09CD\u09B0\u09C7\u09B0\u00A0\u09A4\u09CD\u09B0\u09BF\u0998\u09BE\u09A4\u00A4',
+    13: '00\u00A0\u098F\u0995\u09B6\u09CB\u00A0\u09B8\u09B9\u09B8\u09CD\u09B0\u09C7\u09B0\u00A0\u09A4\u09CD\u09B0\u09BF\u0998\u09BE\u09A4\u00A4',
+    14: '000\u00A0\u09B8\u09B9\u09B8\u09CD\u09B0\u00A0\u09B8\u09B9\u09B8\u09CD\u09B0\u09C7\u09B0\u00A0\u09A4\u09CD\u09B0\u09BF\u0998\u09BE\u09A4\u00A4',
+  }),
+  // Compact number symbols for locale br.
+  "br": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0K\u00A0\u00A4',
+    4: '00K\u00A0\u00A4',
+    5: '000K\u00A0\u00A4',
+    6: '0M\u00A0\u00A4',
+    7: '00M\u00A0\u00A4',
+    8: '000M\u00A0\u00A4',
+    9: '0G\u00A0\u00A4',
+    10: '00G\u00A0\u00A4',
+    11: '000G\u00A0\u00A4',
+    12: '0T\u00A0\u00A4',
+    13: '00T\u00A0\u00A4',
+    14: '000T\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale bs.
+  "bs": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0hilj.',
+    4: '00\u00A0hilj.',
+    5: '000\u00A0hilj.',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mlr.',
+    10: '00\u00A0mlr.',
+    11: '000\u00A0mlr.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 hiljada',
+    4: '00 hiljada',
+    5: '000 hiljada',
+    6: '0 miliona',
+    7: '00 miliona',
+    8: '000 miliona',
+    9: '0 milijardi',
+    10: '00 milijardi',
+    11: '000 milijardi',
+    12: '0 biliona',
+    13: '00 biliona',
+    14: '000 biliona',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0hilj.\u00A0\u00A4',
+    4: '00\u00A0hilj.\u00A0\u00A4',
+    5: '000\u00A0hilj.\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mlr.\u00A0\u00A4',
+    10: '00\u00A0mlr.\u00A0\u00A4',
+    11: '000\u00A0mlr.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale ca.
+  "ca": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0m',
+    4: '00m',
+    5: '000m',
+    6: '0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0000\u00A0M',
+    10: '00mM',
+    11: '000mM',
+    12: '0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 milers',
+    4: '00 milers',
+    5: '000 milers',
+    6: '0 milions',
+    7: '00 milions',
+    8: '000 milions',
+    9: '0 milers de milions',
+    10: '00 milers de milions',
+    11: '000 milers de milions',
+    12: '0 bilions',
+    13: '00 bilions',
+    14: '000 bilions',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0m\u00A0\u00A4',
+    4: '00m\u00A0\u00A4',
+    5: '000m\u00A0\u00A4',
+    6: '0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00mM\u00A0\u00A4',
+    11: '000mM\u00A0\u00A4',
+    12: '0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale chr.
+  "chr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u13A2\u13EF\u13A6\u13F4\u13B5',
+    4: '00 \u13A2\u13EF\u13A6\u13F4\u13B5',
+    5: '000 \u13A2\u13EF\u13A6\u13F4\u13B5',
+    6: '0 \u13A2\u13F3\u13C6\u13D7\u13C5\u13DB',
+    7: '00 \u13A2\u13F3\u13C6\u13D7\u13C5\u13DB',
+    8: '000 \u13A2\u13F3\u13C6\u13D7\u13C5\u13DB',
+    9: '0 \u13A2\u13EF\u13D4\u13B3\u13D7\u13C5\u13DB',
+    10: '00 \u13A2\u13EF\u13D4\u13B3\u13D7\u13C5\u13DB',
+    11: '000 \u13A2\u13EF\u13D4\u13B3\u13D7\u13C5\u13DB',
+    12: '0 \u13A2\u13EF\u13E6\u13A0\u13D7\u13C5\u13DB',
+    13: '00 \u13A2\u13EF\u13E6\u13A0\u13D7\u13C5\u13DB',
+    14: '000 \u13A2\u13EF\u13E6\u13A0\u13D7\u13C5\u13DB',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A4\u00A000G',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale cs.
+  "cs": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tis.',
+    4: '00\u00A0tis.',
+    5: '000\u00A0tis.',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mld.',
+    10: '00\u00A0mld.',
+    11: '000\u00A0mld.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tis\u00EDc',
+    4: '00 tis\u00EDc',
+    5: '000 tis\u00EDc',
+    6: '0 milion\u016F',
+    7: '00 milion\u016F',
+    8: '000 milion\u016F',
+    9: '0 miliard',
+    10: '00 miliard',
+    11: '000 miliard',
+    12: '0 bilion\u016F',
+    13: '00 bilion\u016F',
+    14: '000 bilion\u016F',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tis.\u00A0\u00A4',
+    4: '00\u00A0tis.\u00A0\u00A4',
+    5: '000\u00A0tis.\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mld.\u00A0\u00A4',
+    10: '00\u00A0mld.\u00A0\u00A4',
+    11: '000\u00A0mld.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale cy.
+  "cy": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 miliwn',
+    7: '00 miliwn',
+    8: '000 miliwn',
+    9: '0 biliwn',
+    10: '00 biliwn',
+    11: '000 biliwn',
+    12: '0 triliwn',
+    13: '00 triliwn',
+    14: '000 triliwn',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale da.
+  "da": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0td',
+    4: '00\u00A0td',
+    5: '000\u00A0td',
+    6: '0\u00A0mio',
+    7: '00\u00A0mio',
+    8: '000\u00A0mio',
+    9: '0\u00A0mia',
+    10: '00\u00A0mia',
+    11: '000\u00A0mia',
+    12: '0\u00A0bio',
+    13: '00\u00A0bio',
+    14: '000\u00A0bio',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tusind',
+    4: '00 tusind',
+    5: '000 tusind',
+    6: '0 millioner',
+    7: '00 millioner',
+    8: '000 millioner',
+    9: '0 milliarder',
+    10: '00 milliarder',
+    11: '000 milliarder',
+    12: '0 billioner',
+    13: '00 billioner',
+    14: '000 billioner',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0td\u00A0\u00A4',
+    4: '00\u00A0td\u00A0\u00A4',
+    5: '000\u00A0td\u00A0\u00A4',
+    6: '0\u00A0mio\u00A0\u00A4',
+    7: '00\u00A0mio\u00A0\u00A4',
+    8: '000\u00A0mio\u00A0\u00A4',
+    9: '0\u00A0mia\u00A0\u00A4',
+    10: '00\u00A0mia\u00A0\u00A4',
+    11: '000\u00A0mia\u00A0\u00A4',
+    12: '0\u00A0bio\u00A0\u00A4',
+    13: '00\u00A0bio\u00A0\u00A4',
+    14: '000\u00A0bio\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale de.
+  "de": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0Tsd.',
+    4: '00\u00A0Tsd.',
+    5: '000\u00A0Tsd.',
+    6: '0\u00A0Mio.',
+    7: '00\u00A0Mio.',
+    8: '000\u00A0Mio.',
+    9: '0\u00A0Mrd.',
+    10: '00\u00A0Mrd.',
+    11: '000\u00A0Mrd.',
+    12: '0\u00A0Bio.',
+    13: '00\u00A0Bio.',
+    14: '000\u00A0Bio.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 Tausend',
+    4: '00 Tausend',
+    5: '000 Tausend',
+    6: '0 Millionen',
+    7: '00 Millionen',
+    8: '000 Millionen',
+    9: '0 Milliarden',
+    10: '00 Milliarden',
+    11: '000 Milliarden',
+    12: '0 Billionen',
+    13: '00 Billionen',
+    14: '000 Billionen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0Tsd.\u00A0\u00A4',
+    4: '00\u00A0Tsd.\u00A0\u00A4',
+    5: '000\u00A0Tsd.\u00A0\u00A4',
+    6: '0\u00A0Mio.\u00A0\u00A4',
+    7: '00\u00A0Mio.\u00A0\u00A4',
+    8: '000\u00A0Mio.\u00A0\u00A4',
+    9: '0\u00A0Mrd.\u00A0\u00A4',
+    10: '00\u00A0Mrd.\u00A0\u00A4',
+    11: '000\u00A0Mrd.\u00A0\u00A4',
+    12: '0\u00A0Bio.\u00A0\u00A4',
+    13: '00\u00A0Bio.\u00A0\u00A4',
+    14: '000\u00A0Bio.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale de_AT.
+  "de_AT": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0Tsd.',
+    4: '00\u00A0Tsd.',
+    5: '000\u00A0Tsd.',
+    6: '0\u00A0Mio.',
+    7: '00\u00A0Mio.',
+    8: '000\u00A0Mio.',
+    9: '0\u00A0Mrd.',
+    10: '00\u00A0Mrd.',
+    11: '000\u00A0Mrd.',
+    12: '0\u00A0Bio.',
+    13: '00\u00A0Bio.',
+    14: '000\u00A0Bio.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 Tausend',
+    4: '00 Tausend',
+    5: '000 Tausend',
+    6: '0 Millionen',
+    7: '00 Millionen',
+    8: '000 Millionen',
+    9: '0 Milliarden',
+    10: '00 Milliarden',
+    11: '000 Milliarden',
+    12: '0 Billionen',
+    13: '00 Billionen',
+    14: '000 Billionen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0Tsd.\u00A0\u00A4',
+    4: '00\u00A0Tsd.\u00A0\u00A4',
+    5: '000\u00A0Tsd.\u00A0\u00A4',
+    6: '0\u00A0Mio.\u00A0\u00A4',
+    7: '00\u00A0Mio.\u00A0\u00A4',
+    8: '000\u00A0Mio.\u00A0\u00A4',
+    9: '0\u00A0Mrd.\u00A0\u00A4',
+    10: '00\u00A0Mrd.\u00A0\u00A4',
+    11: '000\u00A0Mrd.\u00A0\u00A4',
+    12: '0\u00A0Bio.\u00A0\u00A4',
+    13: '00\u00A0Bio.\u00A0\u00A4',
+    14: '000\u00A0Bio.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale de_CH.
+  "de_CH": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0Tsd.',
+    4: '00\u00A0Tsd.',
+    5: '000\u00A0Tsd.',
+    6: '0\u00A0Mio.',
+    7: '00\u00A0Mio.',
+    8: '000\u00A0Mio.',
+    9: '0\u00A0Mrd.',
+    10: '00\u00A0Mrd.',
+    11: '000\u00A0Mrd.',
+    12: '0\u00A0Bio.',
+    13: '00\u00A0Bio.',
+    14: '000\u00A0Bio.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 Tausend',
+    4: '00 Tausend',
+    5: '000 Tausend',
+    6: '0 Millionen',
+    7: '00 Millionen',
+    8: '000 Millionen',
+    9: '0 Milliarden',
+    10: '00 Milliarden',
+    11: '000 Milliarden',
+    12: '0 Billionen',
+    13: '00 Billionen',
+    14: '000 Billionen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0Tsd.\u00A0\u00A4',
+    4: '00\u00A0Tsd.\u00A0\u00A4',
+    5: '000\u00A0Tsd.\u00A0\u00A4',
+    6: '0\u00A0Mio.\u00A0\u00A4',
+    7: '00\u00A0Mio.\u00A0\u00A4',
+    8: '000\u00A0Mio.\u00A0\u00A4',
+    9: '0\u00A0Mrd.\u00A0\u00A4',
+    10: '00\u00A0Mrd.\u00A0\u00A4',
+    11: '000\u00A0Mrd.\u00A0\u00A4',
+    12: '0\u00A0Bio.\u00A0\u00A4',
+    13: '00\u00A0Bio.\u00A0\u00A4',
+    14: '000\u00A0Bio.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale el.
+  "el": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u03C7\u03B9\u03BB.',
+    4: '00\u00A0\u03C7\u03B9\u03BB.',
+    5: '000\u00A0\u03C7\u03B9\u03BB.',
+    6: '0\u00A0\u03B5\u03BA.',
+    7: '00\u00A0\u03B5\u03BA.',
+    8: '000\u00A0\u03B5\u03BA.',
+    9: '0\u00A0\u03B4\u03B9\u03C3.',
+    10: '00\u00A0\u03B4\u03B9\u03C3.',
+    11: '000\u00A0\u03B4\u03B9\u03C3.',
+    12: '0\u00A0\u03C4\u03C1\u03B9\u03C3.',
+    13: '00\u00A0\u03C4\u03C1\u03B9\u03C3.',
+    14: '000\u00A0\u03C4\u03C1\u03B9\u03C3.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u03C7\u03B9\u03BB\u03B9\u03AC\u03B4\u03B5\u03C2',
+    4: '00 \u03C7\u03B9\u03BB\u03B9\u03AC\u03B4\u03B5\u03C2',
+    5: '000 \u03C7\u03B9\u03BB\u03B9\u03AC\u03B4\u03B5\u03C2',
+    6: '0 \u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    7: '00 \u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    8: '000 \u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    9: '0 \u03B4\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    10: '00 \u03B4\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    11: '000 \u03B4\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    12: '0 \u03C4\u03C1\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    13: '00 \u03C4\u03C1\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+    14: '000 \u03C4\u03C1\u03B9\u03C3\u03B5\u03BA\u03B1\u03C4\u03BF\u03BC\u03BC\u03CD\u03C1\u03B9\u03B1',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u03C7\u03B9\u03BB.\u00A0\u00A4',
+    4: '00\u00A0\u03C7\u03B9\u03BB.\u00A0\u00A4',
+    5: '000\u00A0\u03C7\u03B9\u03BB.\u00A0\u00A4',
+    6: '0\u00A0\u03B5\u03BA.\u00A0\u00A4',
+    7: '00\u00A0\u03B5\u03BA.\u00A0\u00A4',
+    8: '000\u00A0\u03B5\u03BA.\u00A0\u00A4',
+    9: '0\u00A0\u03B4\u03B9\u03C3.\u00A0\u00A4',
+    10: '00\u00A0\u03B4\u03B9\u03C3.\u00A0\u00A4',
+    11: '000\u00A0\u03B4\u03B9\u03C3.\u00A0\u00A4',
+    12: '0\u00A0\u03C4\u03C1\u03B9\u03C3.\u00A0\u00A4',
+    13: '00\u00A0\u03C4\u03C1\u03B9\u03C3.\u00A0\u00A4',
+    14: '000\u00A0\u03C4\u03C1\u03B9\u03C3.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale en.
+  "en": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_AU.
+  "en_AU": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_CA.
+  "en_CA": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_GB.
+  "en_GB": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_IE.
+  "en_IE": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_IN.
+  "en_IN": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_SG.
+  "en_SG": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_US.
+  "en_US": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale en_ZA.
+  "en_ZA": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 thousand',
+    4: '00 thousand',
+    5: '000 thousand',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 billion',
+    10: '00 billion',
+    11: '000 billion',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale es.
+  "es": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0K',
+    4: '00\u00A0K',
+    5: '000\u00A0K',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0000\u00A0M',
+    10: '00\u00A0MRD',
+    11: '000\u00A0MRD',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 millones',
+    7: '00 millones',
+    8: '000 millones',
+    9: '0 mil millones',
+    10: '00 mil millones',
+    11: '000 mil millones',
+    12: '0 billones',
+    13: '00 billones',
+    14: '000 billones',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0K\u00A0\u00A4',
+    4: '00\u00A0K\u00A0\u00A4',
+    5: '000\u00A0K\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00\u00A0MRD\u00A0\u00A4',
+    11: '000\u00A0MRD\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale es_419.
+  "es_419": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0k\u00A0M',
+    10: '00k\u00A0M',
+    11: '000k\u00A0M',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 millones',
+    7: '00 millones',
+    8: '000 millones',
+    9: '0 mil millones',
+    10: '00 mil millones',
+    11: '000 mil millones',
+    12: '0 billones',
+    13: '00 billones',
+    14: '000 billones',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0K\u00A0\u00A4',
+    4: '00\u00A0K\u00A0\u00A4',
+    5: '000\u00A0K\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00\u00A0MRD\u00A0\u00A4',
+    11: '000\u00A0MRD\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale es_ES.
+  "es_ES": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0K',
+    4: '00\u00A0K',
+    5: '000\u00A0K',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0000\u00A0M',
+    10: '00\u00A0MRD',
+    11: '000\u00A0MRD',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 millones',
+    7: '00 millones',
+    8: '000 millones',
+    9: '0 mil millones',
+    10: '00 mil millones',
+    11: '000 mil millones',
+    12: '0 billones',
+    13: '00 billones',
+    14: '000 billones',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0K\u00A0\u00A4',
+    4: '00\u00A0K\u00A0\u00A4',
+    5: '000\u00A0K\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00\u00A0MRD\u00A0\u00A4',
+    11: '000\u00A0MRD\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale es_MX.
+  "es_MX": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0k\u00A0M',
+    10: '00k\u00A0M',
+    11: '000k\u00A0M',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 millones',
+    7: '00 millones',
+    8: '000 millones',
+    9: '0 mil millones',
+    10: '00 mil millones',
+    11: '000 mil millones',
+    12: '0 billones',
+    13: '00 billones',
+    14: '000 billones',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0K\u00A0\u00A4',
+    4: '00\u00A0K\u00A0\u00A4',
+    5: '000\u00A0K\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00\u00A0MRD\u00A0\u00A4',
+    11: '000\u00A0MRD\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale es_US.
+  "es_US": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0k\u00A0M',
+    10: '00k\u00A0M',
+    11: '000k\u00A0M',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 millones',
+    7: '00 millones',
+    8: '000 millones',
+    9: '0 mil millones',
+    10: '00 mil millones',
+    11: '000 mil millones',
+    12: '0 billones',
+    13: '00 billones',
+    14: '000 billones',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0K\u00A0\u00A4',
+    4: '00\u00A0K\u00A0\u00A4',
+    5: '000\u00A0K\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00\u00A0MRD\u00A0\u00A4',
+    11: '000\u00A0MRD\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale et.
+  "et": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tuh',
+    4: '00\u00A0tuh',
+    5: '000\u00A0tuh',
+    6: '0\u00A0mln',
+    7: '00\u00A0mln',
+    8: '000\u00A0mln',
+    9: '0\u00A0mld',
+    10: '00\u00A0mld',
+    11: '000\u00A0mld',
+    12: '0\u00A0trl',
+    13: '00\u00A0trl',
+    14: '000\u00A0trl',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tuhat',
+    4: '00 tuhat',
+    5: '000 tuhat',
+    6: '0 miljonit',
+    7: '00 miljonit',
+    8: '000 miljonit',
+    9: '0 miljardit',
+    10: '00 miljardit',
+    11: '000 miljardit',
+    12: '0 triljonit',
+    13: '00 triljonit',
+    14: '000 triljonit',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tuh\u00A0\u00A4',
+    4: '00\u00A0tuh\u00A0\u00A4',
+    5: '000\u00A0tuh\u00A0\u00A4',
+    6: '0\u00A0mln\u00A0\u00A4',
+    7: '00\u00A0mln\u00A0\u00A4',
+    8: '000\u00A0mln\u00A0\u00A4',
+    9: '0\u00A0mld\u00A0\u00A4',
+    10: '00\u00A0mld\u00A0\u00A4',
+    11: '000\u00A0mld\u00A0\u00A4',
+    12: '0\u00A0trl\u00A0\u00A4',
+    13: '00\u00A0trl\u00A0\u00A4',
+    14: '000\u00A0trl\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale eu.
+  "eu": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0000',
+    4: '00000',
+    5: '000000',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0000\u00A0M',
+    10: '00000\u00A0M',
+    11: '000000\u00A0M',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0000',
+    4: '00000',
+    5: '000000',
+    6: '0 milioi',
+    7: '00 milioi',
+    8: '000 milioi',
+    9: '0000 milioi',
+    10: '00000 milioi',
+    11: '000000 milioi',
+    12: '0 bilioi',
+    13: '00 bilioi',
+    14: '000 bilioi',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0000\u00A0\u00A4',
+    4: '00000\u00A0\u00A4',
+    5: '000000\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0000\u00A0M\u00A0\u00A4',
+    10: '00000\u00A0M\u00A0\u00A4',
+    11: '000000\u00A0M\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale fa.
+  "fa": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0647\u0632\u0627\u0631',
+    4: '00\u00A0\u0647\u0632\u0627\u0631',
+    5: '000\u00A0\u0647\u0632\u0627\u0631',
+    6: '0\u00A0\u0645\u06CC\u0644\u06CC\u0648\u0646',
+    7: '00\u00A0\u0645\u06CC\u0644\u06CC\u0648\u0646',
+    8: '000\u00A0\u0645',
+    9: '0\u00A0\u0645',
+    10: '00\u00A0\u0645',
+    11: '000\u00A0\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    12: '0\u00A0\u062A\u0631\u06CC\u0644\u06CC\u0648\u0646',
+    13: '00\u00A0\u062A',
+    14: '000\u00A0\u062A',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0647\u0632\u0627\u0631',
+    4: '00 \u0647\u0632\u0627\u0631',
+    5: '000 \u0647\u0632\u0627\u0631',
+    6: '0 \u0645\u06CC\u0644\u06CC\u0648\u0646',
+    7: '00 \u0645\u06CC\u0644\u06CC\u0648\u0646',
+    8: '000 \u0645\u06CC\u0644\u06CC\u0648\u0646',
+    9: '0 \u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    10: '00 \u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    11: '000 \u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    12: '0 \u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    13: '00 \u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+    14: '000 \u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0647\u0632\u0627\u0631\u00A0\u00A4',
+    4: '00\u00A0\u0647\u0632\u0627\u0631\u00A0\u00A4',
+    5: '000\u00A0\u0647\u0632\u0627\u0631\u00A0\u00A4',
+    6: '0\u00A0\u0645\u06CC\u0644\u06CC\u0648\u0646\u00A0\u00A4',
+    7: '00\u00A0\u0645\u06CC\u0644\u06CC\u0648\u0646\u00A0\u00A4',
+    8: '000\u00A0\u0645\u06CC\u0644\u06CC\u0648\u0646\u00A0\u00A4',
+    9: '0\u00A0\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+    10: '00\u00A0\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+    11: '000\u00A0\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+    12: '0\u00A0\u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+    13: '00\u00A0\u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+    14: '000\u00A0\u0647\u0632\u0627\u0631\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale fi.
+  "fi": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0t.',
+    4: '00\u00A0t.',
+    5: '000\u00A0t.',
+    6: '0\u00A0milj.',
+    7: '00\u00A0milj.',
+    8: '000\u00A0milj.',
+    9: '0\u00A0mrd.',
+    10: '00\u00A0mrd.',
+    11: '000\u00A0mrd.',
+    12: '0\u00A0bilj.',
+    13: '00\u00A0bilj.',
+    14: '000\u00A0bilj.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tuhatta',
+    4: '00 tuhatta',
+    5: '000 tuhatta',
+    6: '0 miljoonaa',
+    7: '00 miljoonaa',
+    8: '000 miljoonaa',
+    9: '0 miljardia',
+    10: '00 miljardia',
+    11: '000 miljardia',
+    12: '0 biljoonaa',
+    13: '00 biljoonaa',
+    14: '000 biljoonaa',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0t.\u00A0\u00A4',
+    4: '00\u00A0t.\u00A0\u00A4',
+    5: '000\u00A0t.\u00A0\u00A4',
+    6: '0\u00A0milj.\u00A0\u00A4',
+    7: '00\u00A0milj.\u00A0\u00A4',
+    8: '000\u00A0milj.\u00A0\u00A4',
+    9: '0\u00A0mrd.\u00A0\u00A4',
+    10: '00\u00A0mrd.\u00A0\u00A4',
+    11: '000\u00A0mrd.\u00A0\u00A4',
+    12: '0\u00A0bilj.\u00A0\u00A4',
+    13: '00\u00A0bilj.\u00A0\u00A4',
+    14: '000\u00A0bilj.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale fil.
+  "fil": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 na libo',
+    4: '00 na libo',
+    5: '000 na libo',
+    6: '0 na milyon',
+    7: '00 na milyon',
+    8: '000 na milyon',
+    9: '0 na bilyon',
+    10: '00 na bilyon',
+    11: '000 na bilyon',
+    12: '0 na trilyon',
+    13: '00 na trilyon',
+    14: '000 na trilyon',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale fr.
+  "fr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0k',
+    4: '00\u00A0k',
+    5: '000\u00A0k',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0\u00A0Md',
+    10: '00\u00A0Md',
+    11: '000\u00A0Md',
+    12: '0\u00A0Bn',
+    13: '00\u00A0Bn',
+    14: '000\u00A0Bn',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mille',
+    4: '00 mille',
+    5: '000 mille',
+    6: '0 millions',
+    7: '00 millions',
+    8: '000 millions',
+    9: '0 milliards',
+    10: '00 milliards',
+    11: '000 milliards',
+    12: '0 billions',
+    13: '00 billions',
+    14: '000 billions',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0k\u00A0\u00A4',
+    4: '00\u00A0k\u00A0\u00A4',
+    5: '000\u00A0k\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0\u00A0Md\u00A0\u00A4',
+    10: '00\u00A0Md\u00A0\u00A4',
+    11: '000\u00A0Md\u00A0\u00A4',
+    12: '0\u00A0Bn\u00A0\u00A4',
+    13: '00\u00A0Bn\u00A0\u00A4',
+    14: '000\u00A0Bn\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale fr_CA.
+  "fr_CA": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0k',
+    4: '00\u00A0k',
+    5: '000\u00A0k',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0\u00A0G',
+    10: '00\u00A0G',
+    11: '000\u00A0G',
+    12: '0\u00A0T',
+    13: '00\u00A0T',
+    14: '000\u00A0T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mille',
+    4: '00 mille',
+    5: '000 mille',
+    6: '0 millions',
+    7: '00 millions',
+    8: '000 millions',
+    9: '0 milliards',
+    10: '00 milliards',
+    11: '000 milliards',
+    12: '0 billions',
+    13: '00 billions',
+    14: '000 billions',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0k\u00A0\u00A4',
+    4: '00\u00A0k\u00A0\u00A4',
+    5: '000\u00A0k\u00A0\u00A4',
+    6: '0\u00A0mns\u00A0\u00A4',
+    7: '00\u00A0mns\u00A0\u00A4',
+    8: '000\u00A0mns\u00A0\u00A4',
+    9: '0\u00A0mds\u00A0\u00A4',
+    10: '00\u00A0mds\u00A0\u00A4',
+    11: '000\u00A0mds\u00A0\u00A4',
+    12: '0\u00A0bns\u00A0\u00A4',
+    13: '00\u00A0bns\u00A0\u00A4',
+    14: '000\u00A0bns\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale ga.
+  "ga": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 m\u00EDle',
+    4: '00 m\u00EDle',
+    5: '000 m\u00EDle',
+    6: '0 milli\u00FAn',
+    7: '00 milli\u00FAn',
+    8: '000 milli\u00FAn',
+    9: '0 billi\u00FAn',
+    10: '00 billi\u00FAn',
+    11: '000 billi\u00FAn',
+    12: '0 trilli\u00FAn',
+    13: '00 trilli\u00FAn',
+    14: '000 trilli\u00FAn',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40k',
+    4: '\u00A400k',
+    5: '\u00A4000k',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale gl.
+  "gl": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0\u00A0mill.',
+    7: '00\u00A0mill.',
+    8: '000\u00A0mill',
+    9: '0',
+    10: '0',
+    11: '0',
+    12: '0\u00A0bill.',
+    13: '00\u00A0bill.',
+    14: '000\u00A0bill.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0 mill\u00F3ns',
+    7: '00 mill\u00F3ns',
+    8: '000 mill\u00F3ns',
+    9: '0',
+    10: '0',
+    11: '0',
+    12: '0 bill\u00F3ns',
+    13: '00 bill\u00F3ns',
+    14: '000 bill\u00F3ns',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0\u00A0M\u00A4',
+    7: '00\u00A0M\u00A4',
+    8: '000\u00A0M\u00A4',
+    9: '0',
+    10: '0',
+    11: '0',
+    12: '0',
+    13: '0',
+    14: '0',
+  }),
+  // Compact number symbols for locale gsw.
+  "gsw": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tsd',
+    4: '00\u00A0tsd',
+    5: '000\u00A0tsd',
+    6: '0\u00A0Mio',
+    7: '00\u00A0Mio',
+    8: '000\u00A0Mio',
+    9: '0\u00A0Mrd',
+    10: '00\u00A0Mrd',
+    11: '000\u00A0Mrd',
+    12: '0\u00A0Bio',
+    13: '00\u00A0Bio',
+    14: '000\u00A0Bio',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tausend',
+    4: '00 tausend',
+    5: '000 tausend',
+    6: '0 Millionen',
+    7: '00 Millionen',
+    8: '000 Millionen',
+    9: '0 Milliarden',
+    10: '00 Milliarden',
+    11: '000 Milliarden',
+    12: '0 Billionen',
+    13: '00 Billionen',
+    14: '000 Billionen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tsd\u00A0\u00A4',
+    4: '00\u00A0tsd\u00A0\u00A4',
+    5: '000\u00A0tsd\u00A0\u00A4',
+    6: '0\u00A0Mio\u00A0\u00A4',
+    7: '00\u00A0Mio\u00A0\u00A4',
+    8: '000\u00A0Mio\u00A0\u00A4',
+    9: '0\u00A0Mrd\u00A0\u00A4',
+    10: '00\u00A0Mrd\u00A0\u00A4',
+    11: '000\u00A0Mrd\u00A0\u00A4',
+    12: '0\u00A0Bio\u00A0\u00A4',
+    13: '00\u00A0Bio\u00A0\u00A4',
+    14: '000\u00A0Bio\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale gu.
+  "gu": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0AB9\u0A9C\u0ABE\u0AB0',
+    4: '00\u00A0\u0AB9\u0A9C\u0ABE\u0AB0',
+    5: '0\u00A0\u0AB2\u0ABE\u0A96',
+    6: '00\u00A0\u0AB2\u0ABE\u0A96',
+    7: '0\u00A0\u0A95\u0AB0\u0ACB\u0AA1',
+    8: '00\u00A0\u0A95\u0AB0\u0ACB\u0AA1',
+    9: '0\u00A0\u0A85\u0AAC\u0A9C',
+    10: '00\u00A0\u0A85\u0AAC\u0A9C',
+    11: '0\u00A0\u0AA8\u0ABF\u0A96\u0AB0\u0ACD\u0AB5',
+    12: '0\u00A0\u0AAE\u0AB9\u0ABE\u0AAA\u0AA6\u0ACD\u0AAE',
+    13: '0\u00A0\u0AB6\u0A82\u0A95\u0AC1',
+    14: '0\u00A0\u0A9C\u0AB2\u0AA7\u0ABF',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0AB9\u0A9C\u0ABE\u0AB0',
+    4: '00 \u0AB9\u0A9C\u0ABE\u0AB0',
+    5: '0 \u0AB2\u0ABE\u0A96',
+    6: '00 \u0AB2\u0ABE\u0A96',
+    7: '0 \u0A95\u0AB0\u0ACB\u0AA1',
+    8: '00 \u0A95\u0AB0\u0ACB\u0AA1',
+    9: '0 \u0A85\u0AAC\u0A9C',
+    10: '00 \u0A85\u0AAC\u0A9C',
+    11: '0 \u0AA8\u0ABF\u0A96\u0AB0\u0ACD\u0AB5',
+    12: '0 \u0AAE\u0AB9\u0ABE\u0AAA\u0AA6\u0ACD\u0AAE',
+    13: '0 \u0AB6\u0A82\u0A95\u0AC1',
+    14: '0 \u0A9C\u0AB2\u0AA7\u0ABF',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u0AB9\u0A9C\u0ABE\u0AB0',
+    4: '\u00A400\u00A0\u0AB9\u0A9C\u0ABE\u0AB0',
+    5: '\u00A40\u00A0\u0AB2\u0ABE\u0A96',
+    6: '\u00A400\u00A0\u0AB2\u0ABE\u0A96',
+    7: '\u00A40\u00A0\u0A95\u0AB0\u0ACB\u0AA1',
+    8: '\u00A400\u00A0\u0A95\u0AB0\u0ACB\u0AA1',
+    9: '\u00A40\u00A0\u0A85\u0AAC\u0A9C',
+    10: '\u00A400\u00A0\u0A85\u0AAC\u0A9C',
+    11: '\u00A40\u00A0\u0AA8\u0ABF\u0A96\u0AB0\u0ACD\u0AB5',
+    12: '\u00A40\u00A0\u0AAE\u0AB9\u0ABE\u0AAA\u0AA6\u0ACD\u0AAE',
+    13: '\u00A40\u00A0\u0AB6\u0A82\u0A95\u0AC1',
+    14: '\u00A40\u00A0\u0A9C\u0AB2\u0AA7\u0ABF',
+  }),
+  // Compact number symbols for locale haw.
+  "haw": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40G',
+    10: '\u00A400G',
+    11: '\u00A4000G',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale he.
+  "he": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '\u200F0 \u05D0\u05DC\u05E3',
+    4: '\u200F00 \u05D0\u05DC\u05E3',
+    5: '\u200F000 \u05D0\u05DC\u05E3',
+    6: '\u200F0 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    7: '\u200F00 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    8: '\u200F000 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    9: '\u200F0 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    10: '\u200F00 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    11: '\u200F000 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    12: '\u200F0 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+    13: '\u200F00 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+    14: '\u200F000 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00K',
+    4: '\u00A4\u00A000K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale hi.
+  "hi": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0939\u091C\u093C\u093E\u0930',
+    4: '00\u00A0\u0939\u091C\u093C\u093E\u0930',
+    5: '0\u00A0\u0932\u093E\u0916',
+    6: '00\u00A0\u0932\u093E\u0916',
+    7: '0\u00A0\u0915.',
+    8: '00\u00A0\u0915.',
+    9: '0\u00A0\u0905.',
+    10: '00\u00A0\u0905.',
+    11: '0\u00A0\u0916.',
+    12: '00\u00A0\u0916.',
+    13: '0\u00A0\u0928\u0940\u0932',
+    14: '00\u00A0\u0928\u0940\u0932',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0939\u091C\u093C\u093E\u0930',
+    4: '00 \u0939\u091C\u093C\u093E\u0930',
+    5: '0 \u0932\u093E\u0916',
+    6: '00 \u0932\u093E\u0916',
+    7: '0 \u0915\u0930\u094B\u0921\u093C',
+    8: '00 \u0915\u0930\u094B\u0921\u093C',
+    9: '0 \u0905\u0930\u092C',
+    10: '00 \u0905\u0930\u092C',
+    11: '0 \u0916\u0930\u092C',
+    12: '00 \u0916\u0930\u092C',
+    13: '000 \u0916\u0930\u092C',
+    14: '0000 \u0916\u0930\u092C',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u0939\u091C\u093C\u093E\u0930',
+    4: '\u00A400\u00A0\u0939\u091C\u093C\u093E\u0930',
+    5: '\u00A40\u00A0\u0932\u093E\u0916',
+    6: '\u00A400\u00A0\u0932\u093E\u0916',
+    7: '\u00A40\u00A0\u0915.',
+    8: '\u00A400\u00A0\u0915.',
+    9: '\u00A40\u00A0\u0905.',
+    10: '\u00A400\u00A0\u0905.',
+    11: '\u00A40\u00A0\u0916.',
+    12: '\u00A400\u00A0\u0916.',
+    13: '\u00A40\u00A0\u0928\u0940\u0932',
+    14: '\u00A400\u00A0\u0928\u0940\u0932',
+  }),
+  // Compact number symbols for locale hr.
+  "hr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tis.',
+    4: '00\u00A0tis.',
+    5: '000\u00A0tis.',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mlr.',
+    10: '00\u00A0mlr.',
+    11: '000\u00A0mlr.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tisu\u0107a',
+    4: '00 tisu\u0107a',
+    5: '000 tisu\u0107a',
+    6: '0 milijuna',
+    7: '00 milijuna',
+    8: '000 milijuna',
+    9: '0 milijardi',
+    10: '00 milijardi',
+    11: '000 milijardi',
+    12: '0 bilijuna',
+    13: '00 bilijuna',
+    14: '000 bilijuna',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0000\u00A4',
+    4: '00\u00A0tis.\u00A0\u00A4',
+    5: '000\u00A0tis.\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mlr.\u00A0\u00A4',
+    10: '00\u00A0mlr.\u00A0\u00A4',
+    11: '000\u00A0mlr.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale hu.
+  "hu": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0E',
+    4: '00\u00A0E',
+    5: '000\u00A0E',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0\u00A0Mrd',
+    10: '00\u00A0Mrd',
+    11: '000\u00A0Mrd',
+    12: '0\u00A0B',
+    13: '00\u00A0B',
+    14: '000\u00A0B',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ezer',
+    4: '00 ezer',
+    5: '000 ezer',
+    6: '0 milli\u00F3',
+    7: '00 milli\u00F3',
+    8: '000 milli\u00F3',
+    9: '0 milli\u00E1rd',
+    10: '00 milli\u00E1rd',
+    11: '000 milli\u00E1rd',
+    12: '0 billi\u00F3',
+    13: '00 billi\u00F3',
+    14: '000 billi\u00F3',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0E\u00A0\u00A4',
+    4: '00\u00A0E\u00A0\u00A4',
+    5: '000\u00A0E\u00A0\u00A4',
+    6: '0\u00A0M\u00A0\u00A4',
+    7: '00\u00A0M\u00A0\u00A4',
+    8: '000\u00A0M\u00A0\u00A4',
+    9: '0\u00A0Mrd\u00A0\u00A4',
+    10: '00\u00A0Mrd\u00A0\u00A4',
+    11: '000\u00A0Mrd\u00A0\u00A4',
+    12: '0\u00A0B\u00A0\u00A4',
+    13: '00\u00A0B\u00A0\u00A4',
+    14: '000\u00A0B\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale hy.
+  "hy": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0570\u0566\u0580',
+    4: '00\u00A0\u0570\u0566\u0580',
+    5: '000\u00A0\u0570\u0566\u0580',
+    6: '0\u00A0\u0574\u056C\u0576',
+    7: '00\u00A0\u0574\u056C\u0576',
+    8: '000\u00A0\u0574\u056C\u0576',
+    9: '0\u00A0\u0574\u056C\u0580\u0564',
+    10: '00\u00A0\u0574\u056C\u0580\u0564',
+    11: '000\u00A0\u0574\u056C\u0580\u0564',
+    12: '0\u00A0\u057F\u0580\u056C\u0576',
+    13: '00\u00A0\u057F\u0580\u056C\u0576',
+    14: '000\u00A0\u057F\u0580\u056C\u0576',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0570\u0561\u0566\u0561\u0580',
+    4: '00 \u0570\u0561\u0566\u0561\u0580',
+    5: '000 \u0570\u0561\u0566\u0561\u0580',
+    6: '0 \u0574\u056B\u056C\u056B\u0578\u0576',
+    7: '00 \u0574\u056B\u056C\u056B\u0578\u0576',
+    8: '000 \u0574\u056B\u056C\u056B\u0578\u0576',
+    9: '0 \u0574\u056B\u056C\u056B\u0561\u0580\u0564',
+    10: '00 \u0574\u056B\u056C\u056B\u0561\u0580\u0564',
+    11: '000 \u0574\u056B\u056C\u056B\u0561\u0580\u0564',
+    12: '0 \u057F\u0580\u056B\u056C\u056B\u0578\u0576',
+    13: '00 \u057F\u0580\u056B\u056C\u056B\u0578\u0576',
+    14: '000 \u057F\u0580\u056B\u056C\u056B\u0578\u0576',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0570\u0566\u0580\u00A0\u00A4',
+    4: '00\u00A0\u0570\u0566\u0580\u00A0\u00A4',
+    5: '000\u00A0\u0570\u0566\u0580\u00A0\u00A4',
+    6: '0\u00A0\u0574\u056C\u0576\u00A0\u00A4',
+    7: '00\u00A0\u0574\u056C\u0576\u00A0\u00A4',
+    8: '000\u00A0\u0574\u056C\u0576\u00A0\u00A4',
+    9: '0\u00A0\u0574\u056C\u0580\u0564\u00A0\u00A4',
+    10: '00\u00A0\u0574\u056C\u0580\u0564\u00A0\u00A4',
+    11: '000\u00A0\u0574\u056C\u0580\u0564\u00A0\u00A4',
+    12: '0\u00A0\u057F\u0580\u056C\u0576\u00A0\u00A4',
+    13: '00\u00A0\u057F\u0580\u056C\u0576\u00A0\u00A4',
+    14: '000\u00A0\u057F\u0580\u056C\u0576\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale id.
+  "id": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0rb',
+    4: '00\u00A0rb',
+    5: '000\u00A0rb',
+    6: '0\u00A0jt',
+    7: '00\u00A0jt',
+    8: '000\u00A0jt',
+    9: '0\u00A0M',
+    10: '00\u00A0M',
+    11: '000\u00A0M',
+    12: '0\u00A0T',
+    13: '00\u00A0T',
+    14: '000\u00A0T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ribu',
+    4: '00 ribu',
+    5: '000 ribu',
+    6: '0 juta',
+    7: '00 juta',
+    8: '000 juta',
+    9: '0 miliar',
+    10: '00 miliar',
+    11: '000 miliar',
+    12: '0 triliun',
+    13: '00 triliun',
+    14: '000 triliun',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0rb',
+    4: '\u00A400\u00A0rb',
+    5: '\u00A4000\u00A0rb',
+    6: '\u00A40\u00A0jt',
+    7: '\u00A400\u00A0jt',
+    8: '\u00A4000\u00A0jt',
+    9: '\u00A40\u00A0M',
+    10: '\u00A400\u00A0M',
+    11: '\u00A4000\u00A0M',
+    12: '\u00A40\u00A0T',
+    13: '\u00A400\u00A0T',
+    14: '\u00A4000\u00A0T',
+  }),
+  // Compact number symbols for locale in.
+  "in": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0rb',
+    4: '00\u00A0rb',
+    5: '000\u00A0rb',
+    6: '0\u00A0jt',
+    7: '00\u00A0jt',
+    8: '000\u00A0jt',
+    9: '0\u00A0M',
+    10: '00\u00A0M',
+    11: '000\u00A0M',
+    12: '0\u00A0T',
+    13: '00\u00A0T',
+    14: '000\u00A0T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ribu',
+    4: '00 ribu',
+    5: '000 ribu',
+    6: '0 juta',
+    7: '00 juta',
+    8: '000 juta',
+    9: '0 miliar',
+    10: '00 miliar',
+    11: '000 miliar',
+    12: '0 triliun',
+    13: '00 triliun',
+    14: '000 triliun',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0rb',
+    4: '\u00A400\u00A0rb',
+    5: '\u00A4000\u00A0rb',
+    6: '\u00A40\u00A0jt',
+    7: '\u00A400\u00A0jt',
+    8: '\u00A4000\u00A0jt',
+    9: '\u00A40\u00A0M',
+    10: '\u00A400\u00A0M',
+    11: '\u00A4000\u00A0M',
+    12: '\u00A40\u00A0T',
+    13: '\u00A400\u00A0T',
+    14: '\u00A4000\u00A0T',
+  }),
+  // Compact number symbols for locale is.
+  "is": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u00FE.',
+    4: '00\u00A0\u00FE.',
+    5: '000\u00A0\u00FE.',
+    6: '0\u00A0m.',
+    7: '00\u00A0m.',
+    8: '000\u00A0m.',
+    9: '0\u00A0ma.',
+    10: '00\u00A0ma.',
+    11: '000\u00A0ma.',
+    12: '0\u00A0bn',
+    13: '00\u00A0bn',
+    14: '000\u00A0bn',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u00FE\u00FAsund',
+    4: '00 \u00FE\u00FAsund',
+    5: '000 \u00FE\u00FAsund',
+    6: '0 millj\u00F3nir',
+    7: '00 millj\u00F3nir',
+    8: '000 millj\u00F3nir',
+    9: '0 milljar\u00F0ar',
+    10: '00 milljar\u00F0ar',
+    11: '000 milljar\u00F0ar',
+    12: '0 billj\u00F3nir',
+    13: '00 billj\u00F3nir',
+    14: '000 billj\u00F3nir',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u00FE.\u00A0\u00A4',
+    4: '00\u00A0\u00FE.\u00A0\u00A4',
+    5: '000\u00A0\u00FE.\u00A0\u00A4',
+    6: '0\u00A0m.\u00A0\u00A4',
+    7: '00\u00A0m.\u00A0\u00A4',
+    8: '000\u00A0m.\u00A0\u00A4',
+    9: '0\u00A0ma.\u00A0\u00A4',
+    10: '00\u00A0ma.\u00A0\u00A4',
+    11: '000\u00A0ma.\u00A0\u00A4',
+    12: '0\u00A0bn\u00A0\u00A4',
+    13: '00\u00A0bn\u00A0\u00A4',
+    14: '000\u00A0bn\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale it.
+  "it": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0\u00A0Mln',
+    7: '00\u00A0Mln',
+    8: '000\u00A0Mln',
+    9: '0\u00A0Mld',
+    10: '00\u00A0Mld',
+    11: '000\u00A0Mld',
+    12: '0\u00A0Bln',
+    13: '00\u00A0Bln',
+    14: '000\u00A0Bln',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mila',
+    4: '00 mila',
+    5: '000 mila',
+    6: '0 milioni',
+    7: '00 milioni',
+    8: '000 milioni',
+    9: '0 miliardi',
+    10: '00 miliardi',
+    11: '000 miliardi',
+    12: '0 mila miliardi',
+    13: '00 mila miliardi',
+    14: '000 mila miliardi',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0',
+    4: '0',
+    5: '0',
+    6: '0\u00A0Mio\u00A0\u00A4',
+    7: '00\u00A0Mio\u00A0\u00A4',
+    8: '000\u00A0Mio\u00A0\u00A4',
+    9: '0\u00A0Mrd\u00A0\u00A4',
+    10: '00\u00A0Mrd\u00A0\u00A4',
+    11: '000\u00A0Mrd\u00A0\u00A4',
+    12: '0\u00A0Bln\u00A0\u00A4',
+    13: '00\u00A0Bln\u00A0\u00A4',
+    14: '000\u00A0Bln\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale iw.
+  "iw": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '\u200F0 \u05D0\u05DC\u05E3',
+    4: '\u200F00 \u05D0\u05DC\u05E3',
+    5: '\u200F000 \u05D0\u05DC\u05E3',
+    6: '\u200F0 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    7: '\u200F00 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    8: '\u200F000 \u05DE\u05D9\u05DC\u05D9\u05D5\u05DF',
+    9: '\u200F0 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    10: '\u200F00 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    11: '\u200F000 \u05DE\u05D9\u05DC\u05D9\u05D0\u05E8\u05D3',
+    12: '\u200F0 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+    13: '\u200F00 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+    14: '\u200F000 \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00K',
+    4: '\u00A4\u00A000K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale ja.
+  "ja": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u5104',
+    9: '00\u5104',
+    10: '000\u5104',
+    11: '0000\u5104',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u5104',
+    9: '00\u5104',
+    10: '000\u5104',
+    11: '0000\u5104',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0',
+    4: '\u00A40\u4E07',
+    5: '\u00A400\u4E07',
+    6: '\u00A4000\u4E07',
+    7: '\u00A40000\u4E07',
+    8: '\u00A40\u5104',
+    9: '\u00A400\u5104',
+    10: '\u00A4000\u5104',
+    11: '\u00A40000\u5104',
+    12: '\u00A40\u5146',
+    13: '\u00A400\u5146',
+    14: '\u00A4000\u5146',
+  }),
+  // Compact number symbols for locale ka.
+  "ka": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u10D0\u10D7.',
+    4: '00\u00A0\u10D0\u10D7.',
+    5: '000\u00A0\u10D0\u10D7.',
+    6: '0\u00A0\u10DB\u10DA\u10DC.',
+    7: '00\u00A0\u10DB\u10DA\u10DC.',
+    8: '000\u00A0\u10DB\u10DA\u10DC.',
+    9: '0\u00A0\u10DB\u10DA\u10E0\u10D3.',
+    10: '00\u00A0\u10DB\u10DA\u10E0\u10D3.',
+    11: '000\u00A0\u10DB\u10DA\u10E0.',
+    12: '0\u00A0\u10E2\u10E0\u10DA.',
+    13: '00\u00A0\u10E2\u10E0\u10DA.',
+    14: '000\u00A0\u10E2\u10E0\u10DA.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u10D0\u10D7\u10D0\u10E1\u10D8',
+    4: '00 \u10D0\u10D7\u10D0\u10E1\u10D8',
+    5: '000 \u10D0\u10D7\u10D0\u10E1\u10D8',
+    6: '0 \u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+    7: '00 \u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+    8: '000 \u10DB\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+    9: '0 \u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D8',
+    10: '00 \u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D8',
+    11: '000 \u10DB\u10D8\u10DA\u10D8\u10D0\u10E0\u10D3\u10D8',
+    12: '0 \u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+    13: '00 \u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+    14: '000 \u10E2\u10E0\u10D8\u10DA\u10D8\u10DD\u10DC\u10D8',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u10D0\u10D7.\u00A0\u00A4',
+    4: '00\u00A0\u10D0\u10D7.\u00A0\u00A4',
+    5: '000\u00A0\u10D0\u10D7.\u00A0\u00A4',
+    6: '0\u00A0\u10DB\u10DA\u10DC.\u00A0\u00A4',
+    7: '00\u00A0\u10DB\u10DA\u10DC.\u00A0\u00A4',
+    8: '000\u00A0\u10DB\u10DA\u10DC.\u00A0\u00A4',
+    9: '0\u00A0\u10DB\u10DA\u10E0\u10D3.\u00A0\u00A4',
+    10: '00\u00A0\u10DB\u10DA\u10E0\u10D3.\u00A0\u00A4',
+    11: '000\u00A0\u10DB\u10DA\u10E0.\u00A0\u00A4',
+    12: '0\u00A0\u10E2\u10E0\u10DA.\u00A0\u00A4',
+    13: '00\u00A0\u10E2\u10E0\u10DA.\u00A0\u00A4',
+    14: '000\u00A0\u10E2\u10E0\u10DA.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale kk.
+  "kk": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u043C\u044B\u04A3',
+    4: '00\u00A0\u043C\u044B\u04A3',
+    5: '000\u00A0\u043C.',
+    6: '0\u00A0\u043C\u043B\u043D',
+    7: '00\u00A0\u043C\u043B\u043D',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0440\u0434',
+    10: '00\u00A0\u043C\u043B\u0440\u0434',
+    11: '000\u00A0\u043C\u043B\u0440\u0434',
+    12: '0\u00A0\u0442\u0440\u043B\u043D',
+    13: '00\u00A0\u0442\u0440\u043B\u043D',
+    14: '000\u00A0\u0442\u0440\u043B\u043D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u043C\u044B\u04A3',
+    4: '00 \u043C\u044B\u04A3',
+    5: '000 \u043C\u044B\u04A3',
+    6: '0 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    7: '00 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    8: '000 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    9: '0 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    10: '00 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    11: '000 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    12: '0 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+    13: '00 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+    14: '000 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u043C\u044B\u04A3\u00A0\u00A4',
+    4: '00\u00A0\u043C\u044B\u04A3\u00A0\u00A4',
+    5: '000\u00A0\u043C\u044B\u04A3\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale km.
+  "km": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u1796\u17B6\u1793\u17CB',
+    4: '0\u200B\u1798\u17BA\u17BB\u1793',
+    5: '0\u179F\u17C2\u1793',
+    6: '0\u179B\u17B6\u1793',
+    7: '0\u200B\u178A\u1794\u17CB\u200B\u179B\u17B6\u1793',
+    8: '0\u200B\u179A\u1799\u179B\u17B6\u1793',
+    9: '0\u200B\u1780\u17C4\u178A\u17B7',
+    10: '0\u200B\u178A\u1794\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    11: '0\u200B\u179A\u1799\u200B\u1780\u17C4\u178A\u17B7',
+    12: '0\u200B\u1796\u17B6\u1793\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    13: '0\u200B\u1798\u17BA\u17BB\u1793\u200B\u1780\u17C4\u178A\u17B7',
+    14: '0\u200B\u179F\u17C2\u1793\u200B\u1780\u17C4\u178A\u17B7',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u1796\u17B6\u1793\u17CB',
+    4: '0\u200B\u1798\u17BA\u17BB\u1793',
+    5: '0\u179F\u17C2\u1793',
+    6: '0\u179B\u17B6\u1793',
+    7: '0\u200B\u178A\u1794\u17CB\u200B\u179B\u17B6\u1793',
+    8: '0\u200B\u179A\u1799\u179B\u17B6\u1793',
+    9: '0\u200B\u1780\u17C4\u178A\u17B7',
+    10: '0\u200B\u178A\u1794\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    11: '0\u200B\u179A\u1799\u200B\u1780\u17C4\u178A\u17B7',
+    12: '0\u200B\u1796\u17B6\u1793\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    13: '0\u200B\u1798\u17BA\u17BB\u1793\u200B\u1780\u17C4\u178A\u17B7',
+    14: '0\u200B\u179F\u17C2\u1793\u200B\u1780\u17C4\u178A\u17B7',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u1796\u17B6\u1793\u17CB',
+    4: '\u00A40\u200B\u1798\u17BA\u17BB\u1793',
+    5: '\u00A40\u179F\u17C2\u1793',
+    6: '\u00A40\u179B\u17B6\u1793',
+    7: '\u00A40\u200B\u178A\u1794\u17CB\u200B\u179B\u17B6\u1793',
+    8: '\u00A40\u200B\u179A\u1799\u179B\u17B6\u1793',
+    9: '\u00A40\u200B\u1780\u17C4\u178A\u17B7',
+    10: '\u00A40\u200B\u178A\u1794\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    11: '\u00A40\u200B\u179A\u1799\u200B\u1780\u17C4\u178A\u17B7',
+    12: '\u00A40\u200B\u1796\u17B6\u1793\u17CB\u200B\u1780\u17C4\u178A\u17B7',
+    13: '\u00A40\u200B\u1798\u17BA\u17BB\u1793\u200B\u1780\u17C4\u178A\u17B7',
+    14: '\u00A40\u200B\u179F\u17C2\u1793\u200B\u1780\u17C4\u178A\u17B7',
+  }),
+  // Compact number symbols for locale kn.
+  "kn": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u0CB8\u0CBE',
+    4: '00\u0CB8\u0CBE',
+    5: '000\u0CB8\u0CBE',
+    6: '0\u0CAE\u0CBF',
+    7: '00\u0CAE\u0CBF',
+    8: '000\u0CAE\u0CBF',
+    9: '0\u0CAC\u0CBF',
+    10: '00\u0CAC\u0CBF',
+    11: '000\u0CAC\u0CBF',
+    12: '0\u0C9F\u0CCD\u0CB0\u0CBF',
+    13: '00\u0C9F\u0CCD\u0CB0\u0CBF',
+    14: '000\u0C9F\u0CCD\u0CB0\u0CBF',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0CB8\u0CBE\u0CB5\u0CBF\u0CB0',
+    4: '00 \u0CB8\u0CBE\u0CB5\u0CBF\u0CB0',
+    5: '000 \u0CB8\u0CBE\u0CB5\u0CBF\u0CB0',
+    6: '0 \u0CAE\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    7: '00 \u0CAE\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    8: '000 \u0CAE\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    9: '0 \u0CAC\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    10: '00 \u0CAC\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    11: '000 \u0CAC\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD',
+    12: '0 \u0C9F\u0CCD\u0CB0\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD\u200C',
+    13: '00 \u0C9F\u0CCD\u0CB0\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD\u200C',
+    14: '000 \u0C9F\u0CCD\u0CB0\u0CBF\u0CB2\u0CBF\u0CAF\u0CA8\u0CCD\u200C',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u0CB8\u0CBE',
+    4: '\u00A400\u0CB8\u0CBE',
+    5: '\u00A4000\u0CB8\u0CBE',
+    6: '\u00A40\u0CAE\u0CBF',
+    7: '\u00A400\u0CAE\u0CBF',
+    8: '\u00A4000\u0CAE\u0CBF',
+    9: '\u00A40\u0CAC\u0CBF',
+    10: '\u00A400\u0CAC\u0CBF',
+    11: '\u00A4000\u0CAC\u0CBF',
+    12: '\u00A40\u0C9F\u0CCD\u0CB0\u0CBF',
+    13: '\u00A400\u0C9F\u0CCD\u0CB0\u0CBF',
+    14: '\u00A4000\u0C9F\u0CCD\u0CB0\u0CBF',
+  }),
+  // Compact number symbols for locale ko.
+  "ko": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\uCC9C',
+    4: '0\uB9CC',
+    5: '00\uB9CC',
+    6: '000\uB9CC',
+    7: '0000\uB9CC',
+    8: '0\uC5B5',
+    9: '00\uC5B5',
+    10: '000\uC5B5',
+    11: '0000\uC5B5',
+    12: '0\uC870',
+    13: '00\uC870',
+    14: '000\uC870',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\uCC9C',
+    4: '0\uB9CC',
+    5: '00\uB9CC',
+    6: '000\uB9CC',
+    7: '0000\uB9CC',
+    8: '0\uC5B5',
+    9: '00\uC5B5',
+    10: '000\uC5B5',
+    11: '0000\uC5B5',
+    12: '0\uC870',
+    13: '00\uC870',
+    14: '000\uC870',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\uCC9C',
+    4: '\u00A40\uB9CC',
+    5: '\u00A400\uB9CC',
+    6: '\u00A4000\uB9CC',
+    7: '\u00A40000\uB9CC',
+    8: '\u00A40\uC5B5',
+    9: '\u00A400\uC5B5',
+    10: '\u00A4000\uC5B5',
+    11: '\u00A40000\uC5B5',
+    12: '\u00A40\uC870',
+    13: '\u00A400\uC870',
+    14: '\u00A4000\uC870',
+  }),
+  // Compact number symbols for locale ky.
+  "ky": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u043C\u0438\u04CA',
+    4: '00\u00A0\u043C\u0438\u04CA',
+    5: '000\u00A0\u043C\u0438\u04CA',
+    6: '0\u00A0\u043C\u043B\u043D',
+    7: '00\u00A0\u043C\u043B\u043D',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0434',
+    10: '00\u00A0\u043C\u043B\u0434',
+    11: '000\u00A0\u043C\u043B\u0434',
+    12: '0\u00A0\u0442\u0440\u043B\u043D',
+    13: '00\u00A0\u0442\u0440\u043B\u043D',
+    14: '000\u00A0\u0442\u0440\u043B\u043D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u043C\u0438\u04CA',
+    4: '00 \u043C\u0438\u04CA',
+    5: '000 \u043C\u0438\u04CA',
+    6: '0 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    7: '00 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    8: '000 \u043C\u0438\u043B\u043B\u0438\u043E\u043D',
+    9: '0 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    10: '00 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    11: '000 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434',
+    12: '0 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+    13: '00 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+    14: '000 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u043C\u0438\u04CA\u00A0\u00A4',
+    4: '00\u00A0\u043C\u0438\u04CA\u00A0\u00A4',
+    5: '000\u00A0\u043C\u0438\u04CA\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0434\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0434\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0434\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale ln.
+  "ln": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0K\u00A0\u00A4',
+    4: '00K\u00A0\u00A4',
+    5: '000K\u00A0\u00A4',
+    6: '0M\u00A0\u00A4',
+    7: '00M\u00A0\u00A4',
+    8: '000M\u00A0\u00A4',
+    9: '0G\u00A0\u00A4',
+    10: '00G\u00A0\u00A4',
+    11: '000G\u00A0\u00A4',
+    12: '0T\u00A0\u00A4',
+    13: '00T\u00A0\u00A4',
+    14: '000T\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale lo.
+  "lo": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0E9E\u0EB1\u0E99',
+    4: '00\u00A0\u0E9E\u0EB1\u0E99',
+    5: '000\u00A0\u0E81\u0EB5\u0E9A',
+    6: '0\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    7: '00\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    8: '000\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    9: '0\u00A0\u0E95\u0EB7\u0EC9',
+    10: '00\u00A0\u0E95\u0EB7\u0EC9',
+    11: '000\u00A0\u0E95\u0EB7\u0EC9',
+    12: '0\u00A0\u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+    13: '00\u0EA5\u0EA5',
+    14: '000\u0EA5\u0EA5',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0E9E\u0EB1\u0E99',
+    4: '00 \u0E9E\u0EB1\u0E99',
+    5: '0 \u0EC1\u0EAA\u0E99',
+    6: '0 \u0EA5\u0EC9\u0EB2\u0E99',
+    7: '00 \u0EA5\u0EC9\u0EB2\u0E99',
+    8: '000 \u0EA5\u0EC9\u0EB2\u0E99',
+    9: '0 \u0E95\u0EB7\u0EC9',
+    10: '00 \u0E95\u0EB7\u0EC9',
+    11: '000 \u0E95\u0EB7\u0EC9',
+    12: '0 \u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+    13: '00 \u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+    14: '000 \u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u0E9E\u0EB1\u0E99',
+    4: '\u00A400\u00A0\u0E9E\u0EB1\u0E99',
+    5: '\u00A4000\u00A0\u0E81\u0EB5\u0E9A',
+    6: '\u00A40\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    7: '\u00A400\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    8: '\u00A4000\u00A0\u0EA5\u0EC9\u0EB2\u0E99',
+    9: '\u00A40\u00A0\u0E95\u0EB7\u0EC9',
+    10: '\u00A400\u00A0\u0E95\u0EB7\u0EC9',
+    11: '\u00A4000\u00A0\u0E95\u0EB7\u0EC9',
+    12: '\u00A40\u00A0\u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+    13: '\u00A400\u00A0\u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+    14: '\u00A4000\u00A0\u0EA5\u0EC9\u0EB2\u0E99\u0EA5\u0EC9\u0EB2\u0E99',
+  }),
+  // Compact number symbols for locale lt.
+  "lt": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0t\u016Bkst.',
+    4: '00\u00A0t\u016Bkst.',
+    5: '000\u00A0t\u016Bkst.',
+    6: '0\u00A0mln.',
+    7: '00\u00A0mln.',
+    8: '000\u00A0mln.',
+    9: '0\u00A0mlrd.',
+    10: '00\u00A0mlrd.',
+    11: '000\u00A0mlrd.',
+    12: '0\u00A0trln.',
+    13: '00\u00A0trln.',
+    14: '000\u00A0trln.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 t\u016Bkstan\u010Di\u0173',
+    4: '00 t\u016Bkstan\u010Di\u0173',
+    5: '000 t\u016Bkstan\u010Di\u0173',
+    6: '0 milijon\u0173',
+    7: '00 milijon\u0173',
+    8: '000 milijon\u0173',
+    9: '0 milijard\u0173',
+    10: '00 milijard\u0173',
+    11: '000 milijard\u0173',
+    12: '0 trilijon\u0173',
+    13: '00 trilijon\u0173',
+    14: '000 trilijon\u0173',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0t\u016Bkst.\u00A0\u00A4',
+    4: '00\u00A0t\u016Bkst.\u00A0\u00A4',
+    5: '000\u00A0t\u016Bkst.\u00A0\u00A4',
+    6: '0\u00A0mln.\u00A0\u00A4',
+    7: '00\u00A0mln.\u00A0\u00A4',
+    8: '000\u00A0mln.\u00A0\u00A4',
+    9: '0\u00A0mlrd.\u00A0\u00A4',
+    10: '00\u00A0mlrd.\u00A0\u00A4',
+    11: '000\u00A0mlrd.\u00A0\u00A4',
+    12: '0\u00A0trln.\u00A0\u00A4',
+    13: '00\u00A0trln.\u00A0\u00A4',
+    14: '000\u00A0trln.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale lv.
+  "lv": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0t\u016Bkst.',
+    4: '00\u00A0t\u016Bkst.',
+    5: '000\u00A0t\u016Bkst.',
+    6: '0\u00A0milj.',
+    7: '00\u00A0milj.',
+    8: '000\u00A0milj.',
+    9: '0\u00A0mljrd.',
+    10: '00\u00A0mljrd.',
+    11: '000\u00A0mljrd.',
+    12: '0\u00A0trilj.',
+    13: '00\u00A0trilj.',
+    14: '000\u00A0trilj.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 t\u016Bksto\u0161i',
+    4: '00 t\u016Bksto\u0161i',
+    5: '000 t\u016Bksto\u0161i',
+    6: '0 miljoni',
+    7: '00 miljoni',
+    8: '000 miljoni',
+    9: '0 miljardi',
+    10: '00 miljardi',
+    11: '000 miljardi',
+    12: '0 triljoni',
+    13: '00 triljoni',
+    14: '000 triljoni',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0t\u016Bkst.\u00A0\u00A4',
+    4: '00\u00A0t\u016Bkst.\u00A0\u00A4',
+    5: '000\u00A0t\u016Bkst.\u00A0\u00A4',
+    6: '0\u00A0milj.\u00A0\u00A4',
+    7: '00\u00A0milj.\u00A0\u00A4',
+    8: '000\u00A0milj.\u00A0\u00A4',
+    9: '0\u00A0mljrd.\u00A0\u00A4',
+    10: '\u00A400\u00A0mljrd.',
+    11: '\u00A4000\u00A0mljrd.',
+    12: '\u00A40\u00A0trilj.',
+    13: '\u00A400\u00A0trilj.',
+    14: '\u00A4000\u00A0trilj.',
+  }),
+  // Compact number symbols for locale mk.
+  "mk": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0438\u043B\u0458.',
+    4: '00\u00A0\u0438\u043B\u0458.',
+    5: '000\u00A0\u0438\u043B\u0458.',
+    6: '0\u00A0\u043C\u0438\u043B.',
+    7: '00\u00A0\u043C\u0438\u043B.',
+    8: '000\u00A0\u041C',
+    9: '0\u00A0\u043C\u0438\u043B\u0458.',
+    10: '00\u00A0\u043C\u0438\u043B\u0458.',
+    11: '000\u00A0\u043C\u0438\u043B\u0458.',
+    12: '0\u00A0\u0442\u0440\u0438\u043B.',
+    13: '00\u00A0\u0442\u0440\u0438\u043B.',
+    14: '000\u00A0\u0442\u0440\u0438\u043B.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0438\u043B\u0458\u0430\u0434\u0438',
+    4: '00 \u0438\u043B\u0458\u0430\u0434\u0438',
+    5: '000 \u0438\u043B\u0458\u0430\u0434\u0438',
+    6: '0 \u043C\u0438\u043B\u0438\u043E\u043D\u0438',
+    7: '00 \u043C\u0438\u043B\u0438\u043E\u043D\u0438',
+    8: '000 \u043C\u0438\u043B\u0438\u043E\u043D\u0438',
+    9: '0 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    10: '00 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    11: '000 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    12: '0 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0438',
+    13: '00 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0438',
+    14: '000 \u0442\u0440\u0438\u043B\u0438\u043E\u043D\u0438',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u00A0\u0438\u043B\u0458.',
+    4: '\u00A4\u00A000\u00A0\u0438\u043B\u0458.',
+    5: '\u00A4\u00A0000\u00A0\u0438\u043B\u0458.',
+    6: '\u00A4\u00A00\u00A0\u043C\u0438\u043B.',
+    7: '\u00A4\u00A000\u00A0\u043C\u0438\u043B.',
+    8: '\u00A4\u00A0000\u00A0\u041C',
+    9: '\u00A4\u00A00\u00A0\u043C\u0438\u043B\u0458.',
+    10: '\u00A4\u00A000\u00A0\u043C\u0438\u043B\u0458.',
+    11: '\u00A4\u00A0000\u00A0\u043C\u0438\u043B\u0458.',
+    12: '\u00A4\u00A00\u00A0\u0442\u0440\u0438\u043B.',
+    13: '\u00A4\u00A000\u00A0\u0442\u0440\u0438\u043B.',
+    14: '\u00A4\u00A0000\u00A0\u0442\u0440\u0438\u043B.',
+  }),
+  // Compact number symbols for locale ml.
+  "ml": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0D06\u0D2F\u0D3F\u0D30\u0D02',
+    4: '00 \u0D06\u0D2F\u0D3F\u0D30\u0D02',
+    5: '000 \u0D06\u0D2F\u0D3F\u0D30\u0D02',
+    6: '0 \u0D26\u0D36\u0D32\u0D15\u0D4D\u0D37\u0D02',
+    7: '00 \u0D26\u0D36\u0D32\u0D15\u0D4D\u0D37\u0D02',
+    8: '000 \u0D26\u0D36\u0D32\u0D15\u0D4D\u0D37\u0D02',
+    9: '0 \u0D32\u0D15\u0D4D\u0D37\u0D02 \u0D15\u0D4B\u0D1F\u0D3F',
+    10: '00 \u0D32\u0D15\u0D4D\u0D37\u0D02 \u0D15\u0D4B\u0D1F\u0D3F',
+    11: '000 \u0D32\u0D15\u0D4D\u0D37\u0D02 \u0D15\u0D4B\u0D1F\u0D3F',
+    12: '0 \u0D1F\u0D4D\u0D30\u0D3F\u0D32\u0D4D\u0D2F\u0D7A',
+    13: '00 \u0D1F\u0D4D\u0D30\u0D3F\u0D32\u0D4D\u0D2F\u0D7A',
+    14: '000 \u0D1F\u0D4D\u0D30\u0D3F\u0D32\u0D4D\u0D2F\u0D7A',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale mn.
+  "mn": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u043C\u044F\u043D\u0433\u0430',
+    4: '00\u043C\u044F\u043D\u0433\u0430',
+    5: '000\u041C',
+    6: '0\u0441\u0430\u044F',
+    7: '00\u0441\u0430\u044F',
+    8: '000\u0441\u0430\u044F',
+    9: '0\u0442\u044D\u0440\u0431\u0443\u043C',
+    10: '00\u0422',
+    11: '000\u0422',
+    12: '0\u0418\u041D',
+    13: '00\u0418\u041D',
+    14: '000\u0418\u041D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u043C\u044F\u043D\u0433\u0430',
+    4: '00 \u043C\u044F\u043D\u0433\u0430',
+    5: '000 \u043C\u044F\u043D\u0433\u0430',
+    6: '0 \u0441\u0430\u044F',
+    7: '00 \u0441\u0430\u044F',
+    8: '000 \u0441\u0430\u044F',
+    9: '0 \u0442\u044D\u0440\u0431\u0443\u043C',
+    10: '00 \u0442\u044D\u0440\u0431\u0443\u043C',
+    11: '000 \u0442\u044D\u0440\u0431\u0443\u043C',
+    12: '0 \u0438\u0445 \u043D\u0430\u044F\u0434',
+    13: '00 \u0438\u0445 \u043D\u0430\u044F\u0434',
+    14: '000 \u0438\u0445 \u043D\u0430\u044F\u0434',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u041C\u044F\u043D\u0433\u0430',
+    4: '\u00A4\u00A000\u041C\u044F\u043D\u0433\u0430',
+    5: '\u00A4\u00A00\u041C\u044F\u043D\u0433\u0430',
+    6: '\u00A4\u00A00\u0421\u0430\u044F',
+    7: '\u00A4\u00A000\u0421\u0430\u044F',
+    8: '\u00A4\u00A0000\u0421\u0430\u044F',
+    9: '\u00A4\u00A00\u0422\u044D\u0440\u0431\u0443\u043C',
+    10: '\u00A4\u00A000\u0422\u044D\u0440\u0431\u0443\u043C',
+    11: '\u00A4\u00A0000\u0422\u044D\u0440\u0431\u0443\u043C',
+    12: '\u00A4\u00A00\u0418\u041D',
+    13: '\u00A4\u00A000\u0418\u041D',
+    14: '\u00A4\u00A0000\u0418\u041D',
+  }),
+  // Compact number symbols for locale mr.
+  "mr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0939',
+    4: '00\u00A0\u0939',
+    5: '0\u00A0\u0932\u093E\u0916',
+    6: '00\u00A0\u0932\u093E\u0916',
+    7: '0\u00A0\u0915\u094B\u091F\u0940',
+    8: '00\u00A0\u0915\u094B\u091F\u0940',
+    9: '0\u00A0\u0905\u092C\u094D\u091C',
+    10: '00\u00A0\u0905\u092C\u094D\u091C',
+    11: '0\u00A0\u0916\u0930\u094D\u0935',
+    12: '00\u00A0\u0916\u0930\u094D\u0935',
+    13: '0\u00A0\u092A\u0926\u094D\u092E',
+    14: '00\u00A0\u092A\u0926\u094D\u092E',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0939\u091C\u093E\u0930',
+    4: '00 \u0939\u091C\u093E\u0930',
+    5: '0 \u0932\u093E\u0916',
+    6: '00 \u0932\u093E\u0916',
+    7: '0 \u0915\u094B\u091F\u0940',
+    8: '00 \u0915\u094B\u091F\u0940',
+    9: '0 \u0905\u092C\u094D\u091C',
+    10: '00 \u0905\u092C\u094D\u091C',
+    11: '0 \u0916\u0930\u094D\u0935',
+    12: '00 \u0916\u0930\u094D\u0935',
+    13: '0 \u092A\u0926\u094D\u092E',
+    14: '00 \u092A\u0926\u094D\u092E',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u0939',
+    4: '\u00A400\u00A0\u0939',
+    5: '\u00A40\u00A0\u0932\u093E\u0916',
+    6: '\u00A400\u00A0\u0932\u093E\u0916',
+    7: '\u00A40\u00A0\u0915\u094B\u091F\u0940',
+    8: '\u00A400\u00A0\u0915\u094B\u091F\u0940',
+    9: '\u00A40\u00A0\u0905\u092C\u094D\u091C',
+    10: '\u00A400\u00A0\u0905\u092C\u094D\u091C',
+    11: '\u00A40\u00A0\u0916\u0930\u094D\u0935',
+    12: '\u00A400\u00A0\u0916\u0930\u094D\u0935',
+    13: '\u00A40\u00A0\u092A\u0926\u094D\u092E',
+    14: '\u00A400\u00A0\u092A\u0926\u094D\u092E',
+  }),
+  // Compact number symbols for locale ms.
+  "ms": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0J',
+    7: '00J',
+    8: '000J',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ribu',
+    4: '00 ribu',
+    5: '000 ribu',
+    6: '0 juta',
+    7: '00 juta',
+    8: '000 juta',
+    9: '0 bilion',
+    10: '00 bilion',
+    11: '000 bilion',
+    12: '0 trilion',
+    13: '00 trilion',
+    14: '000 trilion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40J',
+    7: '\u00A400J',
+    8: '\u00A4000J',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale mt.
+  "mt": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40G',
+    10: '\u00A400G',
+    11: '\u00A4000G',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale my.
+  "my": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u1011\u1031\u102C\u1004\u103A',
+    4: '0\u101E\u1031\u102C\u1004\u103A\u1038',
+    5: '0\u101E\u102D\u1014\u103A\u1038',
+    6: '0\u101E\u1014\u103A\u1038',
+    7: '0\u1000\u102F\u100B\u1031',
+    8: '00\u1000\u102F\u100B\u1031',
+    9: '\u1000\u102F\u100B\u1031000',
+    10: '\u1000\u102F\u100B\u10310\u1011',
+    11: '\u1000\u102F\u100B\u10310\u101E',
+    12: '\u100B\u10310\u101E\u102D\u1014\u103A\u1038',
+    13: '\u100B\u10310\u101E\u1014\u103A\u1038',
+    14: '0\u1000\u1031\u102C\u100B\u102D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u1011\u1031\u102C\u1004\u103A',
+    4: '0\u101E\u1031\u102C\u1004\u103A\u1038',
+    5: '0\u101E\u102D\u1014\u103A\u1038',
+    6: '0\u101E\u1014\u103A\u1038',
+    7: '0\u1000\u102F\u100B\u1031',
+    8: '00\u1000\u102F\u100B\u1031',
+    9: '\u1000\u102F\u100B\u1031000',
+    10: '\u1000\u102F\u100B\u10310000',
+    11: '\u1000\u102F\u100B\u10310\u101E\u1031\u102C\u1004\u103A\u1038',
+    12: '\u1000\u102F\u100B\u10310\u101E\u102D\u1014\u103A\u1038',
+    13: '\u1000\u102F\u100B\u10310\u101E\u1014\u103A\u1038',
+    14: '0\u1000\u1031\u102C\u100B\u102D',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u1011\u1031\u102C\u1004\u103A',
+    4: '\u00A4\u00A00\u101E\u1031\u102C\u1004\u103A\u1038',
+    5: '\u00A4\u00A00\u101E\u102D\u1014\u103A\u1038',
+    6: '\u00A4\u00A00\u101E\u1014\u103A\u1038',
+    7: '\u00A4\u00A00\u1000\u102F\u100B\u1031',
+    8: '\u00A4\u00A000\u1000\u102F\u100B\u1031',
+    9: '\u00A4\u00A0\u1000\u102F\u100B\u1031000',
+    10: '\u00A4\u00A0\u1000\u102F\u100B\u10310000',
+    11: '\u00A4\u00A0\u1000\u102F\u100B\u10310\u101E\u1031\u102C\u1004\u103A\u1038',
+    12: '\u00A4\u00A0\u1000\u102F\u100B\u10310\u101E\u102D\u1014\u103A\u1038',
+    13: '\u00A4\u00A0\u1000\u102F\u100B\u10310\u101E\u1014\u103A\u1038',
+    14: '\u00A4\u00A00\u1000\u1031\u102C\u100B\u102D',
+  }),
+  // Compact number symbols for locale nb.
+  "nb": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0mill',
+    7: '00\u00A0mill',
+    8: '000\u00A0mill',
+    9: '0\u00A0mrd',
+    10: '00\u00A0mrd',
+    11: '000\u00A0mrd',
+    12: '0\u00A0bill',
+    13: '00\u00A0bill',
+    14: '000\u00A0bill',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tusen',
+    4: '00 tusen',
+    5: '000 tusen',
+    6: '0 millioner',
+    7: '00 millioner',
+    8: '000 millioner',
+    9: '0 milliarder',
+    10: '00 milliarder',
+    11: '000 milliarder',
+    12: '0 billioner',
+    13: '00 billioner',
+    14: '000 billioner',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00k',
+    4: '\u00A4\u00A000k',
+    5: '\u00A4\u00A0000k',
+    6: '\u00A4\u00A00\u00A0mill',
+    7: '\u00A4\u00A000\u00A0mill',
+    8: '\u00A4\u00A0000\u00A0mill',
+    9: '\u00A4\u00A00\u00A0mrd',
+    10: '\u00A4\u00A000\u00A0mrd',
+    11: '\u00A4\u00A0000\u00A0mrd',
+    12: '\u00A4\u00A00\u00A0bill',
+    13: '\u00A4\u00A000\u00A0bill',
+    14: '\u00A4\u00A0000\u00A0bill',
+  }),
+  // Compact number symbols for locale ne.
+  "ne": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0939\u091C\u093E\u0930',
+    4: '00\u00A0\u0939\u091C\u093E\u0930',
+    5: '0\u00A0\u0932\u093E\u0916',
+    6: '00\u00A0\u0932\u093E\u0916',
+    7: '0\u00A0\u0915\u0930\u094B\u0921',
+    8: '00\u00A0\u0915\u0930\u094B\u0921',
+    9: '0\u00A0\u0905\u0930\u092C',
+    10: '00\u00A0\u0905\u0930\u092C',
+    11: '0\u00A0\u0916\u0930\u092C',
+    12: '00\u00A0\u0916\u0930\u092C',
+    13: '0\u00A0\u0936\u0902\u0916',
+    14: '00\u00A0\u0936\u0902\u0916',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0939\u091C\u093E\u0930',
+    4: '00 \u0939\u091C\u093E\u0930',
+    5: '0 \u0932\u093E\u0916',
+    6: '0 \u0915\u0930\u094B\u0921',
+    7: '00 \u0915\u0930\u094B\u0921',
+    8: '000 \u0915\u0930\u094B\u0921',
+    9: '0 \u0905\u0930\u094D\u092C',
+    10: '00 \u0905\u0930\u094D\u092C',
+    11: '000 \u0905\u0930\u092C',
+    12: '0 \u0916\u0930\u094D\u092C',
+    13: '0 \u0936\u0902\u0916',
+    14: '00 \u0936\u0902\u0916',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u00A0\u0939\u091C\u093E\u0930',
+    4: '\u00A4\u00A000\u00A0\u0939\u091C\u093E\u0930',
+    5: '\u00A4\u00A00\u00A0\u0932\u093E\u0916',
+    6: '\u00A4\u00A000\u00A0\u0932\u093E\u0916',
+    7: '\u00A4\u00A00\u00A0\u0915\u0930\u094B\u0921',
+    8: '\u00A4\u00A000\u00A0\u0915\u0930\u094B\u0921',
+    9: '\u00A4\u00A00\u00A0\u0905\u0930\u092C',
+    10: '\u00A4\u00A000\u00A0\u0905\u0930\u092C',
+    11: '\u00A4\u00A00\u00A0\u0916\u0930\u092C',
+    12: '\u00A4\u00A000\u00A0\u0916\u0930\u092C',
+    13: '\u00A4\u00A00\u00A0\u0936\u0902\u0916',
+    14: '\u00A4\u00A000\u00A0\u0936\u0902\u0916',
+  }),
+  // Compact number symbols for locale nl.
+  "nl": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0\u00A0mln.',
+    7: '00\u00A0mln.',
+    8: '000\u00A0mln.',
+    9: '0\u00A0mld.',
+    10: '00\u00A0mld.',
+    11: '000\u00A0mld.',
+    12: '0\u00A0bln.',
+    13: '00\u00A0bln.',
+    14: '000\u00A0bln.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 duizend',
+    4: '00 duizend',
+    5: '000 duizend',
+    6: '0 miljoen',
+    7: '00 miljoen',
+    8: '000 miljoen',
+    9: '0 miljard',
+    10: '00 miljard',
+    11: '000 miljard',
+    12: '0 biljoen',
+    13: '00 biljoen',
+    14: '000 biljoen',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00K',
+    4: '\u00A4\u00A000K',
+    5: '\u00A4\u00A0000K',
+    6: '\u00A4\u00A00\u00A0mln.',
+    7: '\u00A4\u00A000\u00A0mln.',
+    8: '\u00A4\u00A0000\u00A0mln.',
+    9: '\u00A4\u00A00\u00A0mld.',
+    10: '\u00A4\u00A000\u00A0mld.',
+    11: '\u00A4\u00A0000\u00A0mld.',
+    12: '\u00A4\u00A00\u00A0bln.',
+    13: '\u00A4\u00A000\u00A0bln.',
+    14: '\u00A4\u00A0000\u00A0bln.',
+  }),
+  // Compact number symbols for locale no.
+  "no": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0mill',
+    7: '00\u00A0mill',
+    8: '000\u00A0mill',
+    9: '0\u00A0mrd',
+    10: '00\u00A0mrd',
+    11: '000\u00A0mrd',
+    12: '0\u00A0bill',
+    13: '00\u00A0bill',
+    14: '000\u00A0bill',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tusen',
+    4: '00 tusen',
+    5: '000 tusen',
+    6: '0 millioner',
+    7: '00 millioner',
+    8: '000 millioner',
+    9: '0 milliarder',
+    10: '00 milliarder',
+    11: '000 milliarder',
+    12: '0 billioner',
+    13: '00 billioner',
+    14: '000 billioner',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00k',
+    4: '\u00A4\u00A000k',
+    5: '\u00A4\u00A0000k',
+    6: '\u00A4\u00A00\u00A0mill',
+    7: '\u00A4\u00A000\u00A0mill',
+    8: '\u00A4\u00A0000\u00A0mill',
+    9: '\u00A4\u00A00\u00A0mrd',
+    10: '\u00A4\u00A000\u00A0mrd',
+    11: '\u00A4\u00A0000\u00A0mrd',
+    12: '\u00A4\u00A00\u00A0bill',
+    13: '\u00A4\u00A000\u00A0bill',
+    14: '\u00A4\u00A0000\u00A0bill',
+  }),
+  // Compact number symbols for locale no_NO.
+  "no_NO": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0k',
+    4: '00k',
+    5: '000k',
+    6: '0\u00A0mill',
+    7: '00\u00A0mill',
+    8: '000\u00A0mill',
+    9: '0\u00A0mrd',
+    10: '00\u00A0mrd',
+    11: '000\u00A0mrd',
+    12: '0\u00A0bill',
+    13: '00\u00A0bill',
+    14: '000\u00A0bill',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tusen',
+    4: '00 tusen',
+    5: '000 tusen',
+    6: '0 millioner',
+    7: '00 millioner',
+    8: '000 millioner',
+    9: '0 milliarder',
+    10: '00 milliarder',
+    11: '000 milliarder',
+    12: '0 billioner',
+    13: '00 billioner',
+    14: '000 billioner',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00k',
+    4: '\u00A4\u00A000k',
+    5: '\u00A4\u00A0000k',
+    6: '\u00A4\u00A00\u00A0mill',
+    7: '\u00A4\u00A000\u00A0mill',
+    8: '\u00A4\u00A0000\u00A0mill',
+    9: '\u00A4\u00A00\u00A0mrd',
+    10: '\u00A4\u00A000\u00A0mrd',
+    11: '\u00A4\u00A0000\u00A0mrd',
+    12: '\u00A4\u00A00\u00A0bill',
+    13: '\u00A4\u00A000\u00A0bill',
+    14: '\u00A4\u00A0000\u00A0bill',
+  }),
+  // Compact number symbols for locale or.
+  "or": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0G',
+    10: '00G',
+    11: '000G',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00K',
+    4: '\u00A4\u00A000K',
+    5: '\u00A4\u00A0000K',
+    6: '\u00A4\u00A00M',
+    7: '\u00A4\u00A000M',
+    8: '\u00A4\u00A0000M',
+    9: '\u00A4\u00A00G',
+    10: '\u00A4\u00A000G',
+    11: '\u00A4\u00A0000G',
+    12: '\u00A4\u00A00T',
+    13: '\u00A4\u00A000T',
+    14: '\u00A4\u00A0000T',
+  }),
+  // Compact number symbols for locale pa.
+  "pa": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    4: '00\u00A0\u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    5: '0\u00A0\u0A32\u0A71\u0A16',
+    6: '00\u00A0\u0A32\u0A71\u0A16',
+    7: '0\u00A0\u0A15\u0A30\u0A4B\u0A5C',
+    8: '00\u00A0\u0A15\u0A30\u0A4B\u0A5C',
+    9: '0\u00A0\u0A05\u0A30\u0A2C',
+    10: '00\u00A0\u0A05\u0A30\u0A2C',
+    11: '0\u00A0\u0A16\u0A30\u0A2C',
+    12: '00\u00A0\u0A16\u0A30\u0A2C',
+    13: '0\u00A0\u0A28\u0A40\u0A32',
+    14: '00\u00A0\u0A28\u0A40\u0A32',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    4: '00 \u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    5: '0 \u0A32\u0A71\u0A16',
+    6: '00 \u0A32\u0A71\u0A16',
+    7: '0 \u0A15\u0A30\u0A4B\u0A5C',
+    8: '00 \u0A15\u0A30\u0A4B\u0A5C',
+    9: '0 \u0A05\u0A30\u0A2C',
+    10: '00 \u0A05\u0A30\u0A2C',
+    11: '0 \u0A16\u0A30\u0A2C',
+    12: '00 \u0A16\u0A30\u0A2C',
+    13: '0 \u0A28\u0A40\u0A32',
+    14: '00 \u0A28\u0A40\u0A32',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u00A0\u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    4: '\u00A4\u00A000\u00A0\u0A39\u0A1C\u0A3C\u0A3E\u0A30',
+    5: '\u00A4\u00A00\u00A0\u0A32\u0A71\u0A16',
+    6: '\u00A4\u00A000\u00A0\u0A32\u0A71\u0A16',
+    7: '\u00A4\u00A00\u00A0\u0A15\u0A30\u0A4B\u0A5C',
+    8: '\u00A4\u00A000\u00A0\u0A15\u0A30\u0A4B\u0A5C',
+    9: '\u00A4\u00A00\u00A0\u0A05\u0A30\u0A2C',
+    10: '\u00A4\u00A000\u00A0\u0A05\u0A30\u0A2C',
+    11: '\u00A4\u00A00\u00A0\u0A16\u0A30\u0A2C',
+    12: '\u00A4\u00A000\u00A0\u0A16\u0A30\u0A2C',
+    13: '\u00A4\u00A00\u00A0\u0A28\u0A40\u0A32',
+    14: '\u00A4\u00A000\u00A0\u0A28\u0A40\u0A32',
+  }),
+  // Compact number symbols for locale pl.
+  "pl": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tys.',
+    4: '00\u00A0tys.',
+    5: '000\u00A0tys.',
+    6: '0\u00A0mln',
+    7: '00\u00A0mln',
+    8: '000\u00A0mln',
+    9: '0\u00A0mld',
+    10: '00\u00A0mld',
+    11: '000\u00A0mld',
+    12: '0\u00A0bln',
+    13: '00\u00A0bln',
+    14: '000\u00A0bln',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tysi\u0105ca',
+    4: '00 tysi\u0105ca',
+    5: '000 tysi\u0105ca',
+    6: '0 miliona',
+    7: '00 miliona',
+    8: '000 miliona',
+    9: '0 miliarda',
+    10: '00 miliarda',
+    11: '000 miliarda',
+    12: '0 biliona',
+    13: '00 biliona',
+    14: '000 biliona',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tys.\u00A0\u00A4',
+    4: '00\u00A0tys.\u00A0\u00A4',
+    5: '000\u00A0tys.\u00A0\u00A4',
+    6: '0\u00A0mln\u00A0\u00A4',
+    7: '00\u00A0mln\u00A0\u00A4',
+    8: '000\u00A0mln\u00A0\u00A4',
+    9: '0\u00A0mld\u00A0\u00A4',
+    10: '00\u00A0mld\u00A0\u00A4',
+    11: '000\u00A0mld\u00A0\u00A4',
+    12: '0\u00A0bln\u00A0\u00A4',
+    13: '00\u00A0bln\u00A0\u00A4',
+    14: '000\u00A0bln\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale pt.
+  "pt": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0mil',
+    4: '00\u00A0mil',
+    5: '000\u00A0mil',
+    6: '0\u00A0mi',
+    7: '00\u00A0mi',
+    8: '000\u00A0mi',
+    9: '0\u00A0bi',
+    10: '00\u00A0bi',
+    11: '000\u00A0bi',
+    12: '0\u00A0tri',
+    13: '00\u00A0tri',
+    14: '000\u00A0tri',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 milh\u00F5es',
+    7: '00 milh\u00F5es',
+    8: '000 milh\u00F5es',
+    9: '0 bilh\u00F5es',
+    10: '00 bilh\u00F5es',
+    11: '000 bilh\u00F5es',
+    12: '0 trilh\u00F5es',
+    13: '00 trilh\u00F5es',
+    14: '000 trilh\u00F5es',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0mil',
+    4: '\u00A400\u00A0mil',
+    5: '\u00A4000\u00A0mil',
+    6: '\u00A40\u00A0mi',
+    7: '\u00A400\u00A0mi',
+    8: '\u00A4000\u00A0mi',
+    9: '\u00A40\u00A0bi',
+    10: '\u00A400\u00A0bi',
+    11: '\u00A4000\u00A0bi',
+    12: '\u00A40\u00A0tri',
+    13: '\u00A400\u00A0tri',
+    14: '\u00A4000\u00A0tri',
+  }),
+  // Compact number symbols for locale pt_BR.
+  "pt_BR": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0mil',
+    4: '00\u00A0mil',
+    5: '000\u00A0mil',
+    6: '0\u00A0mi',
+    7: '00\u00A0mi',
+    8: '000\u00A0mi',
+    9: '0\u00A0bi',
+    10: '00\u00A0bi',
+    11: '000\u00A0bi',
+    12: '0\u00A0tri',
+    13: '00\u00A0tri',
+    14: '000\u00A0tri',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 milh\u00F5es',
+    7: '00 milh\u00F5es',
+    8: '000 milh\u00F5es',
+    9: '0 bilh\u00F5es',
+    10: '00 bilh\u00F5es',
+    11: '000 bilh\u00F5es',
+    12: '0 trilh\u00F5es',
+    13: '00 trilh\u00F5es',
+    14: '000 trilh\u00F5es',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0mil',
+    4: '\u00A400\u00A0mil',
+    5: '\u00A4000\u00A0mil',
+    6: '\u00A40\u00A0mi',
+    7: '\u00A400\u00A0mi',
+    8: '\u00A4000\u00A0mi',
+    9: '\u00A40\u00A0bi',
+    10: '\u00A400\u00A0bi',
+    11: '\u00A4000\u00A0bi',
+    12: '\u00A40\u00A0tri',
+    13: '\u00A400\u00A0tri',
+    14: '\u00A4000\u00A0tri',
+  }),
+  // Compact number symbols for locale pt_PT.
+  "pt_PT": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0mil',
+    4: '00\u00A0mil',
+    5: '000\u00A0mil',
+    6: '0\u00A0M',
+    7: '00\u00A0M',
+    8: '000\u00A0M',
+    9: '0\u00A0mM',
+    10: '00\u00A0mM',
+    11: '000\u00A0mM',
+    12: '0\u00A0Bi',
+    13: '00\u00A0Bi',
+    14: '000\u00A0Bi',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mil',
+    4: '00 mil',
+    5: '000 mil',
+    6: '0 milh\u00F5es',
+    7: '00 milh\u00F5es',
+    8: '000 milh\u00F5es',
+    9: '0 mil milh\u00F5es',
+    10: '00 mil milh\u00F5es',
+    11: '000 mil milh\u00F5es',
+    12: '0 bili\u00F5es',
+    13: '00 bili\u00F5es',
+    14: '000 bili\u00F5es',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0mil',
+    4: '\u00A400\u00A0mil',
+    5: '\u00A4000\u00A0mil',
+    6: '\u00A40\u00A0M',
+    7: '\u00A400\u00A0M',
+    8: '\u00A4000\u00A0M',
+    9: '\u00A40\u00A0mM',
+    10: '\u00A400\u00A0mM',
+    11: '\u00A4000\u00A0mM',
+    12: '\u00A40\u00A0B',
+    13: '\u00A400\u00A0B',
+    14: '\u00A4000\u00A0B',
+  }),
+  // Compact number symbols for locale ro.
+  "ro": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0K',
+    4: '00\u00A0K',
+    5: '000\u00A0K',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mld.',
+    10: '00\u00A0mld.',
+    11: '000\u00A0mld.',
+    12: '0\u00A0tril.',
+    13: '00\u00A0tril.',
+    14: '000\u00A0tril.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 de mii',
+    4: '00 de mii',
+    5: '000 de mii',
+    6: '0 de milioane',
+    7: '00 de milioane',
+    8: '000 de milioane',
+    9: '0 de miliarde',
+    10: '00 de miliarde',
+    11: '000 de miliarde',
+    12: '0 de trilioane',
+    13: '00 de trilioane',
+    14: '000 de trilioane',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0mii\u00A0\u00A4',
+    4: '00\u00A0mii\u00A0\u00A4',
+    5: '000\u00A0mii\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mld.\u00A0\u00A4',
+    10: '00\u00A0mld.\u00A0\u00A4',
+    11: '000\u00A0mld.\u00A0\u00A4',
+    12: '0\u00A0tril.\u00A0\u00A4',
+    13: '00\u00A0tril.\u00A0\u00A4',
+    14: '000\u00A0tril.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale ru.
+  "ru": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0442\u044B\u0441.',
+    4: '00\u00A0\u0442\u044B\u0441.',
+    5: '000\u00A0\u0442\u044B\u0441.',
+    6: '0\u00A0\u043C\u043B\u043D',
+    7: '00\u00A0\u043C\u043B\u043D',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0440\u0434',
+    10: '00\u00A0\u043C\u043B\u0440\u0434',
+    11: '000\u00A0\u043C\u043B\u0440\u0434',
+    12: '0\u00A0\u0442\u0440\u043B\u043D',
+    13: '00\u00A0\u0442\u0440\u043B\u043D',
+    14: '000\u00A0\u0442\u0440\u043B\u043D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0442\u044B\u0441\u044F\u0447\u0438',
+    4: '00 \u0442\u044B\u0441\u044F\u0447\u0438',
+    5: '000 \u0442\u044B\u0441\u044F\u0447\u0438',
+    6: '0 \u043C\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+    7: '00 \u043C\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+    8: '000 \u043C\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+    9: '0 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434\u0430',
+    10: '00 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434\u0430',
+    11: '000 \u043C\u0438\u043B\u043B\u0438\u0430\u0440\u0434\u0430',
+    12: '0 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+    13: '00 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+    14: '000 \u0442\u0440\u0438\u043B\u043B\u0438\u043E\u043D\u0430',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    4: '00\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    5: '000\u00A0\u0442\u044B\u0441.\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale si.
+  "si": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '\u0DAF0',
+    4: '\u0DAF00',
+    5: '\u0DAF000',
+    6: '\u0DB8\u0DD20',
+    7: '\u0DB8\u0DD200',
+    8: '\u0DB8\u0DD2000',
+    9: '\u0DB6\u0DD20',
+    10: '\u0DB6\u0DD200',
+    11: '\u0DB6\u0DD2000',
+    12: '\u0DA7\u0DCA\u200D\u0DBB\u0DD20',
+    13: '\u0DA7\u0DCA\u200D\u0DBB\u0DD200',
+    14: '\u0DA7\u0DCA\u200D\u0DBB\u0DD2000',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '\u0DAF\u0DC4\u0DC3 0',
+    4: '\u0DAF\u0DC4\u0DC3 00',
+    5: '\u0DAF\u0DC4\u0DC3 000',
+    6: '\u0DB8\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 0',
+    7: '\u0DB8\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 00',
+    8: '\u0DB8\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 000',
+    9: '\u0DB6\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 0',
+    10: '\u0DB6\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 00',
+    11: '\u0DB6\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 000',
+    12: '\u0DA7\u0DCA\u200D\u0DBB\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 0',
+    13: '\u0DA7\u0DCA\u200D\u0DBB\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 00',
+    14: '\u0DA7\u0DCA\u200D\u0DBB\u0DD2\u0DBD\u0DD2\u0DBA\u0DB1 000',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u0DAF0',
+    4: '\u00A4\u0DAF00',
+    5: '\u00A4\u0DAF000',
+    6: '\u00A4\u0DB8\u0DD20',
+    7: '\u00A4\u0DB8\u0DD200',
+    8: '\u00A4\u0DB8\u0DD2000',
+    9: '\u00A4\u0DB6\u0DD20',
+    10: '\u00A4\u0DB6\u0DD200',
+    11: '\u00A4\u0DB6\u0DD2000',
+    12: '\u00A4\u0DA7\u0DCA\u200D\u0DBB\u0DD20',
+    13: '\u00A4\u0DA7\u0DCA\u200D\u0DBB\u0DD200',
+    14: '\u00A4\u0DA7\u0DCA\u200D\u0DBB\u0DD2000',
+  }),
+  // Compact number symbols for locale sk.
+  "sk": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tis.',
+    4: '00\u00A0tis.',
+    5: '000\u00A0tis.',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mld.',
+    10: '00\u00A0mld.',
+    11: '000\u00A0mld.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tis\u00EDc',
+    4: '00 tis\u00EDc',
+    5: '000 tis\u00EDc',
+    6: '0 mili\u00F3nov',
+    7: '00 mili\u00F3nov',
+    8: '000 mili\u00F3nov',
+    9: '0 mili\u00E1rd',
+    10: '00 mili\u00E1rd',
+    11: '000 mili\u00E1rd',
+    12: '0 bili\u00F3nov',
+    13: '00 bili\u00F3nov',
+    14: '000 bili\u00F3nov',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tis.\u00A0\u00A4',
+    4: '00\u00A0tis.\u00A0\u00A4',
+    5: '000\u00A0tis.\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mld.\u00A0\u00A4',
+    10: '00\u00A0mld.\u00A0\u00A4',
+    11: '000\u00A0mld.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sl.
+  "sl": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tis.',
+    4: '00\u00A0tis.',
+    5: '000\u00A0tis.',
+    6: '0\u00A0mio.',
+    7: '00\u00A0mio.',
+    8: '000\u00A0mio.',
+    9: '0\u00A0mrd.',
+    10: '00\u00A0mrd.',
+    11: '000\u00A0mrd.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tiso\u010D',
+    4: '00 tiso\u010D',
+    5: '000 tiso\u010D',
+    6: '0 milijonov',
+    7: '00 milijonov',
+    8: '000 milijonov',
+    9: '0 milijard',
+    10: '00 milijard',
+    11: '000 milijard',
+    12: '0 bilijonov',
+    13: '00 bilijonov',
+    14: '000 bilijonov',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tis.\u00A0\u00A4',
+    4: '00\u00A0tis.\u00A0\u00A4',
+    5: '000\u00A0tis.\u00A0\u00A4',
+    6: '0\u00A0mio.\u00A0\u00A4',
+    7: '00\u00A0mio.\u00A0\u00A4',
+    8: '000\u00A0mio.\u00A0\u00A4',
+    9: '0\u00A0mrd.\u00A0\u00A4',
+    10: '00\u00A0mrd.\u00A0\u00A4',
+    11: '000\u00A0mrd.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sq.
+  "sq": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0mij\u00EB',
+    4: '00\u00A0mij\u00EB',
+    5: '000\u00A0mij\u00EB',
+    6: '0\u00A0Mln',
+    7: '00\u00A0Mln',
+    8: '000\u00A0Mln',
+    9: '0\u00A0Mld',
+    10: '00\u00A0Mld',
+    11: '000\u00A0Mld',
+    12: '0\u00A0Bln',
+    13: '00\u00A0Bln',
+    14: '000\u00A0Bln',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 mij\u00EB',
+    4: '00 mij\u00EB',
+    5: '000 mij\u00EB',
+    6: '0 milion',
+    7: '00 milion',
+    8: '000 milion',
+    9: '0 miliard',
+    10: '00 miliard',
+    11: '000 miliard',
+    12: '0 bilion',
+    13: '00 bilion',
+    14: '000 bilion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0mij\u00EB\u00A0\u00A4',
+    4: '00\u00A0mij\u00EB\u00A0\u00A4',
+    5: '000\u00A0mij\u00EB\u00A0\u00A4',
+    6: '0\u00A0Mln\u00A0\u00A4',
+    7: '00\u00A0Mln\u00A0\u00A4',
+    8: '000\u00A0Mln\u00A0\u00A4',
+    9: '0\u00A0Mld\u00A0\u00A4',
+    10: '00\u00A0Mld\u00A0\u00A4',
+    11: '000\u00A0Mld\u00A0\u00A4',
+    12: '0\u00A0Bln\u00A0\u00A4',
+    13: '00\u00A0Bln\u00A0\u00A4',
+    14: '000\u00A0Bln\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sr.
+  "sr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0445\u0438\u0459.',
+    4: '00\u00A0\u0445\u0438\u0459.',
+    5: '000\u00A0\u0445\u0438\u0459.',
+    6: '0\u00A0\u043C\u0438\u043B.',
+    7: '00\u00A0\u043C\u0438\u043B.',
+    8: '000\u00A0\u043C\u0438\u043B.',
+    9: '0\u00A0\u043C\u043B\u0440\u0434.',
+    10: '00\u00A0\u043C\u043B\u0440\u0434.',
+    11: '000\u00A0\u043C\u043B\u0440\u0434.',
+    12: '0\u00A0\u0431\u0438\u043B.',
+    13: '00\u00A0\u0431\u0438\u043B.',
+    14: '000\u00A0\u0431\u0438\u043B.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0445\u0438\u0459\u0430\u0434\u0430',
+    4: '00 \u0445\u0438\u0459\u0430\u0434\u0430',
+    5: '000 \u0445\u0438\u0459\u0430\u0434\u0430',
+    6: '0 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    7: '00 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    8: '000 \u043C\u0438\u043B\u0438\u043E\u043D\u0430',
+    9: '0 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    10: '00 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    11: '000 \u043C\u0438\u043B\u0438\u0458\u0430\u0440\u0434\u0438',
+    12: '0 \u0431\u0438\u043B\u0438\u043E\u043D\u0430',
+    13: '00 \u0431\u0438\u043B\u0438\u043E\u043D\u0430',
+    14: '000 \u0431\u0438\u043B\u0438\u043E\u043D\u0430',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0445\u0438\u0459.\u00A0\u00A4',
+    4: '00\u00A0\u0445\u0438\u0459.\u00A0\u00A4',
+    5: '000\u00A0\u0445\u0438\u0459.\u00A0\u00A4',
+    6: '0\u00A0\u043C\u0438\u043B.\u00A0\u00A4',
+    7: '00\u00A0\u043C\u0438\u043B.\u00A0\u00A4',
+    8: '000\u00A0\u043C\u0438\u043B.\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434.\u00A0\u00A4',
+    12: '0\u00A0\u0431\u0438\u043B.\u00A0\u00A4',
+    13: '00\u00A0\u0431\u0438\u043B.\u00A0\u00A4',
+    14: '000\u00A0\u0431\u0438\u043B.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sr_Latn.
+  "sr_Latn": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0hilj.',
+    4: '00\u00A0hilj.',
+    5: '000\u00A0hilj.',
+    6: '0\u00A0mil.',
+    7: '00\u00A0mil.',
+    8: '000\u00A0mil.',
+    9: '0\u00A0mlrd.',
+    10: '00\u00A0mlrd.',
+    11: '000\u00A0mlrd.',
+    12: '0\u00A0bil.',
+    13: '00\u00A0bil.',
+    14: '000\u00A0bil.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 hiljada',
+    4: '00 hiljada',
+    5: '000 hiljada',
+    6: '0 miliona',
+    7: '00 miliona',
+    8: '000 miliona',
+    9: '0 milijardi',
+    10: '00 milijardi',
+    11: '000 milijardi',
+    12: '0 biliona',
+    13: '00 biliona',
+    14: '000 biliona',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0hilj.\u00A0\u00A4',
+    4: '00\u00A0hilj.\u00A0\u00A4',
+    5: '000\u00A0hilj.\u00A0\u00A4',
+    6: '0\u00A0mil.\u00A0\u00A4',
+    7: '00\u00A0mil.\u00A0\u00A4',
+    8: '000\u00A0mil.\u00A0\u00A4',
+    9: '0\u00A0mlrd.\u00A0\u00A4',
+    10: '00\u00A0mlrd.\u00A0\u00A4',
+    11: '000\u00A0mlrd.\u00A0\u00A4',
+    12: '0\u00A0bil.\u00A0\u00A4',
+    13: '00\u00A0bil.\u00A0\u00A4',
+    14: '000\u00A0bil.\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sv.
+  "sv": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0tn',
+    4: '00\u00A0tn',
+    5: '000\u00A0tn',
+    6: '0\u00A0mn',
+    7: '00\u00A0mn',
+    8: '000\u00A0mn',
+    9: '0\u00A0md',
+    10: '00\u00A0md',
+    11: '000\u00A0md',
+    12: '0\u00A0bn',
+    13: '00\u00A0bn',
+    14: '000\u00A0bn',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 tusen',
+    4: '00 tusen',
+    5: '000 tusen',
+    6: '0 miljoner',
+    7: '00 miljoner',
+    8: '000 miljoner',
+    9: '0 miljarder',
+    10: '00 miljarder',
+    11: '000 miljarder',
+    12: '0 biljoner',
+    13: '00 biljoner',
+    14: '000 biljoner',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0tn\u00A0\u00A4',
+    4: '00\u00A0tn\u00A0\u00A4',
+    5: '000\u00A0tn\u00A0\u00A4',
+    6: '0\u00A0mn\u00A0\u00A4',
+    7: '00\u00A0mn\u00A0\u00A4',
+    8: '000\u00A0mn\u00A0\u00A4',
+    9: '0\u00A0md\u00A0\u00A4',
+    10: '00\u00A0md\u00A0\u00A4',
+    11: '000\u00A0md\u00A0\u00A4',
+    12: '0\u00A0bn\u00A0\u00A4',
+    13: '00\u00A0bn\u00A0\u00A4',
+    14: '000\u00A0bn\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale sw.
+  "sw": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: 'elfu\u00A00',
+    4: 'elfu\u00A000',
+    5: 'elfu\u00A0000',
+    6: 'M0',
+    7: 'M00',
+    8: 'M000',
+    9: 'B0',
+    10: 'B00',
+    11: 'B000',
+    12: 'T0',
+    13: 'T00',
+    14: 'T000',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: 'Elfu 0',
+    4: 'Elfu 00',
+    5: 'Elfu 000',
+    6: 'Milioni 0',
+    7: 'Milioni 00',
+    8: 'Milioni 000',
+    9: 'Bilioni 0',
+    10: 'Bilioni 00',
+    11: 'Bilioni 000',
+    12: 'Trilioni 0',
+    13: 'Trilioni 00',
+    14: 'Trilioni 000',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4elfu\u00A00',
+    4: '\u00A4elfu\u00A000',
+    5: '\u00A4laki\u00A0000',
+    6: '\u00A4M0',
+    7: '\u00A4M00',
+    8: '\u00A4M000',
+    9: '\u00A4B0',
+    10: '\u00A4B00',
+    11: '\u00A4B000',
+    12: '\u00A4T0',
+    13: '\u00A4T00',
+    14: '\u00A4T000',
+  }),
+  // Compact number symbols for locale ta.
+  "ta": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u0B86',
+    4: '00\u0B86',
+    5: '000\u0B86',
+    6: '0\u0BAE\u0BBF',
+    7: '00\u0BAE\u0BBF',
+    8: '000\u0BAE\u0BBF',
+    9: '0\u0BAA\u0BBF',
+    10: '00\u0BAA\u0BBF',
+    11: '000\u0BAA\u0BBF',
+    12: '0\u0B9F\u0BBF',
+    13: '00\u0B9F\u0BBF',
+    14: '000\u0B9F\u0BBF',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0B86\u0BAF\u0BBF\u0BB0\u0BAE\u0BCD',
+    4: '00 \u0B86\u0BAF\u0BBF\u0BB0\u0BAE\u0BCD',
+    5: '000 \u0B86\u0BAF\u0BBF\u0BB0\u0BAE\u0BCD',
+    6: '0 \u0BAE\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    7: '00 \u0BAE\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    8: '000 \u0BAE\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    9: '0 \u0BAA\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    10: '00 \u0BAA\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    11: '000 \u0BAA\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    12: '0 \u0B9F\u0BBF\u0BB0\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    13: '00 \u0B9F\u0BBF\u0BB0\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+    14: '000 \u0B9F\u0BBF\u0BB0\u0BBF\u0BB2\u0BCD\u0BB2\u0BBF\u0BAF\u0BA9\u0BCD',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u0B86',
+    4: '\u00A4\u00A000\u0B86',
+    5: '\u00A4\u00A0000\u0B86',
+    6: '\u00A4\u00A00\u0BAE\u0BBF',
+    7: '\u00A4\u00A000\u0BAE\u0BBF',
+    8: '\u00A4\u00A0000\u0BAE\u0BBF',
+    9: '\u00A40\u0BAA\u0BBF',
+    10: '\u00A4\u00A000\u0BAA\u0BBF',
+    11: '\u00A4000\u0BAA\u0BBF',
+    12: '\u00A4\u00A00\u0B9F\u0BBF',
+    13: '\u00A4\u00A000\u0B9F\u0BBF',
+    14: '\u00A4\u00A0000\u0B9F\u0BBF',
+  }),
+  // Compact number symbols for locale te.
+  "te": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u0C35\u0C47',
+    4: '00\u0C35\u0C47',
+    5: '000\u0C35\u0C47',
+    6: '0\u0C2E\u0C3F',
+    7: '00\u0C2E\u0C3F',
+    8: '000\u0C2E\u0C3F',
+    9: '0\u0C2C\u0C3F',
+    10: '00\u0C2C\u0C3F',
+    11: '000\u0C2C\u0C3F',
+    12: '0\u0C1F\u0C4D\u0C30\u0C3F',
+    13: '00\u0C1F\u0C4D\u0C30\u0C3F',
+    14: '000\u0C1F\u0C4D\u0C30\u0C3F',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0C35\u0C47\u0C32\u0C41',
+    4: '00 \u0C35\u0C47\u0C32\u0C41',
+    5: '000 \u0C35\u0C47\u0C32\u0C41',
+    6: '0 \u0C2E\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    7: '00 \u0C2E\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    8: '000 \u0C2E\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    9: '0 \u0C2C\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    10: '00 \u0C2C\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    11: '000 \u0C2C\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    12: '0 \u0C1F\u0C4D\u0C30\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    13: '00 \u0C1F\u0C4D\u0C30\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+    14: '000 \u0C1F\u0C4D\u0C30\u0C3F\u0C32\u0C3F\u0C2F\u0C28\u0C4D\u0C32\u0C41',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u0C35\u0C47',
+    4: '\u00A400\u0C35\u0C47',
+    5: '\u00A4000\u0C35\u0C47',
+    6: '\u00A40\u0C2E\u0C3F',
+    7: '\u00A400\u0C2E\u0C3F',
+    8: '\u00A4000\u0C2E\u0C3F',
+    9: '\u00A40\u0C2C\u0C3F',
+    10: '\u00A400\u0C2C\u0C3F',
+    11: '\u00A4000\u0C2C\u0C3F',
+    12: '\u00A40\u0C1F\u0C4D\u0C30\u0C3F',
+    13: '\u00A400\u0C1F\u0C4D\u0C30\u0C3F',
+    14: '\u00A4000\u0C1F\u0C4D\u0C30\u0C3F',
+  }),
+  // Compact number symbols for locale th.
+  "th": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0E1E.',
+    4: '0\u00A0\u0E21.',
+    5: '0\u00A0\u0E2A.',
+    6: '0\u00A0\u0E25.',
+    7: '00\u00A0\u0E25.',
+    8: '000\u00A0\u0E25.',
+    9: '0\u00A0\u0E1E.\u0E25.',
+    10: '0\u00A0\u0E21.\u0E25.',
+    11: '0\u00A0\u0E2A.\u0E25.',
+    12: '0\u00A0\u0E25.\u0E25.',
+    13: '00\u00A0\u0E25.\u0E25.',
+    14: '000\u00A0\u0E25.\u0E25.',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0E1E\u0E31\u0E19',
+    4: '0 \u0E2B\u0E21\u0E37\u0E48\u0E19',
+    5: '0 \u0E41\u0E2A\u0E19',
+    6: '0 \u0E25\u0E49\u0E32\u0E19',
+    7: '00 \u0E25\u0E49\u0E32\u0E19',
+    8: '000 \u0E25\u0E49\u0E32\u0E19',
+    9: '0 \u0E1E\u0E31\u0E19\u0E25\u0E49\u0E32\u0E19',
+    10: '0 \u0E2B\u0E21\u0E37\u0E48\u0E19\u0E25\u0E49\u0E32\u0E19',
+    11: '0 \u0E41\u0E2A\u0E19\u0E25\u0E49\u0E32\u0E19',
+    12: '0 \u0E25\u0E49\u0E32\u0E19\u0E25\u0E49\u0E32\u0E19',
+    13: '00 \u0E25\u0E49\u0E32\u0E19\u0E25\u0E49\u0E32\u0E19',
+    14: '000 \u0E25\u0E49\u0E32\u0E19\u0E25\u0E49\u0E32\u0E19',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u00A0\u0E1E.',
+    4: '\u00A40\u00A0\u0E21.',
+    5: '\u00A40\u00A0\u0E2A.',
+    6: '\u00A40\u00A0\u0E25.',
+    7: '\u00A400\u00A0\u0E25.',
+    8: '\u00A4000\u00A0\u0E25.',
+    9: '\u00A40\u00A0\u0E1E.\u0E25.',
+    10: '\u00A40\u00A0\u0E21.\u0E25.',
+    11: '\u00A40\u00A0\u0E2A.\u0E25.',
+    12: '\u00A40\u00A0\u0E25.\u0E25.',
+    13: '\u00A400\u00A0\u0E25.\u0E25.',
+    14: '\u00A4000\u00A0\u0E25.\u0E25.',
+  }),
+  // Compact number symbols for locale tl.
+  "tl": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 na libo',
+    4: '00 na libo',
+    5: '000 na libo',
+    6: '0 na milyon',
+    7: '00 na milyon',
+    8: '000 na milyon',
+    9: '0 na bilyon',
+    10: '00 na bilyon',
+    11: '000 na bilyon',
+    12: '0 na trilyon',
+    13: '00 na trilyon',
+    14: '000 na trilyon',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale tr.
+  "tr": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0B',
+    4: '00\u00A0B',
+    5: '000\u00A0B',
+    6: '0\u00A0Mn',
+    7: '00\u00A0Mn',
+    8: '000\u00A0Mn',
+    9: '0\u00A0Mr',
+    10: '00\u00A0Mr',
+    11: '000\u00A0Mr',
+    12: '0\u00A0Tn',
+    13: '00\u00A0Tn',
+    14: '000\u00A0Tn',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 bin',
+    4: '00 bin',
+    5: '000 bin',
+    6: '0 milyon',
+    7: '00 milyon',
+    8: '000 milyon',
+    9: '0 milyar',
+    10: '00 milyar',
+    11: '000 milyar',
+    12: '0 trilyon',
+    13: '00 trilyon',
+    14: '000 trilyon',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0B\u00A0\u00A4',
+    4: '00\u00A0B\u00A0\u00A4',
+    5: '000\u00A0B\u00A0\u00A4',
+    6: '0\u00A0Mn\u00A0\u00A4',
+    7: '00\u00A0Mn\u00A0\u00A4',
+    8: '000\u00A0Mn\u00A0\u00A4',
+    9: '0\u00A0Mr\u00A0\u00A4',
+    10: '00\u00A0Mr\u00A0\u00A4',
+    11: '000\u00A0Mr\u00A0\u00A4',
+    12: '0\u00A0Tn\u00A0\u00A4',
+    13: '00\u00A0Tn\u00A0\u00A4',
+    14: '000\u00A0Tn\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale uk.
+  "uk": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u0442\u0438\u0441.',
+    4: '00\u00A0\u0442\u0438\u0441.',
+    5: '000\u00A0\u0442\u0438\u0441.',
+    6: '0\u00A0\u043C\u043B\u043D',
+    7: '00\u00A0\u043C\u043B\u043D',
+    8: '000\u00A0\u043C\u043B\u043D',
+    9: '0\u00A0\u043C\u043B\u0440\u0434',
+    10: '00\u00A0\u043C\u043B\u0440\u0434',
+    11: '000\u00A0\u043C\u043B\u0440\u0434',
+    12: '0\u00A0\u0442\u0440\u043B\u043D',
+    13: '00\u00A0\u0442\u0440\u043B\u043D',
+    14: '000\u00A0\u0442\u0440\u043B\u043D',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u0442\u0438\u0441\u044F\u0447\u0456',
+    4: '00 \u0442\u0438\u0441\u044F\u0447\u0456',
+    5: '000 \u0442\u0438\u0441\u044F\u0447\u0456',
+    6: '0 \u043C\u0456\u043B\u044C\u0439\u043E\u043D\u0430',
+    7: '00 \u043C\u0456\u043B\u044C\u0439\u043E\u043D\u0430',
+    8: '000 \u043C\u0456\u043B\u044C\u0439\u043E\u043D\u0430',
+    9: '0 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    10: '00 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    11: '000 \u043C\u0456\u043B\u044C\u044F\u0440\u0434\u0430',
+    12: '0 \u0442\u0440\u0438\u043B\u044C\u0439\u043E\u043D\u0430',
+    13: '00 \u0442\u0440\u0438\u043B\u044C\u0439\u043E\u043D\u0430',
+    14: '000 \u0442\u0440\u0438\u043B\u044C\u0439\u043E\u043D\u0430',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0\u0442\u0438\u0441.\u00A0\u00A4',
+    4: '00\u00A0\u0442\u0438\u0441.\u00A0\u00A4',
+    5: '000\u00A0\u0442\u0438\u0441.\u00A0\u00A4',
+    6: '0\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    7: '00\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    8: '000\u00A0\u043C\u043B\u043D\u00A0\u00A4',
+    9: '0\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    10: '00\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    11: '000\u00A0\u043C\u043B\u0440\u0434\u00A0\u00A4',
+    12: '0\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    13: '00\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+    14: '000\u00A0\u0442\u0440\u043B\u043D\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale ur.
+  "ur": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0\u06C1\u0632\u0627\u0631',
+    4: '00\u00A0\u06C1\u0632\u0627\u0631',
+    5: '0\u00A0\u0644\u0627\u06A9\u06BE',
+    6: '00\u00A0\u0644\u0627\u06A9\u06BE',
+    7: '0\u00A0\u06A9\u0631\u0648\u0691',
+    8: '00\u00A0\u06A9\u0631\u0648\u0691',
+    9: '0\u00A0\u0627\u0631\u0628',
+    10: '00\u00A0\u0627\u0631\u0628',
+    11: '0\u00A0\u06A9\u06BE\u0631\u0628',
+    12: '00\u00A0\u06A9\u06BE\u0631\u0628',
+    13: '00\u00A0\u0679\u0631\u06CC\u0644\u06CC\u0646',
+    14: '000\u00A0\u0679\u0631\u06CC\u0644\u06CC\u0646',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 \u06C1\u0632\u0627\u0631',
+    4: '00 \u06C1\u0632\u0627\u0631',
+    5: '0 \u0644\u0627\u06A9\u06BE',
+    6: '00 \u0644\u0627\u06A9\u06BE',
+    7: '0 \u06A9\u0631\u0648\u0691',
+    8: '00 \u06A9\u0631\u0648\u0691',
+    9: '0 \u0627\u0631\u0628',
+    10: '00 \u0627\u0631\u0628',
+    11: '0 \u06A9\u06BE\u0631\u0628',
+    12: '00 \u06A9\u06BE\u0631\u0628',
+    13: '00 \u0679\u0631\u06CC\u0644\u06CC\u0646',
+    14: '000 \u0679\u0631\u06CC\u0644\u06CC\u0646',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A4\u00A00\u00A0\u06C1\u0632\u0627\u0631',
+    4: '\u00A4\u00A000\u00A0\u06C1\u0632\u0627\u0631',
+    5: '\u00A4\u00A00\u00A0\u0644\u0627\u06A9\u06BE',
+    6: '\u00A4\u00A000\u00A0\u0644\u0627\u06A9\u06BE',
+    7: '\u00A4\u00A00\u00A0\u06A9\u0631\u0648\u0691',
+    8: '\u00A4\u00A000\u00A0\u06A9\u0631\u0648\u0691',
+    9: '\u00A4\u00A00\u00A0\u0627\u0631\u0628',
+    10: '\u00A4\u00A000\u00A0\u0627\u0631\u0628',
+    11: '\u00A4\u00A00\u00A0\u06A9\u06BE\u0631\u0628',
+    12: '\u00A40\u00A0\u0679\u0631\u06CC\u0644\u06CC\u0646',
+    13: '\u00A4\u00A000\u00A0\u0679\u0631\u06CC\u0644\u06CC\u0646',
+    14: '\u00A4\u00A0000\u00A0\u0679\u0631\u06CC\u0644\u06CC\u0646',
+  }),
+  // Compact number symbols for locale uz.
+  "uz": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0ming',
+    4: '00\u00A0ming',
+    5: '000\u00A0ming',
+    6: '0\u00A0mln',
+    7: '00\u00A0mln',
+    8: '000\u00A0mln',
+    9: '0\u00A0mlrd',
+    10: '00\u00A0mlrd',
+    11: '000\u00A0mlrd',
+    12: '0\u00A0trln',
+    13: '00\u00A0trln',
+    14: '000\u00A0trln',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ming',
+    4: '00 ming',
+    5: '000 ming',
+    6: '0 million',
+    7: '00 million',
+    8: '000 million',
+    9: '0 milliard',
+    10: '00 milliard',
+    11: '000 milliard',
+    12: '0 trillion',
+    13: '00 trillion',
+    14: '000 trillion',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0ming\u00A0\u00A4',
+    4: '00\u00A0ming\u00A0\u00A4',
+    5: '000\u00A0ming\u00A0\u00A4',
+    6: '0\u00A0mln\u00A0\u00A4',
+    7: '00\u00A0mln\u00A0\u00A4',
+    8: '000\u00A0mln\u00A0\u00A4',
+    9: '0\u00A0mlrd\u00A0\u00A4',
+    10: '00\u00A0mlrd\u00A0\u00A4',
+    11: '000\u00A0mlrd\u00A0\u00A4',
+    12: '0\u00A0trln\u00A0\u00A4',
+    13: '00\u00A0trln\u00A0\u00A4',
+    14: '000\u00A0trln\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale vi.
+  "vi": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u00A0N',
+    4: '00\u00A0N',
+    5: '000\u00A0N',
+    6: '0\u00A0Tr',
+    7: '00\u00A0Tr',
+    8: '000\u00A0Tr',
+    9: '0\u00A0T',
+    10: '00\u00A0T',
+    11: '000\u00A0T',
+    12: '0\u00A0NT',
+    13: '00\u00A0NT',
+    14: '000\u00A0NT',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 ngh\u00ECn',
+    4: '00 ngh\u00ECn',
+    5: '000 ngh\u00ECn',
+    6: '0 tri\u1EC7u',
+    7: '00 tri\u1EC7u',
+    8: '000 tri\u1EC7u',
+    9: '0 t\u1EF7',
+    10: '00 t\u1EF7',
+    11: '000 t\u1EF7',
+    12: '0 ngh\u00ECn t\u1EF7',
+    13: '00 ngh\u00ECn t\u1EF7',
+    14: '000 ngh\u00ECn t\u1EF7',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '0\u00A0N\u00A0\u00A4',
+    4: '00\u00A0N\u00A0\u00A4',
+    5: '000\u00A0N\u00A0\u00A4',
+    6: '0\u00A0Tr\u00A0\u00A4',
+    7: '00\u00A0Tr\u00A0\u00A4',
+    8: '000\u00A0Tr\u00A0\u00A4',
+    9: '0\u00A0T\u00A0\u00A4',
+    10: '00\u00A0T\u00A0\u00A4',
+    11: '000\u00A0T\u00A0\u00A4',
+    12: '0\u00A0NT\u00A0\u00A4',
+    13: '00\u00A0NT\u00A0\u00A4',
+    14: '000\u00A0NT\u00A0\u00A4',
+  }),
+  // Compact number symbols for locale zh.
+  "zh": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u4EBF',
+    9: '00\u4EBF',
+    10: '000\u4EBF',
+    11: '0000\u4EBF',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u4EBF',
+    9: '00\u4EBF',
+    10: '000\u4EBF',
+    11: '0000\u4EBF',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u5343',
+    4: '\u00A40\u4E07',
+    5: '\u00A400\u4E07',
+    6: '\u00A4000\u4E07',
+    7: '\u00A40000\u4E07',
+    8: '\u00A40\u4EBF',
+    9: '\u00A400\u4EBF',
+    10: '\u00A4000\u4EBF',
+    11: '\u00A40000\u4EBF',
+    12: '\u00A40\u5146',
+    13: '\u00A400\u5146',
+    14: '\u00A4000\u5146',
+  }),
+  // Compact number symbols for locale zh_CN.
+  "zh_CN": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u4EBF',
+    9: '00\u4EBF',
+    10: '000\u4EBF',
+    11: '0000\u4EBF',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u4E07',
+    5: '00\u4E07',
+    6: '000\u4E07',
+    7: '0000\u4E07',
+    8: '0\u4EBF',
+    9: '00\u4EBF',
+    10: '000\u4EBF',
+    11: '0000\u4EBF',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u5343',
+    4: '\u00A40\u4E07',
+    5: '\u00A400\u4E07',
+    6: '\u00A4000\u4E07',
+    7: '\u00A40000\u4E07',
+    8: '\u00A40\u4EBF',
+    9: '\u00A400\u4EBF',
+    10: '\u00A4000\u4EBF',
+    11: '\u00A40000\u4EBF',
+    12: '\u00A40\u5146',
+    13: '\u00A400\u5146',
+    14: '\u00A4000\u5146',
+  }),
+  // Compact number symbols for locale zh_HK.
+  "zh_HK": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u842C',
+    5: '00\u842C',
+    6: '000\u842C',
+    7: '0000\u842C',
+    8: '0\u5104',
+    9: '00\u5104',
+    10: '000\u5104',
+    11: '0000\u5104',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A40M',
+    7: '\u00A400M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  }),
+  // Compact number symbols for locale zh_TW.
+  "zh_TW": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u842C',
+    5: '00\u842C',
+    6: '000\u842C',
+    7: '0000\u842C',
+    8: '0\u5104',
+    9: '00\u5104',
+    10: '000\u5104',
+    11: '0000\u5104',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0\u5343',
+    4: '0\u842C',
+    5: '00\u842C',
+    6: '000\u842C',
+    7: '0000\u842C',
+    8: '0\u5104',
+    9: '00\u5104',
+    10: '000\u5104',
+    11: '0000\u5104',
+    12: '0\u5146',
+    13: '00\u5146',
+    14: '000\u5146',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40\u5343',
+    4: '\u00A40\u842C',
+    5: '\u00A400\u842C',
+    6: '\u00A4000\u842C',
+    7: '\u00A40000\u842C',
+    8: '\u00A40\u5104',
+    9: '\u00A400\u5104',
+    10: '\u00A4000\u5104',
+    11: '\u00A40000\u5104',
+    12: '\u00A40\u5146',
+    13: '\u00A400\u5146',
+    14: '\u00A4000\u5146',
+  }),
+  // Compact number symbols for locale zu.
+  "zu": new CompactNumberSymbols(COMPACT_DECIMAL_SHORT_PATTERN: const {
+    3: '0K',
+    4: '00K',
+    5: '000K',
+    6: '0M',
+    7: '00M',
+    8: '000M',
+    9: '0B',
+    10: '00B',
+    11: '000B',
+    12: '0T',
+    13: '00T',
+    14: '000T',
+  }, COMPACT_DECIMAL_LONG_PATTERN: const {
+    3: '0 inkulungwane',
+    4: '00 inkulungwane',
+    5: '000 inkulungwane',
+    6: '0 isigidi',
+    7: '00 isigidi',
+    8: '000 isigidi',
+    9: '0 isigidi sezigidi',
+    10: '00 isigidi sezigidi',
+    11: '000 isigidi sezigidi',
+    12: '0 isigidintathu',
+    13: '00 isigidintathu',
+    14: '000 isigidintathu',
+  }, COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN: const {
+    3: '\u00A40K',
+    4: '\u00A400K',
+    5: '\u00A4000K',
+    6: '\u00A4\u00A00M',
+    7: '\u00A4\u00A000M',
+    8: '\u00A4000M',
+    9: '\u00A40B',
+    10: '\u00A400B',
+    11: '\u00A4000B',
+    12: '\u00A40T',
+    13: '\u00A400T',
+    14: '\u00A4000T',
+  })
+};
+
+final currencyFractionDigits = {
+  "ADP": 0,
+  "AFN": 0,
+  "ALL": 0,
+  "AMD": 0,
+  "BHD": 3,
+  "BIF": 0,
+  "BYN": 2,
+  "BYR": 0,
+  "CAD": 2,
+  "CHF": 2,
+  "CLF": 4,
+  "CLP": 0,
+  "COP": 0,
+  "CRC": 2,
+  "CZK": 2,
+  "DEFAULT": 2,
+  "DJF": 0,
+  "ESP": 0,
+  "GNF": 0,
+  "GYD": 0,
+  "HUF": 2,
+  "IDR": 0,
+  "IQD": 0,
+  "IRR": 0,
+  "ISK": 0,
+  "ITL": 0,
+  "JOD": 3,
+  "JPY": 0,
+  "KMF": 0,
+  "KPW": 0,
+  "KRW": 0,
+  "KWD": 3,
+  "LAK": 0,
+  "LBP": 0,
+  "LUF": 0,
+  "LYD": 3,
+  "MGA": 0,
+  "MGF": 0,
+  "MMK": 0,
+  "MNT": 0,
+  "MRO": 0,
+  "MUR": 0,
+  "OMR": 3,
+  "PKR": 0,
+  "PYG": 0,
+  "RSD": 0,
+  "RWF": 0,
+  "SLL": 0,
+  "SOS": 0,
+  "STD": 0,
+  "SYP": 0,
+  "TMM": 0,
+  "TND": 3,
+  "TRL": 0,
+  "TWD": 2,
+  "TZS": 0,
+  "UGX": 0,
+  "UYI": 0,
+  "UZS": 0,
+  "VND": 0,
+  "VUV": 0,
+  "XAF": 0,
+  "XOF": 0,
+  "XPF": 0,
+  "YER": 0,
+  "ZMK": 0,
+  "ZWD": 0,
+};
diff --git a/packages/intl/lib/src/data/dates/locale_list.dart b/packages/intl/lib/src/data/dates/locale_list.dart
index 2c55f28..1f2bb95 100644
--- a/packages/intl/lib/src/data/dates/locale_list.dart
+++ b/packages/intl/lib/src/data/dates/locale_list.dart
@@ -9,9 +9,11 @@
   "am",
   "ar",
   "az",
+  "be",
   "bg",
   "bn",
   "br",
+  "bs",
   "ca",
   "chr",
   "cs",
@@ -23,6 +25,7 @@
   "el",
   "en",
   "en_AU",
+  "en_CA",
   "en_GB",
   "en_IE",
   "en_IN",
@@ -32,6 +35,8 @@
   "es",
   "es_419",
   "es_ES",
+  "es_MX",
+  "es_US",
   "et",
   "eu",
   "fa",
@@ -39,6 +44,7 @@
   "fil",
   "fr",
   "fr_CA",
+  "ga",
   "gl",
   "gsw",
   "gu",
@@ -89,6 +95,7 @@
   "sl",
   "sq",
   "sr",
+  "sr_Latn",
   "sv",
   "sw",
   "ta",
diff --git a/packages/intl/lib/src/data/dates/patterns/af.json b/packages/intl/lib/src/data/dates/patterns/af.json
index d34eeab..0501cf2 100644
--- a/packages/intl/lib/src/data/dates/patterns/af.json
+++ b/packages/intl/lib/src/data/dates/patterns/af.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd-MM","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM-y","yMd":"y-MM-dd","yMEd":"EEE y-MM-dd","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/am.json b/packages/intl/lib/src/data/dates/patterns/am.json
index 08e24d6..c62c5e5 100644
--- a/packages/intl/lib/src/data/dates/patterns/am.json
+++ b/packages/intl/lib/src/data/dates/patterns/am.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE፣ d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE፣ MMM d y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE፣ M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE፣ MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE፣ MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE፣ d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE፣ MMM d y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE ፣d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ar.json b/packages/intl/lib/src/data/dates/patterns/ar.json
index 0f787ff..720db8c 100644
--- a/packages/intl/lib/src/data/dates/patterns/ar.json
+++ b/packages/intl/lib/src/data/dates/patterns/ar.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/‏M","MEd":"EEE، d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE، d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE، d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M‏/y","yMd":"d‏/M‏/y","yMEd":"EEE، d/‏M/‏y","yMMM":"MMM y","yMMMd":"d MMM، y","yMMMEd":"EEE، d MMM، y","yMMMM":"MMMM y","yMMMMd":"d MMMM، y","yMMMMEEEEd":"EEEE، d MMMM، y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/‏M","MEd":"EEE، d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE، d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE، d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M‏/y","yMd":"d‏/M‏/y","yMEd":"EEE، d/‏M/‏y","yMMM":"MMM y","yMMMd":"d MMM، y","yMMMEd":"EEE، d MMM، y","yMMMM":"MMMM y","yMMMMd":"d MMMM، y","yMMMMEEEEd":"EEEE، d MMMM، y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/az.json b/packages/intl/lib/src/data/dates/patterns/az.json
index 4d2176e..4636739 100644
--- a/packages/intl/lib/src/data/dates/patterns/az.json
+++ b/packages/intl/lib/src/data/dates/patterns/az.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"dd.MM, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMM, EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"d MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"dd.MM.y, EEE","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"d MMM y, EEE","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"dd.MM, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMM, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"d MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"dd.MM.y, EEE","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"d MMM y, EEE","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/be.json b/packages/intl/lib/src/data/dates/patterns/be.json
new file mode 100644
index 0000000..43c5347
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/be.json
@@ -0,0 +1 @@
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/bg.json b/packages/intl/lib/src/data/dates/patterns/bg.json
index 5c50e33..ff273bf 100644
--- a/packages/intl/lib/src/data/dates/patterns/bg.json
+++ b/packages/intl/lib/src/data/dates/patterns/bg.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.MM","MEd":"EEE, d.MM","MMM":"MM","MMMd":"d.MM","MMMEd":"EEE, d.MM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y 'г'.","yM":"M.y 'г'.","yMd":"d.MM.y 'г'.","yMEd":"EEE, d.MM.y 'г'.","yMMM":"MM.y 'г'.","yMMMd":"d.MM.y 'г'.","yMMMEd":"EEE, d.MM.y 'г'.","yMMMM":"MMMM y 'г'.","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"m:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.MM","MEd":"EEE, d.MM","MMM":"MM","MMMd":"d.MM","MMMEd":"EEE, d.MM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y 'г'.","yM":"MM.y 'г'.","yMd":"d.MM.y 'г'.","yMEd":"EEE, d.MM.y 'г'.","yMMM":"MM.y 'г'.","yMMMd":"d.MM.y 'г'.","yMMMEd":"EEE, d.MM.y 'г'.","yMMMM":"MMMM y 'г'.","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"m:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/bn.json b/packages/intl/lib/src/data/dates/patterns/bn.json
index e58647b..d3aa5b0 100644
--- a/packages/intl/lib/src/data/dates/patterns/bn.json
+++ b/packages/intl/lib/src/data/dates/patterns/bn.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/br.json b/packages/intl/lib/src/data/dates/patterns/br.json
index 45a919d..9caeae1 100644
--- a/packages/intl/lib/src/data/dates/patterns/br.json
+++ b/packages/intl/lib/src/data/dates/patterns/br.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"MM","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/bs.json b/packages/intl/lib/src/data/dates/patterns/bs.json
new file mode 100644
index 0000000..27839f7
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/bs.json
@@ -0,0 +1 @@
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"MM/y","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"LLLL y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm (v)","jmz":"HH:mm (z)","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ca.json b/packages/intl/lib/src/data/dates/patterns/ca.json
index 322ccbe..cb7340e 100644
--- a/packages/intl/lib/src/data/dates/patterns/ca.json
+++ b/packages/intl/lib/src/data/dates/patterns/ca.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM, y","yMMMM":"LLLL 'de' y","yMMMMd":"d MMMM 'de' y","yMMMMEEEEd":"EEEE, d MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"H","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"LLL 'de' y","yMMMd":"d LLL y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL 'de' y","yMMMMd":"d MMMM 'de' y","yMMMMEEEEd":"EEEE, d MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"H","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/chr.json b/packages/intl/lib/src/data/dates/patterns/chr.json
index afe8598..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/chr.json
+++ b/packages/intl/lib/src/data/dates/patterns/chr.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/cs.json b/packages/intl/lib/src/data/dates/patterns/cs.json
index 1a09695..11107ba 100644
--- a/packages/intl/lib/src/data/dates/patterns/cs.json
+++ b/packages/intl/lib/src/data/dates/patterns/cs.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d. M.","MEd":"EEE d. M.","MMM":"LLL","MMMd":"d. M.","MMMEd":"EEE d. M.","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d. M. y","yMEd":"EEE d. M. y","yMMM":"LLLL y","yMMMd":"d. M. y","yMMMEd":"EEE d. M. y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d. M.","MEd":"EEE d. M.","MMM":"LLL","MMMd":"d. M.","MMMEd":"EEE d. M.","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d. M. y","yMEd":"EEE d. M. y","yMMM":"LLLL y","yMMMd":"d. M. y","yMMMEd":"EEE d. M. y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/cy.json b/packages/intl/lib/src/data/dates/patterns/cy.json
index 021ce1d..816fd83 100644
--- a/packages/intl/lib/src/data/dates/patterns/cy.json
+++ b/packages/intl/lib/src/data/dates/patterns/cy.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/da.json b/packages/intl/lib/src/data/dates/patterns/da.json
index ca2bf7d..429b85c 100644
--- a/packages/intl/lib/src/data/dates/patterns/da.json
+++ b/packages/intl/lib/src/data/dates/patterns/da.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"MMM","LLLL":"MMMM","M":"M","Md":"d/M","MEd":"EEE d/M","MMM":"MMM","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"MMMM","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE 'den' d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"MMM","LLLL":"MMMM","M":"M","Md":"d/M","MEd":"EEE d/M","MMM":"MMM","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"MMMM","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE 'den' d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/de.json b/packages/intl/lib/src/data/dates/patterns/de.json
index df26113..d1e6e95 100644
--- a/packages/intl/lib/src/data/dates/patterns/de.json
+++ b/packages/intl/lib/src/data/dates/patterns/de.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/de_AT.json b/packages/intl/lib/src/data/dates/patterns/de_AT.json
index df26113..d1e6e95 100644
--- a/packages/intl/lib/src/data/dates/patterns/de_AT.json
+++ b/packages/intl/lib/src/data/dates/patterns/de_AT.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/de_CH.json b/packages/intl/lib/src/data/dates/patterns/de_CH.json
index df26113..d1e6e95 100644
--- a/packages/intl/lib/src/data/dates/patterns/de_CH.json
+++ b/packages/intl/lib/src/data/dates/patterns/de_CH.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'Uhr'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'Uhr'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'Uhr' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/el.json b/packages/intl/lib/src/data/dates/patterns/el.json
index 0dc654c..562528c 100644
--- a/packages/intl/lib/src/data/dates/patterns/el.json
+++ b/packages/intl/lib/src/data/dates/patterns/el.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"MMM","LLLL":"MMMM","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"MMM","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"MMMM","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en.json b/packages/intl/lib/src/data/dates/patterns/en.json
index 9141e1d..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/en.json
+++ b/packages/intl/lib/src/data/dates/patterns/en.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_AU.json b/packages/intl/lib/src/data/dates/patterns/en_AU.json
index fcbe5fa..fef102b 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_AU.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_AU.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_CA.json b/packages/intl/lib/src/data/dates/patterns/en_CA.json
new file mode 100644
index 0000000..9b6e7e6
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/en_CA.json
@@ -0,0 +1 @@
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"EEE, MM-dd","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"EEE, y-MM-dd","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_GB.json b/packages/intl/lib/src/data/dates/patterns/en_GB.json
index 6809dbf..6e0fad0 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_GB.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_GB.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_IE.json b/packages/intl/lib/src/data/dates/patterns/en_IE.json
index 8b8b9bb..7d79d10 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_IE.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_IE.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_IN.json b/packages/intl/lib/src/data/dates/patterns/en_IN.json
index bea43e2..68f2e25 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_IN.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_IN.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_ISO.json b/packages/intl/lib/src/data/dates/patterns/en_ISO.json
index 9141e1d..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_ISO.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_ISO.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_SG.json b/packages/intl/lib/src/data/dates/patterns/en_SG.json
index 8ce600e..fef102b 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_SG.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_SG.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_US.json b/packages/intl/lib/src/data/dates/patterns/en_US.json
index 9141e1d..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_US.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_US.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/en_ZA.json b/packages/intl/lib/src/data/dates/patterns/en_ZA.json
index 0af5646..abd84fd 100644
--- a/packages/intl/lib/src/data/dates/patterns/en_ZA.json
+++ b/packages/intl/lib/src/data/dates/patterns/en_ZA.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM/dd","MEd":"EEE MM/dd","MMM":"LLL","MMMd":"dd MMM","MMMEd":"EEE dd MMM","MMMM":"LLLL","MMMMd":"dd MMMM","MMMMEEEEd":"EEEE dd MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"y/MM/dd","yMEd":"EEE, y/MM/dd","yMMM":"MMM y","yMMMd":"dd MMM y","yMMMEd":"EEE, dd MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM/dd","MEd":"EEE, MM/dd","MMM":"LLL","MMMd":"dd MMM","MMMEd":"EEE, dd MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, dd MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"y/MM/dd","yMEd":"EEE, y/MM/dd","yMMM":"MMM y","yMMMd":"dd MMM y","yMMMEd":"EEE, dd MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/es.json b/packages/intl/lib/src/data/dates/patterns/es.json
index f05c9f9..0a69a42 100644
--- a/packages/intl/lib/src/data/dates/patterns/es.json
+++ b/packages/intl/lib/src/data/dates/patterns/es.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/es_419.json b/packages/intl/lib/src/data/dates/patterns/es_419.json
index e77fae4..2606f80 100644
--- a/packages/intl/lib/src/data/dates/patterns/es_419.json
+++ b/packages/intl/lib/src/data/dates/patterns/es_419.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMMM 'de' y","yMMMd":"d 'de' MMMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/es_ES.json b/packages/intl/lib/src/data/dates/patterns/es_ES.json
index f05c9f9..0a69a42 100644
--- a/packages/intl/lib/src/data/dates/patterns/es_ES.json
+++ b/packages/intl/lib/src/data/dates/patterns/es_ES.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/es_MX.json b/packages/intl/lib/src/data/dates/patterns/es_MX.json
new file mode 100644
index 0000000..654b982
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/es_MX.json
@@ -0,0 +1 @@
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMMM 'de' y","yMMMd":"d 'de' MMMM 'de' y","yMMMEd":"EEE, d 'de' MMMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"H:mm","Hms":"H:mm:ss","j":"HH","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/es_US.json b/packages/intl/lib/src/data/dates/patterns/es_US.json
new file mode 100644
index 0000000..c382dc7
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/es_US.json
@@ -0,0 +1 @@
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMMM 'de' y","yMMMd":"d 'de' MMMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/et.json b/packages/intl/lib/src/data/dates/patterns/et.json
index 5f5c6e7..d344b66 100644
--- a/packages/intl/lib/src/data/dates/patterns/et.json
+++ b/packages/intl/lib/src/data/dates/patterns/et.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"MMMM","LLLL":"MMMM","M":"M","Md":"d.M","MEd":"EEE, d.M","MMM":"MMMM","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"MMMM","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"H:mm.ss","j":"HH","jm":"HH:mm","jms":"H:mm.ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"MMMM","LLLL":"MMMM","M":"M","Md":"d.M","MEd":"EEE, d.M","MMM":"MMMM","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"MMMM","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/eu.json b/packages/intl/lib/src/data/dates/patterns/eu.json
index 50d6a77..ce12fff 100644
--- a/packages/intl/lib/src/data/dates/patterns/eu.json
+++ b/packages/intl/lib/src/data/dates/patterns/eu.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"M/d, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y('e')'ko' MMMM","yMMMMd":"y('e')'ko' MMMM d","yMMMMEEEEd":"y('e')'ko' MMMM d, EEEE","yQQQ":"y('e')'ko' QQQ","yQQQQ":"y('e')'ko' QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm (v)","jmz":"HH:mm (z)","jz":"HH (z)","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"M/d, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y('e')'ko' MMMM","yMMMMd":"y('e')'ko' MMMM d","yMMMMEEEEd":"y('e')'ko' MMMM d, EEEE","yQQQ":"y('e')'ko' QQQ","yQQQQ":"y('e')'ko' QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH (z)","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/fa.json b/packages/intl/lib/src/data/dates/patterns/fa.json
index 031e71c..aa2ac22 100644
--- a/packages/intl/lib/src/data/dates/patterns/fa.json
+++ b/packages/intl/lib/src/data/dates/patterns/fa.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE M/d","MMM":"LLL","MMMd":"d LLL","MMMEd":"EEE d LLL","MMMM":"LLLL","MMMMd":"d LLLL","MMMMEEEEd":"EEEE d LLLL","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y/M","yMd":"y/M/d","yMEd":"EEE y/M/d","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm (v)","jmz":"HH:mm (z)","jz":"H (z)","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE M/d","MMM":"LLL","MMMd":"d LLL","MMMEd":"EEE d LLL","MMMM":"LLLL","MMMMd":"d LLLL","MMMMEEEEd":"EEEE d LLLL","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y/M","yMd":"y/M/d","yMEd":"EEE y/M/d","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm (z)","jz":"H (z)","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/fi.json b/packages/intl/lib/src/data/dates/patterns/fi.json
index ce1a345..f7bc33e 100644
--- a/packages/intl/lib/src/data/dates/patterns/fi.json
+++ b/packages/intl/lib/src/data/dates/patterns/fi.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"ccc d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"cccc d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"L.y","yMd":"d.M.y","yMEd":"EEE d.M.y","yMMM":"LLL y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H.mm","Hms":"H.mm.ss","j":"H","jm":"H.mm","jms":"H.mm.ss","jmv":"H.mm v","jmz":"H.mm z","jz":"H z","m":"m","ms":"m.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"ccc d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"cccc d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"L.y","yMd":"d.M.y","yMEd":"EEE d.M.y","yMMM":"LLL y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H.mm","Hms":"H.mm.ss","j":"H","jm":"H.mm","jms":"H.mm.ss","jmv":"H.mm v","jmz":"H.mm z","jz":"H z","m":"m","ms":"m.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/fil.json b/packages/intl/lib/src/data/dates/patterns/fil.json
index 9141e1d..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/fil.json
+++ b/packages/intl/lib/src/data/dates/patterns/fil.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/fr.json b/packages/intl/lib/src/data/dates/patterns/fr.json
index 212f9b1..e83faf9 100644
--- a/packages/intl/lib/src/data/dates/patterns/fr.json
+++ b/packages/intl/lib/src/data/dates/patterns/fr.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'h'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'h'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'h' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'h'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'h'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'h' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/fr_CA.json b/packages/intl/lib/src/data/dates/patterns/fr_CA.json
index 1bc6b18..361aabc 100644
--- a/packages/intl/lib/src/data/dates/patterns/fr_CA.json
+++ b/packages/intl/lib/src/data/dates/patterns/fr_CA.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"EEE M-d","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"EEE y-MM-dd","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'h'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH 'h'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH 'h' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"EEE M-d","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"EEE y-MM-dd","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH 'h'","Hm":"HH 'h' mm","Hms":"HH:mm:ss","j":"HH 'h'","jm":"HH 'h' mm","jms":"HH:mm:ss","jmv":"HH 'h' mm v","jmz":"HH 'h' mm z","jz":"HH 'h' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ga.json b/packages/intl/lib/src/data/dates/patterns/ga.json
new file mode 100644
index 0000000..0c5e9f7
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/ga.json
@@ -0,0 +1 @@
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE dd/MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE dd/MM/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/gl.json b/packages/intl/lib/src/data/dates/patterns/gl.json
index b3ee8b2..af2193d 100644
--- a/packages/intl/lib/src/data/dates/patterns/gl.json
+++ b/packages/intl/lib/src/data/dates/patterns/gl.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE, d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"ccc, d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"cccc, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"ccc, d/M/y","yMMM":"LLL 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"ccc, d 'de' MMM 'de' y","yMMMM":"LLLL 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm (v)","jmz":"HH:mm (z)","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/gsw.json b/packages/intl/lib/src/data/dates/patterns/gsw.json
index 7c20110..16a7f88 100644
--- a/packages/intl/lib/src/data/dates/patterns/gsw.json
+++ b/packages/intl/lib/src/data/dates/patterns/gsw.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"d.M.y","yMEd":"EEE, y-M-d","yMMM":"MMM y","yMMMd":"y MMM d","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"HH:mm:ss","j":"H","jm":"H:mm","jms":"HH:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"d.M.y","yMEd":"EEE, y-M-d","yMMM":"MMM y","yMMMd":"y MMM d","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"H","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/gu.json b/packages/intl/lib/src/data/dates/patterns/gu.json
index 4e5c8dd..d50bff0 100644
--- a/packages/intl/lib/src/data/dates/patterns/gu.json
+++ b/packages/intl/lib/src/data/dates/patterns/gu.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/haw.json b/packages/intl/lib/src/data/dates/patterns/haw.json
index 12bddd1..37cf500 100644
--- a/packages/intl/lib/src/data/dates/patterns/haw.json
+++ b/packages/intl/lib/src/data/dates/patterns/haw.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/he.json b/packages/intl/lib/src/data/dates/patterns/he.json
index a710048..d2ab292 100644
--- a/packages/intl/lib/src/data/dates/patterns/he.json
+++ b/packages/intl/lib/src/data/dates/patterns/he.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d בMMM","MMMEd":"EEE, d בMMM","MMMM":"LLLL","MMMMd":"d בMMMM","MMMMEEEEd":"EEEE, d בMMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d בMMM y","yMMMEd":"EEE, d בMMM y","yMMMM":"MMMM y","yMMMMd":"d בMMMM y","yMMMMEEEEd":"EEEE, d בMMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d בMMM","MMMEd":"EEE, d בMMM","MMMM":"LLLL","MMMMd":"d בMMMM","MMMMEEEEd":"EEEE, d בMMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d בMMM y","yMMMEd":"EEE, d בMMM y","yMMMM":"MMMM y","yMMMMd":"d בMMMM y","yMMMMEEEEd":"EEEE, d בMMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/hi.json b/packages/intl/lib/src/data/dates/patterns/hi.json
index 7f5d858..1d56e5b 100644
--- a/packages/intl/lib/src/data/dates/patterns/hi.json
+++ b/packages/intl/lib/src/data/dates/patterns/hi.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/hr.json b/packages/intl/lib/src/data/dates/patterns/hr.json
index 39918c7..01fdb63 100644
--- a/packages/intl/lib/src/data/dates/patterns/hr.json
+++ b/packages/intl/lib/src/data/dates/patterns/hr.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d. M.","MEd":"EEE, d. M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M. y.","yMd":"d. M. y.","yMEd":"EEE, d. M. y.","yMMM":"LLL y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"LLLL y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y.","yQQQQ":"QQQQ y.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"dd. MM.","MEd":"EEE, dd. MM.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"MM. y.","yMd":"dd. MM. y.","yMEd":"EEE, dd. MM. y.","yMMM":"LLL y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"LLLL y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y.","yQQQQ":"QQQQ y.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH (z)","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/hu.json b/packages/intl/lib/src/data/dates/patterns/hu.json
index 0dadb65..79c9503 100644
--- a/packages/intl/lib/src/data/dates/patterns/hu.json
+++ b/packages/intl/lib/src/data/dates/patterns/hu.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M. d.","MEd":"M. d., EEE","MMM":"LLL","MMMd":"MMM d.","MMMEd":"MMM d., EEE","MMMM":"LLLL","MMMMd":"MMMM d.","MMMMEEEEd":"MMMM d., EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"y. M.","yMd":"y. MM. dd.","yMEd":"y. MM. dd., EEE","yMMM":"y. MMM","yMMMd":"y. MMM d.","yMMMEd":"y. MMM d., EEE","yMMMM":"y. MMMM","yMMMMd":"y. MMMM d.","yMMMMEEEEd":"y. MMMM d., EEEE","yQQQ":"y. QQQ","yQQQQ":"y. QQQQ","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M. d.","MEd":"M. d., EEE","MMM":"LLL","MMMd":"MMM d.","MMMEd":"MMM d., EEE","MMMM":"LLLL","MMMMd":"MMMM d.","MMMMEEEEd":"MMMM d., EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"y. M.","yMd":"y. MM. dd.","yMEd":"y. MM. dd., EEE","yMMM":"y. MMM","yMMMd":"y. MMM d.","yMMMEd":"y. MMM d., EEE","yMMMM":"y. MMMM","yMMMMd":"y. MMMM d.","yMMMMEEEEd":"y. MMMM d., EEEE","yQQQ":"y. QQQ","yQQQQ":"y. QQQQ","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/hy.json b/packages/intl/lib/src/data/dates/patterns/hy.json
index 5964bf3..65b1734 100644
--- a/packages/intl/lib/src/data/dates/patterns/hy.json
+++ b/packages/intl/lib/src/data/dates/patterns/hy.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"dd.MM, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMM, EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"d MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"d.MM.yթ., EEE","yMMM":"yթ. LLL","yMMMd":"d MMM, yթ.","yMMMEd":"yթ. MMM d, EEE","yMMMM":"yթ. LLLL","yMMMMd":"d MMMM, yթ.","yMMMMEEEEd":"yթ. MMMM d, EEEE","yQQQ":"y թ, QQQ","yQQQQ":"y թ, QQQQ","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm, v","jmz":"H:mm, z","jz":"H, z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"dd.MM, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMM, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"d MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"d.MM.y թ., EEE","yMMM":"y թ. LLL","yMMMd":"d MMM, y թ.","yMMMEd":"y թ. MMM d, EEE","yMMMM":"yթ․ MMMM","yMMMMd":"d MMMM, y թ.","yMMMMEEEEd":"y թ. MMMM d, EEEE","yQQQ":"y թ, QQQ","yQQQQ":"y թ, QQQQ","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/id.json b/packages/intl/lib/src/data/dates/patterns/id.json
index 1efa71f..6e408af 100644
--- a/packages/intl/lib/src/data/dates/patterns/id.json
+++ b/packages/intl/lib/src/data/dates/patterns/id.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/in.json b/packages/intl/lib/src/data/dates/patterns/in.json
index 1efa71f..6e408af 100644
--- a/packages/intl/lib/src/data/dates/patterns/in.json
+++ b/packages/intl/lib/src/data/dates/patterns/in.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/is.json b/packages/intl/lib/src/data/dates/patterns/is.json
index 1349efd..e3155a3 100644
--- a/packages/intl/lib/src/data/dates/patterns/is.json
+++ b/packages/intl/lib/src/data/dates/patterns/is.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M. y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M. y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/it.json b/packages/intl/lib/src/data/dates/patterns/it.json
index 79bd37f..c3f43bb 100644
--- a/packages/intl/lib/src/data/dates/patterns/it.json
+++ b/packages/intl/lib/src/data/dates/patterns/it.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/iw.json b/packages/intl/lib/src/data/dates/patterns/iw.json
index a710048..d2ab292 100644
--- a/packages/intl/lib/src/data/dates/patterns/iw.json
+++ b/packages/intl/lib/src/data/dates/patterns/iw.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d בMMM","MMMEd":"EEE, d בMMM","MMMM":"LLLL","MMMMd":"d בMMMM","MMMMEEEEd":"EEEE, d בMMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d בMMM y","yMMMEd":"EEE, d בMMM y","yMMMM":"MMMM y","yMMMMd":"d בMMMM y","yMMMMEEEEd":"EEEE, d בMMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d בMMM","MMMEd":"EEE, d בMMM","MMMM":"LLLL","MMMMd":"d בMMMM","MMMMEEEEd":"EEEE, d בMMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d בMMM y","yMMMEd":"EEE, d בMMM y","yMMMM":"MMMM y","yMMMMd":"d בMMMM y","yMMMMEEEEd":"EEEE, d בMMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ja.json b/packages/intl/lib/src/data/dates/patterns/ja.json
index 6521d81..4d2ff83 100644
--- a/packages/intl/lib/src/data/dates/patterns/ja.json
+++ b/packages/intl/lib/src/data/dates/patterns/ja.json
@@ -1 +1 @@
-{"d":"d日","E":"EEE","EEEE":"EEEE","LLL":"M月","LLLL":"M月","M":"M月","Md":"M/d","MEd":"M/d(EEE)","MMM":"M月","MMMd":"M月d日","MMMEd":"M月d日(EEE)","MMMM":"M月","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d(EEE)","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日(EEE)","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y/QQQ","yQQQQ":"yQQQQ","H":"H時","Hm":"H:mm","Hms":"H:mm:ss","j":"H時","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d日","E":"ccc","EEEE":"cccc","LLL":"M月","LLLL":"M月","M":"M月","Md":"M/d","MEd":"M/d(EEE)","MMM":"M月","MMMd":"M月d日","MMMEd":"M月d日(EEE)","MMMM":"M月","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d(EEE)","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日(EEE)","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y/QQQ","yQQQQ":"y年QQQQ","H":"H時","Hm":"H:mm","Hms":"H:mm:ss","j":"H時","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ka.json b/packages/intl/lib/src/data/dates/patterns/ka.json
index 7228325..35a9d52 100644
--- a/packages/intl/lib/src/data/dates/patterns/ka.json
+++ b/packages/intl/lib/src/data/dates/patterns/ka.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM, y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM, y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ, y","yQQQQ":"QQQQ, y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM. y","yMMMd":"d MMM. y","yMMMEd":"EEE, d MMM. y","yMMMM":"MMMM, y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ, y","yQQQQ":"QQQQ, y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/kk.json b/packages/intl/lib/src/data/dates/patterns/kk.json
index fcc0684..a2cfda4 100644
--- a/packages/intl/lib/src/data/dates/patterns/kk.json
+++ b/packages/intl/lib/src/data/dates/patterns/kk.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd-MM","MEd":"EEE, dd-MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM-y","yMd":"dd-MM-y","yMEd":"EEE, dd-MM-y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y 'ж'.","yMMMMEEEEd":"EEEE, d MMMM y 'ж'.","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"dd.MM, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMM, EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"d MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"dd.MM.y, EEE","yMMM":"y 'ж'. MMM","yMMMd":"y 'ж'. d MMM","yMMMEd":"y 'ж'. d MMM, EEE","yMMMM":"y 'ж'. MMMM","yMMMMd":"y 'ж'. d MMMM","yMMMMEEEEd":"y 'ж'. d MMMM, EEEE","yQQQ":"y 'ж'. QQQ","yQQQQ":"y 'ж'. QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/km.json b/packages/intl/lib/src/data/dates/patterns/km.json
index d3e062f..a4d30b3 100644
--- a/packages/intl/lib/src/data/dates/patterns/km.json
+++ b/packages/intl/lib/src/data/dates/patterns/km.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE d MMM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d-M-y","yMEd":"EEE d-M-y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/kn.json b/packages/intl/lib/src/data/dates/patterns/kn.json
index a5b34ac..627f718 100644
--- a/packages/intl/lib/src/data/dates/patterns/kn.json
+++ b/packages/intl/lib/src/data/dates/patterns/kn.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"d/M, EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d, MMM, y","yMMMEd":"d MMM, y EEE","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y, EEEE","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"d/M, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d,y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ko.json b/packages/intl/lib/src/data/dates/patterns/ko.json
index 2602182..6a0e690 100644
--- a/packages/intl/lib/src/data/dates/patterns/ko.json
+++ b/packages/intl/lib/src/data/dates/patterns/ko.json
@@ -1 +1 @@
-{"d":"d일","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M월","Md":"M. d.","MEd":"M. d. (EEE)","MMM":"LLL","MMMd":"MMM d일","MMMEd":"MMM d일 (EEE)","MMMM":"LLLL","MMMMd":"MMMM d일","MMMMEEEEd":"MMMM d일 EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y년","yM":"y. M.","yMd":"y. M. d.","yMEd":"y. M. d. (EEE)","yMMM":"y년 MMM","yMMMd":"y년 MMM d일","yMMMEd":"y년 MMM d일 (EEE)","yMMMM":"y년 MMMM","yMMMMd":"y년 MMMM d일","yMMMMEEEEd":"y년 MMMM d일 EEEE","yQQQ":"y년 QQQ","yQQQQ":"y년 QQQQ","H":"H시","Hm":"HH:mm","Hms":"H시 m분 s초","j":"a h시","jm":"a h:mm","jms":"a h:mm:ss","jmv":"a h:mm v","jmz":"a h:mm z","jz":"a h시 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d일","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"M월","Md":"M. d.","MEd":"M. d. (EEE)","MMM":"LLL","MMMd":"MMM d일","MMMEd":"MMM d일 (EEE)","MMMM":"LLLL","MMMMd":"MMMM d일","MMMMEEEEd":"MMMM d일 EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y년","yM":"y. M.","yMd":"y. M. d.","yMEd":"y. M. d. (EEE)","yMMM":"y년 MMM","yMMMd":"y년 MMM d일","yMMMEd":"y년 MMM d일 (EEE)","yMMMM":"y년 MMMM","yMMMMd":"y년 MMMM d일","yMMMMEEEEd":"y년 MMMM d일 EEEE","yQQQ":"y년 QQQ","yQQQQ":"y년 QQQQ","H":"H시","Hm":"HH:mm","Hms":"H시 m분 s초","j":"a h시","jm":"a h:mm","jms":"a h:mm:ss","jmv":"a h:mm v","jmz":"a h:mm z","jz":"a h시 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ky.json b/packages/intl/lib/src/data/dates/patterns/ky.json
index 07f6b5b..7fa7937 100644
--- a/packages/intl/lib/src/data/dates/patterns/ky.json
+++ b/packages/intl/lib/src/data/dates/patterns/ky.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd-MM","MEd":"dd-MM, EEE","MMM":"LLL","MMMd":"d-MMM","MMMEd":"d-MMM, EEE","MMMM":"LLLL","MMMMd":"d-MMMM","MMMMEEEEd":"d-MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y-'ж'. MMM","yMMMd":"y-'ж'. d-MMM","yMMMEd":"y-'ж'. d-MMM, EEE","yMMMM":"y-'ж'. MMMM","yMMMMd":"d-MMMM, y-'ж'.","yMMMMEEEEd":"EEEE, d-MMMM, y-'ж'.","yQQQ":"y-'ж'., QQQ","yQQQQ":"y-'ж'., QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd-MM","MEd":"dd-MM, EEE","MMM":"LLL","MMMd":"d-MMM","MMMEd":"d-MMM, EEE","MMMM":"LLLL","MMMMd":"d-MMMM","MMMMEEEEd":"d-MMMM, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-dd-MM","yMEd":"y-dd-MM, EEE","yMMM":"y-'ж'. MMM","yMMMd":"y-'ж'. d-MMM","yMMMEd":"y-'ж'. d-MMM, EEE","yMMMM":"y-'ж'., MMMM","yMMMMd":"y-'ж'., d-MMMM","yMMMMEEEEd":"y-'ж'., d-MMMM, EEEE","yQQQ":"y-'ж'., QQQ","yQQQQ":"y-'ж'., QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ln.json b/packages/intl/lib/src/data/dates/patterns/ln.json
index 971825c..91b1be2 100644
--- a/packages/intl/lib/src/data/dates/patterns/ln.json
+++ b/packages/intl/lib/src/data/dates/patterns/ln.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"H","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"m:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"HH:mm","Hms":"HH:mm:ss","j":"H","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"H z","m":"m","ms":"m:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/lo.json b/packages/intl/lib/src/data/dates/patterns/lo.json
index 6847469..4e9dca7 100644
--- a/packages/intl/lib/src/data/dates/patterns/lo.json
+++ b/packages/intl/lib/src/data/dates/patterns/lo.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/lt.json b/packages/intl/lib/src/data/dates/patterns/lt.json
index cce6313..127753c 100644
--- a/packages/intl/lib/src/data/dates/patterns/lt.json
+++ b/packages/intl/lib/src/data/dates/patterns/lt.json
@@ -1 +1 @@
-{"d":"dd","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"MM-d","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y 'm'. MMMM d 'd'.","yMMMMEEEEd":"y 'm'. MMMM d 'd'., EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"dd","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"MM","Md":"MM-d","MEd":"MM-dd, EEE","MMM":"MM","MMMd":"MM-dd","MMMEd":"MM-dd, EEE","MMMM":"LLLL","MMMMd":"MMMM d 'd'.","MMMMEEEEd":"MMMM d 'd'., EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y-MM","yMMMd":"y-MM-dd","yMMMEd":"y-MM-dd, EEE","yMMMM":"y 'm'. LLLL","yMMMMd":"y 'm'. MMMM d 'd'.","yMMMMEEEEd":"y 'm'. MMMM d 'd'., EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm; v","jmz":"HH:mm; z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/lv.json b/packages/intl/lib/src/data/dates/patterns/lv.json
index df4fea4..e22cb27 100644
--- a/packages/intl/lib/src/data/dates/patterns/lv.json
+++ b/packages/intl/lib/src/data/dates/patterns/lv.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM.","MEd":"EEE, dd.MM.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y. 'g'.","yM":"MM.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"y. 'g'. MMM","yMMMd":"y. 'g'. d. MMM","yMMMEd":"EEE, y. 'g'. d. MMM","yMMMM":"y. 'g'. MMMM","yMMMMd":"y. 'gada' d. MMMM","yMMMMEEEEd":"EEEE, y. 'gada' d. MMMM","yQQQ":"QQQ y","yQQQQ":"y. 'g'. QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM.","MEd":"EEE, dd.MM.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y. 'g'.","yM":"MM.y.","yMd":"y.MM.d.","yMEd":"EEE, d.M.y.","yMMM":"y. 'g'. MMM","yMMMd":"y. 'g'. d. MMM","yMMMEd":"EEE, y. 'g'. d. MMM","yMMMM":"y. 'g'. MMMM","yMMMMd":"y. 'gada' d. MMMM","yMMMMEEEEd":"EEEE, y. 'gada' d. MMMM","yQQQ":"y. 'g'. QQQ","yQQQQ":"y. 'g'. QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/mk.json b/packages/intl/lib/src/data/dates/patterns/mk.json
index 5bbfa3e..a54a236 100644
--- a/packages/intl/lib/src/data/dates/patterns/mk.json
+++ b/packages/intl/lib/src/data/dates/patterns/mk.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y 'г'.","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y 'г'.","yMMMd":"d MMM y 'г'.","yMMMEd":"EEE, d MMM y 'г'.","yMMMM":"MMMM y 'г'.","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y 'г'.","yMMMd":"d MMM y 'г'.","yMMMEd":"EEE, d MMM y 'г'.","yMMMM":"MMMM y 'г'.","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ml.json b/packages/intl/lib/src/data/dates/patterns/ml.json
index 1b10e22..7df1d2a 100644
--- a/packages/intl/lib/src/data/dates/patterns/ml.json
+++ b/packages/intl/lib/src/data/dates/patterns/ml.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"M/d, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d/M/y","yMEd":"d-M-y, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y, MMMM d","yMMMMEEEEd":"y, MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"d/M, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"d/M/y","yMEd":"d-M-y, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y, MMMM d","yMMMMEEEEd":"y, MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/mn.json b/packages/intl/lib/src/data/dates/patterns/mn.json
index 767d1b1..bd2b40c 100644
--- a/packages/intl/lib/src/data/dates/patterns/mn.json
+++ b/packages/intl/lib/src/data/dates/patterns/mn.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"EEE, M-d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"y-M-d","yMEd":"EEE, y-M-d","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"EEE, y MMM d","yMMMM":"y MMMM","yMMMMd":"y 'оны' MMMM 'сарын' d","yMMMMEEEEd":"EEEE, y 'оны' MMMM 'сарын' d","yQQQ":"y QQQ","yQQQQ":"y 'оны' QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"EEE, M-d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"y-M-d","yMEd":"EEE, y-M-d","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"EEE, y MMM d","yMMMM":"y MMMM","yMMMMd":"y'оны' MMMM'сарын' d'өдөр'","yMMMMEEEEd":"EEEE, y MMMM d","yQQQ":"y QQQ","yQQQQ":"y 'оны' QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/mo.json b/packages/intl/lib/src/data/dates/patterns/mo.json
index a8694ff..9e33ec8 100644
--- a/packages/intl/lib/src/data/dates/patterns/mo.json
+++ b/packages/intl/lib/src/data/dates/patterns/mo.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/mr.json b/packages/intl/lib/src/data/dates/patterns/mr.json
index 215525d..8727aae 100644
--- a/packages/intl/lib/src/data/dates/patterns/mr.json
+++ b/packages/intl/lib/src/data/dates/patterns/mr.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d, MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"H:mm","Hms":"H:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d, MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"H:mm","Hms":"H:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ms.json b/packages/intl/lib/src/data/dates/patterns/ms.json
index d88b217..f81d5d7 100644
--- a/packages/intl/lib/src/data/dates/patterns/ms.json
+++ b/packages/intl/lib/src/data/dates/patterns/ms.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE, d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE, d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/mt.json b/packages/intl/lib/src/data/dates/patterns/mt.json
index 9bd9164..20ae4b3 100644
--- a/packages/intl/lib/src/data/dates/patterns/mt.json
+++ b/packages/intl/lib/src/data/dates/patterns/mt.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"d 'ta'’ MMMM y","yMMMMEEEEd":"EEEE, d 'ta'’ MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"EEE, M-d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, d 'ta'’ MMM","MMMM":"LLLL","MMMMd":"d 'ta'’ MMMM","MMMMEEEEd":"EEEE, d 'ta'’ MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d 'ta'’ MMM, y","yMMMEd":"EEE, d 'ta'’ MMM, y","yMMMM":"MMMM y","yMMMMd":"d 'ta'’ MMMM y","yMMMMEEEEd":"EEEE, d 'ta'’ MMMM y","yQQQ":"QQQ - y","yQQQQ":"QQQQ - y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/my.json b/packages/intl/lib/src/data/dates/patterns/my.json
index 29c62e8..916a77c 100644
--- a/packages/intl/lib/src/data/dates/patterns/my.json
+++ b/packages/intl/lib/src/data/dates/patterns/my.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y/M","yMd":"y-MM-dd","yMEd":"EEE, y/M/d","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"EEE, y MMM d","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"EEEE, y MMMM d","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"cccနေ့","EEEE":"ccccနေ့","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"d/M EEEနေ့","MMM":"LLL","MMMd":"d MMM","MMMEd":"MMM d ရက် EEEနေ့","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d ရက် EEEEနေ့","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"dd-MM-y","yMEd":"d-M-y EEEနေ့","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"d MMM y EEEနေ့","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"v HH:mm","jmz":"z HH:mm","jz":"z HH","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/nb.json b/packages/intl/lib/src/data/dates/patterns/nb.json
index a103c4f..f2ced28 100644
--- a/packages/intl/lib/src/data/dates/patterns/nb.json
+++ b/packages/intl/lib/src/data/dates/patterns/nb.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ne.json b/packages/intl/lib/src/data/dates/patterns/ne.json
index 45a919d..dd0ba60 100644
--- a/packages/intl/lib/src/data/dates/patterns/ne.json
+++ b/packages/intl/lib/src/data/dates/patterns/ne.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/nl.json b/packages/intl/lib/src/data/dates/patterns/nl.json
index aea70dd..0b37383 100644
--- a/packages/intl/lib/src/data/dates/patterns/nl.json
+++ b/packages/intl/lib/src/data/dates/patterns/nl.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d-M-y","yMEd":"EEE d-M-y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE d-M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d-M-y","yMEd":"EEE d-M-y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/no.json b/packages/intl/lib/src/data/dates/patterns/no.json
index a103c4f..f2ced28 100644
--- a/packages/intl/lib/src/data/dates/patterns/no.json
+++ b/packages/intl/lib/src/data/dates/patterns/no.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/no_NO.json b/packages/intl/lib/src/data/dates/patterns/no_NO.json
index a103c4f..f2ced28 100644
--- a/packages/intl/lib/src/data/dates/patterns/no_NO.json
+++ b/packages/intl/lib/src/data/dates/patterns/no_NO.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE d.M","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d.MM.y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/pa.json b/packages/intl/lib/src/data/dates/patterns/pa.json
index 2a82066..e942ebe 100644
--- a/packages/intl/lib/src/data/dates/patterns/pa.json
+++ b/packages/intl/lib/src/data/dates/patterns/pa.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd-MM.","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M-y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd-MM.","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"y MMMM","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/pl.json b/packages/intl/lib/src/data/dates/patterns/pl.json
index cc17f6c..05e22cd 100644
--- a/packages/intl/lib/src/data/dates/patterns/pl.json
+++ b/packages/intl/lib/src/data/dates/patterns/pl.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.MM","MEd":"EEE, d.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"d.MM.y","yMEd":"EEE, d.MM.y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.MM","MEd":"EEE, d.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"d.MM.y","yMEd":"EEE, d.MM.y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/pt.json b/packages/intl/lib/src/data/dates/patterns/pt.json
index e9af06f..da6f389 100644
--- a/packages/intl/lib/src/data/dates/patterns/pt.json
+++ b/packages/intl/lib/src/data/dates/patterns/pt.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE, d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE, d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/pt_BR.json b/packages/intl/lib/src/data/dates/patterns/pt_BR.json
index e9af06f..da6f389 100644
--- a/packages/intl/lib/src/data/dates/patterns/pt_BR.json
+++ b/packages/intl/lib/src/data/dates/patterns/pt_BR.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE, d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d 'de' MMM","MMMEd":"EEE, d 'de' MMM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM 'de' y","yMMMd":"d 'de' MMM 'de' y","yMMMEd":"EEE, d 'de' MMM 'de' y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/pt_PT.json b/packages/intl/lib/src/data/dates/patterns/pt_PT.json
index 086a1db..4670957 100644
--- a/packages/intl/lib/src/data/dates/patterns/pt_PT.json
+++ b/packages/intl/lib/src/data/dates/patterns/pt_PT.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d/MM","MMMEd":"EEE, d/MM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"EEEE, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MM/y","yMMMd":"d/MM/y","yMMMEd":"EEE, d/MM/y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d/MM","MMMEd":"EEE, d/MM","MMMM":"LLLL","MMMMd":"d 'de' MMMM","MMMMEEEEd":"cccc, d 'de' MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MM/y","yMMMd":"d/MM/y","yMMMEd":"EEE, d/MM/y","yMMMM":"MMMM 'de' y","yMMMMd":"d 'de' MMMM 'de' y","yMMMMEEEEd":"EEEE, d 'de' MMMM 'de' y","yQQQ":"QQQQ 'de' y","yQQQQ":"QQQQ 'de' y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ro.json b/packages/intl/lib/src/data/dates/patterns/ro.json
index a8694ff..9e33ec8 100644
--- a/packages/intl/lib/src/data/dates/patterns/ro.json
+++ b/packages/intl/lib/src/data/dates/patterns/ro.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ru.json b/packages/intl/lib/src/data/dates/patterns/ru.json
index 7b8c17d..0336405 100644
--- a/packages/intl/lib/src/data/dates/patterns/ru.json
+++ b/packages/intl/lib/src/data/dates/patterns/ru.json
@@ -1 +1 @@
-{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"ccc, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"cccc, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"ccc, d.MM.y 'г'.","yMMM":"LLL y","yMMMd":"d MMM y 'г'.","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"ccc, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"cccc, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"ccc, d.MM.y 'г'.","yMMM":"LLL y 'г'.","yMMMd":"d MMM y 'г'.","yMMMEd":"EEE, d MMM y 'г'.","yMMMM":"LLLL y 'г'.","yMMMMd":"d MMMM y 'г'.","yMMMMEEEEd":"EEEE, d MMMM y 'г'.","yQQQ":"QQQ y 'г'.","yQQQQ":"QQQQ y 'г'.","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sh.json b/packages/intl/lib/src/data/dates/patterns/sh.json
index 3bfb526..2dc42d0 100644
--- a/packages/intl/lib/src/data/dates/patterns/sh.json
+++ b/packages/intl/lib/src/data/dates/patterns/sh.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, M-d","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"MMMM y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ. y","yQQQQ":"QQQQ. y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"MMMM y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y.","yQQQQ":"QQQQ y.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/si.json b/packages/intl/lib/src/data/dates/patterns/si.json
index 0a2ea70..0ca6818 100644
--- a/packages/intl/lib/src/data/dates/patterns/si.json
+++ b/packages/intl/lib/src/data/dates/patterns/si.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"M-d, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"y-M-d","yMEd":"y-M-d, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"a h","jm":"a h.mm","jms":"a h.mm.ss","jmv":"a h.mm v","jmz":"a h.mm z","jz":"a h z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M-d","MEd":"M-d, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-M","yMd":"y-M-d","yMEd":"y-M-d, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"y MMMM d, EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sk.json b/packages/intl/lib/src/data/dates/patterns/sk.json
index f3ecaeb..95a8df8 100644
--- a/packages/intl/lib/src/data/dates/patterns/sk.json
+++ b/packages/intl/lib/src/data/dates/patterns/sk.json
@@ -1 +1 @@
-{"d":"d.","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM.","MMMEd":"EEE, d. MMM.","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE d. M. y","yMMM":"LLL y","yMMMd":"d.M.y","yMMMEd":"EEE, d. MMM y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L.","Md":"d. M.","MEd":"EEE d. M.","MMM":"LLL","MMMd":"d. M.","MMMEd":"EEE d. M.","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d. M. y","yMEd":"EEE d. M. y","yMMM":"M/y","yMMMd":"d. M. y","yMMMEd":"EEE d. M. y","yMMMM":"LLLL y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"H","Hm":"H:mm","Hms":"H:mm:ss","j":"H","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"H z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sl.json b/packages/intl/lib/src/data/dates/patterns/sl.json
index a0f902a..1f92ef5 100644
--- a/packages/intl/lib/src/data/dates/patterns/sl.json
+++ b/packages/intl/lib/src/data/dates/patterns/sl.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d. M.","MEd":"EEE, d. MM.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d. M. y","yMEd":"EEE, d. M. y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d.","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d. M.","MEd":"EEE, d. M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE, d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d. M. y","yMEd":"EEE, d. M. y","yMMM":"MMM y","yMMMd":"d. MMM y","yMMMEd":"EEE, d. MMM y","yMMMM":"MMMM y","yMMMMd":"d. MMMM y","yMMMMEEEEd":"EEEE, d. MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH'h'","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH'h'","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH'h' z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sq.json b/packages/intl/lib/src/data/dates/patterns/sq.json
index 0597df8..c5ca254 100644
--- a/packages/intl/lib/src/data/dates/patterns/sq.json
+++ b/packages/intl/lib/src/data/dates/patterns/sq.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"dd/MM/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M","MEd":"EEE, d.M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M.y","yMd":"d.M.y","yMEd":"EEE, d.M.y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ, y","yQQQQ":"QQQQ, y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a, v","jmz":"h:mm a, z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sr.json b/packages/intl/lib/src/data/dates/patterns/sr.json
index 3bfb526..2dc42d0 100644
--- a/packages/intl/lib/src/data/dates/patterns/sr.json
+++ b/packages/intl/lib/src/data/dates/patterns/sr.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, M-d","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"MMMM y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ. y","yQQQQ":"QQQQ. y","H":"HH","Hm":"HH.mm","Hms":"HH.mm.ss","j":"HH","jm":"HH.mm","jms":"HH.mm.ss","jmv":"HH.mm v","jmz":"HH.mm z","jz":"HH z","m":"m","ms":"mm.ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"MMMM y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y.","yQQQQ":"QQQQ y.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sr_Latn.json b/packages/intl/lib/src/data/dates/patterns/sr_Latn.json
new file mode 100644
index 0000000..2dc42d0
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/patterns/sr_Latn.json
@@ -0,0 +1 @@
+{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d.M.","MEd":"EEE, d.M.","MMM":"LLL","MMMd":"d. MMM","MMMEd":"EEE d. MMM","MMMM":"LLLL","MMMMd":"d. MMMM","MMMMEEEEd":"EEEE, d. MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y.","yM":"M.y.","yMd":"d.M.y.","yMEd":"EEE, d.M.y.","yMMM":"MMM y.","yMMMd":"d. MMM y.","yMMMEd":"EEE, d. MMM y.","yMMMM":"MMMM y.","yMMMMd":"d. MMMM y.","yMMMMEEEEd":"EEEE, d. MMMM y.","yQQQ":"QQQ y.","yQQQQ":"QQQQ y.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sv.json b/packages/intl/lib/src/data/dates/patterns/sv.json
index 4367651..77bc733 100644
--- a/packages/intl/lib/src/data/dates/patterns/sv.json
+++ b/packages/intl/lib/src/data/dates/patterns/sv.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"EEE, y-MM-dd","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"EEE, y-MM-dd","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/sw.json b/packages/intl/lib/src/data/dates/patterns/sw.json
index 2c73553..a9ac6c1 100644
--- a/packages/intl/lib/src/data/dates/patterns/sw.json
+++ b/packages/intl/lib/src/data/dates/patterns/sw.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d-M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE, d MMMM y","yQQQ":"y QQQ","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ta.json b/packages/intl/lib/src/data/dates/patterns/ta.json
index 2ebbe91..42e048d 100644
--- a/packages/intl/lib/src/data/dates/patterns/ta.json
+++ b/packages/intl/lib/src/data/dates/patterns/ta.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"dd-MM, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"a h","jm":"a h:mm","jms":"a h:mm:ss","jmv":"a h:mm v","jmz":"a h:mm z","jz":"a h z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/te.json b/packages/intl/lib/src/data/dates/patterns/te.json
index 9a7eec6..7691b7f 100644
--- a/packages/intl/lib/src/data/dates/patterns/te.json
+++ b/packages/intl/lib/src/data/dates/patterns/te.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d, MMM y","yMMMEd":"EEE, d, MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y EEEE","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, d/M/y","yMMM":"MMM y","yMMMd":"d, MMM y","yMMMEd":"EEE, d, MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"d, MMMM y, EEEE","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/th.json b/packages/intl/lib/src/data/dates/patterns/th.json
index 79bd37f..fa1fd86 100644
--- a/packages/intl/lib/src/data/dates/patterns/th.json
+++ b/packages/intl/lib/src/data/dates/patterns/th.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEEที่ d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE d/M/y","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"EEE d MMM y","yMMMM":"MMMM G y","yMMMMd":"d MMMM G y","yMMMMEEEEd":"EEEEที่ d MMMM G y","yQQQ":"QQQ y","yQQQQ":"QQQQ G y","H":"HH","Hm":"HH:mm น.","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm น.","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/tl.json b/packages/intl/lib/src/data/dates/patterns/tl.json
index 9141e1d..8e21ba7 100644
--- a/packages/intl/lib/src/data/dates/patterns/tl.json
+++ b/packages/intl/lib/src/data/dates/patterns/tl.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/tr.json b/packages/intl/lib/src/data/dates/patterns/tr.json
index b2b3630..eaa6964 100644
--- a/packages/intl/lib/src/data/dates/patterns/tr.json
+++ b/packages/intl/lib/src/data/dates/patterns/tr.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/MM","MEd":"dd/MM EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMMM EEE","MMMM":"LLLL","MMMMd":"dd MMMM","MMMMEEEEd":"dd MMMM EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd.MM.y","yMEd":"dd.MM.y EEE","yMMM":"MMM y","yMMMd":"dd MMM y","yMMMEd":"d MMM y EEE","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y EEEE","yQQQ":"y/QQQ","yQQQQ":"y/QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"d/MM EEE","MMM":"LLL","MMMd":"d MMM","MMMEd":"d MMMM EEE","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"d MMMM EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd.MM.y","yMEd":"d.M.y EEE","yMMM":"MMM y","yMMMd":"d MMM y","yMMMEd":"d MMM y EEE","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"d MMMM y EEEE","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/uk.json b/packages/intl/lib/src/data/dates/patterns/uk.json
index fc8ec35..9f58417 100644
--- a/packages/intl/lib/src/data/dates/patterns/uk.json
+++ b/packages/intl/lib/src/data/dates/patterns/uk.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y 'р'.","yMMMMEEEEd":"EEEE, d MMMM y 'р'.","yQQQ":"QQQ y","yQQQQ":"QQQQ y 'р'.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd.MM","MEd":"EEE, dd.MM","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM.y","yMd":"dd.MM.y","yMEd":"EEE, dd.MM.y","yMMM":"LLL y","yMMMd":"d MMM y","yMMMEd":"EEE, d MMM y","yMMMM":"LLLL y","yMMMMd":"d MMMM y 'р'.","yMMMMEEEEd":"EEEE, d MMMM y 'р'.","yQQQ":"QQQ y","yQQQQ":"QQQQ y 'р'.","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/ur.json b/packages/intl/lib/src/data/dates/patterns/ur.json
index 4ca6759..bc124ee 100644
--- a/packages/intl/lib/src/data/dates/patterns/ur.json
+++ b/packages/intl/lib/src/data/dates/patterns/ur.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE، d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE، d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE، d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE، d/M/y","yMMM":"MMM y","yMMMd":"d MMM، y","yMMMEd":"EEE، d MMM، y","yMMMM":"MMMM y","yMMMMd":"d MMMM، y","yMMMMEEEEd":"EEEE، d MMMM، y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"d/M","MEd":"EEE، d/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE، d MMM","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE، d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE، d/M/y","yMMM":"MMM y","yMMMd":"d MMM، y","yMMMEd":"EEE، d MMM، y","yMMMM":"y MMMM","yMMMMd":"d MMMM، y","yMMMMEEEEd":"EEEE، d MMMM، y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/uz.json b/packages/intl/lib/src/data/dates/patterns/uz.json
index 245e54e..4639c4c 100644
--- a/packages/intl/lib/src/data/dates/patterns/uz.json
+++ b/packages/intl/lib/src/data/dates/patterns/uz.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"MMM d, EEE","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"MMMM d, EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"y MMM","yMMMd":"y MMM d","yMMMEd":"y MMM d, EEE","yMMMM":"y MMMM","yMMMMd":"y MMMM d","yMMMMEEEEd":"EEEE, y MMMM d","yQQQ":"y QQQ","yQQQQ":"y QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"LL","Md":"dd/MM","MEd":"EEE, dd/MM","MMM":"LLL","MMMd":"d-MMM","MMMEd":"EEE, d-MMM","MMMM":"LLLL","MMMMd":"d-MMMM","MMMMEEEEd":"EEEE, d-MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"MM/y","yMd":"dd/MM/y","yMEd":"EEE, dd/MM/y","yMMM":"MMM, y","yMMMd":"d-MMM, y","yMMMEd":"EEE, d-MMM, y","yMMMM":"MMMM, y","yMMMMd":"d-MMMM, y","yMMMMEEEEd":"EEEE, d-MMMM, y","yQQQ":"y, QQQ","yQQQQ":"y, QQQQ","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm (v)","jmz":"HH:mm (z)","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/vi.json b/packages/intl/lib/src/data/dates/patterns/vi.json
index 3b29ea6..f5ebb41 100644
--- a/packages/intl/lib/src/data/dates/patterns/vi.json
+++ b/packages/intl/lib/src/data/dates/patterns/vi.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd-M","MEd":"EEE, dd-M","MMM":"LLL","MMMd":"dd MMM","MMMEd":"EEE, dd MMM","MMMM":"LLLL","MMMMd":"dd MMMM","MMMMEEEEd":"EEEE, dd MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"'Năm' y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, dd-M-y","yMMM":"MMM y","yMMMd":"dd MMM, y","yMMMEd":"EEE, dd MMM y","yMMMM":"MMMM y","yMMMMd":"dd MMMM, y","yMMMMEEEEd":"EEEE, 'ngày' d MMMM 'năm' y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"H:mm","Hms":"H:mm:ss","j":"HH","jm":"H:mm","jms":"H:mm:ss","jmv":"H:mm v","jmz":"H:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"dd/M","MEd":"EEE, dd/M","MMM":"LLL","MMMd":"d MMM","MMMEd":"EEE, d MMM","MMMM":"LLLL","MMMMd":"d MMMM","MMMMEEEEd":"EEEE, d MMMM","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"d/M/y","yMEd":"EEE, dd/M/y","yMMM":"MMM y","yMMMd":"d MMM, y","yMMMEd":"EEE, d MMM, y","yMMMM":"MMMM 'năm' y","yMMMMd":"d MMMM, y","yMMMMEEEEd":"EEEE, d MMMM, y","yQQQ":"QQQ y","yQQQQ":"QQQQ 'năm' y","H":"HH","Hm":"H:mm","Hms":"HH:mm:ss","j":"HH","jm":"H:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/zh.json b/packages/intl/lib/src/data/dates/patterns/zh.json
index 8235fb6..e7af8ce 100644
--- a/packages/intl/lib/src/data/dates/patterns/zh.json
+++ b/packages/intl/lib/src/data/dates/patterns/zh.json
@@ -1 +1 @@
-{"d":"d日","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/dEEE","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/dEEE","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年第Q季度","yQQQQ":"y年第Q季度","H":"H时","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah时","jm":"ah:mm","jms":"ah:mm:ss","jmv":"vah:mm","jmz":"zah:mm","jz":"zah时","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d日","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/dEEE","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y年M月","yMd":"y/M/d","yMEd":"y/M/dEEE","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年第Q季度","yQQQQ":"y年第Q季度","H":"H时","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah时","jm":"ah:mm","jms":"ah:mm:ss","jmv":"v ah:mm","jmz":"z ah:mm","jz":"zah时","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/zh_CN.json b/packages/intl/lib/src/data/dates/patterns/zh_CN.json
index 8235fb6..e7af8ce 100644
--- a/packages/intl/lib/src/data/dates/patterns/zh_CN.json
+++ b/packages/intl/lib/src/data/dates/patterns/zh_CN.json
@@ -1 +1 @@
-{"d":"d日","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/dEEE","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/dEEE","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年第Q季度","yQQQQ":"y年第Q季度","H":"H时","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah时","jm":"ah:mm","jms":"ah:mm:ss","jmv":"vah:mm","jmz":"zah:mm","jz":"zah时","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d日","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/dEEE","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y年M月","yMd":"y/M/d","yMEd":"y/M/dEEE","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年第Q季度","yQQQQ":"y年第Q季度","H":"H时","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah时","jm":"ah:mm","jms":"ah:mm:ss","jmv":"v ah:mm","jmz":"z ah:mm","jz":"zah时","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/zh_HK.json b/packages/intl/lib/src/data/dates/patterns/zh_HK.json
index 54c66f7..76b3d90 100644
--- a/packages/intl/lib/src/data/dates/patterns/zh_HK.json
+++ b/packages/intl/lib/src/data/dates/patterns/zh_HK.json
@@ -1 +1 @@
-{"d":"d日","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"d/M","MEd":"EEE, d/M","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日 (EEE)","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日 (EEEE)","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"M/y","yMd":"d/M/y","yMEd":"d/M/y(EEE)","yMMM":"y 年 M 月","yMMMd":"y 年 M 月 d 日","yMMMEd":"y 年 M 月 d 日 (EEE)","yMMMM":"y 年 M 月","yMMMMd":"y 年 M 月 d 日","yMMMMEEEEd":"y 年 M 月 d 日 (EEEE)","yQQQ":"y年QQQ","yQQQQ":"y年QQQQ","H":"H時","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah時","jm":"ah:mm","jms":"ah:mm:ss","jmv":"ah:mm v","jmz":"ah:mm z","jz":"ah時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d日","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"d/M","MEd":"d/M(EEE)","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"M/y","yMd":"d/M/y","yMEd":"d/M/y(EEE)","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年QQQ","yQQQQ":"y年QQQQ","H":"H時","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah時","jm":"ah:mm","jms":"ah:mm:ss","jmv":"ah:mm [v]","jmz":"ah:mm [z]","jz":"ah時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/zh_TW.json b/packages/intl/lib/src/data/dates/patterns/zh_TW.json
index 1d0d9c4..6d84871 100644
--- a/packages/intl/lib/src/data/dates/patterns/zh_TW.json
+++ b/packages/intl/lib/src/data/dates/patterns/zh_TW.json
@@ -1 +1 @@
-{"d":"d日","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/d(EEE)","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d(EEE)","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日EEEE","yQQQ":"y年QQQ","yQQQQ":"y年QQQQ","H":"H時","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah時","jm":"ah:mm","jms":"ah:mm:ss","jmv":"ah:mm v","jmz":"ah:mm z","jz":"ah時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d日","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"M月","Md":"M/d","MEd":"M/d(EEE)","MMM":"LLL","MMMd":"M月d日","MMMEd":"M月d日 EEE","MMMM":"LLLL","MMMMd":"M月d日","MMMMEEEEd":"M月d日 EEEE","QQQ":"QQQ","QQQQ":"QQQQ","y":"y年","yM":"y/M","yMd":"y/M/d","yMEd":"y/M/d(EEE)","yMMM":"y年M月","yMMMd":"y年M月d日","yMMMEd":"y年M月d日 EEE","yMMMM":"y年M月","yMMMMd":"y年M月d日","yMMMMEEEEd":"y年M月d日 EEEE","yQQQ":"y年QQQ","yQQQQ":"y年QQQQ","H":"H時","Hm":"HH:mm","Hms":"HH:mm:ss","j":"ah時","jm":"ah:mm","jms":"ah:mm:ss","jmv":"ah:mm [v]","jmz":"ah:mm [z]","jz":"ah時 z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/patterns/zu.json b/packages/intl/lib/src/data/dates/patterns/zu.json
index 3129b04..2f7692b 100644
--- a/packages/intl/lib/src/data/dates/patterns/zu.json
+++ b/packages/intl/lib/src/data/dates/patterns/zu.json
@@ -1 +1 @@
-{"d":"d","E":"EEE","EEEE":"EEEE","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"M/d","MEd":"EEE, M/d","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"M/y","yMd":"M/d/y","yMEd":"EEE, M/d/y","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"d MMMM y","yMMMMEEEEd":"EEEE d MMMM y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"h a","jm":"h:mm a","jms":"h:mm:ss a","jmv":"h:mm a v","jmz":"h:mm a z","jz":"h a z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
+{"d":"d","E":"ccc","EEEE":"cccc","LLL":"LLL","LLLL":"LLLL","M":"L","Md":"MM-dd","MEd":"MM-dd, EEE","MMM":"LLL","MMMd":"MMM d","MMMEd":"EEE, MMM d","MMMM":"LLLL","MMMMd":"MMMM d","MMMMEEEEd":"EEEE, MMMM d","QQQ":"QQQ","QQQQ":"QQQQ","y":"y","yM":"y-MM","yMd":"y-MM-dd","yMEd":"y-MM-dd, EEE","yMMM":"MMM y","yMMMd":"MMM d, y","yMMMEd":"EEE, MMM d, y","yMMMM":"MMMM y","yMMMMd":"MMMM d, y","yMMMMEEEEd":"EEEE, MMMM d, y","yQQQ":"QQQ y","yQQQQ":"QQQQ y","H":"HH","Hm":"HH:mm","Hms":"HH:mm:ss","j":"HH","jm":"HH:mm","jms":"HH:mm:ss","jmv":"HH:mm v","jmz":"HH:mm z","jz":"HH z","m":"m","ms":"mm:ss","s":"s","v":"v","z":"z","zzzz":"zzzz","ZZZZ":"ZZZZ"}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/af.json b/packages/intl/lib/src/data/dates/symbols/af.json
index f0a0a77..4856a67 100644
--- a/packages/intl/lib/src/data/dates/symbols/af.json
+++ b/packages/intl/lib/src/data/dates/symbols/af.json
@@ -1 +1 @@
-{"NAME":"af","ERAS":["v.C.","n.C."],"ERANAMES":["voor Christus","na Christus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],"WEEKDAYS":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"STANDALONEWEEKDAYS":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"SHORTWEEKDAYS":["So","Ma","Di","Wo","Do","Vr","Sa"],"STANDALONESHORTWEEKDAYS":["So","Ma","Di","Wo","Do","Vr","Sa"],"NARROWWEEKDAYS":["S","M","D","W","D","V","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","W","D","V","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1ste kwartaal","2de kwartaal","3de kwartaal","4de kwartaal"],"AMPMS":["vm.","nm."],"DATEFORMATS":["EEEE dd MMMM y","dd MMMM y","dd MMM y","y-MM-dd"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"af","ERAS":["v.C.","n.C."],"ERANAMES":["voor Christus","na Christus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan.","Feb.","Mrt.","Apr.","Mei","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Des."],"STANDALONESHORTMONTHS":["Jan.","Feb.","Mrt.","Apr.","Mei","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Des."],"WEEKDAYS":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"STANDALONEWEEKDAYS":["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],"SHORTWEEKDAYS":["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."],"STANDALONESHORTWEEKDAYS":["So.","Ma.","Di.","Wo.","Do.","Vr.","Sa."],"NARROWWEEKDAYS":["S","M","D","W","D","V","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","W","D","V","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1ste kwartaal","2de kwartaal","3de kwartaal","4de kwartaal"],"AMPMS":["vm.","nm."],"DATEFORMATS":["EEEE, dd MMMM y","dd MMMM y","dd MMM y","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/am.json b/packages/intl/lib/src/data/dates/symbols/am.json
index c1c18ed..0a01fc7 100644
--- a/packages/intl/lib/src/data/dates/symbols/am.json
+++ b/packages/intl/lib/src/data/dates/symbols/am.json
@@ -1 +1 @@
-{"NAME":"am","ERAS":["ዓ/ዓ","ዓ/ም"],"ERANAMES":["ዓመተ ዓለም","ዓመተ ምሕረት"],"NARROWMONTHS":["ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ጁ","ኦ","ሴ","ኦ","ኖ","ዲ"],"STANDALONENARROWMONTHS":["ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ጁ","ኦ","ሴ","ኦ","ኖ","ዲ"],"MONTHS":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር"],"STANDALONEMONTHS":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"SHORTMONTHS":["ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም"],"STANDALONESHORTMONTHS":["ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክቶ","ኖቬም","ዲሴም"],"WEEKDAYS":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"STANDALONEWEEKDAYS":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"SHORTWEEKDAYS":["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"STANDALONESHORTWEEKDAYS":["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"NARROWWEEKDAYS":["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"],"STANDALONENARROWWEEKDAYS":["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"],"SHORTQUARTERS":["ሩብ1","ሩብ2","ሩብ3","ሩብ4"],"QUARTERS":["1ኛው ሩብ","ሁለተኛው ሩብ","3ኛው ሩብ","4ኛው ሩብ"],"AMPMS":["ጥዋት","ከሰዓት"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"am","ERAS":["ዓ/ዓ","ዓ/ም"],"ERANAMES":["ዓመተ ዓለም","ዓመተ ምሕረት"],"NARROWMONTHS":["ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ጁ","ኦ","ሴ","ኦ","ኖ","ዲ"],"STANDALONENARROWMONTHS":["ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ጁ","ኦ","ሴ","ኦ","ኖ","ዲ"],"MONTHS":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"STANDALONEMONTHS":["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕሪል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር"],"SHORTMONTHS":["ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክቶ","ኖቬም","ዲሴም"],"STANDALONESHORTMONTHS":["ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክቶ","ኖቬም","ዲሴም"],"WEEKDAYS":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"STANDALONEWEEKDAYS":["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"SHORTWEEKDAYS":["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"STANDALONESHORTWEEKDAYS":["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],"NARROWWEEKDAYS":["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"],"STANDALONENARROWWEEKDAYS":["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"],"SHORTQUARTERS":["ሩብ1","ሩብ2","ሩብ3","ሩብ4"],"QUARTERS":["1ኛው ሩብ","2ኛው ሩብ","3ኛው ሩብ","4ኛው ሩብ"],"AMPMS":["ጥዋት","ከሰዓት"],"DATEFORMATS":["EEEE ፣d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/az.json b/packages/intl/lib/src/data/dates/symbols/az.json
index dbba148..02f7948 100644
--- a/packages/intl/lib/src/data/dates/symbols/az.json
+++ b/packages/intl/lib/src/data/dates/symbols/az.json
@@ -1 +1 @@
-{"NAME":"az","ERAS":["e.ə.","b.e."],"ERANAMES":["eramızdan əvvəl","bizim eramızın"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"STANDALONEMONTHS":["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],"SHORTMONTHS":["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],"STANDALONESHORTMONTHS":["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],"WEEKDAYS":["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"STANDALONEWEEKDAYS":["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"SHORTWEEKDAYS":["B.","B.E.","Ç.A.","Ç.","C.A.","C","Ş."],"STANDALONESHORTWEEKDAYS":["B.","B.E.","Ç.A.","Ç.","C.A.","C","Ş."],"NARROWWEEKDAYS":["7","1","2","3","4","5","6"],"STANDALONENARROWWEEKDAYS":["7","1","2","3","4","5","6"],"SHORTQUARTERS":["1-ci kv.","2-ci kv.","3-cü kv.","4-cü kv."],"QUARTERS":["1-ci kvartal","2-ci kvartal","3-cü kvartal","4-cü kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["d MMMM y, EEEE","d MMMM y","d MMM y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"az","ERAS":["e.ə.","y.e."],"ERANAMES":["eramızdan əvvəl","yeni era"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["yanvar","fevral","mart","aprel","may","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr"],"STANDALONEMONTHS":["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],"SHORTMONTHS":["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],"STANDALONESHORTMONTHS":["yan","fev","mar","apr","may","iyn","iyl","avq","sen","okt","noy","dek"],"WEEKDAYS":["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"STANDALONEWEEKDAYS":["bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə"],"SHORTWEEKDAYS":["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."],"STANDALONESHORTWEEKDAYS":["B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş."],"NARROWWEEKDAYS":["7","1","2","3","4","5","6"],"STANDALONENARROWWEEKDAYS":["7","1","2","3","4","5","6"],"SHORTQUARTERS":["1-ci kv.","2-ci kv.","3-cü kv.","4-cü kv."],"QUARTERS":["1-ci kvartal","2-ci kvartal","3-cü kvartal","4-cü kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["d MMMM y, EEEE","d MMMM y","d MMM y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/be.json b/packages/intl/lib/src/data/dates/symbols/be.json
new file mode 100644
index 0000000..7d12401
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/be.json
@@ -0,0 +1 @@
+{"NAME":"be","ERAS":["да н.э.","н.э."],"ERANAMES":["да нараджэння Хрыстова","ад нараджэння Хрыстова"],"NARROWMONTHS":["с","л","с","к","м","ч","л","ж","в","к","л","с"],"STANDALONENARROWMONTHS":["с","л","с","к","м","ч","л","ж","в","к","л","с"],"MONTHS":["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня"],"STANDALONEMONTHS":["студзень","люты","сакавік","красавік","май","чэрвень","ліпень","жнівень","верасень","кастрычнік","лістапад","снежань"],"SHORTMONTHS":["сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне"],"STANDALONESHORTMONTHS":["сту","лют","сак","кра","май","чэр","ліп","жні","вер","кас","ліс","сне"],"WEEKDAYS":["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],"STANDALONEWEEKDAYS":["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],"SHORTWEEKDAYS":["нд","пн","аў","ср","чц","пт","сб"],"STANDALONESHORTWEEKDAYS":["нд","пн","аў","ср","чц","пт","сб"],"NARROWWEEKDAYS":["н","п","а","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","а","с","ч","п","с"],"SHORTQUARTERS":["1-шы кв.","2-гі кв.","3-ці кв.","4-ты кв."],"QUARTERS":["1-шы квартал","2-гі квартал","3-ці квартал","4-ты квартал"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y 'г'.","d MMMM y 'г'.","d.MM.y","d.MM.yy"],"TIMEFORMATS":["HH:mm:ss, zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'у' {0}","{1} 'у' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/bg.json b/packages/intl/lib/src/data/dates/symbols/bg.json
index 647a5e5..408e152 100644
--- a/packages/intl/lib/src/data/dates/symbols/bg.json
+++ b/packages/intl/lib/src/data/dates/symbols/bg.json
@@ -1 +1 @@
-{"NAME":"bg","ERAS":["пр.Хр.","сл.Хр."],"ERANAMES":["пр.Хр.","сл.Хр."],"NARROWMONTHS":["я","ф","м","а","м","ю","ю","а","с","о","н","д"],"STANDALONENARROWMONTHS":["я","ф","м","а","м","ю","ю","а","с","о","н","д"],"MONTHS":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"STANDALONEMONTHS":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"SHORTMONTHS":["ян.","февр.","март","апр.","май","юни","юли","авг.","септ.","окт.","ноем.","дек."],"STANDALONESHORTMONTHS":["ян.","февр.","март","апр.","май","юни","юли","авг.","септ.","окт.","ноем.","дек."],"WEEKDAYS":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"STANDALONEWEEKDAYS":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"SHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"STANDALONESHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"NARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"SHORTQUARTERS":["1 трим.","2 трим.","3 трим.","4 трим."],"QUARTERS":["1-во тримесечие","2-ро тримесечие","3-то тримесечие","4-то тримесечие"],"AMPMS":["пр.об.","сл.об."],"DATEFORMATS":["EEEE, d MMMM y 'г'.","d MMMM y 'г'.","d.MM.y 'г'.","d.MM.yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"bg","ERAS":["пр.Хр.","сл.Хр."],"ERANAMES":["преди Христа","след Христа"],"NARROWMONTHS":["я","ф","м","а","м","ю","ю","а","с","о","н","д"],"STANDALONENARROWMONTHS":["я","ф","м","а","м","ю","ю","а","с","о","н","д"],"MONTHS":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"STANDALONEMONTHS":["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември"],"SHORTMONTHS":["яну","фев","март","апр","май","юни","юли","авг","сеп","окт","ное","дек"],"STANDALONESHORTMONTHS":["яну","фев","март","апр","май","юни","юли","авг","сеп","окт","ное","дек"],"WEEKDAYS":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"STANDALONEWEEKDAYS":["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],"SHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"STANDALONESHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"NARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"SHORTQUARTERS":["1. трим.","2. трим.","3. трим.","4. трим."],"QUARTERS":["1. тримесечие","2. тримесечие","3. тримесечие","4. тримесечие"],"AMPMS":["пр.об.","сл.об."],"DATEFORMATS":["EEEE, d MMMM y 'г'.","d MMMM y 'г'.","d.MM.y 'г'.","d.MM.yy 'г'."],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/bn.json b/packages/intl/lib/src/data/dates/symbols/bn.json
index 97ac316..23beb4d 100644
--- a/packages/intl/lib/src/data/dates/symbols/bn.json
+++ b/packages/intl/lib/src/data/dates/symbols/bn.json
@@ -1 +1 @@
-{"NAME":"bn","ERAS":["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],"ERANAMES":["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],"NARROWMONTHS":["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],"STANDALONENARROWMONTHS":["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],"MONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"STANDALONEMONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"SHORTMONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"STANDALONESHORTMONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"WEEKDAYS":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহষ্পতিবার","শুক্রবার","শনিবার"],"STANDALONEWEEKDAYS":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহষ্পতিবার","শুক্রবার","শনিবার"],"SHORTWEEKDAYS":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"STANDALONESHORTWEEKDAYS":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"NARROWWEEKDAYS":["র","সো","ম","বু","বৃ","শু","শ"],"STANDALONENARROWWEEKDAYS":["র","সো","ম","বু","বৃ","শু","শ"],"SHORTQUARTERS":["চতুর্থাংশ ১","চতুর্থাংশ ২","চতুর্থাংশ ৩","চতুর্থাংশ ৪"],"QUARTERS":["প্রথম চতুর্থাংশ","দ্বিতীয় চতুর্থাংশ","তৃতীয় চতুর্থাংশ","চতুর্থ চতুর্থাংশ"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":4,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"bn","ERAS":["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],"ERANAMES":["খ্রিস্টপূর্ব","খৃষ্টাব্দ"],"NARROWMONTHS":["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],"STANDALONENARROWMONTHS":["জা","ফে","মা","এ","মে","জুন","জু","আ","সে","অ","ন","ডি"],"MONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"STANDALONEMONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"SHORTMONTHS":["জানু","ফেব","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"STANDALONESHORTMONTHS":["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],"WEEKDAYS":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],"STANDALONEWEEKDAYS":["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহষ্পতিবার","শুক্রবার","শনিবার"],"SHORTWEEKDAYS":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"STANDALONESHORTWEEKDAYS":["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],"NARROWWEEKDAYS":["র","সো","ম","বু","বৃ","শু","শ"],"STANDALONENARROWWEEKDAYS":["র","সো","ম","বু","বৃ","শু","শ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ত্রৈমাসিক","দ্বিতীয় ত্রৈমাসিক","তৃতীয় ত্রৈমাসিক","চতুর্থ ত্রৈমাসিক"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":4,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/br.json b/packages/intl/lib/src/data/dates/symbols/br.json
index ff3bd11..6a0e9f5 100644
--- a/packages/intl/lib/src/data/dates/symbols/br.json
+++ b/packages/intl/lib/src/data/dates/symbols/br.json
@@ -1 +1 @@
-{"NAME":"br","ERAS":["BCE","CE"],"ERANAMES":["BCE","CE"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"STANDALONEMONTHS":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"SHORTMONTHS":["Gen","Cʼhwe","Meur","Ebr","Mae","Mezh","Goue","Eost","Gwen","Here","Du","Ker"],"STANDALONESHORTMONTHS":["Gen","Cʼhwe","Meur","Ebr","Mae","Mezh","Goue","Eost","Gwen","Here","Du","Ker"],"WEEKDAYS":["Sul","Lun","Meurzh","Mercʼher","Yaou","Gwener","Sadorn"],"STANDALONEWEEKDAYS":["Sul","Lun","Meurzh","Mercʼher","Yaou","Gwener","Sadorn"],"SHORTWEEKDAYS":["sul","lun","meu.","mer.","yaou","gwe.","sad."],"STANDALONESHORTWEEKDAYS":["sul","lun","meu.","mer.","yaou","gwe.","sad."],"NARROWWEEKDAYS":["su","lu","mz","mc","ya","gw","sa"],"STANDALONENARROWWEEKDAYS":["su","lu","mz","mc","ya","gw","sa"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Q1","Q2","Q3","Q4"],"AMPMS":["AM","PM"],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"br","ERAS":["a-raok J.K.","goude J.K."],"ERANAMES":["a-raok Jezuz-Krist","goude Jezuz-Krist"],"NARROWMONTHS":["01","02","03","04","05","06","07","08","09","10","11","12"],"STANDALONENARROWMONTHS":["01","02","03","04","05","06","07","08","09","10","11","12"],"MONTHS":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"STANDALONEMONTHS":["Genver","Cʼhwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu"],"SHORTMONTHS":["Gen.","Cʼhwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu."],"STANDALONESHORTMONTHS":["Gen.","Cʼhwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Ker."],"WEEKDAYS":["Sul","Lun","Meurzh","Mercʼher","Yaou","Gwener","Sadorn"],"STANDALONEWEEKDAYS":["Sul","Lun","Meurzh","Mercʼher","Yaou","Gwener","Sadorn"],"SHORTWEEKDAYS":["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],"STANDALONESHORTWEEKDAYS":["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],"NARROWWEEKDAYS":["Su","L","Mz","Mc","Y","G","Sa"],"STANDALONENARROWWEEKDAYS":["Su","L","Mz","Mc","Y","G","Sa"],"SHORTQUARTERS":["1añ trim.","2l trim.","3e trim.","4e trim."],"QUARTERS":["1añ trimiziad","2l trimiziad","3e trimiziad","4e trimiziad"],"AMPMS":["A.M.","G.M."],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'da' {0}","{1} 'da' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/bs.json b/packages/intl/lib/src/data/dates/symbols/bs.json
new file mode 100644
index 0000000..273be61
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/bs.json
@@ -0,0 +1 @@
+{"NAME":"bs","ERAS":["p. n. e.","n. e."],"ERANAMES":["prije nove ere","nove ere"],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar"],"STANDALONEMONTHS":["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar"],"SHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"WEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"STANDALONEWEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"SHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"STANDALONESHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"NARROWWEEKDAYS":["N","P","U","S","Č","P","S"],"STANDALONENARROWWEEKDAYS":["n","p","u","s","č","p","s"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["Prvi kvartal","Drugi kvartal","Treći kvartal","Četvrti kvartal"],"AMPMS":["prijepodne","popodne"],"DATEFORMATS":["EEEE, d. MMMM y.","d. MMMM y.","d. MMM. y.","d.M.yy."],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'u' {0}","{1} 'u' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ca.json b/packages/intl/lib/src/data/dates/symbols/ca.json
index 245c8c3..d7cf5ec 100644
--- a/packages/intl/lib/src/data/dates/symbols/ca.json
+++ b/packages/intl/lib/src/data/dates/symbols/ca.json
@@ -1 +1 @@
-{"NAME":"ca","ERAS":["aC","dC"],"ERANAMES":["abans de Crist","després de Crist"],"NARROWMONTHS":["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],"STANDALONENARROWMONTHS":["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],"MONTHS":["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],"STANDALONEMONTHS":["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],"SHORTMONTHS":["gen.","feb.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],"STANDALONESHORTMONTHS":["gen.","feb.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],"WEEKDAYS":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"STANDALONEWEEKDAYS":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"SHORTWEEKDAYS":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"STANDALONESHORTWEEKDAYS":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"NARROWWEEKDAYS":["dg","dl","dt","dc","dj","dv","ds"],"STANDALONENARROWWEEKDAYS":["dg","dl","dt","dc","dj","dv","ds"],"SHORTQUARTERS":["1T","2T","3T","4T"],"QUARTERS":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d MMMM 'de' y","d MMMM 'de' y","dd/MM/y","d/M/yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ca","ERAS":["aC","dC"],"ERANAMES":["abans de Crist","després de Crist"],"NARROWMONTHS":["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],"STANDALONENARROWMONTHS":["GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS"],"MONTHS":["de gener","de febrer","de març","d’abril","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre"],"STANDALONEMONTHS":["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],"SHORTMONTHS":["de gen.","de febr.","de març","d’abr.","de maig","de juny","de jul.","d’ag.","de set.","d’oct.","de nov.","de des."],"STANDALONESHORTMONTHS":["gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des."],"WEEKDAYS":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"STANDALONEWEEKDAYS":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"SHORTWEEKDAYS":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"STANDALONESHORTWEEKDAYS":["dg.","dl.","dt.","dc.","dj.","dv.","ds."],"NARROWWEEKDAYS":["dg","dl","dt","dc","dj","dv","ds"],"STANDALONENARROWWEEKDAYS":["dg","dl","dt","dc","dj","dv","ds"],"SHORTQUARTERS":["1T","2T","3T","4T"],"QUARTERS":["1r trimestre","2n trimestre","3r trimestre","4t trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d MMMM 'de' y","d MMMM 'de' y","d MMM y","d/M/yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'a' 'les' {0}","{1} 'a' 'les' {0}","{1}, {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/chr.json b/packages/intl/lib/src/data/dates/symbols/chr.json
index 2bd27ac..1286899 100644
--- a/packages/intl/lib/src/data/dates/symbols/chr.json
+++ b/packages/intl/lib/src/data/dates/symbols/chr.json
@@ -1 +1 @@
-{"NAME":"chr","ERAS":["ᎤᏓᎷᎸ","ᎤᎶᏐᏅ"],"ERANAMES":["Ꮟ ᏥᏌ ᎾᏕᎲᏍᎬᎾ","ᎠᎩᏃᎮᎵᏓᏍᏗᏱ ᎠᏕᏘᏱᏍᎬ ᏱᎰᏩ ᏧᏓᏂᎸᎢᏍᏗ"],"NARROWMONTHS":["Ꭴ","Ꭷ","Ꭰ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮪ","Ꮕ","Ꭵ"],"STANDALONENARROWMONTHS":["Ꭴ","Ꭷ","Ꭰ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮪ","Ꮕ","Ꭵ"],"MONTHS":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"STANDALONEMONTHS":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"SHORTMONTHS":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"],"STANDALONESHORTMONTHS":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"],"WEEKDAYS":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"STANDALONEWEEKDAYS":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"SHORTWEEKDAYS":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"STANDALONESHORTWEEKDAYS":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"NARROWWEEKDAYS":["Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮕ","Ꮷ","Ꭴ"],"STANDALONENARROWWEEKDAYS":["Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮕ","Ꮷ","Ꭴ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Q1","Q2","Q3","Q4"],"AMPMS":["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"chr","ERAS":["BC","AD"],"ERANAMES":["ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ","ᎠᏃ ᏙᎻᏂ"],"NARROWMONTHS":["Ꭴ","Ꭷ","Ꭰ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮪ","Ꮕ","Ꭵ"],"STANDALONENARROWMONTHS":["Ꭴ","Ꭷ","Ꭰ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮪ","Ꮕ","Ꭵ"],"MONTHS":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"STANDALONEMONTHS":["ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ"],"SHORTMONTHS":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"],"STANDALONESHORTMONTHS":["ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ"],"WEEKDAYS":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"STANDALONEWEEKDAYS":["ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ"],"SHORTWEEKDAYS":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"STANDALONESHORTWEEKDAYS":["ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ"],"NARROWWEEKDAYS":["Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮕ","Ꮷ","Ꭴ"],"STANDALONENARROWWEEKDAYS":["Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮕ","Ꮷ","Ꭴ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st ᎩᏄᏙᏗ","2nd ᎩᏄᏙᏗ","3rd ᎩᏄᏙᏗ","4th ᎩᏄᏙᏗ"],"AMPMS":["ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} ᎤᎾᎢ {0}","{1} ᎤᎾᎢ {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/cs.json b/packages/intl/lib/src/data/dates/symbols/cs.json
index ce7279d..73befe0 100644
--- a/packages/intl/lib/src/data/dates/symbols/cs.json
+++ b/packages/intl/lib/src/data/dates/symbols/cs.json
@@ -1 +1 @@
-{"NAME":"cs","ERAS":["př. n. l.","n. l."],"ERANAMES":["př. n. l.","n. l."],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"MONTHS":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"STANDALONEMONTHS":["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],"SHORTMONTHS":["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],"STANDALONESHORTMONTHS":["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],"WEEKDAYS":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"STANDALONEWEEKDAYS":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"SHORTWEEKDAYS":["ne","po","út","st","čt","pá","so"],"STANDALONESHORTWEEKDAYS":["ne","po","út","st","čt","pá","so"],"NARROWWEEKDAYS":["N","P","Ú","S","Č","P","S"],"STANDALONENARROWWEEKDAYS":["N","P","Ú","S","Č","P","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. M. y","dd.MM.yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"cs","ERAS":["př. n. l.","n. l."],"ERANAMES":["př. n. l.","n. l."],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],"STANDALONEMONTHS":["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],"SHORTMONTHS":["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],"STANDALONESHORTMONTHS":["led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro"],"WEEKDAYS":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"STANDALONEWEEKDAYS":["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],"SHORTWEEKDAYS":["ne","po","út","st","čt","pá","so"],"STANDALONESHORTWEEKDAYS":["ne","po","út","st","čt","pá","so"],"NARROWWEEKDAYS":["N","P","Ú","S","Č","P","S"],"STANDALONENARROWWEEKDAYS":["N","P","Ú","S","Č","P","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"AMPMS":["dop.","odp."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. M. y","dd.MM.yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/cy.json b/packages/intl/lib/src/data/dates/symbols/cy.json
index c7e25f9..826798c 100644
--- a/packages/intl/lib/src/data/dates/symbols/cy.json
+++ b/packages/intl/lib/src/data/dates/symbols/cy.json
@@ -1 +1 @@
-{"NAME":"cy","ERAS":["CC","OC"],"ERANAMES":["Cyn Crist","Oed Crist"],"NARROWMONTHS":["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],"STANDALONENARROWMONTHS":["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],"MONTHS":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"STANDALONEMONTHS":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"SHORTMONTHS":["Ion","Chwef","Mawrth","Ebrill","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag"],"STANDALONESHORTMONTHS":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Awst","Medi","Hyd","Tach","Rhag"],"WEEKDAYS":["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],"STANDALONEWEEKDAYS":["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],"SHORTWEEKDAYS":["Sul","Llun","Maw","Mer","Iau","Gwen","Sad"],"STANDALONESHORTWEEKDAYS":["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],"NARROWWEEKDAYS":["S","Ll","M","M","I","G","S"],"STANDALONENARROWWEEKDAYS":["S","Ll","M","M","I","G","S"],"SHORTQUARTERS":["Ch1","Ch2","Ch3","Ch4"],"QUARTERS":["Chwarter 1af","2il chwarter","3ydd chwarter","4ydd chwarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'am' {0}","{1} 'am' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"cy","ERAS":["CC","OC"],"ERANAMES":["Cyn Crist","Oed Crist"],"NARROWMONTHS":["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],"STANDALONENARROWMONTHS":["I","Ch","M","E","M","M","G","A","M","H","T","Rh"],"MONTHS":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"STANDALONEMONTHS":["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],"SHORTMONTHS":["Ion","Chwef","Maw","Ebrill","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag"],"STANDALONESHORTMONTHS":["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Awst","Medi","Hyd","Tach","Rhag"],"WEEKDAYS":["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],"STANDALONEWEEKDAYS":["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],"SHORTWEEKDAYS":["Sul","Llun","Maw","Mer","Iau","Gwen","Sad"],"STANDALONESHORTWEEKDAYS":["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],"NARROWWEEKDAYS":["S","Ll","M","M","I","G","S"],"STANDALONENARROWWEEKDAYS":["S","Ll","M","M","I","G","S"],"SHORTQUARTERS":["Ch1","Ch2","Ch3","Ch4"],"QUARTERS":["chwarter 1af","2il chwarter","3ydd chwarter","4ydd chwarter"],"AMPMS":["yb","yh"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'am' {0}","{1} 'am' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/da.json b/packages/intl/lib/src/data/dates/symbols/da.json
index 80111c3..4db1154 100644
--- a/packages/intl/lib/src/data/dates/symbols/da.json
+++ b/packages/intl/lib/src/data/dates/symbols/da.json
@@ -1 +1 @@
-{"NAME":"da","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["f.Kr.","e.Kr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"STANDALONEMONTHS":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["søn","man","tir","ons","tor","fre","lør"],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE 'den' d. MMMM y","d. MMM y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'kl.' {0}","{1} 'kl.' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"da","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["f.Kr.","e.Kr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"STANDALONEMONTHS":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["søn","man","tir","ons","tor","fre","lør"],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["1. kvt.","2. kvt.","3. kvt.","4. kvt."],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE 'den' d. MMMM y","d. MMMM y","d. MMM y","dd/MM/y"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'kl'. {0}","{1} 'kl'. {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/de.json b/packages/intl/lib/src/data/dates/symbols/de.json
index e1f8c13..73d7e55 100644
--- a/packages/intl/lib/src/data/dates/symbols/de.json
+++ b/packages/intl/lib/src/data/dates/symbols/de.json
@@ -1 +1 @@
-{"NAME":"de","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"de","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'um' {0}","{1} 'um' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/de_AT.json b/packages/intl/lib/src/data/dates/symbols/de_AT.json
index c4bdd25..abb8fa5 100644
--- a/packages/intl/lib/src/data/dates/symbols/de_AT.json
+++ b/packages/intl/lib/src/data/dates/symbols/de_AT.json
@@ -1 +1 @@
-{"NAME":"de_AT","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jän.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, dd. MMMM y","dd. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"de_AT","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jän.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'um' {0}","{1} 'um' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/de_CH.json b/packages/intl/lib/src/data/dates/symbols/de_CH.json
index ed58d46..a51fe12 100644
--- a/packages/intl/lib/src/data/dates/symbols/de_CH.json
+++ b/packages/intl/lib/src/data/dates/symbols/de_CH.json
@@ -1 +1 @@
-{"NAME":"de_CH","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"de_CH","ERAS":["v. Chr.","n. Chr."],"ERANAMES":["v. Chr.","n. Chr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"STANDALONEMONTHS":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"SHORTMONTHS":["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],"STANDALONESHORTMONTHS":["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"WEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"STANDALONEWEEKDAYS":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"SHORTWEEKDAYS":["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],"STANDALONESHORTWEEKDAYS":["So","Mo","Di","Mi","Do","Fr","Sa"],"NARROWWEEKDAYS":["S","M","D","M","D","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","D","M","D","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"AMPMS":["vorm.","nachm."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'um' {0}","{1} 'um' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/el.json b/packages/intl/lib/src/data/dates/symbols/el.json
index cf8c73e..a1527e7 100644
--- a/packages/intl/lib/src/data/dates/symbols/el.json
+++ b/packages/intl/lib/src/data/dates/symbols/el.json
@@ -1 +1 @@
-{"NAME":"el","ERAS":["π.Χ.","μ.Χ."],"ERANAMES":["π.Χ.","μ.Χ."],"NARROWMONTHS":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"STANDALONENARROWMONTHS":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"MONTHS":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"STANDALONEMONTHS":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"SHORTMONTHS":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"STANDALONESHORTMONTHS":["Ιαν","Φεβ","Μάρ","Απρ","Μάι","Ιούν","Ιούλ","Αύγ","Σεπ","Οκτ","Νοέ","Δεκ"],"WEEKDAYS":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"STANDALONEWEEKDAYS":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"SHORTWEEKDAYS":["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],"STANDALONESHORTWEEKDAYS":["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],"NARROWWEEKDAYS":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"STANDALONENARROWWEEKDAYS":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"SHORTQUARTERS":["Τ1","Τ2","Τ3","Τ4"],"QUARTERS":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"AMPMS":["π.μ.","μ.μ."],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} - {0}","{1} - {0}","{1} - {0}","{1} - {0}"]}
\ No newline at end of file
+{"NAME":"el","ERAS":["π.Χ.","μ.Χ."],"ERANAMES":["προ Χριστού","μετά Χριστόν"],"NARROWMONTHS":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"STANDALONENARROWMONTHS":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"MONTHS":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου"],"STANDALONEMONTHS":["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],"SHORTMONTHS":["Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],"STANDALONESHORTMONTHS":["Ιαν","Φεβ","Μάρ","Απρ","Μάι","Ιούν","Ιούλ","Αύγ","Σεπ","Οκτ","Νοέ","Δεκ"],"WEEKDAYS":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"STANDALONEWEEKDAYS":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"SHORTWEEKDAYS":["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],"STANDALONESHORTWEEKDAYS":["Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ"],"NARROWWEEKDAYS":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"STANDALONENARROWWEEKDAYS":["Κ","Δ","Τ","Τ","Π","Π","Σ"],"SHORTQUARTERS":["Τ1","Τ2","Τ3","Τ4"],"QUARTERS":["1ο τρίμηνο","2ο τρίμηνο","3ο τρίμηνο","4ο τρίμηνο"],"AMPMS":["π.μ.","μ.μ."],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} - {0}","{1} - {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_AU.json b/packages/intl/lib/src/data/dates/symbols/en_AU.json
index 027594a..fdf3407 100644
--- a/packages/intl/lib/src/data/dates/symbols/en_AU.json
+++ b/packages/intl/lib/src/data/dates/symbols/en_AU.json
@@ -1 +1 @@
-{"NAME":"en_AU","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/MM/y"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"en_AU","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan.","Feb.","Mar.","Apr.","May","Jun.","Jul.","Aug.","Sep.","Oct.","Nov.","Dec."],"STANDALONESHORTMONTHS":["Jan.","Feb.","Mar.","Apr.","May","Jun.","Jul.","Aug.","Sep.","Oct.","Nov.","Dec."],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun.","Mon.","Tue.","Wed.","Thu.","Fri.","Sat."],"STANDALONESHORTWEEKDAYS":["Sun.","Mon.","Tue.","Wed.","Thu.","Fri.","Sat."],"NARROWWEEKDAYS":["Su.","M.","Tu.","W.","Th.","F.","Sa."],"STANDALONENARROWWEEKDAYS":["Su.","M.","Tu.","W.","Th.","F.","Sa."],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_CA.json b/packages/intl/lib/src/data/dates/symbols/en_CA.json
new file mode 100644
index 0000000..23ed292
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/en_CA.json
@@ -0,0 +1 @@
+{"NAME":"en_CA","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","y-MM-dd"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_GB.json b/packages/intl/lib/src/data/dates/symbols/en_GB.json
index df07512..4b13587 100644
--- a/packages/intl/lib/src/data/dates/symbols/en_GB.json
+++ b/packages/intl/lib/src/data/dates/symbols/en_GB.json
@@ -1 +1 @@
-{"NAME":"en_GB","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"en_GB","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_IE.json b/packages/intl/lib/src/data/dates/symbols/en_IE.json
index 12bf798..89f6890 100644
--- a/packages/intl/lib/src/data/dates/symbols/en_IE.json
+++ b/packages/intl/lib/src/data/dates/symbols/en_IE.json
@@ -1 +1 @@
-{"NAME":"en_IE","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d MMMM y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":2,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"en_IE","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":2,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_ISO.json b/packages/intl/lib/src/data/dates/symbols/en_ISO.json
index cbfb6d8..e0cb542 100644
--- a/packages/intl/lib/src/data/dates/symbols/en_ISO.json
+++ b/packages/intl/lib/src/data/dates/symbols/en_ISO.json
@@ -1 +1 @@
-{"NAME":"en_ISO","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, y MMMM dd","y MMMM d","y MMM d","yyyy-MM-dd"],"TIMEFORMATS":["HH:mm:ss v","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":{"Md":"M/d","MMMMd":"MMMM d","MMMd":"MMM d"},"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"en_ISO","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, y MMMM dd","y MMMM d","y MMM d","yyyy-MM-dd"],"TIMEFORMATS":["HH:mm:ss v","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/en_ZA.json b/packages/intl/lib/src/data/dates/symbols/en_ZA.json
index e0f9627..5b365ea 100644
--- a/packages/intl/lib/src/data/dates/symbols/en_ZA.json
+++ b/packages/intl/lib/src/data/dates/symbols/en_ZA.json
@@ -1 +1 @@
-{"NAME":"en_ZA","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE dd MMMM y","dd MMMM y","dd MMM y","y/MM/dd"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"en_ZA","ERAS":["BC","AD"],"ERANAMES":["Before Christ","Anno Domini"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"STANDALONEMONTHS":["January","February","March","April","May","June","July","August","September","October","November","December"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"WEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"STANDALONEWEEKDAYS":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"SHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"STANDALONESHORTWEEKDAYS":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM y","dd MMMM y","dd MMM y","y/MM/dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'at' {0}","{1} 'at' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/es.json b/packages/intl/lib/src/data/dates/symbols/es.json
index 094a145..2bb08ed 100644
--- a/packages/intl/lib/src/data/dates/symbols/es.json
+++ b/packages/intl/lib/src/data/dates/symbols/es.json
@@ -1 +1 @@
-{"NAME":"es","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","anno Dómini"],"NARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["Ene.","Feb.","Mar.","Abr.","May.","Jun.","Jul.","Ago.","Sept.","Oct.","Nov.","Dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["Dom.","Lun.","Mar.","Mié.","Jue.","Vie.","Sáb."],"NARROWWEEKDAYS":["D","L","M","X","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","X","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d/M/y","d/M/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"es","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","después de Cristo"],"NARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"NARROWWEEKDAYS":["D","L","M","X","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","X","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d MMM y","d/M/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/es_419.json b/packages/intl/lib/src/data/dates/symbols/es_419.json
index ffa62d0..9170608 100644
--- a/packages/intl/lib/src/data/dates/symbols/es_419.json
+++ b/packages/intl/lib/src/data/dates/symbols/es_419.json
@@ -1 +1 @@
-{"NAME":"es_419","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","anno Dómini"],"NARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["Ene.","Feb.","Mar.","Abr.","May.","Jun.","Jul.","Ago.","Sept.","Oct.","Nov.","Dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["Dom.","Lun.","Mar.","Mié.","Jue.","Vie.","Sáb."],"NARROWWEEKDAYS":["D","L","M","X","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","X","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d/M/y","d/M/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"es_419","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","después de Cristo"],"NARROWMONTHS":["e","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sep.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sep.","oct.","nov.","dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"NARROWWEEKDAYS":["d","l","m","m","j","v","s"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d MMM y","d/M/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/es_ES.json b/packages/intl/lib/src/data/dates/symbols/es_ES.json
index 12a5bd1..2da6f84 100644
--- a/packages/intl/lib/src/data/dates/symbols/es_ES.json
+++ b/packages/intl/lib/src/data/dates/symbols/es_ES.json
@@ -1 +1 @@
-{"NAME":"es_ES","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","anno Dómini"],"NARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["Ene.","Feb.","Mar.","Abr.","May.","Jun.","Jul.","Ago.","Sept.","Oct.","Nov.","Dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["Dom.","Lun.","Mar.","Mié.","Jue.","Vie.","Sáb."],"NARROWWEEKDAYS":["D","L","M","X","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","X","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d/M/y","d/M/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"es_ES","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","después de Cristo"],"NARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sept.","oct.","nov.","dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"NARROWWEEKDAYS":["D","L","M","X","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","X","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d MMM y","d/M/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/es_MX.json b/packages/intl/lib/src/data/dates/symbols/es_MX.json
new file mode 100644
index 0000000..8c23007
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/es_MX.json
@@ -0,0 +1 @@
+{"NAME":"es_MX","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","después de Cristo"],"NARROWMONTHS":["e","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTHS":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"STANDALONESHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sep.","oct.","nov.","dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["1er. trim.","2º. trim.","3er. trim.","4º trim."],"QUARTERS":["1er. trimestre","2º. trimestre","3er. trimestre","4o. trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/es_US.json b/packages/intl/lib/src/data/dates/symbols/es_US.json
new file mode 100644
index 0000000..c9329b0
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/es_US.json
@@ -0,0 +1 @@
+{"NAME":"es_US","ERAS":["a. C.","d. C."],"ERANAMES":["antes de Cristo","después de Cristo"],"NARROWMONTHS":["e","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["E","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"STANDALONEMONTHS":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sep.","oct.","nov.","dic."],"STANDALONESHORTMONTHS":["ene.","feb.","mar.","abr.","may.","jun.","jul.","ago.","sep.","oct.","nov.","dic."],"WEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"STANDALONEWEEKDAYS":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"STANDALONESHORTWEEKDAYS":["dom.","lun.","mar.","mié.","jue.","vie.","sáb."],"NARROWWEEKDAYS":["d","l","m","m","j","v","s"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.er trimestre","2.º trimestre","3.er trimestre","4.º trimestre"],"AMPMS":["a. m.","p. m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/et.json b/packages/intl/lib/src/data/dates/symbols/et.json
index fa848ae..e93fc59 100644
--- a/packages/intl/lib/src/data/dates/symbols/et.json
+++ b/packages/intl/lib/src/data/dates/symbols/et.json
@@ -1 +1 @@
-{"NAME":"et","ERAS":["e.m.a.","m.a.j."],"ERANAMES":["enne meie aega","meie aja järgi"],"NARROWMONTHS":["J","V","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","V","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"STANDALONEMONTHS":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"SHORTMONTHS":["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],"STANDALONESHORTMONTHS":["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],"WEEKDAYS":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"STANDALONEWEEKDAYS":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"SHORTWEEKDAYS":["P","E","T","K","N","R","L"],"STANDALONESHORTWEEKDAYS":["P","E","T","K","N","R","L"],"NARROWWEEKDAYS":["P","E","T","K","N","R","L"],"STANDALONENARROWWEEKDAYS":["P","E","T","K","N","R","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["H:mm.ss zzzz","H:mm.ss z","H:mm.ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"et","ERAS":["eKr","pKr"],"ERANAMES":["enne Kristust","pärast Kristust"],"NARROWMONTHS":["J","V","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","V","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"STANDALONEMONTHS":["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],"SHORTMONTHS":["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],"STANDALONESHORTMONTHS":["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],"WEEKDAYS":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"STANDALONEWEEKDAYS":["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],"SHORTWEEKDAYS":["P","E","T","K","N","R","L"],"STANDALONESHORTWEEKDAYS":["P","E","T","K","N","R","L"],"NARROWWEEKDAYS":["P","E","T","K","N","R","L"],"STANDALONENARROWWEEKDAYS":["P","E","T","K","N","R","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","d. MMM y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/eu.json b/packages/intl/lib/src/data/dates/symbols/eu.json
index 6713e77..339d1d3 100644
--- a/packages/intl/lib/src/data/dates/symbols/eu.json
+++ b/packages/intl/lib/src/data/dates/symbols/eu.json
@@ -1 +1 @@
-{"NAME":"eu","ERAS":["K.a.","K.o."],"ERANAMES":["K.a.","K.o."],"NARROWMONTHS":["U","O","M","A","M","E","U","A","I","U","A","A"],"STANDALONENARROWMONTHS":["U","O","M","A","M","E","U","A","I","U","A","A"],"MONTHS":["urtarrilak","otsailak","martxoak","apirilak","maiatzak","ekainak","uztailak","abuztuak","irailak","urriak","azaroak","abenduak"],"STANDALONEMONTHS":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"SHORTMONTHS":["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],"STANDALONESHORTMONTHS":["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],"WEEKDAYS":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"STANDALONEWEEKDAYS":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"SHORTWEEKDAYS":["ig.","al.","ar.","az.","og.","or.","lr."],"STANDALONESHORTWEEKDAYS":["ig.","al.","ar.","az.","og.","or.","lr."],"NARROWWEEKDAYS":["I","A","A","A","O","O","L"],"STANDALONENARROWWEEKDAYS":["I","A","A","A","O","O","L"],"SHORTQUARTERS":["1Hh","2Hh","3Hh","4Hh"],"QUARTERS":["1. hiruhilekoa","2. hiruhilekoa","3. hiruhilekoa","4. hiruhilekoa"],"AMPMS":["AM","PM"],"DATEFORMATS":["y('e')'ko' MMMM d, EEEE","y('e')'ko' MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"eu","ERAS":["K.a.","K.o."],"ERANAMES":["K.a.","Kristo ondoren"],"NARROWMONTHS":["U","O","M","A","M","E","U","A","I","U","A","A"],"STANDALONENARROWMONTHS":["U","O","M","A","M","E","U","A","I","U","A","A"],"MONTHS":["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],"STANDALONEMONTHS":["urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],"SHORTMONTHS":["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],"STANDALONESHORTMONTHS":["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],"WEEKDAYS":["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],"STANDALONEWEEKDAYS":["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"],"SHORTWEEKDAYS":["ig.","al.","ar.","az.","og.","or.","lr."],"STANDALONESHORTWEEKDAYS":["ig.","al.","ar.","az.","og.","or.","lr."],"NARROWWEEKDAYS":["I","A","A","A","O","O","L"],"STANDALONENARROWWEEKDAYS":["I","A","A","A","O","O","L"],"SHORTQUARTERS":["1Hh","2Hh","3Hh","4Hh"],"QUARTERS":["1. hiruhilekoa","2. hiruhilekoa","3. hiruhilekoa","4. hiruhilekoa"],"AMPMS":["AM","PM"],"DATEFORMATS":["y('e')'ko' MMMM d, EEEE","y('e')'ko' MMMM d","y MMM d","yy/M/d"],"TIMEFORMATS":["HH:mm:ss (zzzz)","HH:mm:ss (z)","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/fa.json b/packages/intl/lib/src/data/dates/symbols/fa.json
index 963f68b..fbf3b0e 100644
--- a/packages/intl/lib/src/data/dates/symbols/fa.json
+++ b/packages/intl/lib/src/data/dates/symbols/fa.json
@@ -1 +1 @@
-{"NAME":"fa","ERAS":["ق.م.","م."],"ERANAMES":["قبل از میلاد","میلادی"],"NARROWMONTHS":["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],"STANDALONENARROWMONTHS":["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],"MONTHS":["ژانویهٔ","فوریهٔ","مارس","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"STANDALONEMONTHS":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"SHORTMONTHS":["ژانویهٔ","فوریهٔ","مارس","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"STANDALONESHORTMONTHS":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"WEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"STANDALONEWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"SHORTWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"STANDALONESHORTWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"NARROWWEEKDAYS":["ی","د","س","چ","پ","ج","ش"],"STANDALONENARROWWEEKDAYS":["ی","د","س","چ","پ","ج","ش"],"SHORTQUARTERS":["س‌م۱","س‌م۲","س‌م۳","س‌م۴"],"QUARTERS":["سه‌ماههٔ اول","سه‌ماههٔ دوم","سه‌ماههٔ سوم","سه‌ماههٔ چهارم"],"AMPMS":["قبل‌ازظهر","بعدازظهر"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","y/M/d"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss (z)","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":5,"WEEKENDRANGE":[3,4],"FIRSTWEEKCUTOFFDAY":4,"DATETIMEFORMATS":["{1}، ساعت {0}","{1}، ساعت {0}","{1}،‏ {0}","{1}،‏ {0}"]}
\ No newline at end of file
+{"NAME":"fa","ERAS":["ق.م.","م."],"ERANAMES":["قبل از میلاد","میلادی"],"NARROWMONTHS":["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],"STANDALONENARROWMONTHS":["ژ","ف","م","آ","م","ژ","ژ","ا","س","ا","ن","د"],"MONTHS":["ژانویهٔ","فوریهٔ","مارس","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"STANDALONEMONTHS":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"SHORTMONTHS":["ژانویهٔ","فوریهٔ","مارس","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"STANDALONESHORTMONTHS":["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],"WEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"STANDALONEWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"SHORTWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"STANDALONESHORTWEEKDAYS":["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],"NARROWWEEKDAYS":["ی","د","س","چ","پ","ج","ش"],"STANDALONENARROWWEEKDAYS":["ی","د","س","چ","پ","ج","ش"],"SHORTQUARTERS":["س‌م۱","س‌م۲","س‌م۳","س‌م۴"],"QUARTERS":["سه‌ماههٔ اول","سه‌ماههٔ دوم","سه‌ماههٔ سوم","سه‌ماههٔ چهارم"],"AMPMS":["قبل‌ازظهر","بعدازظهر"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","y/M/d"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss (z)","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":5,"WEEKENDRANGE":[4,4],"FIRSTWEEKCUTOFFDAY":4,"DATETIMEFORMATS":["{1}، ساعت {0}","{1}، ساعت {0}","{1}،‏ {0}","{1}،‏ {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/fi.json b/packages/intl/lib/src/data/dates/symbols/fi.json
index 610dfa5..3b011bb 100644
--- a/packages/intl/lib/src/data/dates/symbols/fi.json
+++ b/packages/intl/lib/src/data/dates/symbols/fi.json
@@ -1 +1 @@
-{"NAME":"fi","ERAS":["eKr.","jKr."],"ERANAMES":["ennen Kristuksen syntymää","jälkeen Kristuksen syntymän"],"NARROWMONTHS":["T","H","M","H","T","K","H","E","S","L","M","J"],"STANDALONENARROWMONTHS":["T","H","M","H","T","K","H","E","S","L","M","J"],"MONTHS":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"STANDALONEMONTHS":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"SHORTMONTHS":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"STANDALONESHORTMONTHS":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"WEEKDAYS":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"STANDALONEWEEKDAYS":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"SHORTWEEKDAYS":["su","ma","ti","ke","to","pe","la"],"STANDALONESHORTWEEKDAYS":["su","ma","ti","ke","to","pe","la"],"NARROWWEEKDAYS":["S","M","T","K","T","P","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","K","T","P","L"],"SHORTQUARTERS":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"QUARTERS":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"AMPMS":["ap.","ip."],"DATEFORMATS":["cccc d. MMMM y","d. MMMM y","d.M.y","d.M.y"],"TIMEFORMATS":["H.mm.ss zzzz","H.mm.ss z","H.mm.ss","H.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"fi","ERAS":["eKr.","jKr."],"ERANAMES":["ennen Kristuksen syntymää","jälkeen Kristuksen syntymän"],"NARROWMONTHS":["T","H","M","H","T","K","H","E","S","L","M","J"],"STANDALONENARROWMONTHS":["T","H","M","H","T","K","H","E","S","L","M","J"],"MONTHS":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"STANDALONEMONTHS":["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],"SHORTMONTHS":["tammik.","helmik.","maalisk.","huhtik.","toukok.","kesäk.","heinäk.","elok.","syysk.","lokak.","marrask.","jouluk."],"STANDALONESHORTMONTHS":["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],"WEEKDAYS":["sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina"],"STANDALONEWEEKDAYS":["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],"SHORTWEEKDAYS":["su","ma","ti","ke","to","pe","la"],"STANDALONESHORTWEEKDAYS":["su","ma","ti","ke","to","pe","la"],"NARROWWEEKDAYS":["S","M","T","K","T","P","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","K","T","P","L"],"SHORTQUARTERS":["1. nelj.","2. nelj.","3. nelj.","4. nelj."],"QUARTERS":["1. neljännes","2. neljännes","3. neljännes","4. neljännes"],"AMPMS":["ap.","ip."],"DATEFORMATS":["cccc d. MMMM y","d. MMMM y","d.M.y","d.M.y"],"TIMEFORMATS":["H.mm.ss zzzz","H.mm.ss z","H.mm.ss","H.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'klo' {0}","{1} 'klo' {0}","{1} 'klo' {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/fil.json b/packages/intl/lib/src/data/dates/symbols/fil.json
index 255f632..6e19b6b 100644
--- a/packages/intl/lib/src/data/dates/symbols/fil.json
+++ b/packages/intl/lib/src/data/dates/symbols/fil.json
@@ -1 +1 @@
-{"NAME":"fil","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["E","P","M","A","M","H","H","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","P","M","A","M","H","H","A","S","O","N","D"],"MONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"STANDALONEMONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"SHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONESHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"WEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"STANDALONEWEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"SHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONESHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"NARROWWEEKDAYS":["L","L","M","M","H","B","S"],"STANDALONENARROWWEEKDAYS":["L","L","M","M","H","B","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ika-1 quarter","ika-2 quarter","ika-3 quarter","ika-4 na quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'ng' {0}","{1} 'ng' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"fil","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONENARROWMONTHS":["E","P","M","A","M","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"MONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"STANDALONEMONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"SHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONESHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"WEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"STANDALONEWEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"SHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONESHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"NARROWWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONENARROWWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ika-1 quarter","ika-2 quarter","ika-3 quarter","ika-4 na quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'nang' {0}","{1} 'nang' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/fr.json b/packages/intl/lib/src/data/dates/symbols/fr.json
index 68a4cc9..345ddd8 100644
--- a/packages/intl/lib/src/data/dates/symbols/fr.json
+++ b/packages/intl/lib/src/data/dates/symbols/fr.json
@@ -1 +1 @@
-{"NAME":"fr","ERAS":["av. J.-C.","ap. J.-C."],"ERANAMES":["avant Jésus-Christ","après Jésus-Christ"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"STANDALONEMONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"SHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"STANDALONESHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"WEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"STANDALONEWEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"SHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"STANDALONESHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"fr","ERAS":["av. J.-C.","ap. J.-C."],"ERANAMES":["avant Jésus-Christ","après Jésus-Christ"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"STANDALONEMONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"SHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"STANDALONESHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"WEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"STANDALONEWEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"SHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"STANDALONESHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'à' {0}","{1} 'à' {0}","{1} 'à' {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/fr_CA.json b/packages/intl/lib/src/data/dates/symbols/fr_CA.json
index 05233a9..9c97e75 100644
--- a/packages/intl/lib/src/data/dates/symbols/fr_CA.json
+++ b/packages/intl/lib/src/data/dates/symbols/fr_CA.json
@@ -1 +1 @@
-{"NAME":"fr_CA","ERAS":["av. J.-C.","ap. J.-C."],"ERANAMES":["avant Jésus-Christ","après Jésus-Christ"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"STANDALONEMONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"SHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"STANDALONESHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"WEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"STANDALONEWEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"SHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"STANDALONESHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","y-MM-dd","yy-MM-dd"],"TIMEFORMATS":["HH 'h' mm 'min' ss 's' zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"fr_CA","ERAS":["av. J.-C.","ap. J.-C."],"ERANAMES":["avant Jésus-Christ","après Jésus-Christ"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"STANDALONEMONTHS":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"SHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juill.","août","sept.","oct.","nov.","déc."],"STANDALONESHORTMONTHS":["janv.","févr.","mars","avr.","mai","juin","juill.","août","sept.","oct.","nov.","déc."],"WEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"STANDALONEWEEKDAYS":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"SHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"STANDALONESHORTWEEKDAYS":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","yy-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH 'h' mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'à' {0}","{1} 'à' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ga.json b/packages/intl/lib/src/data/dates/symbols/ga.json
new file mode 100644
index 0000000..46e862e
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/ga.json
@@ -0,0 +1 @@
+{"NAME":"ga","ERAS":["RC","AD"],"ERANAMES":["Roimh Chríost","Anno Domini"],"NARROWMONTHS":["E","F","M","A","B","M","I","L","M","D","S","N"],"STANDALONENARROWMONTHS":["E","F","M","A","B","M","I","L","M","D","S","N"],"MONTHS":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"STANDALONEMONTHS":["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig"],"SHORTMONTHS":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"],"STANDALONESHORTMONTHS":["Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll"],"WEEKDAYS":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"STANDALONEWEEKDAYS":["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],"SHORTWEEKDAYS":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"STANDALONESHORTWEEKDAYS":["Domh","Luan","Máirt","Céad","Déar","Aoine","Sath"],"NARROWWEEKDAYS":["D","L","M","C","D","A","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","C","D","A","S"],"SHORTQUARTERS":["R1","R2","R3","R4"],"QUARTERS":["1ú ráithe","2ú ráithe","3ú ráithe","4ú ráithe"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":2,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/gl.json b/packages/intl/lib/src/data/dates/symbols/gl.json
index a7cf33c..215e6a3 100644
--- a/packages/intl/lib/src/data/dates/symbols/gl.json
+++ b/packages/intl/lib/src/data/dates/symbols/gl.json
@@ -1 +1 @@
-{"NAME":"gl","ERAS":["a.C.","d.C."],"ERANAMES":["antes de Cristo","despois de Cristo"],"NARROWMONTHS":["X","F","M","A","M","X","X","A","S","O","N","D"],"STANDALONENARROWMONTHS":["X","F","M","A","M","X","X","A","S","O","N","D"],"MONTHS":["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro"],"STANDALONEMONTHS":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"SHORTMONTHS":["xan","feb","mar","abr","mai","xuñ","xul","ago","set","out","nov","dec"],"STANDALONESHORTMONTHS":["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],"WEEKDAYS":["domingo","luns","martes","mércores","xoves","venres","sábado"],"STANDALONEWEEKDAYS":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"SHORTWEEKDAYS":["dom","lun","mar","mér","xov","ven","sáb"],"STANDALONESHORTWEEKDAYS":["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],"NARROWWEEKDAYS":["D","L","M","M","X","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","X","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE dd MMMM y","dd MMMM y","d MMM, y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"gl","ERAS":["a.C.","d.C."],"ERANAMES":["antes de Cristo","despois de Cristo"],"NARROWMONTHS":["x.","f.","m.","a.","m.","x.","x.","a.","s.","o.","n.","d."],"STANDALONENARROWMONTHS":["X","F","M","A","M","X","X","A","S","O","N","D"],"MONTHS":["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro"],"STANDALONEMONTHS":["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],"SHORTMONTHS":["xan.","feb.","mar.","abr.","maio","xuño","xul.","ago.","set.","out.","nov.","dec."],"STANDALONESHORTMONTHS":["Xan.","Feb.","Mar.","Abr.","Maio","Xuño","Xul.","Ago.","Set.","Out.","Nov.","Dec."],"WEEKDAYS":["domingo","luns","martes","mércores","xoves","venres","sábado"],"STANDALONEWEEKDAYS":["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],"SHORTWEEKDAYS":["dom.","luns","mar.","mér.","xov.","ven.","sáb."],"STANDALONESHORTWEEKDAYS":["Dom.","Luns","Mar.","Mér.","Xov.","Ven.","Sáb."],"NARROWWEEKDAYS":["d.","l.","m.","m.","x.","v.","s."],"STANDALONENARROWWEEKDAYS":["D","L","M","M","X","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d 'de' MMM 'de' y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{0} 'do' {1}","{0} 'do' {1}","{0}, {1}","{0}, {1}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/gu.json b/packages/intl/lib/src/data/dates/symbols/gu.json
index 412b6af..32cdabf 100644
--- a/packages/intl/lib/src/data/dates/symbols/gu.json
+++ b/packages/intl/lib/src/data/dates/symbols/gu.json
@@ -1 +1 @@
-{"NAME":"gu","ERAS":["ઈસુના જન્મ પહેલા","ઇસવીસન"],"ERANAMES":["ઈસવીસન પૂર્વે","ઇસવીસન"],"NARROWMONTHS":["જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ઑ","ન","ડિ"],"STANDALONENARROWMONTHS":["જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ઑ","ન","ડિ"],"MONTHS":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"STANDALONEMONTHS":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"SHORTMONTHS":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],"STANDALONESHORTMONTHS":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],"WEEKDAYS":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"STANDALONEWEEKDAYS":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"SHORTWEEKDAYS":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"STANDALONESHORTWEEKDAYS":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"NARROWWEEKDAYS":["ર","સો","મં","બુ","ગુ","શુ","શ"],"STANDALONENARROWWEEKDAYS":["ર","સો","મં","બુ","ગુ","શુ","શ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["પહેલો ત્રિમાસ","બીજો ત્રિમાસ","ત્રીજો ત્રિમાસ","ચોથો ત્રિમાસ"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d-MM-yy"],"TIMEFORMATS":["hh:mm:ss a zzzz","hh:mm:ss a z","hh:mm:ss a","hh:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"gu","ERAS":["ઈ.સ.પૂર્વે","ઈ.સ."],"ERANAMES":["ઈસવીસન પૂર્વે","ઇસવીસન"],"NARROWMONTHS":["જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ઑ","ન","ડિ"],"STANDALONENARROWMONTHS":["જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ઑ","ન","ડિ"],"MONTHS":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"STANDALONEMONTHS":["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર"],"SHORTMONTHS":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],"STANDALONESHORTMONTHS":["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],"WEEKDAYS":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"STANDALONEWEEKDAYS":["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],"SHORTWEEKDAYS":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"STANDALONESHORTWEEKDAYS":["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],"NARROWWEEKDAYS":["ર","સો","મં","બુ","ગુ","શુ","શ"],"STANDALONENARROWWEEKDAYS":["ર","સો","મં","બુ","ગુ","શુ","શ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["પહેલો ત્રિમાસ","બીજો ત્રિમાસ","ત્રીજો ત્રિમાસ","ચોથો ત્રિમાસ"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["hh:mm:ss a zzzz","hh:mm:ss a z","hh:mm:ss a","hh:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/he.json b/packages/intl/lib/src/data/dates/symbols/he.json
index d8404b8..3d18bfb 100644
--- a/packages/intl/lib/src/data/dates/symbols/he.json
+++ b/packages/intl/lib/src/data/dates/symbols/he.json
@@ -1 +1 @@
-{"NAME":"he","ERAS":["לפנה״ס","לסה״נ"],"ERANAMES":["לפני הספירה","לספירה"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"STANDALONEMONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"SHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"STANDALONESHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"WEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"STANDALONEWEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"SHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"STANDALONESHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"NARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"STANDALONENARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"SHORTQUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"QUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"AMPMS":["לפנה״צ","אחה״צ"],"DATEFORMATS":["EEEE, d בMMMM y","d בMMMM y","d בMMM y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[4,5],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} בשעה {0}","{1} בשעה {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"he","ERAS":["לפנה״ס","לספירה"],"ERANAMES":["לפני הספירה","לספירה"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"STANDALONEMONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"SHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"STANDALONESHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"WEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"STANDALONEWEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"SHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"STANDALONESHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"NARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"STANDALONENARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"AMPMS":["לפנה״צ","אחה״צ"],"DATEFORMATS":["EEEE, d בMMMM y","d בMMMM y","d בMMM y","d.M.y"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[4,5],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} בשעה {0}","{1} בשעה {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/hi.json b/packages/intl/lib/src/data/dates/symbols/hi.json
index e7346a5..3d344bf 100644
--- a/packages/intl/lib/src/data/dates/symbols/hi.json
+++ b/packages/intl/lib/src/data/dates/symbols/hi.json
@@ -1 +1 @@
-{"NAME":"hi","ERAS":["ईसा-पूर्व","ईस्वी"],"ERANAMES":["ईसा-पूर्व","ईस्वी"],"NARROWMONTHS":["ज","फ़","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],"STANDALONENARROWMONTHS":["ज","फ़","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],"MONTHS":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"STANDALONEMONTHS":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्टूबर","नवंबर","दिसंबर"],"SHORTMONTHS":["जन","फ़र","मार्च","अप्रै","मई","जून","जुला","अग","सितं","अक्टू","नवं","दिसं"],"STANDALONESHORTMONTHS":["जन","फ़र","मार्च","अप्रै","मई","जून","जुला","अग","सितं","अक्टू","नवं","दिसं"],"WEEKDAYS":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"STANDALONEWEEKDAYS":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"SHORTWEEKDAYS":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"NARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"STANDALONENARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"SHORTQUARTERS":["ति1","ति2","ति3","ति4"],"QUARTERS":["पहली तिमाही","दूसरी तिमाही","तीसरी तिमाही","चौथी तिमाही"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","dd-MM-y","d-M-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} को {0}","{1} को {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"hi","ERAS":["ईसा-पूर्व","ईस्वी"],"ERANAMES":["ईसा-पूर्व","ईसवी सन"],"NARROWMONTHS":["ज","फ़","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],"STANDALONENARROWMONTHS":["ज","फ़","मा","अ","म","जू","जु","अ","सि","अ","न","दि"],"MONTHS":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"STANDALONEMONTHS":["जनवरी","फ़रवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर"],"SHORTMONTHS":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"],"STANDALONESHORTMONTHS":["जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰"],"WEEKDAYS":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"STANDALONEWEEKDAYS":["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"SHORTWEEKDAYS":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],"NARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"STANDALONENARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"SHORTQUARTERS":["ति1","ति2","ति3","ति4"],"QUARTERS":["पहली तिमाही","दूसरी तिमाही","तीसरी तिमाही","चौथी तिमाही"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","dd/MM/y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} को {0}","{1} को {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/hr.json b/packages/intl/lib/src/data/dates/symbols/hr.json
index ae1258e..da95de9 100644
--- a/packages/intl/lib/src/data/dates/symbols/hr.json
+++ b/packages/intl/lib/src/data/dates/symbols/hr.json
@@ -1 +1 @@
-{"NAME":"hr","ERAS":["pr. Kr.","p. Kr."],"ERANAMES":["Prije Krista","Poslije Krista"],"NARROWMONTHS":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"STANDALONENARROWMONTHS":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"MONTHS":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"STANDALONEMONTHS":["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"],"SHORTMONTHS":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],"STANDALONESHORTMONTHS":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],"WEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"STANDALONEWEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"SHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"STANDALONESHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"NARROWWEEKDAYS":["N","P","U","S","Č","P","S"],"STANDALONENARROWWEEKDAYS":["n","p","u","s","č","p","s"],"SHORTQUARTERS":["1kv","2kv","3kv","4kv"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y.","d. MMMM y.","d. MMM y.","d.M.yy."],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'u' {0}","{1} 'u' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"hr","ERAS":["pr. Kr.","po. Kr."],"ERANAMES":["prije Krista","poslije Krista"],"NARROWMONTHS":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"STANDALONENARROWMONTHS":["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12."],"MONTHS":["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca"],"STANDALONEMONTHS":["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"],"SHORTMONTHS":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],"STANDALONESHORTMONTHS":["sij","velj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],"WEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"STANDALONEWEEKDAYS":["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],"SHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"STANDALONESHORTWEEKDAYS":["ned","pon","uto","sri","čet","pet","sub"],"NARROWWEEKDAYS":["N","P","U","S","Č","P","S"],"STANDALONENARROWWEEKDAYS":["n","p","u","s","č","p","s"],"SHORTQUARTERS":["1kv","2kv","3kv","4kv"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y.","d. MMMM y.","d. MMM y.","dd. MM. y."],"TIMEFORMATS":["HH:mm:ss (zzzz)","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'u' {0}","{1} 'u' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/hy.json b/packages/intl/lib/src/data/dates/symbols/hy.json
index e6e9a06..7794acc 100644
--- a/packages/intl/lib/src/data/dates/symbols/hy.json
+++ b/packages/intl/lib/src/data/dates/symbols/hy.json
@@ -1 +1 @@
-{"NAME":"hy","ERAS":["մ.թ.ա.","մ.թ."],"ERANAMES":["մ.թ.ա.","մ.թ."],"NARROWMONTHS":["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],"STANDALONENARROWMONTHS":["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],"MONTHS":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"STANDALONEMONTHS":["հունվար","փետրվար","մարտ","ապրիլ","մայիս","հունիս","հուլիս","օգոստոս","սեպտեմբեր","հոկտեմբեր","նոյեմբեր","դեկտեմբեր"],"SHORTMONTHS":["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սպտ","հկտ","նյմ","դկտ"],"STANDALONESHORTMONTHS":["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սպտ","հկտ","նյմ","դկտ"],"WEEKDAYS":["կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],"STANDALONEWEEKDAYS":["կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],"SHORTWEEKDAYS":["կիր","երկ","երք","չրք","հնգ","ուր","շբթ"],"STANDALONESHORTWEEKDAYS":["կիր","երկ","երք","չրք","հնգ","ուր","շբթ"],"NARROWWEEKDAYS":["Կ","Ե","Ե","Չ","Հ","Ու","Շ"],"STANDALONENARROWWEEKDAYS":["Կ","Ե","Ե","Չ","Հ","Ու","Շ"],"SHORTQUARTERS":["1-ին եռմս.","2-րդ եռմս.","3-րդ եռմս.","4-րդ եռմս."],"QUARTERS":["1-ին եռամսյակ","2-րդ եռամսյակ","3-րդ եռամսյակ","4-րդ եռամսյակ"],"AMPMS":["կեսօրից առաջ","կեսօրից հետո"],"DATEFORMATS":["yթ. MMMM d, EEEE","dd MMMM, yթ.","dd MMM, y թ.","dd.MM.yy"],"TIMEFORMATS":["H:mm:ss, zzzz","H:mm:ss, z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"hy","ERAS":["մ.թ.ա.","մ.թ."],"ERANAMES":["Քրիստոսից առաջ","Քրիստոսից հետո"],"NARROWMONTHS":["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],"STANDALONENARROWMONTHS":["Հ","Փ","Մ","Ա","Մ","Հ","Հ","Օ","Ս","Հ","Ն","Դ"],"MONTHS":["հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի"],"STANDALONEMONTHS":["հունվար","փետրվար","մարտ","ապրիլ","մայիս","հունիս","հուլիս","օգոստոս","սեպտեմբեր","հոկտեմբեր","նոյեմբեր","դեկտեմբեր"],"SHORTMONTHS":["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սեպ","հոկ","նոյ","դեկ"],"STANDALONESHORTMONTHS":["հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սեպ","հոկ","նոյ","դեկ"],"WEEKDAYS":["կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],"STANDALONEWEEKDAYS":["կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],"SHORTWEEKDAYS":["կիր","երկ","երք","չրք","հնգ","ուր","շբթ"],"STANDALONESHORTWEEKDAYS":["կիր","երկ","երք","չրք","հնգ","ուր","շբթ"],"NARROWWEEKDAYS":["Կ","Ե","Ե","Չ","Հ","Ո","Շ"],"STANDALONENARROWWEEKDAYS":["Կ","Ե","Ե","Չ","Հ","Ո","Շ"],"SHORTQUARTERS":["1-ին եռմս.","2-րդ եռմս.","3-րդ եռմս.","4-րդ եռմս."],"QUARTERS":["1-ին եռամսյակ","2-րդ եռամսյակ","3-րդ եռամսյակ","4-րդ եռամսյակ"],"AMPMS":["AM","PM"],"DATEFORMATS":["y թ. MMMM d, EEEE","dd MMMM, y թ.","dd MMM, y թ.","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/id.json b/packages/intl/lib/src/data/dates/symbols/id.json
index 449175e..f5e4ed1 100644
--- a/packages/intl/lib/src/data/dates/symbols/id.json
+++ b/packages/intl/lib/src/data/dates/symbols/id.json
@@ -1 +1 @@
-{"NAME":"id","ERAS":["SM","M"],"ERANAMES":["SM","M"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"WEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"STANDALONEWEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"SHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"STANDALONESHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"NARROWWEEKDAYS":["M","S","S","R","K","J","S"],"STANDALONENARROWWEEKDAYS":["M","S","S","R","K","J","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["Kuartal ke-1","Kuartal ke-2","Kuartal ke-3","Kuartal ke-4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM y","d MMMM y","d MMM y","dd/MM/yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"id","ERAS":["SM","M"],"ERANAMES":["Sebelum Masehi","Masehi"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"WEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"STANDALONEWEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"SHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"STANDALONESHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"NARROWWEEKDAYS":["M","S","S","R","K","J","S"],"STANDALONENARROWWEEKDAYS":["M","S","S","R","K","J","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["Kuartal ke-1","Kuartal ke-2","Kuartal ke-3","Kuartal ke-4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM y","d MMMM y","d MMM y","dd/MM/yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/in.json b/packages/intl/lib/src/data/dates/symbols/in.json
index b6e21f5..eccf5a9 100644
--- a/packages/intl/lib/src/data/dates/symbols/in.json
+++ b/packages/intl/lib/src/data/dates/symbols/in.json
@@ -1 +1 @@
-{"NAME":"in","ERAS":["SM","M"],"ERANAMES":["SM","M"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"WEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"STANDALONEWEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"SHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"STANDALONESHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"NARROWWEEKDAYS":["M","S","S","R","K","J","S"],"STANDALONENARROWWEEKDAYS":["M","S","S","R","K","J","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["Kuartal ke-1","Kuartal ke-2","Kuartal ke-3","Kuartal ke-4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM y","d MMMM y","d MMM y","dd/MM/yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"in","ERAS":["SM","M"],"ERANAMES":["Sebelum Masehi","Masehi"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"STANDALONEMONTHS":["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],"SHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"],"WEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"STANDALONEWEEKDAYS":["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],"SHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"STANDALONESHORTWEEKDAYS":["Min","Sen","Sel","Rab","Kam","Jum","Sab"],"NARROWWEEKDAYS":["M","S","S","R","K","J","S"],"STANDALONENARROWWEEKDAYS":["M","S","S","R","K","J","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["Kuartal ke-1","Kuartal ke-2","Kuartal ke-3","Kuartal ke-4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM y","d MMMM y","d MMM y","dd/MM/yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/is.json b/packages/intl/lib/src/data/dates/symbols/is.json
index 5598364..7563609 100644
--- a/packages/intl/lib/src/data/dates/symbols/is.json
+++ b/packages/intl/lib/src/data/dates/symbols/is.json
@@ -1 +1 @@
-{"NAME":"is","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["fyrir Krist","eftir Krist"],"NARROWMONTHS":["J","F","M","A","M","J","J","Á","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","Á","S","O","N","D"],"MONTHS":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"STANDALONEMONTHS":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],"STANDALONESHORTMONTHS":["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],"WEEKDAYS":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"STANDALONEWEEKDAYS":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"SHORTWEEKDAYS":["sun.","mán.","þri.","mið.","fim.","fös.","lau."],"STANDALONESHORTWEEKDAYS":["sun.","mán.","þri.","mið.","fim.","fös.","lau."],"NARROWWEEKDAYS":["S","M","Þ","M","F","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","Þ","M","F","F","L"],"SHORTQUARTERS":["F1","F2","F3","F4"],"QUARTERS":["1. fjórðungur","2. fjórðungur","3. fjórðungur","4. fjórðungur"],"AMPMS":["f.h.","e.h."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","d. MMM y","d.M.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'kl.' {0}","{1} 'kl.' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"is","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["fyrir Krist","eftir Krist"],"NARROWMONTHS":["J","F","M","A","M","J","J","Á","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","Á","S","O","N","D"],"MONTHS":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"STANDALONEMONTHS":["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],"STANDALONESHORTMONTHS":["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],"WEEKDAYS":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"STANDALONEWEEKDAYS":["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],"SHORTWEEKDAYS":["sun.","mán.","þri.","mið.","fim.","fös.","lau."],"STANDALONESHORTWEEKDAYS":["sun.","mán.","þri.","mið.","fim.","fös.","lau."],"NARROWWEEKDAYS":["S","M","Þ","M","F","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","Þ","M","F","F","L"],"SHORTQUARTERS":["F1","F2","F3","F4"],"QUARTERS":["1. fjórðungur","2. fjórðungur","3. fjórðungur","4. fjórðungur"],"AMPMS":["f.h.","e.h."],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","d. MMM y","d.M.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'kl'. {0}","{1} 'kl'. {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/it.json b/packages/intl/lib/src/data/dates/symbols/it.json
index 935bf96..dac1173 100644
--- a/packages/intl/lib/src/data/dates/symbols/it.json
+++ b/packages/intl/lib/src/data/dates/symbols/it.json
@@ -1 +1 @@
-{"NAME":"it","ERAS":["aC","dC"],"ERANAMES":["a.C.","d.C."],"NARROWMONTHS":["G","F","M","A","M","G","L","A","S","O","N","D"],"STANDALONENARROWMONTHS":["G","F","M","A","M","G","L","A","S","O","N","D"],"MONTHS":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"STANDALONEMONTHS":["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],"SHORTMONTHS":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"STANDALONESHORTMONTHS":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"WEEKDAYS":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"STANDALONEWEEKDAYS":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"SHORTWEEKDAYS":["dom","lun","mar","mer","gio","ven","sab"],"STANDALONESHORTWEEKDAYS":["dom","lun","mar","mer","gio","ven","sab"],"NARROWWEEKDAYS":["D","L","M","M","G","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","G","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","dd MMMM y","dd/MMM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"it","ERAS":["a.C.","d.C."],"ERANAMES":["avanti Cristo","dopo Cristo"],"NARROWMONTHS":["G","F","M","A","M","G","L","A","S","O","N","D"],"STANDALONENARROWMONTHS":["G","F","M","A","M","G","L","A","S","O","N","D"],"MONTHS":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"STANDALONEMONTHS":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"SHORTMONTHS":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"STANDALONESHORTMONTHS":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"WEEKDAYS":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"STANDALONEWEEKDAYS":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"SHORTWEEKDAYS":["dom","lun","mar","mer","gio","ven","sab"],"STANDALONESHORTWEEKDAYS":["dom","lun","mar","mer","gio","ven","sab"],"NARROWWEEKDAYS":["D","L","M","M","G","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","G","V","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","dd MMM y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/iw.json b/packages/intl/lib/src/data/dates/symbols/iw.json
index d17ce90..da037a3 100644
--- a/packages/intl/lib/src/data/dates/symbols/iw.json
+++ b/packages/intl/lib/src/data/dates/symbols/iw.json
@@ -1 +1 @@
-{"NAME":"iw","ERAS":["לפנה״ס","לסה״נ"],"ERANAMES":["לפני הספירה","לספירה"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"STANDALONEMONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"SHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"STANDALONESHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"WEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"STANDALONEWEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"SHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"STANDALONESHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"NARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"STANDALONENARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"SHORTQUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"QUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"AMPMS":["לפנה״צ","אחה״צ"],"DATEFORMATS":["EEEE, d בMMMM y","d בMMMM y","d בMMM y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[4,5],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} בשעה {0}","{1} בשעה {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"iw","ERAS":["לפנה״ס","לספירה"],"ERANAMES":["לפני הספירה","לספירה"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"STANDALONEMONTHS":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"SHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"STANDALONESHORTMONTHS":["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],"WEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"STANDALONEWEEKDAYS":["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"],"SHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"STANDALONESHORTWEEKDAYS":["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],"NARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"STANDALONENARROWWEEKDAYS":["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"AMPMS":["לפנה״צ","אחה״צ"],"DATEFORMATS":["EEEE, d בMMMM y","d בMMMM y","d בMMM y","d.M.y"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[4,5],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} בשעה {0}","{1} בשעה {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ka.json b/packages/intl/lib/src/data/dates/symbols/ka.json
index 87d01d3..5801ba5 100644
--- a/packages/intl/lib/src/data/dates/symbols/ka.json
+++ b/packages/intl/lib/src/data/dates/symbols/ka.json
@@ -1 +1 @@
-{"NAME":"ka","ERAS":["ძვ. წ.","ახ. წ."],"ERANAMES":["ძველი წელთაღრიცხვით","ახალი წელთაღრიცხვით"],"NARROWMONTHS":["ი","თ","მ","ა","მ","ი","ი","ა","ს","ო","ნ","დ"],"STANDALONENARROWMONTHS":["ი","თ","მ","ა","მ","ი","ი","ა","ს","ო","ნ","დ"],"MONTHS":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"STANDALONEMONTHS":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"SHORTMONTHS":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],"STANDALONESHORTMONTHS":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],"WEEKDAYS":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"STANDALONEWEEKDAYS":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"SHORTWEEKDAYS":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"STANDALONESHORTWEEKDAYS":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"NARROWWEEKDAYS":["კ","ო","ს","ო","ხ","პ","შ"],"STANDALONENARROWWEEKDAYS":["კ","ო","ს","ო","ხ","პ","შ"],"SHORTQUARTERS":["I კვ.","II კვ.","III კვ.","IV კვ."],"QUARTERS":["I კვარტალი","II კვარტალი","III კვარტალი","IV კვარტალი"],"AMPMS":["დილის","საღამოს"],"DATEFORMATS":["EEEE, dd MMMM, y","d MMMM, y","d MMM, y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1}, {0}","{1} {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"ka","ERAS":["ძვ. წ.","ახ. წ."],"ERANAMES":["ძველი წელთაღრიცხვით","ახალი წელთაღრიცხვით"],"NARROWMONTHS":["ი","თ","მ","ა","მ","ი","ი","ა","ს","ო","ნ","დ"],"STANDALONENARROWMONTHS":["ი","თ","მ","ა","მ","ი","ი","ა","ს","ო","ნ","დ"],"MONTHS":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"STANDALONEMONTHS":["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],"SHORTMONTHS":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],"STANDALONESHORTMONTHS":["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],"WEEKDAYS":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"STANDALONEWEEKDAYS":["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],"SHORTWEEKDAYS":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"STANDALONESHORTWEEKDAYS":["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],"NARROWWEEKDAYS":["კ","ო","ს","ო","ხ","პ","შ"],"STANDALONENARROWWEEKDAYS":["კ","ო","ს","ო","ხ","პ","შ"],"SHORTQUARTERS":["I კვ.","II კვ.","III კვ.","IV კვ."],"QUARTERS":["I კვარტალი","II კვარტალი","III კვარტალი","IV კვარტალი"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, dd MMMM, y","d MMMM, y","d MMM. y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/kk.json b/packages/intl/lib/src/data/dates/symbols/kk.json
index c72f03f..495ebe8 100644
--- a/packages/intl/lib/src/data/dates/symbols/kk.json
+++ b/packages/intl/lib/src/data/dates/symbols/kk.json
@@ -1 +1 @@
-{"NAME":"kk","ERAS":["б.з.д.","б.з."],"ERANAMES":["б.з.д.","б.з."],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан"],"STANDALONEMONTHS":["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан"],"SHORTMONTHS":["қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","желт."],"STANDALONESHORTMONTHS":["қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","желт."],"WEEKDAYS":["жексенбі","дүйсенбі","сейсенбі","сәрсенбі","бейсенбі","жұма","сенбі"],"STANDALONEWEEKDAYS":["жексенбі","дүйсенбі","сейсенбі","сәрсенбі","бейсенбі","жұма","сенбі"],"SHORTWEEKDAYS":["жс.","дс.","сс.","ср.","бс.","жм.","сб."],"STANDALONESHORTWEEKDAYS":["жс.","дс.","сс.","ср.","бс.","жм.","сб."],"NARROWWEEKDAYS":["Ж","Д","С","С","Б","Ж","С"],"STANDALONENARROWWEEKDAYS":["Ж","Д","С","С","Б","Ж","С"],"SHORTQUARTERS":["1-тоқсан","2-тоқсан","3-тоқсан","4-тоқсан"],"QUARTERS":["1-інші тоқсан","2-інші тоқсан","3-інші тоқсан","4-інші тоқсан"],"AMPMS":["түске дейін","түстен кейін"],"DATEFORMATS":["EEEE, d MMMM y 'ж'.","d MMMM y 'ж'.","dd.MM.y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"kk","ERAS":["б.з.д.","б.з."],"ERANAMES":["Біздің заманымызға дейін","Біздің заманымыз"],"NARROWMONTHS":["Қ","А","Н","С","М","М","Ш","Т","Қ","Қ","Қ","Ж"],"STANDALONENARROWMONTHS":["Қ","А","Н","С","М","М","Ш","Т","Қ","Қ","Қ","Ж"],"MONTHS":["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан"],"STANDALONEMONTHS":["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],"SHORTMONTHS":["қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","жел."],"STANDALONESHORTMONTHS":["Қаң.","Ақп.","Нау.","Сәу.","Мам.","Мау.","Шіл.","Там.","Қыр.","Қаз.","Қар.","Жел."],"WEEKDAYS":["жексенбі","дүйсенбі","сейсенбі","сәрсенбі","бейсенбі","жұма","сенбі"],"STANDALONEWEEKDAYS":["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],"SHORTWEEKDAYS":["Жс","Дс","Сс","Ср","Бс","Жм","Сб"],"STANDALONESHORTWEEKDAYS":["Жс","Дс","Сс","Ср","Бс","Жм","Сб"],"NARROWWEEKDAYS":["Ж","Д","С","С","Б","Ж","С"],"STANDALONENARROWWEEKDAYS":["Ж","Д","С","С","Б","Ж","С"],"SHORTQUARTERS":["І ш.","ІІ ш.","ІІІ ш.","IV ш."],"QUARTERS":["І ширек","ІІ ширек","ІІІ ширек","IV ширек"],"AMPMS":["AM","PM"],"DATEFORMATS":["y 'ж'. d MMMM, EEEE","y 'ж'. d MMMM","y 'ж'. dd MMM","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/km.json b/packages/intl/lib/src/data/dates/symbols/km.json
index 9a1f243..1b2796a 100644
--- a/packages/intl/lib/src/data/dates/symbols/km.json
+++ b/packages/intl/lib/src/data/dates/symbols/km.json
@@ -1 +1 @@
-{"NAME":"km","ERAS":["មុន គ.ស.","គ.ស."],"ERANAMES":["មុន​គ្រិស្តសករាជ","គ្រិស្តសករាជ"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"STANDALONEMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"SHORTMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"STANDALONESHORTMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"WEEKDAYS":["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"STANDALONEWEEKDAYS":["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"SHORTWEEKDAYS":["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"STANDALONESHORTWEEKDAYS":["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"NARROWWEEKDAYS":["1","2","3","4","5","6","7"],"STANDALONENARROWWEEKDAYS":["1","2","3","4","5","6","7"],"SHORTQUARTERS":["ត្រីមាស ១","ត្រីមាស ២","ត្រីមាស ៣","ត្រីមាស ៤"],"QUARTERS":["ត្រីមាសទី ១","ត្រីមាសទី ២","ត្រីមាសទី ៣","ត្រីមាសទី ៤"],"AMPMS":["ព្រឹក","ល្ងាច"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","d/M/y"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"km","ERAS":["មុន គ.ស.","គ.ស."],"ERANAMES":["មុន​គ្រិស្តសករាជ","គ្រិស្តសករាជ"],"NARROWMONTHS":["ម","ក","ម","ម","ឧ","ម","ក","ស","ក","ត","វ","ធ"],"STANDALONENARROWMONTHS":["ម","ក","ម","ម","ឧ","ម","ក","ស","ក","ត","វ","ធ"],"MONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"STANDALONEMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"SHORTMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"STANDALONESHORTMONTHS":["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],"WEEKDAYS":["អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"STANDALONEWEEKDAYS":["អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"SHORTWEEKDAYS":["អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"STANDALONESHORTWEEKDAYS":["អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],"NARROWWEEKDAYS":["អ","ច","អ","ព","ព","ស","ស"],"STANDALONENARROWWEEKDAYS":["អ","ច","អ","ព","ព","ស","ស"],"SHORTQUARTERS":["ត្រីមាសទី 1","ត្រីមាសទី 2","ត្រីមាសទី 3","ត្រីមាសទី 4"],"QUARTERS":["ត្រីមាសទី 1","ត្រីមាសទី 2","ត្រីមាសទី 3","ត្រីមាសទី 4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} នៅ​ម៉ោង {0}","{1} នៅ​ម៉ោង {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/kn.json b/packages/intl/lib/src/data/dates/symbols/kn.json
index 58efc3f..b5ad4bc 100644
--- a/packages/intl/lib/src/data/dates/symbols/kn.json
+++ b/packages/intl/lib/src/data/dates/symbols/kn.json
@@ -1 +1 @@
-{"NAME":"kn","ERAS":["ಕ್ರಿ.ಪೂ","ಜಾಹೀ"],"ERANAMES":["ಈಸಪೂವ೯.","ಕ್ರಿಸ್ತ ಶಕ"],"NARROWMONTHS":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],"STANDALONENARROWMONTHS":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],"MONTHS":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"STANDALONEMONTHS":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"SHORTMONTHS":["ಜನ.","ಫೆಬ್ರು.","ಮಾ","ಏಪ್ರಿ.","ಮೇ","ಜೂ","ಜು.","ಆಗ.","ಸೆಪ್ಟೆಂ.","ಅಕ್ಟೋ.","ನವೆಂ.","ಡಿಸೆಂ."],"STANDALONESHORTMONTHS":["ಜನ.","ಫೆಬ್ರು.","ಮಾ","ಏಪ್ರಿ.","ಮೇ","ಜೂ","ಜು.","ಆಗ.","ಸೆಪ್ಟೆಂ.","ಅಕ್ಟೋ.","ನವೆಂ.","ಡಿಸೆಂ."],"WEEKDAYS":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"STANDALONEWEEKDAYS":["ರವಿವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"SHORTWEEKDAYS":["ರ.","ಸೋ.","ಮಂ.","ಬು.","ಗು.","ಶು.","ಶನಿ."],"STANDALONESHORTWEEKDAYS":["ರವಿ","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ"],"NARROWWEEKDAYS":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"STANDALONENARROWWEEKDAYS":["ರ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"SHORTQUARTERS":["ತ್ರೈ 1","ತ್ರೈ 2","ತ್ರೈ 3","ತ್ರೈ 4"],"QUARTERS":["1 ನೇ ತ್ರೈಮಾಸಿಕ","2ನೇ ತ್ರೈಮಾಸಿಕ","3 ನೇ ತ್ರೈಮಾಸಿಕ","4 ನೇ ತ್ರೈಮಾಸಿಕ"],"AMPMS":["AM","PM"],"DATEFORMATS":["d MMMM y, EEEE","d MMMM y","d MMM y","d-M-yy"],"TIMEFORMATS":["hh:mm:ss a zzzz","hh:mm:ss a z","hh:mm:ss a","hh:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"kn","ERAS":["ಕ್ರಿ.ಪೂ","ಕ್ರಿ.ಶ"],"ERANAMES":["ಕ್ರಿಸ್ತ ಪೂರ್ವ","ಕ್ರಿಸ್ತ ಶಕ"],"NARROWMONTHS":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],"STANDALONENARROWMONTHS":["ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ"],"MONTHS":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"STANDALONEMONTHS":["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಏಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],"SHORTMONTHS":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"],"STANDALONESHORTMONTHS":["ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ"],"WEEKDAYS":["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"STANDALONEWEEKDAYS":["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],"SHORTWEEKDAYS":["ಭಾನು","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ"],"STANDALONESHORTWEEKDAYS":["ಭಾನು","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ"],"NARROWWEEKDAYS":["ಭಾ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"STANDALONENARROWWEEKDAYS":["ಭಾ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ"],"SHORTQUARTERS":["ತ್ರೈ 1","ತ್ರೈ 2","ತ್ರೈ 3","ತ್ರೈ 4"],"QUARTERS":["1ನೇ ತ್ರೈಮಾಸಿಕ","2ನೇ ತ್ರೈಮಾಸಿಕ","3ನೇ ತ್ರೈಮಾಸಿಕ","4ನೇ ತ್ರೈಮಾಸಿಕ"],"AMPMS":["ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","d/M/yy"],"TIMEFORMATS":["hh:mm:ss a zzzz","hh:mm:ss a z","hh:mm:ss a","hh:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ko.json b/packages/intl/lib/src/data/dates/symbols/ko.json
index 4f2217e..5f8e84f 100644
--- a/packages/intl/lib/src/data/dates/symbols/ko.json
+++ b/packages/intl/lib/src/data/dates/symbols/ko.json
@@ -1 +1 @@
-{"NAME":"ko","ERAS":["기원전","서기"],"ERANAMES":["서력기원전","서력기원"],"NARROWMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONENARROWMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"MONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONEMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"SHORTMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONESHORTMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"WEEKDAYS":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"STANDALONEWEEKDAYS":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"SHORTWEEKDAYS":["일","월","화","수","목","금","토"],"STANDALONESHORTWEEKDAYS":["일","월","화","수","목","금","토"],"NARROWWEEKDAYS":["일","월","화","수","목","금","토"],"STANDALONENARROWWEEKDAYS":["일","월","화","수","목","금","토"],"SHORTQUARTERS":["1분기","2분기","3분기","4분기"],"QUARTERS":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"AMPMS":["오전","오후"],"DATEFORMATS":["y년 M월 d일 EEEE","y년 M월 d일","y. M. d.","yy. M. d."],"TIMEFORMATS":["a h시 m분 s초 zzzz","a h시 m분 s초 z","a h:mm:ss","a h:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ko","ERAS":["BC","AD"],"ERANAMES":["기원전","서기"],"NARROWMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONENARROWMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"MONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONEMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"SHORTMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"STANDALONESHORTMONTHS":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"WEEKDAYS":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"STANDALONEWEEKDAYS":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"SHORTWEEKDAYS":["일","월","화","수","목","금","토"],"STANDALONESHORTWEEKDAYS":["일","월","화","수","목","금","토"],"NARROWWEEKDAYS":["일","월","화","수","목","금","토"],"STANDALONENARROWWEEKDAYS":["일","월","화","수","목","금","토"],"SHORTQUARTERS":["1분기","2분기","3분기","4분기"],"QUARTERS":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"AMPMS":["오전","오후"],"DATEFORMATS":["y년 M월 d일 EEEE","y년 M월 d일","y. M. d.","yy. M. d."],"TIMEFORMATS":["a h시 m분 s초 zzzz","a h시 m분 s초 z","a h:mm:ss","a h:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ky.json b/packages/intl/lib/src/data/dates/symbols/ky.json
index b673aa7..6b99ac8 100644
--- a/packages/intl/lib/src/data/dates/symbols/ky.json
+++ b/packages/intl/lib/src/data/dates/symbols/ky.json
@@ -1 +1 @@
-{"NAME":"ky","ERAS":["б.з. ч.","б.з."],"ERANAMES":["б.з. чейин","б.з."],"NARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"STANDALONENARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"MONTHS":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"STANDALONEMONTHS":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"SHORTMONTHS":["янв.","фев.","мар.","апр.","май","июн.","июл.","авг.","сен.","окт.","ноя.","дек."],"STANDALONESHORTMONTHS":["янв.","фев.","мар.","апр.","май","июн.","июл.","авг.","сен.","окт.","ноя.","дек."],"WEEKDAYS":["Жек","Дүй","Шей","Шар","Бей","Жум","Ишм"],"STANDALONEWEEKDAYS":["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],"SHORTWEEKDAYS":["Жк","Дш","Ше","Ша","Бш","Жм","Иш"],"STANDALONESHORTWEEKDAYS":["Жек","Дүй","Шей","Шар","Бей","Жум","Ишм"],"NARROWWEEKDAYS":["Ж","Д","Ш","Ш","Б","Ж","И"],"STANDALONENARROWWEEKDAYS":["Ж","Д","Ш","Ш","Б","Ж","И"],"SHORTQUARTERS":["1-чей.","2-чей.","3-чей.","4-чей."],"QUARTERS":["1-чейрек","2-чейрек","3-чейрек","4-чейрек"],"AMPMS":["түшкө чейинки","түштөн кийинки"],"DATEFORMATS":["EEEE, d-MMMM, y-'ж'.","d-MMMM, y-'ж'.","dd.MM.y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ky","ERAS":["б.з.ч.","б.з."],"ERANAMES":["биздин заманга чейин","биздин заман"],"NARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"STANDALONENARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"MONTHS":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"STANDALONEMONTHS":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"SHORTMONTHS":["янв.","фев.","мар.","апр.","май","июн.","июл.","авг.","сен.","окт.","ноя.","дек."],"STANDALONESHORTMONTHS":["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],"WEEKDAYS":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"STANDALONEWEEKDAYS":["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],"SHORTWEEKDAYS":["жек.","дүй.","шейш.","шарш.","бейш.","жума","ишм."],"STANDALONESHORTWEEKDAYS":["жек.","дүй.","шейш.","шарш.","бейш.","жума","ишм."],"NARROWWEEKDAYS":["Ж","Д","Ш","Ш","Б","Ж","И"],"STANDALONENARROWWEEKDAYS":["Ж","Д","Ш","Ш","Б","Ж","И"],"SHORTQUARTERS":["1-чей.","2-чей.","3-чей.","4-чей."],"QUARTERS":["1-чейрек","2-чейрек","3-чейрек","4-чейрек"],"AMPMS":["таңкы","түштөн кийинки"],"DATEFORMATS":["y-'ж'., d-MMMM, EEEE","y-'ж'., d-MMMM","y-'ж'., d-MMM","d/M/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/lo.json b/packages/intl/lib/src/data/dates/symbols/lo.json
index b31968f..3d34d62 100644
--- a/packages/intl/lib/src/data/dates/symbols/lo.json
+++ b/packages/intl/lib/src/data/dates/symbols/lo.json
@@ -1 +1 @@
-{"NAME":"lo","ERAS":["ກ່ອນ ຄ.ສ.","ຄ.ສ."],"ERANAMES":["ກ່ອນ ຄ.ສ.","ຄ.ສ."],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"STANDALONEMONTHS":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"SHORTMONTHS":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."],"STANDALONESHORTMONTHS":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."],"WEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"STANDALONEWEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"SHORTWEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"STANDALONESHORTWEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"NARROWWEEKDAYS":["1","2","3","4","5","6","7"],"STANDALONENARROWWEEKDAYS":["ທ","ຈ","ຄ","​ພຸ","ພ","​ສຸ","ສ"],"SHORTQUARTERS":["ຕມ1","ຕມ2","ຕມ3","ຕມ4"],"QUARTERS":["ໄຕຣມາດ 1","ໄຕຣມາດ 2","ໄຕຣມາດ 3","ໄຕຣມາດ 4"],"AMPMS":["ກ່ອນທ່ຽງ","ຫຼັງທ່ຽງ"],"DATEFORMATS":["EEEE ທີ d MMMM G y","d MMMM y","d MMM y","d/M/y"],"TIMEFORMATS":["H ໂມງ m ນາທີ ss ວິນາທີ zzzz","H ໂມງ m ນາທີ ss ວິນາທີ z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"lo","ERAS":["ກ່ອນ ຄ.ສ.","ຄ.ສ."],"ERANAMES":["ກ່ອນຄຣິດສັກກະລາດ","ຄຣິດສັກກະລາດ"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"STANDALONEMONTHS":["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ"],"SHORTMONTHS":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."],"STANDALONESHORTMONTHS":["ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ."],"WEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"STANDALONEWEEKDAYS":["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],"SHORTWEEKDAYS":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"STANDALONESHORTWEEKDAYS":["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],"NARROWWEEKDAYS":["ອາ","ຈ","ອ","ພ","ພຫ","ສຸ","ສ"],"STANDALONENARROWWEEKDAYS":["ອາ","ຈ","ອ","ພ","ພຫ","ສຸ","ສ"],"SHORTQUARTERS":["ຕມ1","ຕມ2","ຕມ3","ຕມ4"],"QUARTERS":["ໄຕຣມາດ 1","ໄຕຣມາດ 2","ໄຕຣມາດ 3","ໄຕຣມາດ 4"],"AMPMS":["ກ່ອນທ່ຽງ","ຫຼັງທ່ຽງ"],"DATEFORMATS":["EEEE ທີ d MMMM G y","d MMMM y","d MMM y","d/M/y"],"TIMEFORMATS":["H ໂມງ m ນາທີ ss ວິນາທີ zzzz","H ໂມງ m ນາທີ ss ວິນາທີ z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/lt.json b/packages/intl/lib/src/data/dates/symbols/lt.json
index 6e2b559..2c7aee7 100644
--- a/packages/intl/lib/src/data/dates/symbols/lt.json
+++ b/packages/intl/lib/src/data/dates/symbols/lt.json
@@ -1 +1 @@
-{"NAME":"lt","ERAS":["pr. Kr.","po Kr."],"ERANAMES":["prieš Kristų","po Kristaus"],"NARROWMONTHS":["S","V","K","B","G","B","L","R","R","S","L","G"],"STANDALONENARROWMONTHS":["S","V","K","B","G","B","L","R","R","S","L","G"],"MONTHS":["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis"],"STANDALONEMONTHS":["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis"],"SHORTMONTHS":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],"STANDALONESHORTMONTHS":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],"WEEKDAYS":["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],"STANDALONEWEEKDAYS":["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],"SHORTWEEKDAYS":["sk","pr","an","tr","kt","pn","št"],"STANDALONESHORTWEEKDAYS":["sk","pr","an","tr","kt","pn","št"],"NARROWWEEKDAYS":["S","P","A","T","K","P","Š"],"STANDALONENARROWWEEKDAYS":["S","P","A","T","K","P","Š"],"SHORTQUARTERS":["I k.","II k.","III k.","IV k."],"QUARTERS":["I ketvirtis","II ketvirtis","III ketvirtis","IV ketvirtis"],"AMPMS":["priešpiet","popiet"],"DATEFORMATS":["y 'm'. MMMM d 'd'., EEEE","y 'm'. MMMM d 'd'.","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"lt","ERAS":["pr. Kr.","po Kr."],"ERANAMES":["prieš Kristų","po Kristaus"],"NARROWMONTHS":["S","V","K","B","G","B","L","R","R","S","L","G"],"STANDALONENARROWMONTHS":["S","V","K","B","G","B","L","R","R","S","L","G"],"MONTHS":["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio"],"STANDALONEMONTHS":["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis"],"SHORTMONTHS":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],"STANDALONESHORTMONTHS":["saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod."],"WEEKDAYS":["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],"STANDALONEWEEKDAYS":["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],"SHORTWEEKDAYS":["sk","pr","an","tr","kt","pn","št"],"STANDALONESHORTWEEKDAYS":["sk","pr","an","tr","kt","pn","št"],"NARROWWEEKDAYS":["S","P","A","T","K","P","Š"],"STANDALONENARROWWEEKDAYS":["S","P","A","T","K","P","Š"],"SHORTQUARTERS":["I k.","II k.","III k.","IV k."],"QUARTERS":["I ketvirtis","II ketvirtis","III ketvirtis","IV ketvirtis"],"AMPMS":["priešpiet","popiet"],"DATEFORMATS":["y 'm'. MMMM d 'd'., EEEE","y 'm'. MMMM d 'd'.","y-MM-dd","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/lv.json b/packages/intl/lib/src/data/dates/symbols/lv.json
index e407243..a18f9ac 100644
--- a/packages/intl/lib/src/data/dates/symbols/lv.json
+++ b/packages/intl/lib/src/data/dates/symbols/lv.json
@@ -1 +1 @@
-{"NAME":"lv","ERAS":["p.m.ē.","m.ē."],"ERANAMES":["pirms mūsu ēras","mūsu ērā"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"STANDALONEMONTHS":["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],"SHORTMONTHS":["janv.","febr.","marts","apr.","maijs","jūn.","jūl.","aug.","sept.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["Janv.","Febr.","Marts","Apr.","Maijs","Jūn.","Jūl.","Aug.","Sept.","Okt.","Nov.","Dec."],"WEEKDAYS":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"STANDALONEWEEKDAYS":["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"],"SHORTWEEKDAYS":["Sv","Pr","Ot","Tr","Ce","Pk","Se"],"STANDALONESHORTWEEKDAYS":["Sv","Pr","Ot","Tr","Ce","Pk","Se"],"NARROWWEEKDAYS":["S","P","O","T","C","P","S"],"STANDALONENARROWWEEKDAYS":["S","P","O","T","C","P","S"],"SHORTQUARTERS":["C1","C2","C3","C4"],"QUARTERS":["1. ceturksnis","2. ceturksnis","3. ceturksnis","4. ceturksnis"],"AMPMS":["priekšpusdienā","pēcpusdienā"],"DATEFORMATS":["EEEE, y. 'gada' d. MMMM","y. 'gada' d. MMMM","y. 'gada' d. MMM","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"lv","ERAS":["p.m.ē.","m.ē."],"ERANAMES":["pirms mūsu ēras","mūsu ērā"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"STANDALONEMONTHS":["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],"SHORTMONTHS":["janv.","febr.","marts","apr.","maijs","jūn.","jūl.","aug.","sept.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["janv.","febr.","marts","apr.","maijs","jūn.","jūl.","aug.","sept.","okt.","nov.","dec."],"WEEKDAYS":["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],"STANDALONEWEEKDAYS":["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"],"SHORTWEEKDAYS":["svētd.","pirmd.","otrd.","trešd.","ceturtd.","piektd.","sestd."],"STANDALONESHORTWEEKDAYS":["Svētd.","Pirmd.","Otrd.","Trešd.","Ceturtd.","Piektd.","Sestd."],"NARROWWEEKDAYS":["S","P","O","T","C","P","S"],"STANDALONENARROWWEEKDAYS":["S","P","O","T","C","P","S"],"SHORTQUARTERS":["1. cet.","2. cet.","3. cet.","4. cet."],"QUARTERS":["1. ceturksnis","2. ceturksnis","3. ceturksnis","4. ceturksnis"],"AMPMS":["priekšpusdienā","pēcpusdienā"],"DATEFORMATS":["EEEE, y. 'gada' d. MMMM","y. 'gada' d. MMMM","y. 'gada' d. MMM","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/mk.json b/packages/intl/lib/src/data/dates/symbols/mk.json
index 86dd0ee..283fc77 100644
--- a/packages/intl/lib/src/data/dates/symbols/mk.json
+++ b/packages/intl/lib/src/data/dates/symbols/mk.json
@@ -1 +1 @@
-{"NAME":"mk","ERAS":["пр.н.е.","н.е."],"ERANAMES":["пр.н.е.","н.е."],"NARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"STANDALONENARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"MONTHS":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"STANDALONEMONTHS":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"SHORTMONTHS":["јан.","фев.","мар.","апр.","мај","јун.","јул.","авг.","септ.","окт.","ноем.","дек."],"STANDALONESHORTMONTHS":["јан.","фев.","мар.","апр.","мај","јун.","јул.","авг.","септ.","окт.","ноем.","дек."],"WEEKDAYS":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"STANDALONEWEEKDAYS":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"SHORTWEEKDAYS":["нед.","пон.","вт.","сре.","чет.","пет.","саб."],"STANDALONESHORTWEEKDAYS":["нед.","пон.","вт.","сре.","чет.","пет.","саб."],"NARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["прво тромесечје","второ тромесечје","трето тромесечје","четврто тромесечје"],"AMPMS":["претпладне","попладне"],"DATEFORMATS":["EEEE, dd MMMM y 'г'.","dd MMMM y 'г'.","dd.M.y","dd.M.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"mk","ERAS":["пр.н.е.","н.е."],"ERANAMES":["пред нашата ера","од нашата ера"],"NARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"STANDALONENARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"MONTHS":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"STANDALONEMONTHS":["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],"SHORTMONTHS":["јан.","фев.","мар.","апр.","мај","јун.","јул.","авг.","септ.","окт.","ноем.","дек."],"STANDALONESHORTMONTHS":["јан.","фев.","мар.","апр.","мај","јун.","јул.","авг.","септ.","окт.","ноем.","дек."],"WEEKDAYS":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"STANDALONEWEEKDAYS":["недела","понеделник","вторник","среда","четврток","петок","сабота"],"SHORTWEEKDAYS":["нед.","пон.","вт.","сре.","чет.","пет.","саб."],"STANDALONESHORTWEEKDAYS":["нед.","пон.","вто.","сре.","чет.","пет.","саб."],"NARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","в","с","ч","п","с"],"SHORTQUARTERS":["јан-мар","апр-јун","јул-сеп","окт-дек"],"QUARTERS":["прво тромесечје","второ тромесечје","трето тромесечје","четврто тромесечје"],"AMPMS":["претпладне","попладне"],"DATEFORMATS":["EEEE, dd MMMM y","dd MMMM y","dd.M.y","dd.M.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ml.json b/packages/intl/lib/src/data/dates/symbols/ml.json
index 9dba285..0e37b33 100644
--- a/packages/intl/lib/src/data/dates/symbols/ml.json
+++ b/packages/intl/lib/src/data/dates/symbols/ml.json
@@ -1 +1 @@
-{"NAME":"ml","ERAS":["ക്രി.മൂ","എഡി"],"ERANAMES":["ക്രിസ്തുവിനു് മുമ്പ്‌","ക്രിസ്തുവിന് പിൻപ്"],"NARROWMONTHS":["ജ","ഫെ","മാ","ഏ","മേ","ജൂ","ജൂ","ഓ","സെ","ഒ","ന","ഡി"],"STANDALONENARROWMONTHS":["ജ","ഫെ","മാ","ഏ","മേ","ജൂ","ജൂ","ഓ","സെ","ഒ","ന","ഡി"],"MONTHS":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"STANDALONEMONTHS":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"SHORTMONTHS":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"],"STANDALONESHORTMONTHS":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"],"WEEKDAYS":["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],"STANDALONEWEEKDAYS":["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്‌ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],"SHORTWEEKDAYS":["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],"STANDALONESHORTWEEKDAYS":["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],"NARROWWEEKDAYS":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"STANDALONENARROWWEEKDAYS":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"SHORTQUARTERS":["ഒന്നാം പാദം","രണ്ടാം പാദം","മൂന്നാം പാദം","നാലാം പാദം"],"QUARTERS":["ഒന്നാം പാദം","രണ്ടാം പാദം","മൂന്നാം പാദം","നാലാം പാദം"],"AMPMS":["AM","PM"],"DATEFORMATS":["y, MMMM d, EEEE","y, MMMM d","y, MMM d","dd/MM/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ml","ERAS":["ക്രി.മു.","എഡി"],"ERANAMES":["ക്രിസ്‌തുവിന് മുമ്പ്","ആന്നോ ഡൊമിനി"],"NARROWMONTHS":["ജ","ഫ","മാ","ഏ","മെ","ജൂൺ","ജൂ","ഓ","സെ","ഒ","ന","ഡി"],"STANDALONENARROWMONTHS":["ജ","ഫെ","മാ","ഏ","മെ","ജൂൺ","ജൂ","ഓ","സെ","ഒ","ന","ഡി"],"MONTHS":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"STANDALONEMONTHS":["ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","മേയ്","ജൂൺ","ജൂലൈ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ"],"SHORTMONTHS":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"],"STANDALONESHORTMONTHS":["ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം"],"WEEKDAYS":["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],"STANDALONEWEEKDAYS":["ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്‌ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച"],"SHORTWEEKDAYS":["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],"STANDALONESHORTWEEKDAYS":["ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി"],"NARROWWEEKDAYS":["ഞ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"STANDALONENARROWWEEKDAYS":["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],"SHORTQUARTERS":["ഒന്നാം പാദം","രണ്ടാം പാദം","മൂന്നാം പാദം","നാലാം പാദം"],"QUARTERS":["ഒന്നാം പാദം","രണ്ടാം പാദം","മൂന്നാം പാദം","നാലാം പാദം"],"AMPMS":["AM","PM"],"DATEFORMATS":["y, MMMM d, EEEE","y, MMMM d","y, MMM d","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/mn.json b/packages/intl/lib/src/data/dates/symbols/mn.json
index 4989e29..e6fafe2 100644
--- a/packages/intl/lib/src/data/dates/symbols/mn.json
+++ b/packages/intl/lib/src/data/dates/symbols/mn.json
@@ -1 +1 @@
-{"NAME":"mn","ERAS":["МЭӨ","МЭ"],"ERANAMES":["манай эриний өмнөх","манай эриний"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"STANDALONEMONTHS":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"SHORTMONTHS":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],"STANDALONESHORTMONTHS":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],"WEEKDAYS":["ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба"],"STANDALONEWEEKDAYS":["ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба"],"SHORTWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"STANDALONESHORTWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"NARROWWEEKDAYS":["1","2","3","4","5","6","7"],"STANDALONENARROWWEEKDAYS":["1","2","3","4","5","6","7"],"SHORTQUARTERS":["У1","У2","У3","У4"],"QUARTERS":["1-р улирал","2-р улирал","3-р улирал","4-р улирал"],"AMPMS":["ҮӨ","ҮХ"],"DATEFORMATS":["EEEE, y 'оны' MMMM 'сарын' dd","y 'оны' MMMM 'сарын' d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"mn","ERAS":["м.э.ө","м.э."],"ERANAMES":["манай эриний өмнөх","манай эриний"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"STANDALONEMONTHS":["Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар"],"SHORTMONTHS":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],"STANDALONESHORTMONTHS":["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],"WEEKDAYS":["ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба"],"STANDALONEWEEKDAYS":["ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба"],"SHORTWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"STANDALONESHORTWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"NARROWWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"STANDALONENARROWWEEKDAYS":["Ня","Да","Мя","Лх","Пү","Ба","Бя"],"SHORTQUARTERS":["У1","У2","У3","У4"],"QUARTERS":["1-р улирал","2-р улирал","3-р улирал","4-р улирал"],"AMPMS":["ү.ө","ү.х"],"DATEFORMATS":["EEEE, y 'оны' MM 'сарын' d","y'оны' MMMM'сарын' d'өдөр'","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/mr.json b/packages/intl/lib/src/data/dates/symbols/mr.json
index 24d52b0..51dd9da 100644
--- a/packages/intl/lib/src/data/dates/symbols/mr.json
+++ b/packages/intl/lib/src/data/dates/symbols/mr.json
@@ -1 +1 @@
-{"NAME":"mr","ERAS":["ईसापूर्व","सन"],"ERANAMES":["ईसवीसनपूर्व","ईसवीसन"],"NARROWMONTHS":["जा","फे","मा","ए","मे","जू","जु","ऑ","स","ऑ","नो","डि"],"STANDALONENARROWMONTHS":["जा","फे","मा","ए","मे","जू","जु","ऑ","स","ऑ","नो","डि"],"MONTHS":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"STANDALONEMONTHS":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"SHORTMONTHS":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"],"STANDALONESHORTMONTHS":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"],"WEEKDAYS":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"STANDALONEWEEKDAYS":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"SHORTWEEKDAYS":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"NARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"STANDALONENARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"SHORTQUARTERS":["ति1","ति2","ति3","ति4"],"QUARTERS":["प्रथम तिमाही","द्वितीय तिमाही","तृतीय तिमाही","चतुर्थ तिमाही"],"AMPMS":["[AM]","[PM]"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'रोजी' {0}","{1} 'रोजी' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"mr","ERAS":["इ. स. पू.","इ. स."],"ERANAMES":["ईसवीसनपूर्व","ईसवीसन"],"NARROWMONTHS":["जा","फे","मा","ए","मे","जू","जु","ऑ","स","ऑ","नो","डि"],"STANDALONENARROWMONTHS":["जा","फे","मा","ए","मे","जू","जु","ऑ","स","ऑ","नो","डि"],"MONTHS":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"STANDALONEMONTHS":["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],"SHORTMONTHS":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"],"STANDALONESHORTMONTHS":["जाने","फेब्रु","मार्च","एप्रि","मे","जून","जुलै","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें"],"WEEKDAYS":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"STANDALONEWEEKDAYS":["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],"SHORTWEEKDAYS":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["रवि","सोम","मंगळ","बुध","गुरु","शुक्र","शनि"],"NARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"STANDALONENARROWWEEKDAYS":["र","सो","मं","बु","गु","शु","श"],"SHORTQUARTERS":["ति१","ति२","ति३","ति४"],"QUARTERS":["प्रथम तिमाही","द्वितीय तिमाही","तृतीय तिमाही","चतुर्थ तिमाही"],"AMPMS":["म.पू.","म.उ."],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} रोजी {0}","{1} रोजी {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/mt.json b/packages/intl/lib/src/data/dates/symbols/mt.json
index fd923ea..f1ac92f 100644
--- a/packages/intl/lib/src/data/dates/symbols/mt.json
+++ b/packages/intl/lib/src/data/dates/symbols/mt.json
@@ -1 +1 @@
-{"NAME":"mt","ERAS":["QK","WK"],"ERANAMES":["Qabel Kristu","Wara Kristu"],"NARROWMONTHS":["J","F","M","A","M","Ġ","L","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","Ġ","L","A","S","O","N","D"],"MONTHS":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"STANDALONEMONTHS":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"SHORTMONTHS":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],"STANDALONESHORTMONTHS":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],"WEEKDAYS":["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],"STANDALONEWEEKDAYS":["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],"SHORTWEEKDAYS":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"STANDALONESHORTWEEKDAYS":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"NARROWWEEKDAYS":["Ħ","T","T","E","Ħ","Ġ","S"],"STANDALONENARROWWEEKDAYS":["Ħ","T","T","E","Ħ","Ġ","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["K1","K2","K3","K4"],"AMPMS":["QN","WN"],"DATEFORMATS":["EEEE, d 'ta'’ MMMM y","d 'ta'’ MMMM y","dd MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"mt","ERAS":["QK","WK"],"ERANAMES":["Qabel Kristu","Wara Kristu"],"NARROWMONTHS":["J","F","M","A","M","Ġ","L","A","S","O","N","D"],"STANDALONENARROWMONTHS":["Jn","Fr","Mz","Ap","Mj","Ġn","Lj","Aw","St","Ob","Nv","Dċ"],"MONTHS":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"STANDALONEMONTHS":["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru"],"SHORTMONTHS":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],"STANDALONESHORTMONTHS":["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Aww","Set","Ott","Nov","Diċ"],"WEEKDAYS":["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],"STANDALONEWEEKDAYS":["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],"SHORTWEEKDAYS":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"STANDALONESHORTWEEKDAYS":["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],"NARROWWEEKDAYS":["Ħd","T","Tl","Er","Ħm","Ġm","Sb"],"STANDALONENARROWWEEKDAYS":["Ħd","Tn","Tl","Er","Ħm","Ġm","Sb"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1el kwart","2ni kwart","3et kwart","4ba’ kwart"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d 'ta'’ MMMM y","d 'ta'’ MMMM y","dd MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/my.json b/packages/intl/lib/src/data/dates/symbols/my.json
index 5e8d828..ba54355 100644
--- a/packages/intl/lib/src/data/dates/symbols/my.json
+++ b/packages/intl/lib/src/data/dates/symbols/my.json
@@ -1 +1 @@
-{"NAME":"my","ERAS":["ဘီစီ","အေဒီ"],"ERANAMES":["ခရစ်တော် မပေါ်မီကာလ","ခရစ်တော် ပေါ်ထွန်းပြီးကာလ"],"NARROWMONTHS":["ဇ","ဖ","မ","ဧ","မ","ဇ","ဇ","ဩ","စ","အ","န","ဒ"],"STANDALONENARROWMONTHS":["ဇ","ဖ","မ","ဧ","မ","ဇ","ဇ","ဩ","စ","အ","န","ဒ"],"MONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"STANDALONEMONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"SHORTMONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"STANDALONESHORTMONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"WEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"STANDALONEWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"SHORTWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"STANDALONESHORTWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"NARROWWEEKDAYS":["တ","တ","အ","ဗ","က","သ","စ"],"STANDALONENARROWWEEKDAYS":["တ","တ","အ","ဗ","က","သ","စ"],"SHORTQUARTERS":["ပထမ သုံးလပတ်","ဒုတိယ သုံးလပတ်","တတိယ သုံးလပတ်","စတုတ္ထ သုံးလပတ်"],"QUARTERS":["ပထမ သုံးလပတ်","ဒုတိယ သုံးလပတ်","တတိယ သုံးလပတ်","စတုတ္ထ သုံးလပတ်"],"AMPMS":["နံနက်","ညနေ"],"DATEFORMATS":["EEEE, y MMMM dd","y MMMM d","y MMM d","yy/MM/dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}မှာ {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"my","ERAS":["ဘီစီ","အေဒီ"],"ERANAMES":["ခရစ်တော် မပေါ်မီနှစ်","ခရစ်နှစ်"],"NARROWMONTHS":["ဇ","ဖ","မ","ဧ","မ","ဇ","ဇ","ဩ","စ","အ","န","ဒ"],"STANDALONENARROWMONTHS":["ဇ","ဖ","မ","ဧ","မ","ဇ","ဇ","ဩ","စ","အ","န","ဒ"],"MONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"STANDALONEMONTHS":["ဇန်နဝါရီ","ဖေဖော်ဝါရီ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ"],"SHORTMONTHS":["ဇန်","ဖေ","မတ်","ဧ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"],"STANDALONESHORTMONTHS":["ဇန်","ဖေ","မတ်","ဧ","မေ","ဇွန်","ဇူ","ဩ","စက်","အောက်","နို","ဒီ"],"WEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"STANDALONEWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"SHORTWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"STANDALONESHORTWEEKDAYS":["တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ"],"NARROWWEEKDAYS":["တ","တ","အ","ဗ","က","သ","စ"],"STANDALONENARROWWEEKDAYS":["တ","တ","အ","ဗ","က","သ","စ"],"SHORTQUARTERS":["ပထမ သုံးလပတ်","ဒုတိယ သုံးလပတ်","တတိယ သုံးလပတ်","စတုတ္ထ သုံးလပတ်"],"QUARTERS":["ပထမ သုံးလပတ်","ဒုတိယ သုံးလပတ်","တတိယ သုံးလပတ်","စတုတ္ထ သုံးလပတ်"],"AMPMS":["နံနက်","ညနေ"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd-MM-yy"],"TIMEFORMATS":["zzzz HH:mm:ss","z HH:mm:ss","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/nb.json b/packages/intl/lib/src/data/dates/symbols/nb.json
index 390939a..e3f569a 100644
--- a/packages/intl/lib/src/data/dates/symbols/nb.json
+++ b/packages/intl/lib/src/data/dates/symbols/nb.json
@@ -1 +1 @@
-{"NAME":"nb","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["f.Kr.","e.Kr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["sø.","ma.","ti.","on.","to.","fr.","lø."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl.' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"nb","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["før Kristus","etter Kristus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl'. {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ne.json b/packages/intl/lib/src/data/dates/symbols/ne.json
index f8d374b..3d7a6f0 100644
--- a/packages/intl/lib/src/data/dates/symbols/ne.json
+++ b/packages/intl/lib/src/data/dates/symbols/ne.json
@@ -1 +1 @@
-{"NAME":"ne","ERAS":["ईसा पूर्व","सन्"],"ERANAMES":["ईसा पूर्व","सन्"],"NARROWMONTHS":["१","२","३","४","५","६","७","८","९","१०","११","१२"],"STANDALONENARROWMONTHS":["१","२","३","४","५","६","७","८","९","१०","११","१२"],"MONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"STANDALONEMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"SHORTMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"STANDALONESHORTMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"WEEKDAYS":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"STANDALONEWEEKDAYS":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहीबार","शुक्रबार","शनिबार"],"SHORTWEEKDAYS":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],"NARROWWEEKDAYS":["आ","सो","म","बु","बि","शु","श"],"STANDALONENARROWWEEKDAYS":["आ","सो","म","बु","बि","शु","श"],"SHORTQUARTERS":["पहिलो सत्र","दोस्रो सत्र","तेस्रो सत्र","चौथो सत्र"],"QUARTERS":["पहिलो सत्र","दोस्रो सत्र","तेस्रो सत्र","चौथो सत्र"],"AMPMS":["पूर्व मध्यान्ह","उत्तर मध्यान्ह"],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"ne","ERAS":["ईसा पूर्व","सन्"],"ERANAMES":["ईसा पूर्व","सन्"],"NARROWMONTHS":["१","२","३","४","५","६","७","८","९","१०","११","१२"],"STANDALONENARROWMONTHS":["१","२","३","४","५","६","७","८","९","१०","११","१२"],"MONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मई","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"STANDALONEMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"SHORTMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"STANDALONESHORTMONTHS":["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जुन","जुलाई","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर"],"WEEKDAYS":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],"STANDALONEWEEKDAYS":["आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार"],"SHORTWEEKDAYS":["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"],"STANDALONESHORTWEEKDAYS":["आइत","सोम","मङ्गल","बुध","बिहि","शुक्र","शनि"],"NARROWWEEKDAYS":["आ","सो","म","बु","बि","शु","श"],"STANDALONENARROWWEEKDAYS":["आ","सो","म","बु","बि","शु","श"],"SHORTQUARTERS":["पहिलो सत्र","दोस्रो सत्र","तेस्रो सत्र","चौथो सत्र"],"QUARTERS":["पहिलो सत्र","दोस्रो सत्र","तेस्रो सत्र","चौथो सत्र"],"AMPMS":["पूर्वाह्न","अपराह्न"],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/nl.json b/packages/intl/lib/src/data/dates/symbols/nl.json
index 823a2db..b0f8ae7 100644
--- a/packages/intl/lib/src/data/dates/symbols/nl.json
+++ b/packages/intl/lib/src/data/dates/symbols/nl.json
@@ -1 +1 @@
-{"NAME":"nl","ERAS":["v.Chr.","n.Chr."],"ERANAMES":["Voor Christus","na Christus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"STANDALONEMONTHS":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],"WEEKDAYS":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"STANDALONEWEEKDAYS":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"SHORTWEEKDAYS":["zo","ma","di","wo","do","vr","za"],"STANDALONESHORTWEEKDAYS":["zo","ma","di","wo","do","vr","za"],"NARROWWEEKDAYS":["Z","M","D","W","D","V","Z"],"STANDALONENARROWWEEKDAYS":["Z","M","D","W","D","V","Z"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd-MM-yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"nl","ERAS":["v.Chr.","n.Chr."],"ERANAMES":["voor Christus","na Christus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"STANDALONEMONTHS":["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan.","feb.","mrt.","apr.","mei","jun.","jul.","aug.","sep.","okt.","nov.","dec."],"WEEKDAYS":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"STANDALONEWEEKDAYS":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"SHORTWEEKDAYS":["zo","ma","di","wo","do","vr","za"],"STANDALONESHORTWEEKDAYS":["zo","ma","di","wo","do","vr","za"],"NARROWWEEKDAYS":["Z","M","D","W","D","V","Z"],"STANDALONENARROWWEEKDAYS":["Z","M","D","W","D","V","Z"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1e kwartaal","2e kwartaal","3e kwartaal","4e kwartaal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","dd-MM-yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'om' {0}","{1} 'om' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/no.json b/packages/intl/lib/src/data/dates/symbols/no.json
index b219bb3..b0dd3b3 100644
--- a/packages/intl/lib/src/data/dates/symbols/no.json
+++ b/packages/intl/lib/src/data/dates/symbols/no.json
@@ -1 +1 @@
-{"NAME":"no","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["f.Kr.","e.Kr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["sø.","ma.","ti.","on.","to.","fr.","lø."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl.' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"no","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["før Kristus","etter Kristus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl'. {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/no_NO.json b/packages/intl/lib/src/data/dates/symbols/no_NO.json
index eeeacfa..d41d713 100644
--- a/packages/intl/lib/src/data/dates/symbols/no_NO.json
+++ b/packages/intl/lib/src/data/dates/symbols/no_NO.json
@@ -1 +1 @@
-{"NAME":"no_NO","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["f.Kr.","e.Kr."],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["sø.","ma.","ti.","on.","to.","fr.","lø."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl.' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"no_NO","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["før Kristus","etter Kristus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"STANDALONEMONTHS":["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","mai","jun.","jul.","aug.","sep.","okt.","nov.","des."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],"WEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"STANDALONEWEEKDAYS":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"SHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"STANDALONESHORTWEEKDAYS":["søn.","man.","tir.","ons.","tor.","fre.","lør."],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1. kvartal","2. kvartal","3. kvartal","4. kvartal"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE d. MMMM y","d. MMMM y","d. MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} 'kl'. {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/or.json b/packages/intl/lib/src/data/dates/symbols/or.json
index 35df032..20cf11f 100644
--- a/packages/intl/lib/src/data/dates/symbols/or.json
+++ b/packages/intl/lib/src/data/dates/symbols/or.json
@@ -1 +1 @@
-{"NAME":"or","ERAS":["BCE","CE"],"ERANAMES":["BCE","CE"],"NARROWMONTHS":["ଜା","ଫେ","ମା","ଅ","ମେ","ଜୁ","ଜୁ","ଅ","ସେ","ଅ","ନ","ଡି"],"STANDALONENARROWMONTHS":["ଜା","ଫେ","ମା","ଅ","ମେ","ଜୁ","ଜୁ","ଅ","ସେ","ଅ","ନ","ଡି"],"MONTHS":["ଜାନୁଆରୀ","ଫେବ୍ରୁୟାରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମେ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"STANDALONEMONTHS":["ଜାନୁଆରୀ","ଫେବ୍ରୁୟାରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମେ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"SHORTMONTHS":["ଜାନୁଆରୀ","ଫେବ୍ରୁୟାରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମେ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"STANDALONESHORTMONTHS":["ଜାନୁଆରୀ","ଫେବ୍ରୁୟାରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମେ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"WEEKDAYS":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"STANDALONEWEEKDAYS":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"SHORTWEEKDAYS":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"STANDALONESHORTWEEKDAYS":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"NARROWWEEKDAYS":["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"],"STANDALONENARROWWEEKDAYS":["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Q1","Q2","Q3","Q4"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d-M-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"or","ERAS":["BCE","CE"],"ERANAMES":["BCE","CE"],"NARROWMONTHS":["ଜା","ଫେ","ମା","ଅ","ମଇ","ଜୁ","ଜୁ","ଅ","ସେ","ଅ","ନ","ଡି"],"STANDALONENARROWMONTHS":["ଜା","ଫେ","ମା","ଅ","ମଇ","ଜୁ","ଜୁ","ଅ","ସେ","ଅ","ନ","ଡି"],"MONTHS":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"STANDALONEMONTHS":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"SHORTMONTHS":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"STANDALONESHORTMONTHS":["ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ମଇ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର"],"WEEKDAYS":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"STANDALONEWEEKDAYS":["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],"SHORTWEEKDAYS":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"STANDALONESHORTWEEKDAYS":["ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି"],"NARROWWEEKDAYS":["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"],"STANDALONENARROWWEEKDAYS":["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Q1","Q2","Q3","Q4"],"AMPMS":["am","pm"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d-M-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/pa.json b/packages/intl/lib/src/data/dates/symbols/pa.json
index 49a3ce1..55bc6a8 100644
--- a/packages/intl/lib/src/data/dates/symbols/pa.json
+++ b/packages/intl/lib/src/data/dates/symbols/pa.json
@@ -1 +1 @@
-{"NAME":"pa","ERAS":["ਈ. ਪੂ.","ਸੰਨ"],"ERANAMES":["ਈ. ਪੂ.","ਸੰਨ"],"NARROWMONTHS":["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],"STANDALONENARROWMONTHS":["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],"MONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"STANDALONEMONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"SHORTMONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"STANDALONESHORTMONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"WEEKDAYS":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨੀਵਾਰ"],"STANDALONEWEEKDAYS":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨੀਵਾਰ"],"SHORTWEEKDAYS":["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁਧ.","ਵੀਰ.","ਸ਼ੁੱਕਰ.","ਸ਼ਨੀ."],"STANDALONESHORTWEEKDAYS":["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁਧ.","ਵੀਰ.","ਸ਼ੁੱਕਰ.","ਸ਼ਨੀ."],"NARROWWEEKDAYS":["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],"STANDALONENARROWWEEKDAYS":["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],"SHORTQUARTERS":["ਪਊਆ","ਅੱਧਾ","ਪੌਣਾ","ਪੂਰਾ"],"QUARTERS":["ਪਊਆ","ਅੱਧਾ","ਪੌਣਾ","ਪੂਰਾ"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"pa","ERAS":["ਈ. ਪੂ.","ਸੰਨ"],"ERANAMES":["ਈਸਵੀ ਪੂਰਵ","ਈਸਵੀ ਸੰਨ"],"NARROWMONTHS":["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],"STANDALONENARROWMONTHS":["ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਅ","ਸ","ਅ","ਨ","ਦ"],"MONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"STANDALONEMONTHS":["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],"SHORTMONTHS":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"],"STANDALONESHORTMONTHS":["ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ"],"WEEKDAYS":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"STANDALONEWEEKDAYS":["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],"SHORTWEEKDAYS":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"STANDALONESHORTWEEKDAYS":["ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ"],"NARROWWEEKDAYS":["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],"STANDALONENARROWWEEKDAYS":["ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼"],"SHORTQUARTERS":["ਤਿਮਾਹੀ1","ਤਿਮਾਹੀ2","ਤਿਮਾਹੀ3","ਤਿਮਾਹੀ4"],"QUARTERS":["ਪਹਿਲੀ ਤਿਮਾਹੀ","ਦੂਜੀ ਤਿਮਾਹੀ","ਤੀਜੀ ਤਿਮਾਹੀ","ਚੌਥੀ ਤਿਮਾਹੀ"],"AMPMS":["ਪੂ.ਦੁ.","ਬਾ.ਦੁ."],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/pl.json b/packages/intl/lib/src/data/dates/symbols/pl.json
index de4d1a2..ae58b67 100644
--- a/packages/intl/lib/src/data/dates/symbols/pl.json
+++ b/packages/intl/lib/src/data/dates/symbols/pl.json
@@ -1 +1 @@
-{"NAME":"pl","ERAS":["p.n.e.","n.e."],"ERANAMES":["p.n.e.","n.e."],"NARROWMONTHS":["s","l","m","k","m","c","l","s","w","p","l","g"],"STANDALONENARROWMONTHS":["s","l","m","k","m","c","l","s","w","p","l","g"],"MONTHS":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"STANDALONEMONTHS":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"SHORTMONTHS":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"STANDALONESHORTMONTHS":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"WEEKDAYS":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"STANDALONEWEEKDAYS":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"SHORTWEEKDAYS":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"STANDALONESHORTWEEKDAYS":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"NARROWWEEKDAYS":["N","P","W","Ś","C","P","S"],"STANDALONENARROWWEEKDAYS":["N","P","W","Ś","C","P","S"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["I kwartał","II kwartał","III kwartał","IV kwartał"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"pl","ERAS":["p.n.e.","n.e."],"ERANAMES":["przed naszą erą","naszej ery"],"NARROWMONTHS":["s","l","m","k","m","c","l","s","w","p","l","g"],"STANDALONENARROWMONTHS":["S","L","M","K","M","C","L","S","W","P","L","G"],"MONTHS":["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia"],"STANDALONEMONTHS":["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],"SHORTMONTHS":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"STANDALONESHORTMONTHS":["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],"WEEKDAYS":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"STANDALONEWEEKDAYS":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"SHORTWEEKDAYS":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"STANDALONESHORTWEEKDAYS":["niedz.","pon.","wt.","śr.","czw.","pt.","sob."],"NARROWWEEKDAYS":["n","p","w","ś","c","p","s"],"STANDALONENARROWWEEKDAYS":["N","P","W","Ś","C","P","S"],"SHORTQUARTERS":["I kw.","II kw.","III kw.","IV kw."],"QUARTERS":["I kwartał","II kwartał","III kwartał","IV kwartał"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/pt.json b/packages/intl/lib/src/data/dates/symbols/pt.json
index b842c89..993da5d 100644
--- a/packages/intl/lib/src/data/dates/symbols/pt.json
+++ b/packages/intl/lib/src/data/dates/symbols/pt.json
@@ -1 +1 @@
-{"NAME":"pt","ERAS":["a.C.","d.C."],"ERANAMES":["Antes de Cristo","Ano do Senhor"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"STANDALONEMONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"SHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"STANDALONESHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"STANDALONESHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"pt","ERAS":["a.C.","d.C."],"ERANAMES":["antes de Cristo","depois de Cristo"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"STANDALONEMONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"SHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"STANDALONESHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"STANDALONESHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d 'de' MMM 'de' y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/pt_BR.json b/packages/intl/lib/src/data/dates/symbols/pt_BR.json
index 90b63ae..fc02b93 100644
--- a/packages/intl/lib/src/data/dates/symbols/pt_BR.json
+++ b/packages/intl/lib/src/data/dates/symbols/pt_BR.json
@@ -1 +1 @@
-{"NAME":"pt_BR","ERAS":["a.C.","d.C."],"ERANAMES":["Antes de Cristo","Ano do Senhor"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"STANDALONEMONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"SHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"STANDALONESHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"STANDALONESHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"pt_BR","ERAS":["a.C.","d.C."],"ERANAMES":["antes de Cristo","depois de Cristo"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"STANDALONEMONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"SHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"STANDALONESHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"STANDALONESHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","d 'de' MMM 'de' y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/pt_PT.json b/packages/intl/lib/src/data/dates/symbols/pt_PT.json
index 94ba1c7..1676ad8 100644
--- a/packages/intl/lib/src/data/dates/symbols/pt_PT.json
+++ b/packages/intl/lib/src/data/dates/symbols/pt_PT.json
@@ -1 +1 @@
-{"NAME":"pt_PT","ERAS":["a.C.","d.C."],"ERANAMES":["Antes de Cristo","Ano do Senhor"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"STANDALONEMONTHS":["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],"SHORTMONTHS":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"STANDALONESHORTMONTHS":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"STANDALONESHORTWEEKDAYS":["dom","seg","ter","qua","qui","sex","sáb"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"AMPMS":["da manhã","da tarde"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'às' {0}","{1} 'às' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"pt_PT","ERAS":["a.C.","d.C."],"ERANAMES":["antes de Cristo","depois de Cristo"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"STANDALONEMONTHS":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"SHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"STANDALONESHORTMONTHS":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"WEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"STANDALONEWEEKDAYS":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"SHORTWEEKDAYS":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"STANDALONESHORTWEEKDAYS":["domingo","segunda","terça","quarta","quinta","sexta","sábado"],"NARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"STANDALONENARROWWEEKDAYS":["D","S","T","Q","Q","S","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"AMPMS":["da manhã","da tarde"],"DATEFORMATS":["EEEE, d 'de' MMMM 'de' y","d 'de' MMMM 'de' y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} 'às' {0}","{1} 'às' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ro.json b/packages/intl/lib/src/data/dates/symbols/ro.json
index 42838e3..2871a06 100644
--- a/packages/intl/lib/src/data/dates/symbols/ro.json
+++ b/packages/intl/lib/src/data/dates/symbols/ro.json
@@ -1 +1 @@
-{"NAME":"ro","ERAS":["î.Hr.","d.Hr."],"ERANAMES":["înainte de Hristos","după Hristos"],"NARROWMONTHS":["I","F","M","A","M","I","I","A","S","O","N","D"],"STANDALONENARROWMONTHS":["I","F","M","A","M","I","I","A","S","O","N","D"],"MONTHS":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"STANDALONEMONTHS":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"SHORTMONTHS":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"STANDALONESHORTMONTHS":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"WEEKDAYS":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"STANDALONEWEEKDAYS":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"SHORTWEEKDAYS":["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],"STANDALONESHORTWEEKDAYS":["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["trim. I","trim. II","trim. III","trim. IV"],"QUARTERS":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"ro","ERAS":["î.Hr.","d.Hr."],"ERANAMES":["înainte de Hristos","după Hristos"],"NARROWMONTHS":["I","F","M","A","M","I","I","A","S","O","N","D"],"STANDALONENARROWMONTHS":["I","F","M","A","M","I","I","A","S","O","N","D"],"MONTHS":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"STANDALONEMONTHS":["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],"SHORTMONTHS":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"STANDALONESHORTMONTHS":["ian.","feb.","mar.","apr.","mai","iun.","iul.","aug.","sept.","oct.","nov.","dec."],"WEEKDAYS":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"STANDALONEWEEKDAYS":["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"],"SHORTWEEKDAYS":["dum.","lun.","mar.","mie.","joi","vin.","sâm."],"STANDALONESHORTWEEKDAYS":["dum.","lun.","mar.","mie.","joi","vin.","sâm."],"NARROWWEEKDAYS":["D","L","M","M","J","V","S"],"STANDALONENARROWWEEKDAYS":["D","L","M","M","J","V","S"],"SHORTQUARTERS":["trim. I","trim. II","trim. III","trim. IV"],"QUARTERS":["trimestrul I","trimestrul al II-lea","trimestrul al III-lea","trimestrul al IV-lea"],"AMPMS":["a.m.","p.m."],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ru.json b/packages/intl/lib/src/data/dates/symbols/ru.json
index 3b9f286..7bdda06 100644
--- a/packages/intl/lib/src/data/dates/symbols/ru.json
+++ b/packages/intl/lib/src/data/dates/symbols/ru.json
@@ -1 +1 @@
-{"NAME":"ru","ERAS":["до н. э.","н. э."],"ERANAMES":["до н.э.","н.э."],"NARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"STANDALONENARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"MONTHS":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"STANDALONEMONTHS":["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],"SHORTMONTHS":["янв.","февр.","марта","апр.","мая","июня","июля","авг.","сент.","окт.","нояб.","дек."],"STANDALONESHORTMONTHS":["Янв.","Февр.","Март","Апр.","Май","Июнь","Июль","Авг.","Сент.","Окт.","Нояб.","Дек."],"WEEKDAYS":["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],"STANDALONEWEEKDAYS":["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],"SHORTWEEKDAYS":["вс","пн","вт","ср","чт","пт","сб"],"STANDALONESHORTWEEKDAYS":["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],"NARROWWEEKDAYS":["вс","пн","вт","ср","чт","пт","сб"],"STANDALONENARROWWEEKDAYS":["В","П","В","С","Ч","П","С"],"SHORTQUARTERS":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"QUARTERS":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y 'г'.","d MMMM y 'г'.","d MMM y 'г'.","dd.MM.yy"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"ru","ERAS":["до н. э.","н. э."],"ERANAMES":["до Рождества Христова","от Рождества Христова"],"NARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"STANDALONENARROWMONTHS":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"MONTHS":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"STANDALONEMONTHS":["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"],"SHORTMONTHS":["янв.","февр.","мар.","апр.","мая","июн.","июл.","авг.","сент.","окт.","нояб.","дек."],"STANDALONESHORTMONTHS":["янв.","февр.","март","апр.","май","июнь","июль","авг.","сент.","окт.","нояб.","дек."],"WEEKDAYS":["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],"STANDALONEWEEKDAYS":["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],"SHORTWEEKDAYS":["вс","пн","вт","ср","чт","пт","сб"],"STANDALONESHORTWEEKDAYS":["вс","пн","вт","ср","чт","пт","сб"],"NARROWWEEKDAYS":["вс","пн","вт","ср","чт","пт","сб"],"STANDALONENARROWWEEKDAYS":["В","П","В","С","Ч","П","С"],"SHORTQUARTERS":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"QUARTERS":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"AMPMS":["ДП","ПП"],"DATEFORMATS":["EEEE, d MMMM y 'г'.","d MMMM y 'г'.","d MMM y 'г'.","dd.MM.y"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/si.json b/packages/intl/lib/src/data/dates/symbols/si.json
index 381e408..bc23750 100644
--- a/packages/intl/lib/src/data/dates/symbols/si.json
+++ b/packages/intl/lib/src/data/dates/symbols/si.json
@@ -1 +1 @@
-{"NAME":"si","ERAS":["ක්‍රි.පූ.","ක්‍රි.ව."],"ERANAMES":["ක්‍රිස්තු පූර්‍ව","ක්‍රිස්තු වර්‍ෂ"],"NARROWMONTHS":["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],"STANDALONENARROWMONTHS":["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],"MONTHS":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"STANDALONEMONTHS":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"SHORTMONTHS":["ජන","පෙබ","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],"STANDALONESHORTMONTHS":["ජන","පෙබ","මාර්","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],"WEEKDAYS":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"STANDALONEWEEKDAYS":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"SHORTWEEKDAYS":["ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන"],"STANDALONESHORTWEEKDAYS":["ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන"],"NARROWWEEKDAYS":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"STANDALONENARROWWEEKDAYS":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"SHORTQUARTERS":["කාර්:1","කාර්:2","කාර්:3","කාර්:4"],"QUARTERS":["1 වන කාර්තුව","2 වන කාර්තුව","3 වන කාර්තුව","4 වන කාර්තුව"],"AMPMS":["පෙ.ව.","ප.ව."],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["a h.mm.ss zzzz","a h.mm.ss z","a h.mm.ss","a h.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"si","ERAS":["ක්‍රි.පූ.","ක්‍රි.ව."],"ERANAMES":["ක්‍රිස්තු පූර්ව","ක්‍රිස්තු වර්ෂ"],"NARROWMONTHS":["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],"STANDALONENARROWMONTHS":["ජ","පෙ","මා","අ","මැ","ජූ","ජූ","අ","සැ","ඔ","නෙ","දෙ"],"MONTHS":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"STANDALONEMONTHS":["ජනවාරි","පෙබරවාරි","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්"],"SHORTMONTHS":["ජන","පෙබ","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],"STANDALONESHORTMONTHS":["ජන","පෙබ","මාර්","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ"],"WEEKDAYS":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"STANDALONEWEEKDAYS":["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],"SHORTWEEKDAYS":["ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන"],"STANDALONESHORTWEEKDAYS":["ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන"],"NARROWWEEKDAYS":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"STANDALONENARROWWEEKDAYS":["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"],"SHORTQUARTERS":["කාර්:1","කාර්:2","කාර්:3","කාර්:4"],"QUARTERS":["1 වන කාර්තුව","2 වන කාර්තුව","3 වන කාර්තුව","4 වන කාර්තුව"],"AMPMS":["පෙ.ව.","ප.ව."],"DATEFORMATS":["y MMMM d, EEEE","y MMMM d","y MMM d","y-MM-dd"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sk.json b/packages/intl/lib/src/data/dates/symbols/sk.json
index bf5d72d..556b9a4 100644
--- a/packages/intl/lib/src/data/dates/symbols/sk.json
+++ b/packages/intl/lib/src/data/dates/symbols/sk.json
@@ -1 +1 @@
-{"NAME":"sk","ERAS":["pred n.l.","n.l."],"ERANAMES":["pred n.l.","n.l."],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra"],"STANDALONEMONTHS":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"SHORTMONTHS":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"WEEKDAYS":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"STANDALONEWEEKDAYS":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"SHORTWEEKDAYS":["ne","po","ut","st","št","pi","so"],"STANDALONESHORTWEEKDAYS":["ne","po","ut","st","št","pi","so"],"NARROWWEEKDAYS":["N","P","U","S","Š","P","S"],"STANDALONENARROWWEEKDAYS":["N","P","U","S","Š","P","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","d.M.y","d.M.y"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sk","ERAS":["pred Kr.","po Kr."],"ERANAMES":["pred Kristom","po Kristovi"],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra"],"STANDALONEMONTHS":["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],"SHORTMONTHS":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec"],"WEEKDAYS":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"STANDALONEWEEKDAYS":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"SHORTWEEKDAYS":["ne","po","ut","st","št","pi","so"],"STANDALONESHORTWEEKDAYS":["ne","po","ut","st","št","pi","so"],"NARROWWEEKDAYS":["n","p","u","s","š","p","s"],"STANDALONENARROWWEEKDAYS":["n","p","u","s","š","p","s"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d. MMMM y","d. MMMM y","d. M. y","d. M. y"],"TIMEFORMATS":["H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sl.json b/packages/intl/lib/src/data/dates/symbols/sl.json
index ff41ebb..355e40a 100644
--- a/packages/intl/lib/src/data/dates/symbols/sl.json
+++ b/packages/intl/lib/src/data/dates/symbols/sl.json
@@ -1 +1 @@
-{"NAME":"sl","ERAS":["pr. n. št.","po Kr."],"ERANAMES":["pred našim štetjem","naše štetje"],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"STANDALONEMONTHS":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"WEEKDAYS":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"STANDALONEWEEKDAYS":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"SHORTWEEKDAYS":["ned.","pon.","tor.","sre.","čet.","pet.","sob."],"STANDALONESHORTWEEKDAYS":["ned","pon","tor","sre","čet","pet","sob"],"NARROWWEEKDAYS":["n","p","t","s","č","p","s"],"STANDALONENARROWWEEKDAYS":["n","p","t","s","č","p","s"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"AMPMS":["dop.","pop."],"DATEFORMATS":["EEEE, dd. MMMM y","dd. MMMM y","d. MMM y","d. MM. yy"],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sl","ERAS":["pr. Kr.","po Kr."],"ERANAMES":["pred Kristusom","po Kristusu"],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"STANDALONEMONTHS":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan.","feb.","mar.","apr.","maj","jun.","jul.","avg.","sep.","okt.","nov.","dec."],"WEEKDAYS":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"STANDALONEWEEKDAYS":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"SHORTWEEKDAYS":["ned.","pon.","tor.","sre.","čet.","pet.","sob."],"STANDALONESHORTWEEKDAYS":["ned.","pon.","tor.","sre.","čet.","pet.","sob."],"NARROWWEEKDAYS":["n","p","t","s","č","p","s"],"STANDALONENARROWWEEKDAYS":["n","p","t","s","č","p","s"],"SHORTQUARTERS":["1. čet.","2. čet.","3. čet.","4. čet."],"QUARTERS":["1. četrtletje","2. četrtletje","3. četrtletje","4. četrtletje"],"AMPMS":["dop.","pop."],"DATEFORMATS":["EEEE, dd. MMMM y","dd. MMMM y","d. MMM y","d. MM. yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sq.json b/packages/intl/lib/src/data/dates/symbols/sq.json
index d35b59f..cb3f13e 100644
--- a/packages/intl/lib/src/data/dates/symbols/sq.json
+++ b/packages/intl/lib/src/data/dates/symbols/sq.json
@@ -1 +1 @@
-{"NAME":"sq","ERAS":["p.e.r.","e.r."],"ERANAMES":["para erës së re","erës së re"],"NARROWMONTHS":["J","S","M","P","M","Q","K","G","S","T","N","D"],"STANDALONENARROWMONTHS":["J","S","M","P","M","Q","K","G","S","T","N","D"],"MONTHS":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"STANDALONEMONTHS":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"SHORTMONTHS":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"],"STANDALONESHORTMONTHS":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"],"WEEKDAYS":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"STANDALONEWEEKDAYS":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"SHORTWEEKDAYS":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"STANDALONESHORTWEEKDAYS":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"NARROWWEEKDAYS":["D","H","M","M","E","P","S"],"STANDALONENARROWWEEKDAYS":["D","H","M","M","E","P","S"],"SHORTQUARTERS":["T1","T2","T3","T4"],"QUARTERS":["tremujori i parë","tremujori i dytë","tremujori i tretë","tremujori i katërt"],"AMPMS":["paradite","pasdite"],"DATEFORMATS":["EEEE, dd MMMM y","dd MMMM y","dd/MM/y","dd/MM/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'në' {0}","{1} 'në' {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sq","ERAS":["p.K.","mb.K."],"ERANAMES":["para Krishtit","mbas Krishtit"],"NARROWMONTHS":["j","s","m","p","m","q","k","g","s","t","n","d"],"STANDALONENARROWMONTHS":["J","S","M","P","M","Q","K","G","S","T","N","D"],"MONTHS":["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],"STANDALONEMONTHS":["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],"SHORTMONTHS":["jan","shk","mar","pri","maj","qer","kor","gsh","sht","tet","nën","dhj"],"STANDALONESHORTMONTHS":["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"],"WEEKDAYS":["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],"STANDALONEWEEKDAYS":["E diel","E hënë","E martë","E mërkurë","E enjte","E premte","E shtunë"],"SHORTWEEKDAYS":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"STANDALONESHORTWEEKDAYS":["Die","Hën","Mar","Mër","Enj","Pre","Sht"],"NARROWWEEKDAYS":["D","H","M","M","E","P","S"],"STANDALONENARROWWEEKDAYS":["D","H","M","M","E","P","S"],"SHORTQUARTERS":["tremujori I","tremujori II","tremujori III","tremujori IV"],"QUARTERS":["tremujori i parë","tremujori i dytë","tremujori i tretë","tremujori i katërt"],"AMPMS":["e paradites","e pasdites"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","d.M.yy"],"TIMEFORMATS":["h:mm:ss a, zzzz","h:mm:ss a, z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'në' {0}","{1} 'në' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sr.json b/packages/intl/lib/src/data/dates/symbols/sr.json
index 52fdb49..3155524 100644
--- a/packages/intl/lib/src/data/dates/symbols/sr.json
+++ b/packages/intl/lib/src/data/dates/symbols/sr.json
@@ -1 +1 @@
-{"NAME":"sr","ERAS":["п. н. е.","н. е."],"ERANAMES":["Пре нове ере","Нове ере"],"NARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"STANDALONENARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"MONTHS":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"STANDALONEMONTHS":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"SHORTMONTHS":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],"STANDALONESHORTMONTHS":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],"WEEKDAYS":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"STANDALONEWEEKDAYS":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"SHORTWEEKDAYS":["нед","пон","уто","сре","чет","пет","суб"],"STANDALONESHORTWEEKDAYS":["нед","пон","уто","сре","чет","пет","суб"],"NARROWWEEKDAYS":["н","п","у","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","у","с","ч","п","с"],"SHORTQUARTERS":["К1","К2","К3","К4"],"QUARTERS":["Прво тромесечје","Друго тромесечје","Треће тромесечје","Четврто тромесечје"],"AMPMS":["пре подне","поподне"],"DATEFORMATS":["EEEE, dd. MMMM y.","dd. MMMM y.","dd.MM.y.","d.M.yy."],"TIMEFORMATS":["HH.mm.ss zzzz","HH.mm.ss z","HH.mm.ss","HH.mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sr","ERAS":["п. н. е.","н. е."],"ERANAMES":["пре нове ере","нове ере"],"NARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"STANDALONENARROWMONTHS":["ј","ф","м","а","м","ј","ј","а","с","о","н","д"],"MONTHS":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"STANDALONEMONTHS":["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],"SHORTMONTHS":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],"STANDALONESHORTMONTHS":["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],"WEEKDAYS":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"STANDALONEWEEKDAYS":["недеља","понедељак","уторак","среда","четвртак","петак","субота"],"SHORTWEEKDAYS":["нед","пон","уто","сре","чет","пет","суб"],"STANDALONESHORTWEEKDAYS":["нед","пон","уто","сре","чет","пет","суб"],"NARROWWEEKDAYS":["н","п","у","с","ч","п","с"],"STANDALONENARROWWEEKDAYS":["н","п","у","с","ч","п","с"],"SHORTQUARTERS":["К1","К2","К3","К4"],"QUARTERS":["први квартал","други квартал","трећи квартал","четврти квартал"],"AMPMS":["пре подне","по подне"],"DATEFORMATS":["EEEE, dd. MMMM y.","dd. MMMM y.","dd.MM.y.","d.M.yy."],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sr_Latn.json b/packages/intl/lib/src/data/dates/symbols/sr_Latn.json
new file mode 100644
index 0000000..c1d11b4
--- /dev/null
+++ b/packages/intl/lib/src/data/dates/symbols/sr_Latn.json
@@ -0,0 +1 @@
+{"NAME":"sr_Latn","ERAS":["p. n. e.","n. e."],"ERANAMES":["pre nove ere","nove ere"],"NARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"STANDALONENARROWMONTHS":["j","f","m","a","m","j","j","a","s","o","n","d"],"MONTHS":["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],"STANDALONEMONTHS":["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],"SHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"STANDALONESHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],"WEEKDAYS":["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],"STANDALONEWEEKDAYS":["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],"SHORTWEEKDAYS":["ned","pon","uto","sre","čet","pet","sub"],"STANDALONESHORTWEEKDAYS":["ned","pon","uto","sre","čet","pet","sub"],"NARROWWEEKDAYS":["n","p","u","s","č","p","s"],"STANDALONENARROWWEEKDAYS":["n","p","u","s","č","p","s"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["prvi kvartal","drugi kvartal","treći kvartal","četvrti kvartal"],"AMPMS":["pre podne","po podne"],"DATEFORMATS":["EEEE, dd. MMMM y.","dd. MMMM y.","dd.MM.y.","d.M.yy."],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sv.json b/packages/intl/lib/src/data/dates/symbols/sv.json
index 6d9a7e7..252303e 100644
--- a/packages/intl/lib/src/data/dates/symbols/sv.json
+++ b/packages/intl/lib/src/data/dates/symbols/sv.json
@@ -1 +1 @@
-{"NAME":"sv","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["före Kristus","efter Kristus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"STANDALONEMONTHS":["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],"SHORTMONTHS":["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],"STANDALONESHORTMONTHS":["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],"WEEKDAYS":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"STANDALONEWEEKDAYS":["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],"SHORTWEEKDAYS":["sön","mån","tis","ons","tors","fre","lör"],"STANDALONESHORTWEEKDAYS":["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"AMPMS":["fm","em"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","y-MM-dd"],"TIMEFORMATS":["'kl'. HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sv","ERAS":["f.Kr.","e.Kr."],"ERANAMES":["före Kristus","efter Kristus"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"STANDALONEMONTHS":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"SHORTMONTHS":["jan.","feb.","mars","apr.","maj","juni","juli","aug.","sep.","okt.","nov.","dec."],"STANDALONESHORTMONTHS":["jan.","feb.","mars","apr.","maj","juni","juli","aug.","sep.","okt.","nov.","dec."],"WEEKDAYS":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"STANDALONEWEEKDAYS":["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],"SHORTWEEKDAYS":["sön","mån","tis","ons","tors","fre","lör"],"STANDALONESHORTWEEKDAYS":["sön","mån","tis","ons","tors","fre","lör"],"NARROWWEEKDAYS":["S","M","T","O","T","F","L"],"STANDALONENARROWWEEKDAYS":["S","M","T","O","T","F","L"],"SHORTQUARTERS":["K1","K2","K3","K4"],"QUARTERS":["1:a kvartalet","2:a kvartalet","3:e kvartalet","4:e kvartalet"],"AMPMS":["fm","em"],"DATEFORMATS":["EEEE d MMMM y","d MMMM y","d MMM y","y-MM-dd"],"TIMEFORMATS":["'kl'. HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":3,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/sw.json b/packages/intl/lib/src/data/dates/symbols/sw.json
index 0f6dc5a..db5dbc4 100644
--- a/packages/intl/lib/src/data/dates/symbols/sw.json
+++ b/packages/intl/lib/src/data/dates/symbols/sw.json
@@ -1 +1 @@
-{"NAME":"sw","ERAS":["KK","BK"],"ERANAMES":["Kabla ya Kristo","Baada ya Kristo"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"STANDALONEMONTHS":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"SHORTMONTHS":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],"WEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"STANDALONEWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"SHORTWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"STANDALONESHORTWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"NARROWWEEKDAYS":["2","3","4","5","A","I","1"],"STANDALONENARROWWEEKDAYS":["2","3","4","5","A","I","1"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Robo 1","Robo 2","Robo 3","Robo 4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"sw","ERAS":["KK","BK"],"ERANAMES":["Kabla ya Kristo","Baada ya Kristo"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"STANDALONEMONTHS":["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba"],"SHORTMONTHS":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],"STANDALONESHORTMONTHS":["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Des"],"WEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"STANDALONEWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"SHORTWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"STANDALONESHORTWEEKDAYS":["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["Robo ya 1","Robo ya 2","Robo ya 3","Robo ya 4"],"QUARTERS":["Robo ya 1","Robo ya 2","Robo ya 3","Robo ya 4"],"AMPMS":["Asubuhi","Mchana"],"DATEFORMATS":["EEEE, d MMMM y","d MMMM y","d MMM y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ta.json b/packages/intl/lib/src/data/dates/symbols/ta.json
index 8990827..29db845 100644
--- a/packages/intl/lib/src/data/dates/symbols/ta.json
+++ b/packages/intl/lib/src/data/dates/symbols/ta.json
@@ -1 +1 @@
-{"NAME":"ta","ERAS":["கி.மு.","கி.பி."],"ERANAMES":["கிறிஸ்துவுக்கு முன்","அனோ டோமினி"],"NARROWMONTHS":["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],"STANDALONENARROWMONTHS":["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],"MONTHS":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"STANDALONEMONTHS":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்டு","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"SHORTMONTHS":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],"STANDALONESHORTMONTHS":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],"WEEKDAYS":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"STANDALONEWEEKDAYS":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"SHORTWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"STANDALONESHORTWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"NARROWWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"STANDALONENARROWWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"SHORTQUARTERS":["காலாண்டு1","காலாண்டு2","காலாண்டு3","காலாண்டு4"],"QUARTERS":["முதல் காலாண்டு","இரண்டாம் காலாண்டு","மூன்றாம் காலாண்டு","நான்காம் காலாண்டு"],"AMPMS":["முற்பகல்","பிற்பகல்"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d-M-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ta","ERAS":["கி.மு.","கி.பி."],"ERANAMES":["கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி"],"NARROWMONTHS":["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],"STANDALONENARROWMONTHS":["ஜ","பி","மா","ஏ","மே","ஜூ","ஜூ","ஆ","செ","அ","ந","டி"],"MONTHS":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"STANDALONEMONTHS":["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],"SHORTMONTHS":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],"STANDALONESHORTMONTHS":["ஜன.","பிப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],"WEEKDAYS":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"STANDALONEWEEKDAYS":["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],"SHORTWEEKDAYS":["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],"STANDALONESHORTWEEKDAYS":["ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி"],"NARROWWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"STANDALONENARROWWEEKDAYS":["ஞா","தி","செ","பு","வி","வெ","ச"],"SHORTQUARTERS":["காலா.1","காலா.2","காலா.3","காலா.4"],"QUARTERS":["ஒன்றாம் காலாண்டு","இரண்டாம் காலாண்டு","மூன்றாம் காலாண்டு","நான்காம் காலாண்டு"],"AMPMS":["முற்பகல்","பிற்பகல்"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","d/M/yy"],"TIMEFORMATS":["a h:mm:ss zzzz","a h:mm:ss z","a h:mm:ss","a h:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} ’அன்று’ {0}","{1} ’அன்று’ {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/te.json b/packages/intl/lib/src/data/dates/symbols/te.json
index 1714cd5..d5b1934 100644
--- a/packages/intl/lib/src/data/dates/symbols/te.json
+++ b/packages/intl/lib/src/data/dates/symbols/te.json
@@ -1 +1 @@
-{"NAME":"te","ERAS":["క్రీపూ","క్రీశ"],"ERANAMES":["ఈసాపూర్వ.","సన్."],"NARROWMONTHS":["జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి"],"STANDALONENARROWMONTHS":["జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి"],"MONTHS":["జనవరి","ఫిబ్రవరి","మార్చి","ఎప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"STANDALONEMONTHS":["జనవరి","ఫిబ్రవరి","మార్చి","ఎప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"SHORTMONTHS":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"],"STANDALONESHORTMONTHS":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగస్టు","సెప్టెం","అక్టో","నవం","డిసెం"],"WEEKDAYS":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"STANDALONEWEEKDAYS":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"SHORTWEEKDAYS":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"STANDALONESHORTWEEKDAYS":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"NARROWWEEKDAYS":["ఆ","సో","మ","బు","గు","శు","శ"],"STANDALONENARROWWEEKDAYS":["ఆ","సో","మ","బు","గు","శు","శ"],"SHORTQUARTERS":["త్రై1","త్రై2","త్రై3","త్రై4"],"QUARTERS":["1వ త్రైమాసం","2వ త్రైమాసం","3వ త్రైమాసం","4వ త్రైమాసం"],"AMPMS":["AM","PM"],"DATEFORMATS":["d MMMM y EEEE","d MMMM y","d MMM y","dd-MM-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"te","ERAS":["క్రీపూ","క్రీశ"],"ERANAMES":["క్రీస్తు పూర్వం","క్రీస్తు శకం"],"NARROWMONTHS":["జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి"],"STANDALONENARROWMONTHS":["జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి"],"MONTHS":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"STANDALONEMONTHS":["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జులై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],"SHORTMONTHS":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం"],"STANDALONESHORTMONTHS":["జన","ఫిబ్ర","మార్చి","ఏప్రి","మే","జూన్","జులై","ఆగస్టు","సెప్టెం","అక్టో","నవం","డిసెం"],"WEEKDAYS":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"STANDALONEWEEKDAYS":["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],"SHORTWEEKDAYS":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"STANDALONESHORTWEEKDAYS":["ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని"],"NARROWWEEKDAYS":["ఆ","సో","మ","బు","గు","శు","శ"],"STANDALONENARROWWEEKDAYS":["ఆ","సో","మ","బు","గు","శు","శ"],"SHORTQUARTERS":["త్రై1","త్రై2","త్రై3","త్రై4"],"QUARTERS":["1వ త్రైమాసం","2వ త్రైమాసం","3వ త్రైమాసం","4వ త్రైమాసం"],"AMPMS":["AM","PM"],"DATEFORMATS":["d, MMMM y, EEEE","d MMMM, y","d MMM, y","dd-MM-yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[6,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/th.json b/packages/intl/lib/src/data/dates/symbols/th.json
index e5e8d17..498547d 100644
--- a/packages/intl/lib/src/data/dates/symbols/th.json
+++ b/packages/intl/lib/src/data/dates/symbols/th.json
@@ -1 +1 @@
-{"NAME":"th","ERAS":["ปีก่อน ค.ศ.","ค.ศ."],"ERANAMES":["ปีก่อนคริสต์ศักราช","คริสต์ศักราช"],"NARROWMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"STANDALONENARROWMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"MONTHS":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"STANDALONEMONTHS":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"SHORTMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"STANDALONESHORTMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"WEEKDAYS":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"STANDALONEWEEKDAYS":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"SHORTWEEKDAYS":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"STANDALONESHORTWEEKDAYS":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"NARROWWEEKDAYS":["อา","จ","อ","พ","พฤ","ศ","ส"],"STANDALONENARROWWEEKDAYS":["อา","จ","อ","พ","พฤ","ศ","ส"],"SHORTQUARTERS":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"QUARTERS":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"AMPMS":["ก่อนเที่ยง","หลังเที่ยง"],"DATEFORMATS":["EEEEที่ d MMMM G y","d MMMM y","d MMM y","d/M/yy"],"TIMEFORMATS":["H นาฬิกา mm นาที ss วินาที zzzz","H นาฬิกา mm นาที ss วินาที z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"th","ERAS":["ปีก่อน ค.ศ.","ค.ศ."],"ERANAMES":["ปีก่อนคริสต์ศักราช","คริสต์ศักราช"],"NARROWMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"STANDALONENARROWMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"MONTHS":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"STANDALONEMONTHS":["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],"SHORTMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"STANDALONESHORTMONTHS":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"WEEKDAYS":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"STANDALONEWEEKDAYS":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"SHORTWEEKDAYS":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"STANDALONESHORTWEEKDAYS":["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],"NARROWWEEKDAYS":["อา","จ","อ","พ","พฤ","ศ","ส"],"STANDALONENARROWWEEKDAYS":["อา","จ","อ","พ","พฤ","ศ","ส"],"SHORTQUARTERS":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"QUARTERS":["ไตรมาส 1","ไตรมาส 2","ไตรมาส 3","ไตรมาส 4"],"AMPMS":["ก่อนเที่ยง","หลังเที่ยง"],"DATEFORMATS":["EEEEที่ d MMMM G y","d MMMM G y","d MMM y","d/M/yy"],"TIMEFORMATS":["H นาฬิกา mm นาที ss วินาที zzzz","H นาฬิกา mm นาที ss วินาที z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/tl.json b/packages/intl/lib/src/data/dates/symbols/tl.json
index ecb3357..62e48e6 100644
--- a/packages/intl/lib/src/data/dates/symbols/tl.json
+++ b/packages/intl/lib/src/data/dates/symbols/tl.json
@@ -1 +1 @@
-{"NAME":"tl","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["E","P","M","A","M","H","H","A","S","O","N","D"],"STANDALONENARROWMONTHS":["E","P","M","A","M","H","H","A","S","O","N","D"],"MONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"STANDALONEMONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"SHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONESHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"WEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"STANDALONEWEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"SHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONESHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"NARROWWEEKDAYS":["L","L","M","M","H","B","S"],"STANDALONENARROWWEEKDAYS":["L","L","M","M","H","B","S"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ika-1 quarter","ika-2 quarter","ika-3 quarter","ika-4 na quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'ng' {0}","{1} 'ng' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
+{"NAME":"tl","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONENARROWMONTHS":["E","P","M","A","M","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"MONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"STANDALONEMONTHS":["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre"],"SHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"STANDALONESHORTMONTHS":["Ene","Peb","Mar","Abr","May","Hun","Hul","Ago","Set","Okt","Nob","Dis"],"WEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"STANDALONEWEEKDAYS":["Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado"],"SHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONESHORTWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"NARROWWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"STANDALONENARROWWEEKDAYS":["Lin","Lun","Mar","Miy","Huw","Biy","Sab"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ika-1 quarter","ika-2 quarter","ika-3 quarter","ika-4 na quarter"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} 'nang' {0}","{1} 'nang' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/tr.json b/packages/intl/lib/src/data/dates/symbols/tr.json
index b56c491..5bcc5ab 100644
--- a/packages/intl/lib/src/data/dates/symbols/tr.json
+++ b/packages/intl/lib/src/data/dates/symbols/tr.json
@@ -1 +1 @@
-{"NAME":"tr","ERAS":["MÖ","MS"],"ERANAMES":["Milattan Önce","Milattan Sonra"],"NARROWMONTHS":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"STANDALONENARROWMONTHS":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"MONTHS":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"STANDALONEMONTHS":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"SHORTMONTHS":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"STANDALONESHORTMONTHS":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"WEEKDAYS":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"STANDALONEWEEKDAYS":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"SHORTWEEKDAYS":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"STANDALONESHORTWEEKDAYS":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"NARROWWEEKDAYS":["P","P","S","Ç","P","C","C"],"STANDALONENARROWWEEKDAYS":["P","P","S","Ç","P","C","C"],"SHORTQUARTERS":["Ç1","Ç2","Ç3","Ç4"],"QUARTERS":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"AMPMS":["ÖÖ","ÖS"],"DATEFORMATS":["d MMMM y EEEE","d MMMM y","d MMM y","d MM y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"tr","ERAS":["MÖ","MS"],"ERANAMES":["Milattan Önce","Milattan Sonra"],"NARROWMONTHS":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"STANDALONENARROWMONTHS":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"MONTHS":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"STANDALONEMONTHS":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"SHORTMONTHS":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"STANDALONESHORTMONTHS":["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],"WEEKDAYS":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"STANDALONEWEEKDAYS":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"SHORTWEEKDAYS":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"STANDALONESHORTWEEKDAYS":["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],"NARROWWEEKDAYS":["P","P","S","Ç","P","C","C"],"STANDALONENARROWWEEKDAYS":["P","P","S","Ç","P","C","C"],"SHORTQUARTERS":["Ç1","Ç2","Ç3","Ç4"],"QUARTERS":["1. çeyrek","2. çeyrek","3. çeyrek","4. çeyrek"],"AMPMS":["ÖÖ","ÖS"],"DATEFORMATS":["d MMMM y EEEE","d MMMM y","d MMM y","d.MM.y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/uk.json b/packages/intl/lib/src/data/dates/symbols/uk.json
index b384964..347be2b 100644
--- a/packages/intl/lib/src/data/dates/symbols/uk.json
+++ b/packages/intl/lib/src/data/dates/symbols/uk.json
@@ -1 +1 @@
-{"NAME":"uk","ERAS":["до н.е.","н.е."],"ERANAMES":["до нашої ери","нашої ери"],"NARROWMONTHS":["С","Л","Б","К","Т","Ч","Л","С","В","Ж","Л","Г"],"STANDALONENARROWMONTHS":["С","Л","Б","К","Т","Ч","Л","С","В","Ж","Л","Г"],"MONTHS":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"STANDALONEMONTHS":["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],"SHORTMONTHS":["січ.","лют.","бер.","квіт.","трав.","черв.","лип.","серп.","вер.","жовт.","лист.","груд."],"STANDALONESHORTMONTHS":["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],"WEEKDAYS":["неділя","понеділок","вівторок","середа","четвер","пʼятниця","субота"],"STANDALONEWEEKDAYS":["Неділя","Понеділок","Вівторок","Середа","Четвер","Пʼятниця","Субота"],"SHORTWEEKDAYS":["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],"STANDALONESHORTWEEKDAYS":["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],"NARROWWEEKDAYS":["Н","П","В","С","Ч","П","С"],"STANDALONENARROWWEEKDAYS":["Н","П","В","С","Ч","П","С"],"SHORTQUARTERS":["I кв.","II кв.","III кв.","IV кв."],"QUARTERS":["I квартал","II квартал","III квартал","IV квартал"],"AMPMS":["дп","пп"],"DATEFORMATS":["EEEE, d MMMM y 'р'.","d MMMM y 'р'.","d MMM y","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"uk","ERAS":["до н. е.","н. е."],"ERANAMES":["до нашої ери","нашої ери"],"NARROWMONTHS":["с","л","б","к","т","ч","л","с","в","ж","л","г"],"STANDALONENARROWMONTHS":["С","Л","Б","К","Т","Ч","Л","С","В","Ж","Л","Г"],"MONTHS":["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня"],"STANDALONEMONTHS":["січень","лютий","березень","квітень","травень","червень","липень","серпень","вересень","жовтень","листопад","грудень"],"SHORTMONTHS":["січ.","лют.","бер.","квіт.","трав.","черв.","лип.","серп.","вер.","жовт.","лист.","груд."],"STANDALONESHORTMONTHS":["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру"],"WEEKDAYS":["неділя","понеділок","вівторок","середа","четвер","пʼятниця","субота"],"STANDALONEWEEKDAYS":["неділя","понеділок","вівторок","середа","четвер","пʼятниця","субота"],"SHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"STANDALONESHORTWEEKDAYS":["нд","пн","вт","ср","чт","пт","сб"],"NARROWWEEKDAYS":["Н","П","В","С","Ч","П","С"],"STANDALONENARROWWEEKDAYS":["Н","П","В","С","Ч","П","С"],"SHORTQUARTERS":["1-й кв.","2-й кв.","3-й кв.","4-й кв."],"QUARTERS":["1-й квартал","2-й квартал","3-й квартал","4-й квартал"],"AMPMS":["дп","пп"],"DATEFORMATS":["EEEE, d MMMM y 'р'.","d MMMM y 'р'.","d MMM y 'р'.","dd.MM.yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} 'о' {0}","{1} 'о' {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/ur.json b/packages/intl/lib/src/data/dates/symbols/ur.json
index 9940605..b8e1f68 100644
--- a/packages/intl/lib/src/data/dates/symbols/ur.json
+++ b/packages/intl/lib/src/data/dates/symbols/ur.json
@@ -1 +1 @@
-{"NAME":"ur","ERAS":["ق م","عیسوی سن"],"ERANAMES":["قبل مسیح","عیسوی سن"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"STANDALONEMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"SHORTMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"STANDALONESHORTMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"WEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"STANDALONEWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"SHORTWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"STANDALONESHORTWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["پہلی سہ ماہی","دوسری سہ ماہی","تیسری سہ ماہی","چوتهی سہ ماہی"],"QUARTERS":["پہلی سہ ماہی","دوسری سہ ماہی","تیسری سہ ماہی","چوتهی سہ ماہی"],"AMPMS":["قبل دوپہر","بعد دوپہر"],"DATEFORMATS":["EEEE، d MMMM، y","d MMMM، y","d MMM، y","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"ur","ERAS":["قبل مسیح","عیسوی"],"ERANAMES":["قبل مسیح","عیسوی"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"STANDALONEMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"SHORTMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"STANDALONESHORTMONTHS":["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],"WEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"STANDALONEWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"SHORTWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"STANDALONESHORTWEEKDAYS":["اتوار","سوموار","منگل","بدھ","جمعرات","جمعہ","ہفتہ"],"NARROWWEEKDAYS":["S","M","T","W","T","F","S"],"STANDALONENARROWWEEKDAYS":["S","M","T","W","T","F","S"],"SHORTQUARTERS":["پہلی سہ ماہی","دوسری سہ ماہی","تیسری سہ ماہی","چوتهی سہ ماہی"],"QUARTERS":["پہلی سہ ماہی","دوسری سہ ماہی","تیسری سہ ماہی","چوتهی سہ ماہی"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE، d MMMM، y","d MMMM، y","y MMM d","d/M/yy"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/uz.json b/packages/intl/lib/src/data/dates/symbols/uz.json
index f256e50..1361d6a 100644
--- a/packages/intl/lib/src/data/dates/symbols/uz.json
+++ b/packages/intl/lib/src/data/dates/symbols/uz.json
@@ -1 +1 @@
-{"NAME":"uz","ERAS":["M.A.","E"],"ERANAMES":["M.A.","E"],"NARROWMONTHS":["Y","F","M","A","M","I","I","A","S","O","N","D"],"STANDALONENARROWMONTHS":["Y","F","M","A","M","I","I","A","S","O","N","D"],"MONTHS":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr"],"STANDALONEMONTHS":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr"],"SHORTMONTHS":["Yanv","Fev","Mar","Apr","May","Iyun","Iyul","Avg","Sen","Okt","Noya","Dek"],"STANDALONESHORTMONTHS":["Yanv","Fev","Mar","Apr","May","Iyun","Iyul","Avg","Sen","Okt","Noya","Dek"],"WEEKDAYS":["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],"STANDALONEWEEKDAYS":["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],"SHORTWEEKDAYS":["Yaksh","Dush","Sesh","Chor","Pay","Jum","Shan"],"STANDALONESHORTWEEKDAYS":["Yaksh","Dush","Sesh","Chor","Pay","Jum","Shan"],"NARROWWEEKDAYS":["Y","D","S","C","P","J","S"],"STANDALONENARROWWEEKDAYS":["Y","D","S","C","P","J","S"],"SHORTQUARTERS":["1-ch","2-ch","3-ch","4-ch"],"QUARTERS":["1-chorak","2-chorak","3-chorak","4-chorak"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, y MMMM dd","y MMMM d","y MMM d","yy/MM/dd"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"uz","ERAS":["m.a.","milodiy"],"ERANAMES":["miloddan avvalgi","milodiy"],"NARROWMONTHS":["Y","F","M","A","M","I","I","A","S","O","N","D"],"STANDALONENARROWMONTHS":["Y","F","M","A","M","I","I","A","S","O","N","D"],"MONTHS":["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentabr","oktabr","noyabr","dekabr"],"STANDALONEMONTHS":["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avgust","Sentabr","Oktabr","Noyabr","Dekabr"],"SHORTMONTHS":["yan","fev","mar","apr","may","iyn","iyl","avg","sen","okt","noy","dek"],"STANDALONESHORTMONTHS":["Yan","Fev","Mar","Apr","May","Iyn","Iyl","Avg","Sen","Okt","Noy","Dek"],"WEEKDAYS":["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],"STANDALONEWEEKDAYS":["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],"SHORTWEEKDAYS":["Yak","Dush","Sesh","Chor","Pay","Jum","Shan"],"STANDALONESHORTWEEKDAYS":["Yak","Dush","Sesh","Chor","Pay","Jum","Shan"],"NARROWWEEKDAYS":["Y","D","S","C","P","J","S"],"STANDALONENARROWWEEKDAYS":["Y","D","S","C","P","J","S"],"SHORTQUARTERS":["1-ch","2-ch","3-ch","4-ch"],"QUARTERS":["1-chorak","2-chorak","3-chorak","4-chorak"],"AMPMS":["TO","TK"],"DATEFORMATS":["EEEE, d-MMMM, y","d-MMMM, y","d-MMM, y","dd/MM/yy"],"TIMEFORMATS":["H:mm:ss (zzzz)","H:mm:ss (z)","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{1}, {0}","{1}, {0}","{1}, {0}","{1}, {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/vi.json b/packages/intl/lib/src/data/dates/symbols/vi.json
index fe815a0..54a359c 100644
--- a/packages/intl/lib/src/data/dates/symbols/vi.json
+++ b/packages/intl/lib/src/data/dates/symbols/vi.json
@@ -1 +1 @@
-{"NAME":"vi","ERAS":["tr. CN","sau CN"],"ERANAMES":["tr. CN","sau CN"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["tháng 1","tháng 2","tháng 3","tháng 4","tháng 5","tháng 6","tháng 7","tháng 8","tháng 9","tháng 10","tháng 11","tháng 12"],"STANDALONEMONTHS":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"SHORTMONTHS":["thg 1","thg 2","thg 3","thg 4","thg 5","thg 6","thg 7","thg 8","thg 9","thg 10","thg 11","thg 12"],"STANDALONESHORTMONTHS":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"],"WEEKDAYS":["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],"STANDALONEWEEKDAYS":["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],"SHORTWEEKDAYS":["CN","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7"],"STANDALONESHORTWEEKDAYS":["CN","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7"],"NARROWWEEKDAYS":["CN","T2","T3","T4","T5","T6","T7"],"STANDALONENARROWWEEKDAYS":["CN","T2","T3","T4","T5","T6","T7"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Quý 1","Quý 2","Quý 3","Quý 4"],"AMPMS":["SA","CH"],"DATEFORMATS":["EEEE, 'ngày' dd MMMM 'năm' y","'Ngày' dd 'tháng' MM 'năm' y","dd-MM-y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{0} {1}","{0} {1}","{0} {1}","{0} {1}"]}
\ No newline at end of file
+{"NAME":"vi","ERAS":["Trước CN","sau CN"],"ERANAMES":["Trước CN","sau CN"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["tháng 1","tháng 2","tháng 3","tháng 4","tháng 5","tháng 6","tháng 7","tháng 8","tháng 9","tháng 10","tháng 11","tháng 12"],"STANDALONEMONTHS":["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],"SHORTMONTHS":["thg 1","thg 2","thg 3","thg 4","thg 5","thg 6","thg 7","thg 8","thg 9","thg 10","thg 11","thg 12"],"STANDALONESHORTMONTHS":["Thg 1","Thg 2","Thg 3","Thg 4","Thg 5","Thg 6","Thg 7","Thg 8","Thg 9","Thg 10","Thg 11","Thg 12"],"WEEKDAYS":["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],"STANDALONEWEEKDAYS":["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],"SHORTWEEKDAYS":["CN","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7"],"STANDALONESHORTWEEKDAYS":["CN","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7"],"NARROWWEEKDAYS":["CN","T2","T3","T4","T5","T6","T7"],"STANDALONENARROWWEEKDAYS":["CN","T2","T3","T4","T5","T6","T7"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["Quý 1","Quý 2","Quý 3","Quý 4"],"AMPMS":["SA","CH"],"DATEFORMATS":["EEEE, d MMMM, y","d MMMM, y","d MMM, y","dd/MM/y"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":0,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":6,"DATETIMEFORMATS":["{0} {1}","{0} {1}","{0}, {1}","{0}, {1}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/zh.json b/packages/intl/lib/src/data/dates/symbols/zh.json
index 70890c5..f7d5bb2 100644
--- a/packages/intl/lib/src/data/dates/symbols/zh.json
+++ b/packages/intl/lib/src/data/dates/symbols/zh.json
@@ -1 +1 @@
-{"NAME":"zh","ERAS":["公元前","公元"],"ERANAMES":["公元前","公元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"STANDALONEMONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"STANDALONESHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季度","2季度","3季度","4季度"],"QUARTERS":["第一季度","第二季度","第三季度","第四季度"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","yy/M/d"],"TIMEFORMATS":["zzzzah:mm:ss","zah:mm:ss","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"zh","ERAS":["公元前","公元"],"ERANAMES":["公元前","公元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"STANDALONEMONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"STANDALONESHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季度","2季度","3季度","4季度"],"QUARTERS":["第一季度","第二季度","第三季度","第四季度"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","y/M/d"],"TIMEFORMATS":["zzzz ah:mm:ss","z ah:mm:ss","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/zh_CN.json b/packages/intl/lib/src/data/dates/symbols/zh_CN.json
index b143e62..21a2ba8 100644
--- a/packages/intl/lib/src/data/dates/symbols/zh_CN.json
+++ b/packages/intl/lib/src/data/dates/symbols/zh_CN.json
@@ -1 +1 @@
-{"NAME":"zh_CN","ERAS":["公元前","公元"],"ERANAMES":["公元前","公元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"STANDALONEMONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"STANDALONESHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季度","2季度","3季度","4季度"],"QUARTERS":["第一季度","第二季度","第三季度","第四季度"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","yy/M/d"],"TIMEFORMATS":["zzzzah:mm:ss","zah:mm:ss","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"zh_CN","ERAS":["公元前","公元"],"ERANAMES":["公元前","公元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"STANDALONEMONTHS":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"STANDALONESHORTWEEKDAYS":["周日","周一","周二","周三","周四","周五","周六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季度","2季度","3季度","4季度"],"QUARTERS":["第一季度","第二季度","第三季度","第四季度"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","y/M/d"],"TIMEFORMATS":["zzzz ah:mm:ss","z ah:mm:ss","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/zh_HK.json b/packages/intl/lib/src/data/dates/symbols/zh_HK.json
index 1a82ccf..95daba9 100644
--- a/packages/intl/lib/src/data/dates/symbols/zh_HK.json
+++ b/packages/intl/lib/src/data/dates/symbols/zh_HK.json
@@ -1 +1 @@
-{"NAME":"zh_HK","ERAS":["西元前","西元"],"ERANAMES":["西元前","西元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONEMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"STANDALONESHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季","2季","3季","4季"],"QUARTERS":["第1季","第2季","第3季","第4季"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","d/M/yy"],"TIMEFORMATS":["ah:mm:ss [zzzz]","ah:mm:ss [z]","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1}{0}","{1}{0}"]}
\ No newline at end of file
+{"NAME":"zh_HK","ERAS":["公元前","公元"],"ERANAMES":["公元前","公元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONEMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"STANDALONESHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["第1季度","第2季度","第3季度","第4季度"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","d/M/y"],"TIMEFORMATS":["ah:mm:ss [zzzz]","ah:mm:ss [z]","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/zh_TW.json b/packages/intl/lib/src/data/dates/symbols/zh_TW.json
index 61685b9..af3f68b 100644
--- a/packages/intl/lib/src/data/dates/symbols/zh_TW.json
+++ b/packages/intl/lib/src/data/dates/symbols/zh_TW.json
@@ -1 +1 @@
-{"NAME":"zh_TW","ERAS":["西元前","西元"],"ERANAMES":["西元前","西元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONEMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"STANDALONESHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季","2季","3季","4季"],"QUARTERS":["第1季","第2季","第3季","第4季"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日EEEE","y年M月d日","y年M月d日","y/M/d"],"TIMEFORMATS":["zzzzah時mm分ss秒","zah時mm分ss秒","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1}{0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"zh_TW","ERAS":["西元前","西元"],"ERANAMES":["西元前","西元"],"NARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"STANDALONENARROWMONTHS":["1","2","3","4","5","6","7","8","9","10","11","12"],"MONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONEMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"SHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"STANDALONESHORTMONTHS":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"WEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"STANDALONEWEEKDAYS":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"SHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"STANDALONESHORTWEEKDAYS":["週日","週一","週二","週三","週四","週五","週六"],"NARROWWEEKDAYS":["日","一","二","三","四","五","六"],"STANDALONENARROWWEEKDAYS":["日","一","二","三","四","五","六"],"SHORTQUARTERS":["1季","2季","3季","4季"],"QUARTERS":["第1季","第2季","第3季","第4季"],"AMPMS":["上午","下午"],"DATEFORMATS":["y年M月d日 EEEE","y年M月d日","y年M月d日","y/M/d"],"TIMEFORMATS":["ah:mm:ss [zzzz]","ah:mm:ss [z]","ah:mm:ss","ah:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/data/dates/symbols/zu.json b/packages/intl/lib/src/data/dates/symbols/zu.json
index 4e41d5e..c422059 100644
--- a/packages/intl/lib/src/data/dates/symbols/zu.json
+++ b/packages/intl/lib/src/data/dates/symbols/zu.json
@@ -1 +1 @@
-{"NAME":"zu","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["Januwari","Februwari","Mashi","Apreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"STANDALONEMONTHS":["uJanuwari","uFebruwari","uMashi","u-Apreli","uMeyi","uJuni","uJulayi","uAgasti","uSepthemba","u-Okthoba","uNovemba","uDisemba"],"SHORTMONTHS":["Jan","Feb","Mas","Apr","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],"STANDALONESHORTMONTHS":["Jan","Feb","Mas","Apr","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],"WEEKDAYS":["Sonto","Msombuluko","Lwesibili","Lwesithathu","Lwesine","Lwesihlanu","Mgqibelo"],"STANDALONEWEEKDAYS":["Sonto","Msombuluko","Lwesibili","Lwesithathu","Lwesine","Lwesihlanu","Mgqibelo"],"SHORTWEEKDAYS":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"STANDALONESHORTWEEKDAYS":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"NARROWWEEKDAYS":["S","M","T","T","S","H","M"],"STANDALONENARROWWEEKDAYS":["S","M","B","T","S","H","M"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ikota engu-1","ikota engu-2","ikota engu-3","ikota engu-4"],"AMPMS":["Ekuseni","Ntambama"],"DATEFORMATS":["EEEE dd MMMM y","d MMMM y","d MMM y","y-MM-dd"],"TIMEFORMATS":["h:mm:ss a zzzz","h:mm:ss a z","h:mm:ss a","h:mm a"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
+{"NAME":"zu","ERAS":["BC","AD"],"ERANAMES":["BC","AD"],"NARROWMONTHS":["J","F","M","E","M","J","J","A","S","O","N","D"],"STANDALONENARROWMONTHS":["J","F","M","A","M","J","J","A","S","O","N","D"],"MONTHS":["UMasingana","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"STANDALONEMONTHS":["Januwari","Februwari","Mashi","Ephreli","Meyi","Juni","Julayi","Agasti","Septhemba","Okthoba","Novemba","Disemba"],"SHORTMONTHS":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],"STANDALONESHORTMONTHS":["Jan","Feb","Mas","Eph","Mey","Jun","Jul","Aga","Sep","Okt","Nov","Dis"],"WEEKDAYS":["ISonto","UMsombuluko","ULwesibili","ULwesithathu","ULwesine","ULwesihlanu","UMgqibelo"],"STANDALONEWEEKDAYS":["ISonto","UMsombuluko","ULwesibili","ULwesithathu","ULwesine","ULwesihlanu","UMgqibelo"],"SHORTWEEKDAYS":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"STANDALONESHORTWEEKDAYS":["Son","Mso","Bil","Tha","Sin","Hla","Mgq"],"NARROWWEEKDAYS":["S","M","B","T","S","H","M"],"STANDALONENARROWWEEKDAYS":["S","M","B","T","S","H","M"],"SHORTQUARTERS":["Q1","Q2","Q3","Q4"],"QUARTERS":["ikota yesi-1","ikota yesi-2","ikota yesi-3","ikota yesi-4"],"AMPMS":["AM","PM"],"DATEFORMATS":["EEEE, MMMM d, y","MMMM d, y","MMM d, y","M/d/yy"],"TIMEFORMATS":["HH:mm:ss zzzz","HH:mm:ss z","HH:mm:ss","HH:mm"],"AVAILABLEFORMATS":null,"FIRSTDAYOFWEEK":6,"WEEKENDRANGE":[5,6],"FIRSTWEEKCUTOFFDAY":5,"DATETIMEFORMATS":["{1} {0}","{1} {0}","{1} {0}","{1} {0}"]}
\ No newline at end of file
diff --git a/packages/intl/lib/src/date_format_internal.dart b/packages/intl/lib/src/date_format_internal.dart
index ddb7aad..27924d9 100644
--- a/packages/intl/lib/src/date_format_internal.dart
+++ b/packages/intl/lib/src/date_format_internal.dart
@@ -2,15 +2,13 @@
 // for 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 contains internal implementation details of the date formatting code
- * which are exposed as public functions because they must be called by other
- * libraries in order to configure the source for the locale data. We don't want
- * them exposed as public API functions in the date formatting library, so they
- * are put in a separate library here. These are for internal use only. User
- * code should import one of the `date_symbol_data...` libraries and call the
- * `initializeDateFormatting` method exposed there.
- */
+/// This contains internal implementation details of the date formatting code
+/// which are exposed as public functions because they must be called by other
+/// libraries in order to configure the source for the locale data. We don't
+/// want them exposed as public API functions in the date formatting library, so
+/// they are put in a separate library here. These are for internal use
+/// only. User code should import one of the `date_symbol_data...` libraries and
+/// call the `initializeDateFormatting` method exposed there.
 
 library date_format_internal;
 
@@ -18,44 +16,60 @@
 import 'intl_helpers.dart';
 import '../date_symbols.dart';
 
-/**
- * This holds the symbols to be used for date/time formatting, indexed
- * by locale. Note that it will be set differently during initialization,
- * depending on what implementation we are using. By default, it is initialized
- * to an instance of UninitializedLocaleData, so any attempt to use it will
- * result in an informative error message.
- */
-var dateTimeSymbols = new UninitializedLocaleData(
+/// This holds the symbols to be used for date/time formatting, indexed
+/// by locale. Note that it will be set differently during initialization,
+/// depending on what implementation we are using. By default, it is initialized
+/// to an instance of UninitializedLocaleData, so any attempt to use it will
+/// result in an informative error message.
+// TODO(alanknight): Have a valid type for this. Currently it can be an
+// UninitializedLocaleData, Map, or LazyLocaleData.
+dynamic get dateTimeSymbols => _dateTimeSymbols;
+
+/// Set the dateTimeSymbols and invalidate cache.
+set dateTimeSymbols(dynamic symbols) {
+  // With all the mechanisms we have now this should be sufficient. We can
+  // have an UninitializedLocaleData which gives us the fallback locale, but
+  // when we replace it we invalidate. With a LazyLocaleData we won't change
+  // the results for a particular locale, it will just go from throwing to
+  // being available. With a Map everything is available.
+  _dateTimeSymbols = symbols;
+  cachedDateSymbols = null;
+  lastDateSymbolLocale = null;
+}
+
+dynamic _dateTimeSymbols = new UninitializedLocaleData(
     'initializeDateFormatting(<locale>)', en_USSymbols);
 
-/**
- * This holds the patterns used for date/time formatting, indexed
- * by locale. Note that it will be set differently during initialization,
- * depending on what implementation we are using. By default, it is initialized
- * to an instance of UninitializedLocaleData, so any attempt to use it will
- * result in an informative error message.
- */
-var dateTimePatterns = new UninitializedLocaleData(
+/// Cache the last used symbols to reduce repeated lookups.
+DateSymbols cachedDateSymbols;
+
+/// Which locale was last used for symbol lookup.
+String lastDateSymbolLocale;
+
+/// This holds the patterns used for date/time formatting, indexed
+/// by locale. Note that it will be set differently during initialization,
+/// depending on what implementation we are using. By default, it is initialized
+/// to an instance of UninitializedLocaleData, so any attempt to use it will
+/// result in an informative error message.
+// TODO(alanknight): Have a valid type for this. Currently it can be an
+// UninitializedLocaleData, Map, or LazyLocaleData.
+dynamic dateTimePatterns = new UninitializedLocaleData(
     'initializeDateFormatting(<locale>)', en_USPatterns);
 
-/**
- * Initialize the symbols dictionary. This should be passed a function that
- * creates and returns the symbol data. We take a function so that if
- * initializing the data is an expensive operation it need only be done once,
- * no matter how many times this method is called.
- */
+/// Initialize the symbols dictionary. This should be passed a function that
+/// creates and returns the symbol data. We take a function so that if
+/// initializing the data is an expensive operation it need only be done once,
+/// no matter how many times this method is called.
 void initializeDateSymbols(Function symbols) {
   if (dateTimeSymbols is UninitializedLocaleData) {
     dateTimeSymbols = symbols();
   }
 }
 
-/**
- * Initialize the patterns dictionary. This should be passed a function that
- * creates and returns the pattern data. We take a function so that if
- * initializing the data is an expensive operation it need only be done once,
- * no matter how many times this method is called.
- */
+/// Initialize the patterns dictionary. This should be passed a function that
+/// creates and returns the pattern data. We take a function so that if
+/// initializing the data is an expensive operation it need only be done once,
+/// no matter how many times this method is called.
 void initializeDatePatterns(Function patterns) {
   if (dateTimePatterns is UninitializedLocaleData) {
     dateTimePatterns = patterns();
diff --git a/packages/intl/lib/src/file_data_reader.dart b/packages/intl/lib/src/file_data_reader.dart
index 61c42e2..8e152f3 100644
--- a/packages/intl/lib/src/file_data_reader.dart
+++ b/packages/intl/lib/src/file_data_reader.dart
@@ -2,10 +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.
 
-/**
- * This contains a reader that accesses data from local files, so it can't
- * be run in the browser.
- */
+/// This contains a reader that accesses data from local files, so it can't
+/// be run in the browser.
 
 library file_data_reader;
 
diff --git a/packages/intl/lib/src/http_request_data_reader.dart b/packages/intl/lib/src/http_request_data_reader.dart
index cbe214d..2a24aa2 100644
--- a/packages/intl/lib/src/http_request_data_reader.dart
+++ b/packages/intl/lib/src/http_request_data_reader.dart
@@ -2,10 +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.
 
-/**
- * This contains a reader that accesses data using the HttpRequest
- * facility, and thus works only in the web browser.
- */
+/// This contains a reader that accesses data using the HttpRequest
+/// facility, and thus works only in the web browser.
 
 library http_request_data_reader;
 
@@ -15,17 +13,14 @@
 
 class HttpRequestDataReader implements LocaleDataReader {
 
-  /** The base url from which we read the data. */
+  /// The base url from which we read the data.
   String url;
   HttpRequestDataReader(this.url);
 
   Future read(String locale) {
-    // TODO(alanknight): Remove this once it's not necessary for Chrome.
-    // Without it, the tests will be flaky on Chrome. Issue 11834.
-    var someNumber = new DateTime.now().millisecondsSinceEpoch;
     var request = new HttpRequest();
     request.timeout = 5000;
-    return _getString('$url$locale.json?cacheBlocker=$someNumber', request)
+    return _getString('$url$locale.json', request)
         .then((r) => r.responseText);
   }
 
diff --git a/packages/intl/lib/src/icu_parser.dart b/packages/intl/lib/src/icu_parser.dart
deleted file mode 100644
index 15c47b4..0000000
--- a/packages/intl/lib/src/icu_parser.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Contains a parser for ICU format plural/gender/select format for localized
- * messages. See extract_to_arb.dart and make_hardcoded_translation.dart.
- */
-library icu_parser;
-
-import 'package:intl/src/intl_message.dart';
-import 'package:petitparser/petitparser.dart';
-
-/**
- * This defines a grammar for ICU MessageFormat syntax. Usage is
- *       new IcuParser.message.parse(<string>).value;
- * The "parse" method will return a Success or Failure object which responds
- * to "value".
- */
-class IcuParser {
-  get openCurly => char("{");
-
-  get closeCurly => char("}");
-  get quotedCurly => (string("'{'") | string("'}'")).map((x) => x[1]);
-
-  get icuEscapedText => quotedCurly | twoSingleQuotes;
-  get curly => (openCurly | closeCurly);
-  get notAllowedInIcuText => curly | char("<");
-  get icuText => notAllowedInIcuText.neg();
-  get notAllowedInNormalText => char("{");
-  get normalText => notAllowedInNormalText.neg();
-  get messageText => (icuEscapedText | icuText).plus().map((x) => x.join());
-  get nonIcuMessageText => normalText.plus().map((x) => x.join());
-  get twoSingleQuotes => string("''").map((x) => "'");
-  get number => digit().plus().flatten().trim().map(int.parse);
-  get id => (letter() & (word() | char("_")).star()).flatten().trim();
-  get comma => char(",").trim();
-
-  /**
-   * Given a list of possible keywords, return a rule that accepts any of them.
-   * e.g., given ["male", "female", "other"], accept any of them.
-   */
-  asKeywords(list) => list.map(string).reduce((a, b) => a | b).flatten().trim();
-
-  get pluralKeyword => asKeywords(
-      ["=0", "=1", "=2", "zero", "one", "two", "few", "many", "other"]);
-  get genderKeyword => asKeywords(["female", "male", "other"]);
-
-  var interiorText = undefined();
-
-  get preface => (openCurly & id & comma).map((values) => values[1]);
-
-  get pluralLiteral => string("plural");
-  get pluralClause => (pluralKeyword & openCurly & interiorText & closeCurly)
-      .trim()
-      .map((result) => [result[0], result[2]]);
-  get plural =>
-      preface & pluralLiteral & comma & pluralClause.plus() & closeCurly;
-  get intlPlural =>
-      plural.map((values) => new Plural.from(values.first, values[3], null));
-
-  get selectLiteral => string("select");
-  get genderClause => (genderKeyword & openCurly & interiorText & closeCurly)
-      .trim()
-      .map((result) => [result[0], result[2]]);
-  get gender =>
-      preface & selectLiteral & comma & genderClause.plus() & closeCurly;
-  get intlGender =>
-      gender.map((values) => new Gender.from(values.first, values[3], null));
-  get selectClause =>
-      (id & openCurly & interiorText & closeCurly).map((x) => [x.first, x[2]]);
-  get generalSelect =>
-      preface & selectLiteral & comma & selectClause.plus() & closeCurly;
-  get intlSelect => generalSelect
-      .map((values) => new Select.from(values.first, values[3], null));
-
-  get pluralOrGenderOrSelect => intlPlural | intlGender | intlSelect;
-
-  get contents => pluralOrGenderOrSelect | parameter | messageText;
-  get simpleText => (nonIcuMessageText | parameter | openCurly).plus();
-  get empty => epsilon().map((_) => '');
-
-  get parameter => (openCurly & id & closeCurly)
-      .map((param) => new VariableSubstitution.named(param[1], null));
-
-  /**
-   * The primary entry point for parsing. Accepts a string and produces
-   * a parsed representation of it as a Message.
-   */
-  get message => (pluralOrGenderOrSelect | empty)
-      .map((chunk) => Message.from(chunk, null));
-
-  /**
-   * Represents an ordinary message, i.e. not a plural/gender/select, although
-   * it may have parameters.
-   */
-  get nonIcuMessage =>
-      (simpleText | empty).map((chunk) => Message.from(chunk, null));
-
-  get stuff => (pluralOrGenderOrSelect | empty)
-      .map((chunk) => Message.from(chunk, null));
-
-  IcuParser() {
-    // There is a cycle here, so we need the explicit set to avoid
-    // infinite recursion.
-    interiorText.set(contents.plus() | empty);
-  }
-}
diff --git a/packages/intl/lib/src/intl/bidi_formatter.dart b/packages/intl/lib/src/intl/bidi_formatter.dart
index 9f9495c..87f955a 100644
--- a/packages/intl/lib/src/intl/bidi_formatter.dart
+++ b/packages/intl/lib/src/intl/bidi_formatter.dart
@@ -4,73 +4,67 @@
 
 part of intl;
 
-/**
- * Bidi stands for Bi-directional text.
- * According to [Wikipedia](http://en.wikipedia.org/wiki/Bi-directional_text):
- * Bi-directional text is text containing text in both text directionalities,
- * both right-to-left (RTL) and left-to-right (LTR). It generally involves text
- * containing different types of alphabets, but may also refer to boustrophedon,
- * which is changing text directionality in each row.
- *
- * Utility class for formatting display text in a potentially
- * opposite-directionality context without garbling layout issues.
- * Mostly a very "slimmed-down" and dart-ified port of the Closure Birectional
- * formatting libary. If there is a utility in the Closure library (or ICU, or
- * elsewhere) that you would like this formatter to make available, please
- * contact the Dart team.
- *
- * Provides the following functionality:
- *
- * 1. *BiDi Wrapping*
- * When text in one language is mixed into a document in another, opposite-
- * directionality language, e.g. when an English business name is embedded in a
- * Hebrew web page, both the inserted string and the text following it may be
- * displayed incorrectly unless the inserted string is explicitly separated
- * from the surrounding text in a "wrapper" that declares its directionality at
- * the start and then resets it back at the end. This wrapping can be done in
- * HTML mark-up (e.g. a 'span dir=rtl' tag) or - only in contexts where mark-up
- * can not be used - in Unicode BiDi formatting codes (LRE|RLE and PDF).
- * Providing such wrapping services is the basic purpose of the BiDi formatter.
- *
- * 2. *Directionality estimation*
- * How does one know whether a string about to be inserted into surrounding
- * text has the same directionality? Well, in many cases, one knows that this
- * must be the case when writing the code doing the insertion, e.g. when a
- * localized message is inserted into a localized page. In such cases there is
- * no need to involve the BiDi formatter at all. In the remaining cases, e.g.
- * when the string is user-entered or comes from a database, the language of
- * the string (and thus its directionality) is not known a priori, and must be
- * estimated at run-time. The BiDi formatter does this automatically.
- *
- * 3. *Escaping*
- * When wrapping plain text - i.e. text that is not already HTML or HTML-
- * escaped - in HTML mark-up, the text must first be HTML-escaped to prevent XSS
- * attacks and other nasty business. This of course is always true, but the
- * escaping cannot be done after the string has already been wrapped in
- * mark-up, so the BiDi formatter also serves as a last chance and includes
- * escaping services.
- *
- * Thus, in a single call, the formatter will escape the input string as
- * specified, determine its directionality, and wrap it as necessary. It is
- * then up to the caller to insert the return value in the output.
- */
+/// Bidi stands for Bi-directional text.  According to
+/// [Wikipedia](http://en.wikipedia.org/wiki/Bi-directional_text):
+/// Bi-directional text is text containing text in both text directionalities,
+/// both right-to-left (RTL) and left-to-right (LTR). It generally involves text
+/// containing different types of alphabets, but may also refer to
+/// boustrophedon, which is changing text directionality in each row.
+///
+/// Utility class for formatting display text in a potentially
+/// opposite-directionality context without garbling layout issues.  Mostly a
+/// very "slimmed-down" and dart-ified port of the Closure Birectional
+/// formatting libary. If there is a utility in the Closure library (or ICU, or
+/// elsewhere) that you would like this formatter to make available, please
+/// contact the Dart team.
+///
+/// Provides the following functionality:
+///
+/// 1. *BiDi Wrapping*
+/// When text in one language is mixed into a document in another, opposite-
+/// directionality language, e.g. when an English business name is embedded in a
+/// Hebrew web page, both the inserted string and the text following it may be
+/// displayed incorrectly unless the inserted string is explicitly separated
+/// from the surrounding text in a "wrapper" that declares its directionality at
+/// the start and then resets it back at the end. This wrapping can be done in
+/// HTML mark-up (e.g. a 'span dir=rtl' tag) or - only in contexts where mark-up
+/// can not be used - in Unicode BiDi formatting codes (LRE|RLE and PDF).
+/// Providing such wrapping services is the basic purpose of the BiDi formatter.
+///
+/// 2. *Directionality estimation*
+/// How does one know whether a string about to be inserted into surrounding
+/// text has the same directionality? Well, in many cases, one knows that this
+/// must be the case when writing the code doing the insertion, e.g. when a
+/// localized message is inserted into a localized page. In such cases there is
+/// no need to involve the BiDi formatter at all. In the remaining cases, e.g.
+/// when the string is user-entered or comes from a database, the language of
+/// the string (and thus its directionality) is not known a priori, and must be
+/// estimated at run-time. The BiDi formatter does this automatically.
+///
+/// 3. *Escaping*
+/// When wrapping plain text - i.e. text that is not already HTML or HTML-
+/// escaped - in HTML mark-up, the text must first be HTML-escaped to prevent
+/// XSS attacks and other nasty business. This of course is always true, but the
+/// escaping cannot be done after the string has already been wrapped in
+/// mark-up, so the BiDi formatter also serves as a last chance and includes
+/// escaping services.
+///
+/// Thus, in a single call, the formatter will escape the input string as
+/// specified, determine its directionality, and wrap it as necessary. It is
+/// then up to the caller to insert the return value in the output.
 
 class BidiFormatter {
 
-  /** The direction of the surrounding text (the context). */
+  /// The direction of the surrounding text (the context).
   TextDirection contextDirection;
 
-  /**
-   * Indicates if we should always wrap the formatted text in a &lt;span&lt;,.
-   */
+  /// Indicates if we should always wrap the formatted text in a &lt;span&lt;,.
   bool _alwaysSpan;
 
-  /**
-   * Create a formatting object with a direction. If [alwaysSpan] is true we
-   * should always use a `span` tag, even when the input directionality is
-   * neutral or matches the context, so that the DOM structure of the output
-   * does not depend on the combination of directionalities.
-   */
+  /// Create a formatting object with a direction. If [alwaysSpan] is true we
+  /// should always use a `span` tag, even when the input directionality is
+  /// neutral or matches the context, so that the DOM structure of the output
+  /// does not depend on the combination of directionalities.
   BidiFormatter.LTR([alwaysSpan = false])
       : contextDirection = TextDirection.LTR,
         _alwaysSpan = alwaysSpan;
@@ -81,25 +75,24 @@
       : contextDirection = TextDirection.UNKNOWN,
         _alwaysSpan = alwaysSpan;
 
-  /** Is true if the known context direction for this formatter is RTL. */
+  /// Is true if the known context direction for this formatter is RTL.
   bool get isRTL => contextDirection == TextDirection.RTL;
 
-  /**
-   * Formats a string of a given (or estimated, if not provided)
-   * [direction] for use in HTML output of the context directionality, so
-   * an opposite-directionality string is neither garbled nor garbles what
-   * follows it.
-   * If the input string's directionality doesn't match the context
-   * directionality, we wrap it with a `span` tag and add a `dir` attribute
-   * (either "dir=rtl" or "dir=ltr").
-   * If alwaysSpan was true when constructing the formatter, the input is always
-   * wrapped with `span` tag, skipping the dir attribute when it's not needed.
-   *
-   * If [resetDir] is true and the overall directionality or the exit
-   * directionality of [text] is opposite to the context directionality,
-   * a trailing unicode BiDi mark matching the context directionality is
-   * appended (LRM or RLM). If [isHtml] is false, we HTML-escape the [text].
-   */
+  /// Formats a string of a given (or estimated, if not provided) [direction]
+  /// for use in HTML output of the context directionality, so an
+  /// opposite-directionality string is neither garbled nor garbles what follows
+  /// it.
+  ///
+  ///If the input string's directionality doesn't match the context
+  /// directionality, we wrap it with a `span` tag and add a `dir` attribute
+  /// (either "dir=rtl" or "dir=ltr").  If alwaysSpan was true when constructing
+  /// the formatter, the input is always wrapped with `span` tag, skipping the
+  /// dir attribute when it's not needed.
+  ///
+  /// If [resetDir] is true and the overall directionality or the exit
+  /// directionality of [text] is opposite to the context directionality,
+  /// a trailing unicode BiDi mark matching the context directionality is
+  /// appended (LRM or RLM). If [isHtml] is false, we HTML-escape the [text].
   String wrapWithSpan(String text,
       {bool isHtml: false, bool resetDir: true, TextDirection direction}) {
     if (direction == null) direction = estimateDirection(text, isHtml: isHtml);
@@ -118,25 +111,23 @@
     return result + (resetDir ? _resetDir(text, direction, isHtml) : '');
   }
 
-  /**
-   * Format [text] of a known (if specified) or estimated [direction] for use
-   * in *plain-text* output of the context directionality, so an
-   * opposite-directionality text is neither garbled nor garbles what follows
-   * it. Unlike wrapWithSpan, this makes use of unicode BiDi formatting
-   * characters instead of spans for wrapping. The returned string would be
-   * RLE+text+PDF for RTL text, or LRE+text+PDF for LTR text.
-   *
-   * If [resetDir] is true, and if the overall directionality or the exit
-   * directionality of text are opposite to the context directionality,
-   * a trailing unicode BiDi mark matching the context directionality is
-   * appended (LRM or RLM).
-   *
-   * In HTML, the *only* valid use of this function is inside of elements that
-   * do not allow markup, e.g. an 'option' tag.
-   * This function does *not* do HTML-escaping regardless of the value of
-   * [isHtml]. [isHtml] is used to designate if the text contains HTML (escaped
-   * or unescaped).
-   */
+  /// Format [text] of a known (if specified) or estimated [direction] for use
+  /// in *plain-text* output of the context directionality, so an
+  /// opposite-directionality text is neither garbled nor garbles what follows
+  /// it. Unlike wrapWithSpan, this makes use of unicode BiDi formatting
+  /// characters instead of spans for wrapping. The returned string would be
+  /// RLE+text+PDF for RTL text, or LRE+text+PDF for LTR text.
+  ///
+  /// If [resetDir] is true, and if the overall directionality or the exit
+  /// directionality of text are opposite to the context directionality,
+  /// a trailing unicode BiDi mark matching the context directionality is
+  /// appended (LRM or RLM).
+  ///
+  /// In HTML, the *only* valid use of this function is inside of elements that
+  /// do not allow markup, e.g. an 'option' tag.
+  /// This function does *not* do HTML-escaping regardless of the value of
+  /// [isHtml]. [isHtml] is used to designate if the text contains HTML (escaped
+  /// or unescaped).
   String wrapWithUnicode(String text,
       {bool isHtml: false, bool resetDir: true, TextDirection direction}) {
     if (direction == null) direction = estimateDirection(text, isHtml: isHtml);
@@ -148,24 +139,20 @@
     return result + (resetDir ? _resetDir(text, direction, isHtml) : '');
   }
 
-  /**
-   * Estimates the directionality of [text] using the best known
-   * general-purpose method (using relative word counts). A
-   * TextDirection.UNKNOWN return value indicates completely neutral input.
-   * [isHtml] is true if [text] HTML or HTML-escaped.
-   */
+  /// Estimates the directionality of [text] using the best known
+  /// general-purpose method (using relative word counts). A
+  /// TextDirection.UNKNOWN return value indicates completely neutral input.
+  /// [isHtml] is true if [text] HTML or HTML-escaped.
   TextDirection estimateDirection(String text, {bool isHtml: false}) {
     return Bidi.estimateDirectionOfText(text, isHtml: isHtml); //TODO~!!!
   }
 
-  /**
-   * Returns a unicode BiDi mark matching the surrounding context's [direction]
-   * (not necessarily the direction of [text]). The function returns an LRM or
-   * RLM if the overall directionality or the exit directionality of [text] is
-   * opposite the context directionality. Otherwise
-   * return the empty string. [isHtml] is true if [text] is HTML or
-   * HTML-escaped.
-   */
+  /// Returns a unicode BiDi mark matching the surrounding context's [direction]
+  /// (not necessarily the direction of [text]). The function returns an LRM or
+  /// RLM if the overall directionality or the exit directionality of [text] is
+  /// opposite the context directionality. Otherwise
+  /// return the empty string. [isHtml] is true if [text] is HTML or
+  /// HTML-escaped.
   String _resetDir(String text, TextDirection direction, bool isHtml) {
     // endsWithRtl and endsWithLtr are called only if needed (short-circuit).
     if ((contextDirection == TextDirection.LTR &&
diff --git a/packages/intl/lib/src/intl/bidi_utils.dart b/packages/intl/lib/src/intl/bidi_utils.dart
index 378e0cc..438ef29 100644
--- a/packages/intl/lib/src/intl/bidi_utils.dart
+++ b/packages/intl/lib/src/intl/bidi_utils.dart
@@ -4,24 +4,22 @@
 
 part of intl;
 
-/**
- * Bidi stands for Bi-directional text.
- * According to http://en.wikipedia.org/wiki/Bi-directional_text:
- * Bi-directional text is text containing text in both text directionalities,
- * both right-to-left (RTL) and left-to-right (LTR). It generally involves text
- * containing different types of alphabets, but may also refer to boustrophedon,
- * which is changing text directionality in each row.
- *
- * This file provides some utility classes for determining directionality of
- * text, switching CSS layout from LTR to RTL, and other normalizing utilities
- * needed when switching between RTL and LTR formatting.
- *
- * It defines the TextDirection class which is used to represent directionality
- * of text,
- * In most cases, it is preferable to use bidi_formatter.dart, which provides
- * bidi functionality in the given directional context, instead of using
- * bidi_utils.dart directly.
- */
+/// Bidi stands for Bi-directional text.  According to
+/// http://en.wikipedia.org/wiki/Bi-directional_text: Bi-directional text is
+/// text containing text in both text directionalities, both right-to-left (RTL)
+/// and left-to-right (LTR). It generally involves text containing different
+/// types of alphabets, but may also refer to boustrophedon, which is changing
+/// text directionality in each row.
+///
+/// This file provides some utility classes for determining directionality of
+/// text, switching CSS layout from LTR to RTL, and other normalizing utilities
+/// needed when switching between RTL and LTR formatting.
+///
+/// It defines the TextDirection class which is used to represent directionality
+/// of text,
+/// In most cases, it is preferable to use bidi_formatter.dart, which provides
+/// bidi functionality in the given directional context, instead of using
+/// bidi_utils.dart directly.
 class TextDirection {
   static const LTR = const TextDirection._('LTR', 'ltr');
   static const RTL = const TextDirection._('RTL', 'rtl');
@@ -30,71 +28,60 @@
   // text falls back on the more common ltr direction.
   static const UNKNOWN = const TextDirection._('UNKNOWN', 'ltr');
 
-  /**
-   * Textual representation of the directionality constant. One of
-   * 'LTR', 'RTL', or 'UNKNOWN'.
-   */
+  /// Textual representation of the directionality constant. One of
+  /// 'LTR', 'RTL', or 'UNKNOWN'.
   final String value;
 
-  /** Textual representation of the directionality when used in span tag. */
+  /// Textual representation of the directionality when used in span tag.
   final String spanText;
 
   const TextDirection._(this.value, this.spanText);
 
-  /**
-   * Returns true if [otherDirection] is known to be different from this
-   * direction.
-   */
+  /// Returns true if [otherDirection] is known to be different from this
+  /// direction.
   bool isDirectionChange(TextDirection otherDirection) =>
       otherDirection != TextDirection.UNKNOWN && this != otherDirection;
 }
 
-/**
- * This provides utility methods for working with bidirectional text. All
- * of the methods are static, and are organized into a class primarily to
- * group them together for documentation and discoverability.
- */
+/// This provides utility methods for working with bidirectional text. All
+/// of the methods are static, and are organized into a class primarily to
+/// group them together for documentation and discoverability.
 class Bidi {
-
-  /** Unicode "Left-To-Right Embedding" (LRE) character. */
+  /// Unicode "Left-To-Right Embedding" (LRE) character.
   static const LRE = '\u202A';
 
-  /** Unicode "Right-To-Left Embedding" (RLE) character. */
+  /// Unicode "Right-To-Left Embedding" (RLE) character.
   static const RLE = '\u202B';
 
-  /** Unicode "Pop Directional Formatting" (PDF) character. */
+  /// Unicode "Pop Directional Formatting" (PDF) character.
   static const PDF = '\u202C';
 
-  /** Unicode "Left-To-Right Mark" (LRM) character. */
+  /// Unicode "Left-To-Right Mark" (LRM) character.
   static const LRM = '\u200E';
 
-  /** Unicode "Right-To-Left Mark" (RLM) character. */
+  /// Unicode "Right-To-Left Mark" (RLM) character.
   static const RLM = '\u200F';
 
-  /** Constant to define the threshold of RTL directionality. */
+  /// Constant to define the threshold of RTL directionality.
   static num _RTL_DETECTION_THRESHOLD = 0.40;
 
-  /**
-   * Practical patterns to identify strong LTR and RTL characters, respectively.
-   * These patterns are not completely correct according to the Unicode
-   * standard. They are simplified for performance and small code size.
-   */
+  /// Practical patterns to identify strong LTR and RTL characters,
+  /// respectively.  These patterns are not completely correct according to the
+  /// Unicode standard. They are simplified for performance and small code size.
   static const String _LTR_CHARS =
       r'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590'
       r'\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF';
   static const String _RTL_CHARS = r'\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC';
 
-  /**
-   * Returns the input [text] with spaces instead of HTML tags or HTML escapes,
-   * which is helpful for text directionality estimation.
-   * Note: This function should not be used in other contexts.
-   * It does not deal well with many things: comments, script,
-   * elements, style elements, dir attribute,`>` in quoted attribute values,
-   * etc. But it does handle well enough the most common use cases.
-   * Since the worst that can happen as a result of these shortcomings is that
-   * the wrong directionality will be estimated, we have not invested in
-   * improving this.
-   */
+  /// Returns the input [text] with spaces instead of HTML tags or HTML escapes,
+  /// which is helpful for text directionality estimation.
+  /// Note: This function should not be used in other contexts.
+  /// It does not deal well with many things: comments, script,
+  /// elements, style elements, dir attribute,`>` in quoted attribute values,
+  /// etc. But it does handle well enough the most common use cases.
+  /// Since the worst that can happen as a result of these shortcomings is that
+  /// the wrong directionality will be estimated, we have not invested in
+  /// improving this.
   static String stripHtmlIfNeeded(String text) {
     // The regular expression is simplified for an HTML tag (opening or
     // closing) or an HTML escape. We might want to skip over such expressions
@@ -102,135 +89,124 @@
     return text.replaceAll(new RegExp(r'<[^>]*>|&[^;]+;'), ' ');
   }
 
-  /**
-   * Determines if the first character in [text] with strong directionality is
-   * LTR. If [isHtml] is true, the text is HTML or HTML-escaped.
-   */
+  /// Determines if the first character in [text] with strong directionality is
+  /// LTR. If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool startsWithLtr(String text, [isHtml = false]) {
     return new RegExp('^[^$_RTL_CHARS]*[$_LTR_CHARS]')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Determines if the first character in [text] with strong directionality is
-   * RTL. If [isHtml] is true, the text is HTML or HTML-escaped.
-   */
+  /// Determines if the first character in [text] with strong directionality is
+  /// RTL. If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool startsWithRtl(String text, [isHtml = false]) {
     return new RegExp('^[^$_LTR_CHARS]*[$_RTL_CHARS]')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Determines if the exit directionality (ie, the last strongly-directional
-   * character in [text] is LTR. If [isHtml] is true, the text is HTML or
-   * HTML-escaped.
-   */
+  /// Determines if the exit directionality (ie, the last strongly-directional
+  /// character in [text] is LTR. If [isHtml] is true, the text is HTML or
+  /// HTML-escaped.
   static bool endsWithLtr(String text, [isHtml = false]) {
     return new RegExp('[$_LTR_CHARS][^$_RTL_CHARS]*\$')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Determines if the exit directionality (ie, the last strongly-directional
-   * character in [text] is RTL. If [isHtml] is true, the text is HTML or
-   * HTML-escaped.
-   */
+  /// Determines if the exit directionality (ie, the last strongly-directional
+  /// character in [text] is RTL. If [isHtml] is true, the text is HTML or
+  /// HTML-escaped.
   static bool endsWithRtl(String text, [isHtml = false]) {
     return new RegExp('[$_RTL_CHARS][^$_LTR_CHARS]*\$')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Determines if the given [text] has any LTR characters in it.
-   * If [isHtml] is true, the text is HTML or HTML-escaped.
-   */
+  /// Determines if the given [text] has any LTR characters in it.
+  /// If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool hasAnyLtr(String text, [isHtml = false]) {
     return new RegExp(r'[' '$_LTR_CHARS' r']')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Determines if the given [text] has any RTL characters in it.
-   * If [isHtml] is true, the text is HTML or HTML-escaped.
-   */
+  /// Determines if the given [text] has any RTL characters in it.
+  /// If [isHtml] is true, the text is HTML or HTML-escaped.
   static bool hasAnyRtl(String text, [isHtml = false]) {
     return new RegExp(r'[' '$_RTL_CHARS' r']')
         .hasMatch(isHtml ? stripHtmlIfNeeded(text) : text);
   }
 
-  /**
-   * Check if a BCP 47 / III [languageString] indicates an RTL language.
-   *
-   * i.e. either:
-   * - a language code explicitly specifying one of the right-to-left scripts,
-   *   e.g. "az-Arab", or
-   * - a language code specifying one of the languages normally written in a
-   *   right-to-left script, e.g. "fa" (Farsi), except ones explicitly
-   *   specifying Latin or Cyrillic script (which are the usual LTR
-   *   alternatives).
-   *
-   * The list of right-to-left scripts appears in the 100-199 range in
-   * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and
-   * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, and
-   * Tifinagh, which also have significant modern usage. The rest (Syriac,
-   * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern usage
-   * and are not recognized.
-   * The languages usually written in a right-to-left script are taken as those
-   * with Suppress-Script: Hebr|Arab|Thaa|Nkoo|Tfng  in
-   * http://www.iana.org/assignments/language-subtag-registry,
-   * as well as Sindhi (sd) and Uyghur (ug).
-   * The presence of other subtags of the language code, e.g. regions like EG
-   * (Egypt), is ignored.
-   */
-  static bool isRtlLanguage(String languageString) {
-    return new RegExp(r'^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_]'
-        r'(Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))'
-        r'($|-|_)', caseSensitive: false).hasMatch(languageString);
+  static final _rtlLocaleRegex = new RegExp(
+      r'^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_]'
+      r'(Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))'
+      r'($|-|_)',
+      caseSensitive: false);
+
+  static String _lastLocaleCheckedForRtl;
+  static bool _lastRtlCheck;
+
+  /// Check if a BCP 47 / III [languageString] indicates an RTL language.
+  ///
+  /// i.e. either:
+  /// - a language code explicitly specifying one of the right-to-left scripts,
+  ///   e.g. "az-Arab", or
+  /// - a language code specifying one of the languages normally written in a
+  ///   right-to-left script, e.g. "fa" (Farsi), except ones explicitly
+  ///   specifying Latin or Cyrillic script (which are the usual LTR
+  ///   alternatives).
+  ///
+  /// The list of right-to-left scripts appears in the 100-199 range in
+  /// http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and
+  /// Hebrew are by far the most widely used. We also recognize Thaana, N'Ko,
+  /// and Tifinagh, which also have significant modern usage. The rest (Syriac,
+  /// Samaritan, Mandaic, etc.) seem to have extremely limited or no modern
+  /// usage and are not recognized.  The languages usually written in a
+  /// right-to-left script are taken as those with Suppress-Script:
+  /// Hebr|Arab|Thaa|Nkoo|Tfng in
+  /// http://www.iana.org/assignments/language-subtag-registry, as well as
+  /// Sindhi (sd) and Uyghur (ug).  The presence of other subtags of the
+  /// language code, e.g. regions like EG (Egypt), is ignored.
+  static bool isRtlLanguage([String languageString]) {
+    var language = languageString ?? Intl.getCurrentLocale();
+    if (_lastLocaleCheckedForRtl != language) {
+      _lastLocaleCheckedForRtl = language;
+      _lastRtlCheck = _rtlLocaleRegex.hasMatch(language);
+    }
+    return _lastRtlCheck;
   }
 
-  /**
-   * Enforce the [html] snippet in RTL directionality regardless of overall
-   * context. If the html piece was enclosed by a tag, the direction will be
-   * applied to existing tag, otherwise a span tag will be added as wrapper.
-   * For this reason, if html snippet start with with tag, this tag must enclose
-   * the whole piece. If the tag already has a direction specified, this new one
-   * will override existing one in behavior (should work on Chrome, FF, and IE
-   * since this was ported directly from the Closure version).
-   */
+  /// Enforce the [html] snippet in RTL directionality regardless of overall
+  /// context. If the html piece was enclosed by a tag, the direction will be
+  /// applied to existing tag, otherwise a span tag will be added as wrapper.
+  /// For this reason, if html snippet start with with tag, this tag must
+  /// enclose the whole piece. If the tag already has a direction specified,
+  /// this new one will override existing one in behavior (should work on
+  /// Chrome, FF, and IE since this was ported directly from the Closure
+  /// version).
   static String enforceRtlInHtml(String html) =>
       _enforceInHtmlHelper(html, 'rtl');
 
-  /**
-   * Enforce RTL on both end of the given [text] using unicode BiDi formatting
-   * characters RLE and PDF.
-   */
+  /// Enforce RTL on both end of the given [text] using unicode BiDi formatting
+  /// characters RLE and PDF.
   static String enforceRtlInText(String text) => '$RLE$text$PDF';
 
-  /**
-   * Enforce the [html] snippet in LTR directionality regardless of overall
-   * context. If the html piece was enclosed by a tag, the direction will be
-   * applied to existing tag, otherwise a span tag will be added as wrapper.
-   * For this reason, if html snippet start with with tag, this tag must enclose
-   * the whole piece. If the tag already has a direction specified, this new one
-   * will override existing one in behavior (tested on FF and IE).
-   */
+  /// Enforce the [html] snippet in LTR directionality regardless of overall
+  /// context. If the html piece was enclosed by a tag, the direction will be
+  /// applied to existing tag, otherwise a span tag will be added as wrapper.
+  /// For this reason, if html snippet start with with tag, this tag must
+  /// enclose the whole piece. If the tag already has a direction specified,
+  /// this new one will override existing one in behavior (tested on FF and IE).
   static String enforceLtrInHtml(String html) =>
       _enforceInHtmlHelper(html, 'ltr');
 
-  /**
-   * Enforce LTR on both end of the given [text] using unicode BiDi formatting
-   * characters LRE and PDF.
-   */
+  /// Enforce LTR on both end of the given [text] using unicode BiDi formatting
+  /// characters LRE and PDF.
   static String enforceLtrInText(String text) => '$LRE$text$PDF';
 
-  /**
-   * Enforce the [html] snippet in the desired [direction] regardless of overall
-   * context. If the html piece was enclosed by a tag, the direction will be
-   * applied to existing tag, otherwise a span tag will be added as wrapper.
-   * For this reason, if html snippet start with with tag, this tag must enclose
-   * the whole piece. If the tag already has a direction specified, this new one
-   * will override existing one in behavior (tested on FF and IE).
-   */
+  /// Enforce the [html] snippet in the desired [direction] regardless of
+  /// overall context. If the html piece was enclosed by a tag, the direction
+  /// will be applied to existing tag, otherwise a span tag will be added as
+  /// wrapper.  For this reason, if html snippet start with with tag, this tag
+  /// must enclose the whole piece. If the tag already has a direction
+  /// specified, this new one will override existing one in behavior (tested on
+  /// FF and IE).
   static String _enforceInHtmlHelper(String html, String direction) {
     if (html.startsWith('<')) {
       StringBuffer buffer = new StringBuffer();
@@ -248,12 +224,10 @@
     return '\n<span dir=$direction>$html</span>';
   }
 
-  /**
-   * Apply bracket guard to [str] using html span tag. This is to address the
-   * problem of messy bracket display that frequently happens in RTL layout.
-   * If [isRtlContext] is true, then we explicitly want to wrap in a span of RTL
-   * directionality, regardless of the estimated directionality.
-   */
+  /// Apply bracket guard to [str] using html span tag. This is to address the
+  /// problem of messy bracket display that frequently happens in RTL layout.
+  /// If [isRtlContext] is true, then we explicitly want to wrap in a span of
+  /// RTL directionality, regardless of the estimated directionality.
   static String guardBracketInHtml(String str, [bool isRtlContext]) {
     var useRtl = isRtlContext == null ? hasAnyRtl(str) : isRtlContext;
     RegExp matchingBrackets =
@@ -262,14 +236,12 @@
         '<span dir=${useRtl? "rtl" : "ltr"}>', '</span>');
   }
 
-  /**
-   * Apply bracket guard to [str] using LRM and RLM. This is to address the
-   * problem of messy bracket display that frequently happens in RTL layout.
-   * This version works for both plain text and html, but in some cases is not
-   * as good as guardBracketInHtml.
-   * If [isRtlContext] is true, then we explicitly want to wrap in a span of RTL
-   * directionality, regardless of the estimated directionality.
-   */
+  /// Apply bracket guard to [str] using LRM and RLM. This is to address the
+  /// problem of messy bracket display that frequently happens in RTL layout.
+  /// This version works for both plain text and html, but in some cases is not
+  /// as good as guardBracketInHtml. If [isRtlContext] is true, then we
+  /// explicitly want to wrap in a span of RTL directionality, regardless of the
+  /// estimated directionality.
   static String guardBracketInText(String str, [bool isRtlContext]) {
     var useRtl = isRtlContext == null ? hasAnyRtl(str) : isRtlContext;
     var mark = useRtl ? RLM : LRM;
@@ -277,15 +249,12 @@
         new RegExp(r'(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)'), mark, mark);
   }
 
-  /**
-   * (Mostly) reimplements the $& functionality of "replace" in JavaScript.
-   * Given a [str] and the [regexp] to match with, optionally supply a string to
-   * be inserted [before] the match and/or [after]. For example,
-   * `_guardBracketHelper('firetruck', new RegExp('truck'), 'hydrant', '!')`
-   * would return 'firehydrant!'.
-   */
-  // TODO(efortuna): Get rid of this once this is implemented in Dart.
-  // See Issue 2979.
+  /// (Mostly) reimplements the $& functionality of "replace" in JavaScript.
+  /// Given a [str] and the [regexp] to match with, optionally supply a string
+  /// to be inserted [before] the match and/or [after]. For example,
+  /// `_guardBracketHelper('firetruck', new RegExp('truck'), 'hydrant', '!')`
+  /// would return 'firehydrant!'.  // TODO(efortuna): Get rid of this once this
+  /// is implemented in Dart.  // See Issue 2979.
   static String _guardBracketHelper(String str, RegExp regexp,
       [String before, String after]) {
     var buffer = new StringBuffer();
@@ -301,18 +270,16 @@
     return (buffer..write(str.substring(startIndex))).toString();
   }
 
-  /**
-   * Estimates the directionality of [text] using the best known
-   * general-purpose method (using relative word counts). A
-   * TextDirection.UNKNOWN return value indicates completely neutral input.
-   * [isHtml] is true if [text] HTML or HTML-escaped.
-   *
-   * If the number of RTL words is above a certain percentage of the total
-   * number of strongly directional words, returns RTL.
-   * Otherwise, if any words are strongly or weakly LTR, returns LTR.
-   * Otherwise, returns UNKNOWN, which is used to mean `neutral`.
-   * Numbers and URLs are counted as weakly LTR.
-   */
+  /// Estimates the directionality of [text] using the best known
+  /// general-purpose method (using relative word counts). A
+  /// TextDirection.UNKNOWN return value indicates completely neutral input.
+  /// [isHtml] is true if [text] HTML or HTML-escaped.
+  ///
+  /// If the number of RTL words is above a certain percentage of the total
+  /// number of strongly directional words, returns RTL.
+  /// Otherwise, if any words are strongly or weakly LTR, returns LTR.
+  /// Otherwise, returns UNKNOWN, which is used to mean `neutral`.
+  /// Numbers and URLs are counted as weakly LTR.
   static TextDirection estimateDirectionOfText(String text,
       {bool isHtml: false}) {
     text = isHtml ? stripHtmlIfNeeded(text) : text;
@@ -346,10 +313,8 @@
     }
   }
 
-  /**
-   * Replace the double and single quote directly after a Hebrew character in
-   * [str] with GERESH and GERSHAYIM. This is most likely the user's intention.
-   */
+  /// Replace the double and single quote directly after a Hebrew character in
+  /// [str] with GERESH and GERSHAYIM. This is most likely the user's intention.
   static String normalizeHebrewQuote(String str) {
     StringBuffer buf = new StringBuffer();
     if (str.length > 0) {
@@ -371,11 +336,9 @@
     return buf.toString();
   }
 
-  /**
-   * Check the estimated directionality of [str], return true if the piece of
-   * text should be laid out in RTL direction. If [isHtml] is true, the string
-   * is HTML or HTML-escaped.
-   */
+  /// Check the estimated directionality of [str], return true if the piece of
+  /// text should be laid out in RTL direction. If [isHtml] is true, the string
+  /// is HTML or HTML-escaped.
   static bool detectRtlDirectionality(String str, {bool isHtml: false}) =>
       estimateDirectionOfText(str, isHtml: isHtml) == TextDirection.RTL;
 }
diff --git a/packages/intl/lib/src/intl/compact_number_format.dart b/packages/intl/lib/src/intl/compact_number_format.dart
new file mode 100644
index 0000000..ef4f332
--- /dev/null
+++ b/packages/intl/lib/src/intl/compact_number_format.dart
@@ -0,0 +1,280 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of intl;
+
+/// Represents a compact format for a particular base
+///
+/// For example, 10k can be used to represent 10,000.  Corresponds to one of the
+/// patterns in COMPACT_DECIMAL_SHORT_FORMAT. So, for example, in en_US we have
+/// the pattern
+///
+///       4: '0K'
+/// which matches
+///
+///      new _CompactStyle(pattern: '0K', requiredDigits: 4, divisor: 1000,
+///      expectedDigits: 1, prefix: '', suffix: 'K');
+///
+/// where expectedDigits is the number of zeros.
+class _CompactStyle {
+  _CompactStyle(
+      {this.pattern,
+      this.requiredDigits: 0,
+      this.divisor: 1,
+      this.expectedDigits: 1,
+      this.prefix: '',
+      this.suffix: ''});
+
+  /// The pattern on which this is based.
+  ///
+  /// We don't actually need this, but it makes debugging easier.
+  String pattern;
+
+  /// The length for which the format applies.
+  ///
+  /// So if this is 3, we expect it to apply to numbers from 100 up. Typically
+  /// it would be from 100 to 1000, but that depends if there's a style for 4 or
+  /// not. This is the CLDR index of the pattern, and usually determines the
+  /// divisor, but if the pattern is just a 0 with no prefix or suffix then we
+  /// don't divide at all.
+  int requiredDigits;
+
+  /// What should we divide the number by in order to print. Normally is either
+  /// 10^requiredDigits or 1 if we shouldn't divide at all.
+  int divisor;
+
+  /// How many integer digits do we expect to print - the number of zeros in the
+  /// CLDR pattern.
+  int expectedDigits;
+
+  /// Text we put in front of the number part.
+  String prefix;
+
+  /// Text we put after the number part.
+  String suffix;
+
+  /// How many total digits do we expect in the number.
+  ///
+  /// If the pattern is
+  ///
+  ///       4: "00K",
+  ///
+  /// then this is 5, meaning we expect this to be a 5-digit (or more)
+  /// number. We will scale by 1000 and expect 2 integer digits remaining, so we
+  /// get something like '12K'. This is used to find the closest pattern for a
+  /// number.
+  get totalDigits => requiredDigits + expectedDigits - 1;
+
+  /// Return true if this is the fallback compact pattern, printing the number
+  /// un-compacted. e.g. 1200 might print as "1.2K", but 12 just prints as "12".
+  ///
+  /// For currencies, with the fallback pattern we use the super implementation
+  /// so that we will respect things like the default number of decimal digits
+  /// for a particular currency (e.g. two for USD, zero for JPY)
+  bool get isFallback => pattern == null || pattern == '0';
+
+  /// Should we print the number as-is, without dividing.
+  ///
+  /// This happens if the pattern has no abbreviation for scaling (e.g. K, M).
+  /// So either the pattern is empty or it is of a form like '0 $'. This is a
+  /// workaround for locales like "it", which include patterns with no suffix
+  /// for numbers >= 1000 but < 1,000,000.
+  bool get printsAsIs =>
+      isFallback ||
+      pattern.replaceAll(new RegExp('[0\u00a0\u00a4]'), '').isEmpty;
+}
+
+enum _CompactFormatType {
+  COMPACT_DECIMAL_SHORT_PATTERN,
+  COMPACT_DECIMAL_LONG_PATTERN,
+  COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN
+}
+
+class _CompactNumberFormat extends NumberFormat {
+  /// A default, using the decimal pattern, for the [getPattern] constructor parameter.
+  static String _forDecimal(NumberSymbols symbols) => symbols.DECIMAL_PATTERN;
+
+  // Will be either the COMPACT_DECIMAL_SHORT_PATTERN,
+  // COMPACT_DECIMAL_LONG_PATTERN, or COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN
+  Map<int, String> _patterns;
+
+  List<_CompactStyle> _styles = [];
+
+  _CompactNumberFormat(
+      {String locale,
+      _CompactFormatType formatType,
+      String name,
+      String currencySymbol,
+      String getPattern(NumberSymbols symbols): _forDecimal,
+      String computeCurrencySymbol(NumberFormat),
+      int decimalDigits,
+      bool isForCurrency: false})
+      : super._forPattern(locale, getPattern,
+            name: name,
+            currencySymbol: currencySymbol,
+            computeCurrencySymbol: computeCurrencySymbol,
+            decimalDigits: decimalDigits,
+            isForCurrency: isForCurrency) {
+    significantDigits = 3;
+    turnOffGrouping();
+    switch (formatType) {
+      case _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN:
+        _patterns = compactSymbols.COMPACT_DECIMAL_SHORT_PATTERN;
+        break;
+      case _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN:
+        _patterns = compactSymbols.COMPACT_DECIMAL_LONG_PATTERN ??
+            compactSymbols.COMPACT_DECIMAL_SHORT_PATTERN;
+        break;
+      case _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN:
+        _patterns = compactSymbols.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN;
+        break;
+      default:
+        throw new ArgumentError.notNull("formatType");
+    }
+    var regex = new RegExp('([^0]*)(0+)(.*)');
+    _patterns.forEach((int impliedDigits, String pattern) {
+      var match = regex.firstMatch(pattern);
+      var integerDigits = match.group(2).length;
+      var prefix = match.group(1);
+      var suffix = match.group(3);
+      // If the pattern is just zeros, with no suffix, then we shouldn't divide
+      // by the number of digits. e.g. for 'af', the pattern for 3 is '0', but
+      // it doesn't mean that 4321 should print as 4. But if the pattern was
+      // '0K', then it should print as '4K'. So we have to check if the pattern
+      // has a suffix. This seems extremely hacky, but I don't know how else to
+      // encode that. Check what other things are doing.
+      var divisor = 1;
+      if (pattern.replaceAll('0', '').isNotEmpty) {
+        divisor = pow(10, impliedDigits - integerDigits + 1);
+      }
+      var style = new _CompactStyle(
+          pattern: pattern,
+          requiredDigits: impliedDigits,
+          expectedDigits: integerDigits,
+          prefix: prefix,
+          suffix: suffix,
+          divisor: divisor);
+      _styles.add(style);
+    });
+    // Reverse the styles so that we look through them from largest to smallest.
+    _styles = _styles.reversed.toList();
+    // Add a fallback style that just prints the number.
+    _styles.add(new _CompactStyle());
+  }
+
+  /// The style in which we will format a particular number.
+  ///
+  /// This is a temporary variable that is only valid within a call to format.
+  _CompactStyle _style;
+
+  String format(number) {
+    _style = _styleFor(number);
+    var divisor = _style.printsAsIs ? 1 : _style.divisor;
+    var numberToFormat = _divide(number, divisor);
+    var formatted = super.format(numberToFormat);
+    var prefix = _style.prefix;
+    var suffix = _style.suffix;
+    // If this is for a currency, then the super call will have put the currency
+    // somewhere. We don't want it there, we want it where our style indicates,
+    // so remove it and replace. This has the remote possibility of a false
+    // positive, but it seems unlikely that e.g. USD would occur as a string in
+    // a regular number.
+    if (this._isForCurrency && !_style.isFallback) {
+      formatted = formatted.replaceFirst(currencySymbol, '').trim();
+      prefix = prefix.replaceFirst('\u00a4', currencySymbol);
+      suffix = suffix.replaceFirst('\u00a4', currencySymbol);
+    }
+    var withExtras = "${prefix}$formatted${suffix}";
+    _style = null;
+    return withExtras;
+  }
+
+  /// How many digits after the decimal place should we display, given that
+  /// there are [remainingSignificantDigits] left to show.
+  int _fractionDigitsAfter(int remainingSignificantDigits) {
+    var newFractionDigits =
+        super._fractionDigitsAfter(remainingSignificantDigits);
+    // For non-currencies, or for currencies if the numbers are large enough to
+    // compact, always use the number of significant digits and ignore
+    // decimalDigits. That is, $1.23K but also ¥12.3\u4E07, even though yen
+    // don't normally print decimal places.
+    if (!_isForCurrency || !_style.isFallback) return newFractionDigits;
+    // If we are printing a currency and it's too small to compact, but
+    // significant digits would have us only print some of the decimal digits,
+    // use all of them. So $12.30, not $12.3
+    if (newFractionDigits > 0 && newFractionDigits < decimalDigits) {
+      return decimalDigits;
+    } else {
+      return min(newFractionDigits, decimalDigits);
+    }
+  }
+
+  /// Divide numbers that may not have a division operator (e.g. Int64).
+  ///
+  /// Only used for powers of 10, so we require an integer denominator.
+  num _divide(numerator, int denominator) {
+    if (numerator is num) {
+      return numerator / denominator;
+    }
+    // If it doesn't fit in a JS int after division, we're not going to be able
+    // to meaningfully print a compact representation for it.
+    var divided = numerator ~/ denominator;
+    var integerPart = divided.toInt();
+    if (divided != integerPart) {
+      throw new FormatException(
+          "Number too big to use with compact format", numerator);
+    }
+    var remainder = numerator.remainder(denominator).toInt();
+    var originalFraction = numerator - (numerator ~/ 1);
+    var fraction = originalFraction == 0 ? 0 : originalFraction / denominator;
+    return integerPart + (remainder / denominator) + fraction;
+  }
+
+  _CompactStyle _styleFor(number) {
+    // We have to round the number based on the number of significant digits so
+    // that we pick the right style based on the rounded form and format 999999
+    // as 1M rather than 1000K.
+    var originalLength = NumberFormat.numberOfIntegerDigits(number);
+    var additionalDigits = originalLength - significantDigits;
+    var digitLength = originalLength;
+    if (additionalDigits > 0) {
+      var divisor = pow(10, additionalDigits);
+      // If we have an Int64, value speed over precision and make it double.
+      var rounded = (number.toDouble() / divisor).round() * divisor;
+      digitLength = NumberFormat.numberOfIntegerDigits(rounded);
+    }
+    for (var style in _styles) {
+      if (digitLength > style.totalDigits) {
+        return style;
+      }
+    }
+    throw new FormatException(
+        "No compact style found for number. This should not happen", number);
+  }
+
+  num parse(String text) {
+    for (var style in _styles.reversed) {
+      if (text.startsWith(style.prefix) && text.endsWith(style.suffix)) {
+        var numberText = text.substring(
+            style.prefix.length, text.length - style.suffix.length);
+        var number = _tryParsing(numberText);
+        if (number != null) {
+          return number * style.divisor;
+        }
+      }
+    }
+    throw new FormatException(
+        "Cannot parse compact number in locale '$locale'", text);
+  }
+
+  num _tryParsing(String text) {
+    try {
+      return super.parse(text);
+    } on FormatException {
+      return null;
+    }
+  }
+
+  CompactNumberSymbols get compactSymbols => compactNumberSymbols[_locale];
+}
diff --git a/packages/intl/lib/src/intl/date_format.dart b/packages/intl/lib/src/intl/date_format.dart
index 40ff895..0795b87 100644
--- a/packages/intl/lib/src/intl/date_format.dart
+++ b/packages/intl/lib/src/intl/date_format.dart
@@ -6,223 +6,218 @@
 
 // TODO(efortuna): Customized pattern system -- suggested by i18n needs
 // feedback on appropriateness.
-/**
- * DateFormat is for formatting and parsing dates in a locale-sensitive
- * manner.
- *
- * It allows the user to choose from a set of standard date time formats as well
- * as specify a customized pattern under certain locales. Date elements that
- * vary across locales include month name, week name, field order, etc.
- * We also allow the user to use any customized pattern to parse or format
- * date-time strings under certain locales. Date elements that vary across
- * locales include month name, weekname, field, order, etc.
- *
- * Formatting dates in the default "en_US" format does not require any
- * initialization. e.g.
- *       print(new DateFormat.yMMMd().format(new Date.now()));
- *
- * But for other locales, the formatting data for the locale must be
- * obtained. This can currently be done
- * in one of three ways, determined by which library you import. In all cases,
- * the "initializeDateFormatting" method must be called and will return a future
- * that is complete once the locale data is available. The result of the future
- * isn't important, but the data for that locale is available to the date
- * formatting and parsing once it completes.
- *
- * The easiest option is that the data may be available locally, imported in a
- * library that contains data for all the locales.
- *       import 'package:intl/date_symbol_data_local.dart';
- *       initializeDateFormatting("fr_FR", null).then((_) => runMyCode());
- *
- * If we are running outside of a browser, we may want to read the data
- * from files in the file system.
- *       import 'package:intl/date_symbol_data_file.dart';
- *       initializeDateFormatting("de_DE", null).then((_) => runMyCode());
- *
- * If we are running in a browser, we may want to read the data from the
- * server using the XmlHttpRequest mechanism.
- *       import 'package:intl/date_symbol_data_http_request.dart';
- *       initializeDateFormatting("pt_BR", null).then((_) => runMyCode());
- *
- * The code in example/basic/basic_example.dart shows a full example of
- * using this mechanism.
- *
- * Once we have the locale data, we need to specify the particular format.
- * This library uses the ICU/JDK date/time pattern specification both for
- * complete format specifications and also the abbreviated "skeleton" form
- * which can also adapt to different locales and is preferred where available.
- *
- * Skeletons: These can be specified either as the ICU constant name or as the
- * skeleton to which it resolves. The supported set of skeletons is as follows.
- * For each skeleton there is a named constructor that can be used to create it.
- * It's also possible to pass the skeleton as a string, but the constructor
- * is preferred.
- * 
- *      ICU Name                   Skeleton
- *      --------                   --------
- *      DAY                          d
- *      ABBR_WEEKDAY                 E
- *      WEEKDAY                      EEEE
- *      ABBR_STANDALONE_MONTH        LLL
- *      STANDALONE_MONTH             LLLL
- *      NUM_MONTH                    M
- *      NUM_MONTH_DAY                Md
- *      NUM_MONTH_WEEKDAY_DAY        MEd
- *      ABBR_MONTH                   MMM
- *      ABBR_MONTH_DAY               MMMd
- *      ABBR_MONTH_WEEKDAY_DAY       MMMEd
- *      MONTH                        MMMM
- *      MONTH_DAY                    MMMMd
- *      MONTH_WEEKDAY_DAY            MMMMEEEEd
- *      ABBR_QUARTER                 QQQ
- *      QUARTER                      QQQQ
- *      YEAR                         y
- *      YEAR_NUM_MONTH               yM
- *      YEAR_NUM_MONTH_DAY           yMd
- *      YEAR_NUM_MONTH_WEEKDAY_DAY   yMEd
- *      YEAR_ABBR_MONTH              yMMM
- *      YEAR_ABBR_MONTH_DAY          yMMMd
- *      YEAR_ABBR_MONTH_WEEKDAY_DAY  yMMMEd
- *      YEAR_MONTH                   yMMMM
- *      YEAR_MONTH_DAY               yMMMMd
- *      YEAR_MONTH_WEEKDAY_DAY       yMMMMEEEEd
- *      YEAR_ABBR_QUARTER            yQQQ
- *      YEAR_QUARTER                 yQQQQ
- *      HOUR24                       H
- *      HOUR24_MINUTE                Hm
- *      HOUR24_MINUTE_SECOND         Hms
- *      HOUR                         j
- *      HOUR_MINUTE                  jm
- *      HOUR_MINUTE_SECOND           jms
- *      HOUR_MINUTE_GENERIC_TZ       jmv
- *      HOUR_MINUTE_TZ               jmz
- *      HOUR_GENERIC_TZ              jv
- *      HOUR_TZ                      jz
- *      MINUTE                       m
- *      MINUTE_SECOND                ms
- *      SECOND                       s
- *
- * Examples Using the US Locale:
- *
- *      Pattern                           Result
- *      ----------------                  -------
- *      new DateFormat.yMd()             -> 7/10/1996
- *      new DateFormat("yMd")            -> 7/10/1996
- *      new DateFormat.yMMMMd("en_US")   -> July 10, 1996
- *      new DateFormat.jm()              -> 5:08 PM
- *      new DateFormat.yMd().add_jm()    -> 7/10/1996 5:08 PM
- *      new DateFormat.Hm()              -> 17:08 // force 24 hour time
- *
- * Explicit Pattern Syntax: Formats can also be specified with a pattern string.
- * This can be used for formats that don't have a skeleton available, but these
- * will not adapt to different locales. For example, in an explicit pattern the 
- * letters "H" and "h" are available for 24 hour and 12 hour time formats 
- * respectively. But there isn't a way in an explicit pattern to get the
- * behaviour of the "j" skeleton, which prints 24 hour or 12 hour time according
- * to the conventions of the locale, and also includes am/pm markers where 
- * appropriate. So it is preferable to use the skeletons.
- *
- * The following characters are available in explicit patterns:
- *
- *     Symbol   Meaning                Presentation        Example
- *     ------   -------                ------------        -------
- *     G        era designator         (Text)              AD
- *     y        year                   (Number)            1996
- *     M        month in year          (Text & Number)     July & 07
- *     L        standalone month       (Text & Number)     July & 07
- *     d        day in month           (Number)            10
- *     c        standalone day         (Number)            10
- *     h        hour in am/pm (1~12)   (Number)            12
- *     H        hour in day (0~23)     (Number)            0
- *     m        minute in hour         (Number)            30
- *     s        second in minute       (Number)            55
- *     S        fractional second      (Number)            978
- *     E        day of week            (Text)              Tuesday
- *     D        day in year            (Number)            189
- *     a        am/pm marker           (Text)              PM
- *     k        hour in day (1~24)     (Number)            24
- *     K        hour in am/pm (0~11)   (Number)            0
- *     z        time zone              (Text)              Pacific Standard Time
- *     Z        time zone (RFC 822)    (Number)            -0800
- *     v        time zone (generic)    (Text)              Pacific Time
- *     Q        quarter                (Text)              Q3
- *     '        escape for text        (Delimiter)         'Date='
- *     ''       single quote           (Literal)           'o''clock'
- *
- * The count of pattern letters determine the format.
- *
- * **Text**:
- * * 5 pattern letters--use narrow form for standalone. Otherwise does not apply
- * * 4 or more pattern letters--use full form,
- * * 3 pattern letters--use short or abbreviated form if one exists
- * * less than 3--use numeric form if one exists
- *
- * **Number**: the minimum number of digits. Shorter numbers are zero-padded to
- * this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is handled
- * specially; that is, if the count of 'y' is 2, the Year will be truncated to
- * 2 digits. (e.g., if "yyyy" produces "1997", "yy" produces "97".) Unlike other
- * fields, fractional seconds are padded on the right with zero.
- *
- * **(Text & Number)**: 3 or over, use text, otherwise use number.
- *
- * Any characters not in the pattern will be treated as quoted text. For
- * instance, characters like ':', '.', ' ', '#' and '@' will appear in the
- * resulting text even though they are not enclosed in single quotes. In our
- * current pattern usage, not all letters have meanings. But those unused
- * letters are strongly discouraged to be used as quoted text without quotes,
- * because we may use other letters as pattern characters in the future.
- *
- * Examples Using the US Locale:
- *
- *     Format Pattern                     Result
- *     --------------                     -------
- *     "yyyy.MM.dd G 'at' HH:mm:ss vvvv"  1996.07.10 AD at 15:08:56 Pacific Time
- *     "EEE, MMM d, ''yy"                 Wed, July 10, '96
- *     "h:mm a"                           12:08 PM
- *     "hh 'o''clock' a, zzzz"            12 o'clock PM, Pacific Daylight Time
- *     "K:mm a, vvv"                      0:00 PM, PT
- *     "yyyyy.MMMMM.dd GGG hh:mm aaa"     01996.July.10 AD 12:08 PM
- *
- * When parsing a date string using the abbreviated year pattern ("yy"),
- * DateFormat must interpret the abbreviated year relative to some
- * century. It does this by adjusting dates to be within 80 years before and 20
- * years after the time the parse function is called. For example, using a
- * pattern of "MM/dd/yy" and a DateParse instance created on Jan 1, 1997,
- * the string "01/11/12" would be interpreted as Jan 11, 2012 while the string
- * "05/04/64" would be interpreted as May 4, 1964. During parsing, only
- * strings consisting of exactly two digits, as defined by {@link
- * java.lang.Character#isDigit(char)}, will be parsed into the default
- * century. Any other numeric string, such as a one digit string, a three or
- * more digit string will be interpreted as its face value.
- *
- * If the year pattern does not have exactly two 'y' characters, the year is
- * interpreted literally, regardless of the number of digits. So using the
- * pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.
- */
+/// DateFormat is for formatting and parsing dates in a locale-sensitive
+/// manner.
+///
+/// It allows the user to choose from a set of standard date time formats as
+/// well as specify a customized pattern under certain locales. Date elements
+/// that vary across locales include month name, week name, field order, etc.
+/// We also allow the user to use any customized pattern to parse or format
+/// date-time strings under certain locales. Date elements that vary across
+/// locales include month name, weekname, field, order, etc.
+///
+/// Formatting dates in the default "en_US" format does not require any
+/// initialization. e.g.
+///       print(new DateFormat.yMMMd().format(new DateTime.now()));
+///
+/// But for other locales, the formatting data for the locale must be
+/// obtained. This can currently be done in one of three ways, determined by
+/// which library you import. In all cases, the "initializeDateFormatting"
+/// method must be called and will return a future that is complete once the
+/// locale data is available. The result of the future isn't important, but the
+/// data for that locale is available to the date formatting and parsing once it
+/// completes.
+///
+/// The easiest option is that the data may be available locally, imported in a
+/// library that contains data for all the locales.
+///       import 'package:intl/date_symbol_data_local.dart';
+///       initializeDateFormatting("fr_FR", null).then((_) => runMyCode());
+///
+/// If we are running outside of a browser, we may want to read the data
+/// from files in the file system.
+///       import 'package:intl/date_symbol_data_file.dart';
+///       initializeDateFormatting("de_DE", null).then((_) => runMyCode());
+///
+/// If we are running in a browser, we may want to read the data from the
+/// server using the XmlHttpRequest mechanism.
+///       import 'package:intl/date_symbol_data_http_request.dart';
+///       initializeDateFormatting("pt_BR", null).then((_) => runMyCode());
+///
+/// The code in example/basic/basic_example.dart shows a full example of
+/// using this mechanism.
+///
+/// Once we have the locale data, we need to specify the particular format.
+/// This library uses the ICU/JDK date/time pattern specification both for
+/// complete format specifications and also the abbreviated "skeleton" form
+/// which can also adapt to different locales and is preferred where available.
+///
+/// Skeletons: These can be specified either as the ICU constant name or as the
+/// skeleton to which it resolves. The supported set of skeletons is as follows.
+/// For each skeleton there is a named constructor that can be used to create
+/// it.  It's also possible to pass the skeleton as a string, but the
+/// constructor is preferred.
+///
+///      ICU Name                   Skeleton
+///      --------                   --------
+///      DAY                          d
+///      ABBR_WEEKDAY                 E
+///      WEEKDAY                      EEEE
+///      ABBR_STANDALONE_MONTH        LLL
+///      STANDALONE_MONTH             LLLL
+///      NUM_MONTH                    M
+///      NUM_MONTH_DAY                Md
+///      NUM_MONTH_WEEKDAY_DAY        MEd
+///      ABBR_MONTH                   MMM
+///      ABBR_MONTH_DAY               MMMd
+///      ABBR_MONTH_WEEKDAY_DAY       MMMEd
+///      MONTH                        MMMM
+///      MONTH_DAY                    MMMMd
+///      MONTH_WEEKDAY_DAY            MMMMEEEEd
+///      ABBR_QUARTER                 QQQ
+///      QUARTER                      QQQQ
+///      YEAR                         y
+///      YEAR_NUM_MONTH               yM
+///      YEAR_NUM_MONTH_DAY           yMd
+///      YEAR_NUM_MONTH_WEEKDAY_DAY   yMEd
+///      YEAR_ABBR_MONTH              yMMM
+///      YEAR_ABBR_MONTH_DAY          yMMMd
+///      YEAR_ABBR_MONTH_WEEKDAY_DAY  yMMMEd
+///      YEAR_MONTH                   yMMMM
+///      YEAR_MONTH_DAY               yMMMMd
+///      YEAR_MONTH_WEEKDAY_DAY       yMMMMEEEEd
+///      YEAR_ABBR_QUARTER            yQQQ
+///      YEAR_QUARTER                 yQQQQ
+///      HOUR24                       H
+///      HOUR24_MINUTE                Hm
+///      HOUR24_MINUTE_SECOND         Hms
+///      HOUR                         j
+///      HOUR_MINUTE                  jm
+///      HOUR_MINUTE_SECOND           jms
+///      HOUR_MINUTE_GENERIC_TZ       jmv
+///      HOUR_MINUTE_TZ               jmz
+///      HOUR_GENERIC_TZ              jv
+///      HOUR_TZ                      jz
+///      MINUTE                       m
+///      MINUTE_SECOND                ms
+///      SECOND                       s
+///
+/// Examples Using the US Locale:
+///
+///      Pattern                           Result
+///      ----------------                  -------
+///      new DateFormat.yMd()             -> 7/10/1996
+///      new DateFormat("yMd")            -> 7/10/1996
+///      new DateFormat.yMMMMd("en_US")   -> July 10, 1996
+///      new DateFormat.jm()              -> 5:08 PM
+///      new DateFormat.yMd().add_jm()    -> 7/10/1996 5:08 PM
+///      new DateFormat.Hm()              -> 17:08 // force 24 hour time
+///
+/// Explicit Pattern Syntax: Formats can also be specified with a pattern
+/// string.  This can be used for formats that don't have a skeleton available,
+/// but these will not adapt to different locales. For example, in an explicit
+/// pattern the letters "H" and "h" are available for 24 hour and 12 hour time
+/// formats respectively. But there isn't a way in an explicit pattern to get
+/// the behaviour of the "j" skeleton, which prints 24 hour or 12 hour time
+/// according to the conventions of the locale, and also includes am/pm markers
+/// where appropriate. So it is preferable to use the skeletons.
+///
+/// The following characters are available in explicit patterns:
+///
+///     Symbol   Meaning                Presentation       Example
+///     ------   -------                ------------       -------
+///     G        era designator         (Text)             AD
+///     y        year                   (Number)           1996
+///     M        month in year          (Text & Number)    July & 07
+///     L        standalone month       (Text & Number)    July & 07
+///     d        day in month           (Number)           10
+///     c        standalone day         (Number)           10
+///     h        hour in am/pm (1~12)   (Number)           12
+///     H        hour in day (0~23)     (Number)           0
+///     m        minute in hour         (Number)           30
+///     s        second in minute       (Number)           55
+///     S        fractional second      (Number)           978
+///     E        day of week            (Text)             Tuesday
+///     D        day in year            (Number)           189
+///     a        am/pm marker           (Text)             PM
+///     k        hour in day (1~24)     (Number)           24
+///     K        hour in am/pm (0~11)   (Number)           0
+///     z        time zone              (Text)             Pacific Standard Time
+///     Z        time zone (RFC 822)    (Number)           -0800
+///     v        time zone (generic)    (Text)             Pacific Time
+///     Q        quarter                (Text)             Q3
+///     '        escape for text        (Delimiter)        'Date='
+///     ''       single quote           (Literal)          'o''clock'
+///
+/// The count of pattern letters determine the format.
+///
+/// **Text**:
+/// * 5 pattern letters--use narrow form for standalone. Otherwise not used.
+/// * 4 or more pattern letters--use full form,
+/// * 3 pattern letters--use short or abbreviated form if one exists
+/// * less than 3--use numeric form if one exists
+///
+/// **Number**: the minimum number of digits. Shorter numbers are zero-padded to
+/// this amount (e.g. if "m" produces "6", "mm" produces "06"). Year is handled
+/// specially; that is, if the count of 'y' is 2, the Year will be truncated to
+/// 2 digits. (e.g., if "yyyy" produces "1997", "yy" produces "97".) Unlike
+/// other fields, fractional seconds are padded on the right with zero.
+///
+/// **(Text & Number)**: 3 or over, use text, otherwise use number.
+///
+/// Any characters not in the pattern will be treated as quoted text. For
+/// instance, characters like ':', '.', ' ', '#' and '@' will appear in the
+/// resulting text even though they are not enclosed in single quotes. In our
+/// current pattern usage, not all letters have meanings. But those unused
+/// letters are strongly discouraged to be used as quoted text without quotes,
+/// because we may use other letters as pattern characters in the future.
+///
+/// Examples Using the US Locale:
+///
+///     Format Pattern                    Result
+///     --------------                    -------
+///     "yyyy.MM.dd G 'at' HH:mm:ss vvvv" 1996.07.10 AD at 15:08:56 Pacific Time
+///     "EEE, MMM d, ''yy"                Wed, July 10, '96
+///     "h:mm a"                          12:08 PM
+///     "hh 'o''clock' a, zzzz"           12 o'clock PM, Pacific Daylight Time
+///     "K:mm a, vvv"                     0:00 PM, PT
+///     "yyyyy.MMMMM.dd GGG hh:mm aaa"    01996.July.10 AD 12:08 PM
+///
+/// When parsing a date string using the abbreviated year pattern ("yy"),
+/// DateFormat must interpret the abbreviated year relative to some
+/// century. It does this by adjusting dates to be within 80 years before and 20
+/// years after the time the parse function is called. For example, using a
+/// pattern of "MM/dd/yy" and a DateParse instance created on Jan 1, 1997,
+/// the string "01/11/12" would be interpreted as Jan 11, 2012 while the string
+/// "05/04/64" would be interpreted as May 4, 1964. During parsing, only
+/// strings consisting of exactly two digits, as defined by {@link
+/// java.lang.Character#isDigit(char)}, will be parsed into the default
+/// century. Any other numeric string, such as a one digit string, a three or
+/// more digit string will be interpreted as its face value.
+///
+/// If the year pattern does not have exactly two 'y' characters, the year is
+/// interpreted literally, regardless of the number of digits. So using the
+/// pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.
 
 class DateFormat {
-
-  /**
-   * Creates a new DateFormat, using the format specified by [newPattern]. For
-   * forms that match one of our predefined skeletons, we look up the
-   * corresponding pattern in [locale] (or in the default locale if none is
-   * specified) and use the resulting full format string. This is the
-   * preferred usage, but if [newPattern] does not match one of the skeletons,
-   * then it is used as a format directly, but will not be adapted to suit
-   * the locale.
-   *
-   * For example, in an en_US locale, specifying the skeleton
-   *     new DateFormat.yMEd();
-   * or the explicit
-   *     new DateFormat('EEE, M/d/y');
-   * would produce the same result, a date of the form
-   *     Wed, 6/27/2012
-   * The first version would produce a different format string if used in
-   * another locale, but the second format would always be the same.
-   *
-   * If [locale] does not exist in our set of supported locales then an
-   * [ArgumentError] is thrown.
-   */
+  /// Creates a new DateFormat, using the format specified by [newPattern]. For
+  /// forms that match one of our predefined skeletons, we look up the
+  /// corresponding pattern in [locale] (or in the default locale if none is
+  /// specified) and use the resulting full format string. This is the
+  /// preferred usage, but if [newPattern] does not match one of the skeletons,
+  /// then it is used as a format directly, but will not be adapted to suit
+  /// the locale.
+  ///
+  /// For example, in an en_US locale, specifying the skeleton
+  ///     new DateFormat.yMEd();
+  /// or the explicit
+  ///     new DateFormat('EEE, M/d/y');
+  /// would produce the same result, a date of the form
+  ///     Wed, 6/27/2012
+  /// The first version would produce a different format string if used in
+  /// another locale, but the second format would always be the same.
+  ///
+  /// If [locale] does not exist in our set of supported locales then an
+  /// [ArgumentError] is thrown.
   DateFormat([String newPattern, String locale]) {
     // TODO(alanknight): It should be possible to specify multiple skeletons eg
     // date, time, timezone all separately. Adding many or named parameters to
@@ -233,10 +228,8 @@
     addPattern(newPattern);
   }
 
-  /**
-   * Return a string representing [date] formatted according to our locale
-   * and internal format.
-   */
+  /// Return a string representing [date] formatted according to our locale
+  /// and internal format.
   String format(DateTime date) {
     // TODO(efortuna): read optional TimeZone argument (or similar)?
     var result = new StringBuffer();
@@ -244,66 +237,57 @@
     return result.toString();
   }
 
-  /**
-   * NOT YET IMPLEMENTED.
-   *
-   * Returns a date string indicating how long ago (3 hours, 2 minutes)
-   * something has happened or how long in the future something will happen
-   * given a [reference] DateTime relative to the current time.
-   */
+  /// NOT YET IMPLEMENTED.
+  ///
+  /// Returns a date string indicating how long ago (3 hours, 2 minutes)
+  /// something has happened or how long in the future something will happen
+  /// given a [reference] DateTime relative to the current time.
   String formatDuration(DateTime reference) => '';
 
-  /**
-   * NOT YET IMPLEMENTED.
-   *
-   * Formats a string indicating how long ago (negative [duration]) or how far
-   * in the future (positive [duration]) some time is with respect to a
-   * reference [date].
-   */
+  /// NOT YET IMPLEMENTED.
+  ///
+  /// Formats a string indicating how long ago (negative [duration]) or how far
+  /// in the future (positive [duration]) some time is with respect to a
+  /// reference [date].
   String formatDurationFrom(Duration duration, DateTime date) => '';
 
-  /**
-   * Given user input, attempt to parse the [inputString] into the anticipated
-   * format, treating it as being in the local timezone. If [inputString] does
-   * not match our format, throws a [FormatException]. This will accept dates
-   * whose values are not strictly valid, or strings with additional characters
-   * (including whitespace) after a valid date. For stricter parsing, use
-   * [parseStrict].
-   */
+  /// Given user input, attempt to parse the [inputString] into the anticipated
+  /// format, treating it as being in the local timezone. If [inputString] does
+  /// not match our format, throws a [FormatException]. This will accept dates
+  /// whose values are not strictly valid, or strings with additional characters
+  /// (including whitespace) after a valid date. For stricter parsing, use
+  /// [parseStrict].
   DateTime parse(String inputString, [utc = false]) =>
       _parse(inputString, utc: utc, strict: false);
 
-  /**
-   * Given user input, attempt to parse the [inputString] "loosely" into the
-   * anticipated format, accepting some variations from the strict format.
-   *
-   * If [inputString]
-   * is accepted by [parseStrict], just return the result. If not, attempt to
-   * parse it, but accepting either upper or
-   * lower case, allowing delimiters to be missing and replaced or
-   * supplemented with whitespace,
-   * and allowing arbitrary amounts of whitespace wherever whitespace is
-   * permitted. Note that this does not allow trailing characters, the way
-   * [parse] does. It also does not allow leading whitespace on delimiters,
-   * and does not allow alternative names for months or weekdays other than
-   * those the format knows about. The restrictions are quite arbitrary and
-   * it's not known how well they'll work for locales that aren't English-like.
-   *
-   * If [inputString] does not parse, this throws a
-   * [FormatException].
-   *
-   * For example, this will accept
-   *
-   *       new DateFormat.yMMMd("en_US").parseLoose("SEp   3 2014");
-   *       new DateFormat.yMd("en_US").parseLoose("09    03/2014");
-   *
-   * It will NOT accept
-   *
-   *      // "Sept" is not a valid month name.
-   *      new DateFormat.yMMMd("en_US").parseLoose("Sept 3, 2014");
-   *      // Delimiters can't have leading whitespace.
-   *      new DateFormat.yMd("en_US").parseLoose("09 / 03 / 2014");
-   */
+  /// Given user input, attempt to parse the [inputString] "loosely" into the
+  /// anticipated format, accepting some variations from the strict format.
+  ///
+  /// If [inputString]
+  /// is accepted by [parseStrict], just return the result. If not, attempt to
+  /// parse it, but accepting either upper or
+  /// lower case, allowing delimiters to be missing and replaced or
+  /// supplemented with whitespace,
+  /// and allowing arbitrary amounts of whitespace wherever whitespace is
+  /// permitted. Note that this does not allow trailing characters, the way
+  /// [parse] does.
+  /// It also does not allow alternative names for months or weekdays other than
+  /// those the format knows about. The restrictions are quite arbitrary and
+  /// it's not known how well they'll work for locales that aren't English-like.
+  ///
+  /// If [inputString] does not parse, this throws a
+  /// [FormatException].
+  ///
+  /// For example, this will accept
+  ///
+  ///       new DateFormat.yMMMd("en_US").parseLoose("SEp   3 2014");
+  ///       new DateFormat.yMd("en_US").parseLoose("09    03/2014");
+  ///       new DateFormat.yMd("en_US").parseLoose("09 / 03 / 2014");
+  ///
+  /// It will NOT accept
+  ///
+  ///      // "Sept" is not a valid month name.
+  ///      new DateFormat.yMMMd("en_US").parseLoose("Sept 3, 2014");
   DateTime parseLoose(String inputString, [utc = false]) {
     try {
       return _parse(inputString, utc: utc, strict: true);
@@ -325,15 +309,13 @@
     return dateFields.asDate();
   }
 
-  /**
-   * Given user input, attempt to parse the [inputString] into the anticipated
-   * format, treating it as being in the local timezone. If [inputString] does
-   * not match our format, throws a [FormatException]. This will reject dates
-   * whose values are not strictly valid, even if the
-   * DateTime constructor will accept them. It will also rejct strings with
-   * additional characters (including whitespace) after a valid date. For
-   * looser parsing, use [parse].
-   */
+  /// Given user input, attempt to parse the [inputString] into the anticipated
+  /// format, treating it as being in the local timezone. If [inputString] does
+  /// not match our format, throws a [FormatException]. This will reject dates
+  /// whose values are not strictly valid, even if the
+  /// DateTime constructor will accept them. It will also rejct strings with
+  /// additional characters (including whitespace) after a valid date. For
+  /// looser parsing, use [parse].
   DateTime parseStrict(String inputString, [utc = false]) =>
       _parse(inputString, utc: utc, strict: true);
 
@@ -352,51 +334,42 @@
     return dateFields.asDate();
   }
 
-  /**
-   * Given user input, attempt to parse the [inputString] into the anticipated
-   * format, treating it as being in UTC.
-   *
-   * The canonical Dart style name
-   * is [parseUtc], but [parseUTC] is retained
-   * for backward-compatibility.
-   */
+  /// Given user input, attempt to parse the [inputString] into the anticipated
+  /// format, treating it as being in UTC.
+  ///
+  /// The canonical Dart style name
+  /// is [parseUtc], but [parseUTC] is retained
+  /// for backward-compatibility.
   DateTime parseUTC(String inputString) => parse(inputString, true);
 
-  /**
-   * Given user input, attempt to parse the [inputString] into the anticipated
-   * format, treating it as being in UTC.
-   *
-   * The canonical Dart style name
-   * is [parseUtc], but [parseUTC] is retained
-   * for backward-compatibility.
-   */
+  /// Given user input, attempt to parse the [inputString] into the anticipated
+  /// format, treating it as being in UTC.
+  ///
+  /// The canonical Dart style name
+  /// is [parseUtc], but [parseUTC] is retained
+  /// for backward-compatibility.
   DateTime parseUtc(String inputString) => parse(inputString, true);
 
-  /**
-   * Return the locale code in which we operate, e.g. 'en_US' or 'pt'.
-   */
+  /// Return the locale code in which we operate, e.g. 'en_US' or 'pt'.
   String get locale => _locale;
 
-  /**
-   * Returns a list of all locales for which we have date formatting
-   * information.
-   */
-  static List<String> allLocalesWithSymbols() => dateTimeSymbols.keys.toList();
+  /// Returns a list of all locales for which we have date formatting
+  /// information.
+  static List<String> allLocalesWithSymbols() =>
+      new List<String>.from(dateTimeSymbols.keys);
 
-  /**
-   * The named constructors for this class are all conveniences for creating
-   * instances using one of the known "skeleton" formats, and having code
-   * completion support for discovering those formats.
-   * So,
-   *     new DateFormat.yMd("en_US")
-   * is equivalent to
-   *     new DateFormat("yMd", "en_US")
-   * To create a compound format you can use these constructors in combination
-   * with the add_ methods below. e.g.
-   *     new DateFormat.yMd().add_Hms();
-   * If the optional [locale] is omitted, the format will be created using the
-   * default locale in [Intl.systemLocale].
-   */
+  /// The named constructors for this class are all conveniences for creating
+  /// instances using one of the known "skeleton" formats, and having code
+  /// completion support for discovering those formats.
+  /// So,
+  ///     new DateFormat.yMd("en_US")
+  /// is equivalent to
+  ///     new DateFormat("yMd", "en_US")
+  /// To create a compound format you can use these constructors in combination
+  /// with the add_ methods below. e.g.
+  ///     new DateFormat.yMd().add_Hms();
+  /// If the optional [locale] is omitted, the format will be created using the
+  /// default locale in [Intl.systemLocale].
   DateFormat.d([locale]) : this("d", locale);
   DateFormat.E([locale]) : this("E", locale);
   DateFormat.EEEE([locale]) : this("EEEE", locale);
@@ -439,13 +412,11 @@
   DateFormat.ms([locale]) : this("ms", locale);
   DateFormat.s([locale]) : this("s", locale);
 
-  /**
-   * The "add_*" methods append a particular skeleton to the format, or set
-   * it as the only format if none was previously set. These are primarily
-   * useful for creating compound formats. For example
-   *       new DateFormat.yMd().add_Hms();
-   * would create a date format that prints both the date and the time.
-   */
+  /// The "add_*" methods append a particular skeleton to the format, or set
+  /// it as the only format if none was previously set. These are primarily
+  /// useful for creating compound formats. For example
+  ///       new DateFormat.yMd().add_Hms();
+  /// would create a date format that prints both the date and the time.
   DateFormat add_d() => addPattern("d");
   DateFormat add_E() => addPattern("E");
   DateFormat add_EEEE() => addPattern("EEEE");
@@ -488,10 +459,8 @@
   DateFormat add_ms() => addPattern("ms");
   DateFormat add_s() => addPattern("s");
 
-  /**
-   * For each of the skeleton formats we also allow the use of the corresponding
-   * ICU constant names.
-   */
+  /// For each of the skeleton formats we also allow the use of the
+  /// corresponding ICU constant names.
   static const String ABBR_MONTH = 'MMM';
   static const String DAY = 'd';
   static const String ABBR_WEEKDAY = 'E';
@@ -534,27 +503,21 @@
   static const String MINUTE_SECOND = 'ms';
   static const String SECOND = 's';
 
-  /** The locale in which we operate, e.g. 'en_US', or 'pt'. */
+  /// The locale in which we operate, e.g. 'en_US', or 'pt'.
   String _locale;
 
-  /**
-   * The full template string. This may have been specified directly, or
-   * it may have been derived from a skeleton and the locale information
-   * on how to interpret that skeleton.
-   */
+  /// The full template string. This may have been specified directly, or
+  /// it may have been derived from a skeleton and the locale information
+  /// on how to interpret that skeleton.
   String _pattern;
 
-  /**
-   * We parse the format string into individual [_DateFormatField] objects
-   * that are used to do the actual formatting and parsing. Do not use
-   * this variable directly, use the getter [_formatFields].
-   */
+  /// We parse the format string into individual [_DateFormatField] objects
+  /// that are used to do the actual formatting and parsing. Do not use
+  /// this variable directly, use the getter [_formatFields].
   List<_DateFormatField> _formatFieldsPrivate;
 
-  /**
-   * Getter for [_formatFieldsPrivate] that lazily initializes it.
-   */
-  get _formatFields {
+  /// Getter for [_formatFieldsPrivate] that lazily initializes it.
+  List<_DateFormatField> get _formatFields {
     if (_formatFieldsPrivate == null) {
       if (_pattern == null) _useDefaultPattern();
       _formatFieldsPrivate = parsePattern(_pattern);
@@ -562,19 +525,15 @@
     return _formatFieldsPrivate;
   }
 
-  /**
-   * We are being asked to do formatting without having set any pattern.
-   * Use a default.
-   */
+  /// We are being asked to do formatting without having set any pattern.
+  /// Use a default.
   _useDefaultPattern() {
     add_yMMMMd();
     add_jms();
   }
 
-  /**
-   * A series of regular expressions used to parse a format string into its
-   * component fields.
-   */
+  /// A series of regular expressions used to parse a format string into its
+  /// component fields.
   static List<RegExp> _matchers = [
     // Quoted String - anything between single quotes, with escaping
     //   of single quotes by doubling them.
@@ -590,22 +549,18 @@
     new RegExp("^[^\'GyMkSEahKHcLQdDmsvzZ]+")
   ];
 
-  /**
-   * Set our pattern, appending it to any existing patterns. Also adds a single
-   * space to separate the two.
-   */
+  /// Set our pattern, appending it to any existing patterns. Also adds a single
+  /// space to separate the two.
   _appendPattern(String inputPattern, [String separator = ' ']) {
     _pattern =
         _pattern == null ? inputPattern : "$_pattern$separator$inputPattern";
   }
 
-  /**
-   * Add [inputPattern] to this instance as a pattern. If there was a previous
-   * pattern, then this appends to it, separating the two by [separator].
-   * [inputPattern] is first looked up in our list of known skeletons.
-   * If it's found there, then use the corresponding pattern for this locale.
-   * If it's not, then treat [inputPattern] as an explicit pattern.
-   */
+  /// Add [inputPattern] to this instance as a pattern. If there was a previous
+  /// pattern, then this appends to it, separating the two by [separator].
+  /// [inputPattern] is first looked up in our list of known skeletons.
+  /// If it's found there, then use the corresponding pattern for this locale.
+  /// If it's not, then treat [inputPattern] as an explicit pattern.
   DateFormat addPattern(String inputPattern, [String separator = ' ']) {
     // TODO(alanknight): This is an expensive operation. Caching recently used
     // formats, or possibly introducing an entire "locale" object that would
@@ -621,55 +576,46 @@
     return this;
   }
 
-  /** Return the pattern that we use to format dates.*/
+  /// Return the pattern that we use to format dates.
   get pattern => _pattern;
 
-  /** Return the skeletons for our current locale. */
+  /// Return the skeletons for our current locale.
   Map get _availableSkeletons => dateTimePatterns[locale];
 
-  /**
-   * Return the [DateSymbol] information for the locale. This can be useful
-   * to find lists like the names of weekdays or months in a locale, but
-   * the structure of this data may change, and it's generally better to go
-   * through the [format] and [parse] APIs. If the locale isn't present, or
-   * is uninitialized, returns null;
-   */
-  DateSymbols get dateSymbols => dateTimeSymbols[_locale];
-
-  /**
-   * Set the locale. If the locale can't be found, we also look up
-   * based on alternative versions, e.g. if we have no 'en_CA' we will
-   * look for 'en' as a fallback. It will also translate en-ca into en_CA.
-   * Null is also considered a valid value for [newLocale], indicating
-   * to use the default.
-   */
-  _setLocale(String newLocale) {
-    _locale = Intl.verifiedLocale(newLocale, localeExists);
+  /// Return the [DateSymbol] information for the locale. This can be useful
+  /// to find lists like the names of weekdays or months in a locale, but
+  /// the structure of this data may change, and it's generally better to go
+  /// through the [format] and [parse] APIs. If the locale isn't present, or
+  /// is uninitialized, returns null;
+  DateSymbols get dateSymbols {
+    if (_locale != lastDateSymbolLocale) {
+      lastDateSymbolLocale = _locale;
+      cachedDateSymbols = dateTimeSymbols[_locale];
+    }
+    return cachedDateSymbols;
   }
 
-  /**
-   * Return true if the locale exists, or if it is null. The null case
-   * is interpreted to mean that we use the default locale.
-   */
+  /// Return true if the locale exists, or if it is null. The null case
+  /// is interpreted to mean that we use the default locale.
   static bool localeExists(localeName) {
     if (localeName == null) return false;
     return dateTimeSymbols.containsKey(localeName);
   }
 
   static List get _fieldConstructors => [
-    (pattern, parent) => new _DateFormatQuotedField(pattern, parent),
-    (pattern, parent) => new _DateFormatPatternField(pattern, parent),
-    (pattern, parent) => new _DateFormatLiteralField(pattern, parent)
-  ];
+        (pattern, parent) => new _DateFormatQuotedField(pattern, parent),
+        (pattern, parent) => new _DateFormatPatternField(pattern, parent),
+        (pattern, parent) => new _DateFormatLiteralField(pattern, parent)
+      ];
 
-  /** Parse the template pattern and return a list of field objects.*/
-  List parsePattern(String pattern) {
+  /// Parse the template pattern and return a list of field objects.
+  List<_DateFormatField> parsePattern(String pattern) {
     if (pattern == null) return null;
     return _parsePatternHelper(pattern).reversed.toList();
   }
 
-  /** Recursive helper for parsing the template pattern. */
-  List _parsePatternHelper(String pattern) {
+  /// Recursive helper for parsing the template pattern.
+  List<_DateFormatField> _parsePatternHelper(String pattern) {
     if (pattern.isEmpty) return [];
 
     var matched = _match(pattern);
@@ -681,7 +627,7 @@
     return parsed;
   }
 
-  /** Find elements in a string that are patterns for specific fields.*/
+  /// Find elements in a string that are patterns for specific fields.
   _DateFormatField _match(String pattern) {
     for (var i = 0; i < _matchers.length; i++) {
       var regex = _matchers[i];
@@ -690,5 +636,6 @@
         return _fieldConstructors[i](match.group(0), this);
       }
     }
+    return null;
   }
 }
diff --git a/packages/intl/lib/src/intl/date_format_field.dart b/packages/intl/lib/src/intl/date_format_field.dart
index 8df1154..3c70d99 100644
--- a/packages/intl/lib/src/intl/date_format_field.dart
+++ b/packages/intl/lib/src/intl/date_format_field.dart
@@ -4,49 +4,48 @@
 
 part of intl;
 
-/**
- * This is a private class internal to DateFormat which is used for formatting
- * particular fields in a template. e.g. if the format is hh:mm:ss then the
- * fields would be "hh", ":", "mm", ":", and "ss". Each type of field knows
- * how to format that portion of a date.
- */
+/// This is a private class internal to DateFormat which is used for formatting
+/// particular fields in a template. e.g. if the format is hh:mm:ss then the
+/// fields would be "hh", ":", "mm", ":", and "ss". Each type of field knows
+/// how to format that portion of a date.
 abstract class _DateFormatField {
-  /** The format string that defines us, e.g. "hh" */
-  String pattern;
+  /// The format string that defines us, e.g. "hh"
+  final String pattern;
 
-  /** The DateFormat that we are part of.*/
+  /// The DateFormat that we are part of.
   DateFormat parent;
 
-  _DateFormatField(this.pattern, this.parent);
+  /// Trimmed version of [pattern].
+  String _trimmedPattern;
 
-  /**
-   * Return the width of [pattern]. Different widths represent different
-   * formatting options. See the comment for DateFormat for details.
-   */
+  _DateFormatField(this.pattern, this.parent) {
+    _trimmedPattern = pattern.trim();
+  }
+
+  /// Return the width of [pattern]. Different widths represent different
+  /// formatting options. See the comment for DateFormat for details.
   int get width => pattern.length;
 
   String fullPattern() => pattern;
 
   String toString() => pattern;
 
-  /** Format date according to our specification and return the result. */
+  /// Format date according to our specification and return the result.
   String format(DateTime date) {
     // Default implementation in the superclass, works for both types of
     // literal patterns, and is overridden by _DateFormatPatternField.
     return pattern;
   }
 
-  /** Abstract method for subclasses to implementing parsing for their format.*/
+  /// Abstract method for subclasses to implementing parsing for their format.
   void parse(_Stream input, _DateBuilder dateFields);
 
-  /**
-   * Abstract method for subclasses to implementing 'loose' parsing for
-   * their format, accepting input case-insensitively, and allowing some
-   * delimiters to be skipped.
-   */
+  /// Abstract method for subclasses to implementing 'loose' parsing for
+  /// their format, accepting input case-insensitively, and allowing some
+  /// delimiters to be skipped.
   void parseLoose(_Stream input, _DateBuilder dateFields);
 
-  /** Parse a literal field. We just look for the exact input. */
+  /// Parse a literal field. We just look for the exact input.
   void parseLiteral(_Stream input) {
     var found = input.read(width);
     if (found != pattern) {
@@ -54,32 +53,41 @@
     }
   }
 
-  /**
-   * Parse a literal field. We accept either an exact match, or an arbitrary
-   * amount of whitespace.
-   */
+  /// Parse a literal field. We accept either an exact match, or an arbitrary
+  /// amount of whitespace.
+  ///
+  /// Any whitespace which occurs before or after the literal field is trimmed
+  /// from the input stream. Any leading or trailing whitespace in the literal
+  /// field's format specification is also trimmed before matching is
+  /// attempted. Therefore, leading and trailing whitespace is optional, and
+  /// arbitrary additional whitespace may be added before/after the literal.
   void parseLiteralLoose(_Stream input) {
-    var found = input.peek(width);
-    if (found == pattern) {
-      input.read(width);
+    _trimWhitespace(input);
+
+    var found = input.peek(_trimmedPattern.length);
+    if (found == _trimmedPattern) {
+      input.read(_trimmedPattern.length);
     }
+
+    _trimWhitespace(input);
+  }
+
+  void _trimWhitespace(_Stream input) {
     while (!input.atEnd() && input.peek().trim().isEmpty) {
       input.read();
     }
   }
 
-  /** Throw a format exception with an error message indicating the position.*/
+  /// Throw a format exception with an error message indicating the position.
   void throwFormatException(_Stream stream) {
     throw new FormatException("Trying to read $this from ${stream.contents} "
         "at position ${stream.index}");
   }
 }
 
-/**
- * Represents a literal field - a sequence of characters that doesn't
- * change according to the date's data. As such, the implementation
- * is extremely simple.
- */
+/// Represents a literal field - a sequence of characters that doesn't
+/// change according to the date's data. As such, the implementation
+/// is extremely simple.
 class _DateFormatLiteralField extends _DateFormatField {
   _DateFormatLiteralField(pattern, parent) : super(pattern, parent);
 
@@ -91,18 +99,16 @@
       parseLiteralLoose(input);
 }
 
-/**
- * Represents a literal field with quoted characters in it. This is
- * only slightly more complex than a _DateFormatLiteralField.
- */
+/// Represents a literal field with quoted characters in it. This is
+/// only slightly more complex than a _DateFormatLiteralField.
 class _DateFormatQuotedField extends _DateFormatField {
   String _fullPattern;
 
   String fullPattern() => _fullPattern;
 
-  _DateFormatQuotedField(pattern, parent) : super(pattern, parent) {
+  _DateFormatQuotedField(pattern, parent)
+      : super(_patchQuotes(pattern), parent) {
     _fullPattern = pattern;
-    patchQuotes();
   }
 
   parse(_Stream input, _DateBuilder dateFields) {
@@ -112,30 +118,28 @@
   parseLoose(_Stream input, _DateBuilder dateFields) =>
       parseLiteralLoose(input);
 
-  void patchQuotes() {
+  static final _twoEscapedQuotes = new RegExp(r"''");
+
+  static String _patchQuotes(String pattern) {
     if (pattern == "''") {
-      pattern = "'";
+      return "'";
     } else {
-      pattern = pattern.substring(1, pattern.length - 1);
-      var twoEscapedQuotes = new RegExp(r"''");
-      pattern = pattern.replaceAll(twoEscapedQuotes, "'");
+      return pattern
+          .substring(1, pattern.length - 1)
+          .replaceAll(_twoEscapedQuotes, "'");
     }
   }
 }
 
-/**
- * A field that parses "loosely", meaning that we'll accept input that is
- * missing delimiters, has upper/lower case mixed up, and might not strictly
- * conform to the pattern, e.g. the pattern calls for Sep we might accept
- * sep, september, sEPTember. Doesn't affect numeric fields.
- */
+/// A field that parses "loosely", meaning that we'll accept input that is
+/// missing delimiters, has upper/lower case mixed up, and might not strictly
+/// conform to the pattern, e.g. the pattern calls for Sep we might accept
+/// sep, september, sEPTember. Doesn't affect numeric fields.
 class _LoosePatternField extends _DateFormatPatternField {
   _LoosePatternField(String pattern, parent) : super(pattern, parent);
 
-  /**
-    * Parse from a list of possibilities, but case-insensitively.
-    * Assumes that input is lower case.
-    */
+  /// Parse from a list of possibilities, but case-insensitively.
+  /// Assumes that input is lower case.
   int parseEnumeratedString(_Stream input, List possibilities) {
     var lowercasePossibilities =
         possibilities.map((x) => x.toLowerCase()).toList();
@@ -146,10 +150,8 @@
     }
   }
 
-  /**
-   * Parse a month name, case-insensitively, and set it in [dateFields].
-   * Assumes that [input] is lower case.
-   */
+  /// Parse a month name, case-insensitively, and set it in [dateFields].
+  /// Assumes that [input] is lower case.
   void parseMonth(input, dateFields) {
     if (width <= 2) {
       handleNumericField(input, dateFields.setMonth);
@@ -163,12 +165,11 @@
         return;
       }
     }
+    throwFormatException(input);
   }
 
-  /**
-   * Parse a standalone day name, case-insensitively.
-   * Assumes that input is lower case. Doesn't do anything
-   */
+  /// Parse a standalone day name, case-insensitively.
+  /// Assumes that input is lower case. Doesn't do anything
   void parseStandaloneDay(input) {
     // This is ignored, but we still have to skip over it the correct amount.
     if (width <= 2) {
@@ -187,13 +188,11 @@
     }
   }
 
-  /**
-   * Parse a standalone month name, case-insensitively.
-   * Assumes that input is lower case. Doesn't do anything
-   */
+  /// Parse a standalone month name, case-insensitively, and set it in
+  /// [dateFields]. Assumes that input is lower case.
   void parseStandaloneMonth(input, dateFields) {
     if (width <= 2) {
-      handleNumericField(input, (x) => x);
+      handleNumericField(input, dateFields.setMonth);
       return;
     }
     var possibilities = [
@@ -207,12 +206,11 @@
         return;
       }
     }
+    throwFormatException(input);
   }
 
-  /**
-   * Parse a day of the week name, case-insensitively.
-   * Assumes that input is lower case. Doesn't do anything
-   */
+  /// Parse a day of the week name, case-insensitively.
+  /// Assumes that input is lower case. Doesn't do anything
   void parseDayOfWeek(_Stream input) {
     // This is IGNORED, but we still have to skip over it the correct amount.
     if (width <= 2) {
@@ -237,32 +235,26 @@
 class _DateFormatPatternField extends _DateFormatField {
   _DateFormatPatternField(pattern, parent) : super(pattern, parent);
 
-  /** Format date according to our specification and return the result. */
+  /// Format date according to our specification and return the result.
   String format(DateTime date) {
     return formatField(date);
   }
 
-  /**
-   * Parse the date according to our specification and put the result
-   * into the correct place in dateFields.
-   */
+  /// Parse the date according to our specification and put the result
+  /// into the correct place in dateFields.
   void parse(_Stream input, _DateBuilder dateFields) {
     parseField(input, dateFields);
   }
 
-  /**
-   * Parse the date according to our specification and put the result
-   * into the correct place in dateFields. Allow looser parsing, accepting
-   * case-insensitive input and skipped delimiters.
-   */
+  /// Parse the date according to our specification and put the result
+  /// into the correct place in dateFields. Allow looser parsing, accepting
+  /// case-insensitive input and skipped delimiters.
   void parseLoose(_Stream input, _DateBuilder dateFields) {
     new _LoosePatternField(pattern, parent).parse(input, dateFields);
   }
 
-  /**
-   * Parse a field representing part of a date pattern. Note that we do not
-   * return a value, but rather build up the result in [builder].
-   */
+  /// Parse a field representing part of a date pattern. Note that we do not
+  /// return a value, but rather build up the result in [builder].
   void parseField(_Stream input, _DateBuilder builder) {
     try {
       switch (pattern[0]) {
@@ -283,6 +275,7 @@
           parseDayOfWeek(input);
           break;
         case 'G':
+          parseEra(input);
           break; // era
         case 'h':
           parse1To12Hours(input, builder);
@@ -330,7 +323,7 @@
     }
   }
 
-  /** Formatting logic if we are of type FIELD */
+  /// Formatting logic if we are of type FIELD
   String formatField(DateTime date) {
     switch (pattern[0]) {
       case 'a':
@@ -378,8 +371,8 @@
     }
   }
 
-  /** Return the symbols for our current locale. */
-  DateSymbols get symbols => dateTimeSymbols[parent.locale];
+  /// Return the symbols for our current locale.
+  DateSymbols get symbols => parent.dateSymbols;
 
   formatEra(DateTime date) {
     var era = date.year > 0 ? 1 : 0;
@@ -395,29 +388,25 @@
     return width == 2 ? padTo(2, year % 100) : padTo(width, year);
   }
 
-  /**
-   * We are given [input] as a stream from which we want to read a date. We
-   * can't dynamically build up a date, so we are given a list [dateFields] of
-   * the constructor arguments and an [position] at which to set it
-   * (year,month,day,hour,minute,second,fractionalSecond)
-   * then after all parsing is done we construct a date from the arguments.
-   * This method handles reading any of the numeric fields. The [offset]
-   * argument allows us to compensate for zero-based versus one-based values.
-   */
+  /// We are given [input] as a stream from which we want to read a date. We
+  /// can't dynamically build up a date, so we are given a list [dateFields] of
+  /// the constructor arguments and an [position] at which to set it
+  /// (year,month,day,hour,minute,second,fractionalSecond)
+  /// then after all parsing is done we construct a date from the arguments.
+  /// This method handles reading any of the numeric fields. The [offset]
+  /// argument allows us to compensate for zero-based versus one-based values.
   void handleNumericField(_Stream input, Function setter, [int offset = 0]) {
     var result = input.nextInteger();
     if (result == null) throwFormatException(input);
     setter(result + offset);
   }
 
-  /**
-   * We are given [input] as a stream from which we want to read a date. We
-   * can't dynamically build up a date, so we are given a list [dateFields] of
-   * the constructor arguments and an [position] at which to set it
-   * (year,month,day,hour,minute,second,fractionalSecond)
-   * then after all parsing is done we construct a date from the arguments.
-   * This method handles reading any of string fields from an enumerated set.
-   */
+  /// We are given [input] as a stream from which we want to read a date. We
+  /// can't dynamically build up a date, so we are given a list [dateFields] of
+  /// the constructor arguments and an [position] at which to set it
+  /// (year,month,day,hour,minute,second,fractionalSecond)
+  /// then after all parsing is done we construct a date from the arguments.
+  /// This method handles reading any of string fields from an enumerated set.
   int parseEnumeratedString(_Stream input, List possibilities) {
     var results = new _Stream(possibilities)
         .findIndexes((each) => input.peek(each.length) == each);
@@ -477,7 +466,7 @@
 
   String formatAmPm(DateTime date) {
     var hours = date.hour;
-    var index = (date.hour >= 12) && (date.hour < 24) ? 1 : 0;
+    var index = (hours >= 12) && (hours < 24) ? 1 : 0;
     var ampm = symbols.AMPMS;
     return ampm[index];
   }
@@ -573,37 +562,37 @@
 
   String formatQuarter(DateTime date) {
     var quarter = ((date.month - 1) / 3).truncate();
-    if (width < 4) {
-      return symbols.SHORTQUARTERS[quarter];
-    } else {
-      return symbols.QUARTERS[quarter];
+    switch (width) {
+      case 4:
+        return symbols.QUARTERS[quarter];
+      case 3:
+        return symbols.SHORTQUARTERS[quarter];
+      default:
+        return padTo(width, quarter + 1);
     }
   }
+
   String formatDayOfMonth(DateTime date) {
     return padTo(width, date.day);
   }
 
   String formatDayOfYear(DateTime date) => padTo(width, dayNumberInYear(date));
 
-  /** Return the ordinal day, i.e. the day number in the year. */
+  /// Return the ordinal day, i.e. the day number in the year.
   int dayNumberInYear(DateTime date) {
     if (date.month == 1) return date.day;
     if (date.month == 2) return date.day + 31;
     return ordinalDayFromMarchFirst(date) + 59 + (isLeapYear(date) ? 1 : 0);
   }
 
-  /**
-   * Return the day of the year counting March 1st as 1, after which the
-   * number of days per month is constant, so it's easier to calculate.
-   * Formula from http://en.wikipedia.org/wiki/Ordinal_date
-   */
+  /// Return the day of the year counting March 1st as 1, after which the
+  /// number of days per month is constant, so it's easier to calculate.
+  /// Formula from http://en.wikipedia.org/wiki/Ordinal_date
   int ordinalDayFromMarchFirst(DateTime date) =>
       ((30.6 * date.month) - 91.4).floor() + date.day;
 
-  /**
-   * Return true if this is a leap year. Rely on [DateTime] to do the
-   * underlying calculation, even though it doesn't expose the test to us.
-   */
+  /// Return true if this is a leap year. Rely on [DateTime] to do the
+  /// underlying calculation, even though it doesn't expose the test to us.
   bool isLeapYear(DateTime date) {
     var feb29 = new DateTime(date.year, 2, 29);
     return feb29.month == 2;
@@ -611,9 +600,8 @@
 
   String formatDayOfWeek(DateTime date) {
     // Note that Dart's weekday returns 1 for Monday and 7 for Sunday.
-    return (width >= 4
-        ? symbols.WEEKDAYS
-        : symbols.SHORTWEEKDAYS)[(date.weekday) % 7];
+    return (width >= 4 ? symbols.WEEKDAYS : symbols.SHORTWEEKDAYS)[
+        (date.weekday) % 7];
   }
 
   void parseDayOfWeek(_Stream input) {
@@ -622,6 +610,11 @@
     parseEnumeratedString(input, possibilities);
   }
 
+  void parseEra(_Stream input) {
+    var possibilities = width >= 4 ? symbols.ERANAMES : symbols.ERAS;
+    parseEnumeratedString(input, possibilities);
+  }
+
   String formatMinutes(DateTime date) {
     return padTo(width, date.minute);
   }
@@ -643,18 +636,8 @@
     throw new UnimplementedError();
   }
 
-  /**
-  * Return a string representation of the object padded to the left with
-  * zeros. Primarily useful for numbers.
-  */
-  String padTo(int width, Object toBePrinted) {
-    var basicString = toBePrinted.toString();
-    if (basicString.length >= width) return basicString;
-    var buffer = new StringBuffer();
-    for (var i = 0; i < width - basicString.length; i++) {
-      buffer.write('0');
-    }
-    buffer.write(basicString);
-    return buffer.toString();
-  }
+  /// Return a string representation of the object padded to the left with
+  /// zeros. Primarily useful for numbers.
+  static String padTo(int width, Object toBePrinted) =>
+      '$toBePrinted'.padLeft(width, '0');
 }
diff --git a/packages/intl/lib/src/intl/date_format_helpers.dart b/packages/intl/lib/src/intl/date_format_helpers.dart
index 6a6e68c..05a6a49 100644
--- a/packages/intl/lib/src/intl/date_format_helpers.dart
+++ b/packages/intl/lib/src/intl/date_format_helpers.dart
@@ -4,10 +4,8 @@
 
 part of intl;
 
-/**
- * A class for holding onto the data for a date so that it can be built
- * up incrementally.
- */
+/// A class for holding onto the data for a date so that it can be built
+/// up incrementally.
 class _DateBuilder {
   // Default the date values to the EPOCH so that there's a valid date
   // in case the format doesn't set them.
@@ -26,32 +24,36 @@
   void setYear(x) {
     year = x;
   }
+
   void setMonth(x) {
     month = x;
   }
+
   void setDay(x) {
     day = x;
   }
+
   void setHour(x) {
     hour = x;
   }
+
   void setMinute(x) {
     minute = x;
   }
+
   void setSecond(x) {
     second = x;
   }
+
   void setFractionalSecond(x) {
     fractionalSecond = x;
   }
 
   get hour24 => pm ? hour + 12 : hour;
 
-  /**
-   * Verify that we correspond to a valid date. This will reject out of
-   * range values, even if the DateTime constructor would accept them. An
-   * invalid message will result in throwing a [FormatException].
-   */
+  /// Verify that we correspond to a valid date. This will reject out of
+  /// range values, even if the DateTime constructor would accept them. An
+  /// invalid message will result in throwing a [FormatException].
   verify(String s) {
     _verify(month, 1, 12, "month", s);
     _verify(hour24, 0, 23, "hour", s);
@@ -64,23 +66,24 @@
     // check the year, which we otherwise can't verify, and the hours,
     // which will catch cases like "14:00:00 PM".
     var date = asDate();
-    _verify(hour24, date.hour, date.hour, "hour", s);
-    _verify(day, date.day, date.day, "day", s);
-    _verify(year, date.year, date.year, "year", s);
+    _verify(hour24, date.hour, date.hour, "hour", s, date);
+    _verify(day, date.day, date.day, "day", s, date);
+    _verify(year, date.year, date.year, "year", s, date);
   }
 
-  _verify(int value, int min, int max, String desc, String originalInput) {
+  _verify(int value, int min, int max, String desc, String originalInput,
+      [DateTime parsed]) {
     if (value < min || value > max) {
+      var parsedDescription = parsed == null ? "" : " Date parsed as $parsed.";
       throw new FormatException(
-          "Error parsing $originalInput, invalid $desc value: $value");
+          "Error parsing $originalInput, invalid $desc value: $value."
+          " Expected value between $min and $max.$parsedDescription");
     }
   }
 
-  /**
-   * Return a date built using our values. If no date portion is set,
-   * use the "Epoch" of January 1, 1970.
-   */
-  DateTime asDate({retry: true}) {
+  /// Return a date built using our values. If no date portion is set,
+  /// use the "Epoch" of January 1, 1970.
+  DateTime asDate({int retries: 10}) {
     // TODO(alanknight): Validate the date, especially for things which
     // can crash the VM, e.g. large month values.
     var result;
@@ -90,22 +93,21 @@
     } else {
       result = new DateTime(
           year, month, day, hour24, minute, second, fractionalSecond);
-      // TODO(alanknight): Issue 15560 means non-UTC dates occasionally come
-      // out in UTC. If that happens, retry once. This will always happen if
-      // the local time zone is UTC, but that's ok.
-      if (result.toUtc() == result) {
-        result = asDate(retry: false);
+      // TODO(alanknight): Issue 15560 means non-UTC dates occasionally come out
+      // in UTC, or, alternatively, are constructed as if in UTC and then have
+      // the offset subtracted. If that happens, retry, several times if
+      // necessary.
+      if (retries > 0 && (result.hour != hour24 || result.day != day)) {
+        result = asDate(retries: retries - 1);
       }
     }
     return result;
   }
 }
 
-/**
- * A simple and not particularly general stream class to make parsing
- * dates from strings simpler. It is general enough to operate on either
- * lists or strings.
- */
+/// A simple and not particularly general stream class to make parsing
+/// dates from strings simpler. It is general enough to operate on either
+/// lists or strings.
 // TODO(alanknight): With the improvements to the collection libraries
 // since this was written we might be able to get rid of it entirely
 // in favor of e.g. aString.split('') giving us an iterable of one-character
@@ -121,33 +123,29 @@
 
   next() => contents[index++];
 
-  /**
-   * Return the next [howMany] items, or as many as there are remaining.
-   * Advance the stream by that many positions.
-   */
+  /// Return the next [howMany] items, or as many as there are remaining.
+  /// Advance the stream by that many positions.
   read([int howMany = 1]) {
     var result = peek(howMany);
     index += howMany;
     return result;
   }
 
-  /**
-   * Does the input start with the given string, if we start from the
-   * current position.
-   */
+  /// Does the input start with the given string, if we start from the
+  /// current position.
   bool startsWith(String pattern) {
     if (contents is String) return contents.startsWith(pattern, index);
     return pattern == peek(pattern.length);
   }
 
-  /**
-   * Return the next [howMany] items, or as many as there are remaining.
-   * Does not modify the stream position.
-   */
+  /// Return the next [howMany] items, or as many as there are remaining.
+  /// Does not modify the stream position.
   peek([int howMany = 1]) {
     var result;
     if (contents is String) {
-      result = contents.substring(index, min(index + howMany, contents.length));
+      String stringContents = contents;
+      result = stringContents.substring(
+          index, min(index + howMany, stringContents.length));
     } else {
       // Assume List
       result = contents.sublist(index, index + howMany);
@@ -155,13 +153,11 @@
     return result;
   }
 
-  /** Return the remaining contents of the stream */
+  /// Return the remaining contents of the stream
   rest() => peek(contents.length - index);
 
-  /**
-   * Find the index of the first element for which [f] returns true.
-   * Advances the stream to that position.
-   */
+  /// Find the index of the first element for which [f] returns true.
+  /// Advances the stream to that position.
   int findIndex(Function f) {
     while (!atEnd()) {
       if (f(next())) return index - 1;
@@ -169,10 +165,8 @@
     return null;
   }
 
-  /**
-   * Find the indexes of all the elements for which [f] returns true.
-   * Leaves the stream positioned at the end.
-   */
+  /// Find the indexes of all the elements for which [f] returns true.
+  /// Leaves the stream positioned at the end.
   List findIndexes(Function f) {
     var results = [];
     while (!atEnd()) {
@@ -181,11 +175,9 @@
     return results;
   }
 
-  /**
-   * Assuming that the contents are characters, read as many digits as we
-   * can see and then return the corresponding integer. Advance the stream.
-   */
-  var digitMatcher = new RegExp(r'\d+');
+  /// Assuming that the contents are characters, read as many digits as we
+  /// can see and then return the corresponding integer. Advance the stream.
+  var digitMatcher = new RegExp(r'^\d+');
   int nextInteger() {
     var string = digitMatcher.stringMatch(rest());
     if (string == null || string.isEmpty) return null;
diff --git a/packages/intl/lib/src/intl/number_format.dart b/packages/intl/lib/src/intl/number_format.dart
index 9e0de51..ae6428b 100644
--- a/packages/intl/lib/src/intl/number_format.dart
+++ b/packages/intl/lib/src/intl/number_format.dart
@@ -4,177 +4,560 @@
 
 part of intl;
 
-/**
- * Provides the ability to format a number in a locale-specific way. The
- * format is specified as a pattern using a subset of the ICU formatting
- * patterns.
- *
- * - `0` A single digit
- * - `#` A single digit, omitted if the value is zero
- * - `.` Decimal separator
- * - `-` Minus sign
- * - `,` Grouping separator
- * - `E` Separates mantissa and expontent
- * - `+` - Before an exponent, indicates it should be prefixed with a plus sign.
- * - `%` - In prefix or suffix, multiply by 100 and show as percentage
- * - `‰ (\u2030)` In prefix or suffix, multiply by 1000 and show as per mille
- * - `¤ (\u00A4)` Currency sign, replaced by currency name
- * - `'` Used to quote special characters
- * - `;` Used to separate the positive and negative patterns if both are present
- *
- * For example,
- *       var f = new NumberFormat("###.0#", "en_US");
- *       print(f.format(12.345));
- *       ==> 12.34
- * If the locale is not specified, it will default to the current locale. If
- * the format is not specified it will print in a basic format with at least
- * one integer digit and three fraction digits.
- *
- * There are also standard patterns available via the special constructors. e.g.
- *       var percent = new NumberFormat.percentFormat("ar");
- *       var eurosInUSFormat = new NumberFormat.currencyPattern("en_US", "€");
- * There are four such constructors: decimalFormat, percentFormat,
- * scientificFormat and currencyFormat. However, at the moment,
- * scientificFormat prints only as equivalent to "#E0" and does not take
- * into account significant digits. The currencyFormat will default to the
- * three-letter name of the currency if no explicit name/symbol is provided.
- */
+/// The function that we pass internally to NumberFormat to get
+/// the appropriate pattern (e.g. currency)
+typedef String _PatternGetter(NumberSymbols symbols);
+
+/// Provides the ability to format a number in a locale-specific way. The
+/// format is specified as a pattern using a subset of the ICU formatting
+/// patterns.
+///
+/// - `0` A single digit
+/// - `#` A single digit, omitted if the value is zero
+/// - `.` Decimal separator
+/// - `-` Minus sign
+/// - `,` Grouping separator
+/// - `E` Separates mantissa and expontent
+/// - `+` - Before an exponent, to say it should be prefixed with a plus sign.
+/// - `%` - In prefix or suffix, multiply by 100 and show as percentage
+/// - `‰ (\u2030)` In prefix or suffix, multiply by 1000 and show as per mille
+/// - `¤ (\u00A4)` Currency sign, replaced by currency name
+/// - `'` Used to quote special characters
+/// - `;` Used to separate the positive and negative patterns (if both present)
+///
+/// For example,
+///       var f = new NumberFormat("###.0#", "en_US");
+///       print(f.format(12.345));
+///       ==> 12.34
+/// If the locale is not specified, it will default to the current locale. If
+/// the format is not specified it will print in a basic format with at least
+/// one integer digit and three fraction digits.
+///
+/// There are also standard patterns available via the special constructors.
+/// e.g.
+///       var percent = new NumberFormat.percentFormat("ar");
+///       var eurosInUSFormat = new NumberFormat.currency(locale: "en_US",
+///           symbol: "€");
+/// There are four such constructors: decimalFormat, percentFormat,
+/// scientificFormat and currencyFormat. However, at the moment,
+/// scientificFormat prints only as equivalent to "#E0" and does not take
+/// into account significant digits. The currencyFormat will default to the
+/// three-letter name of the currency if no explicit name/symbol is provided.
 class NumberFormat {
-  /** Variables to determine how number printing behaves. */
+  /// Variables to determine how number printing behaves.
   // TODO(alanknight): If these remain as variables and are set based on the
   // pattern, can we make them final?
   String _negativePrefix = '-';
   String _positivePrefix = '';
   String _negativeSuffix = '';
   String _positiveSuffix = '';
-  /**
-   * How many numbers in a group when using punctuation to group digits in
-   * large numbers. e.g. in en_US: "1,000,000" has a grouping size of 3 digits
-   * between commas.
-   */
+
+  /// How many numbers in a group when using punctuation to group digits in
+  /// large numbers. e.g. in en_US: "1,000,000" has a grouping size of 3 digits
+  /// between commas.
   int _groupingSize = 3;
-  /**
-   * In some formats the last grouping size may be different than previous
-   * ones, e.g. Hindi.
-   */
+
+  /// In some formats the last grouping size may be different than previous
+  /// ones, e.g. Hindi.
   int _finalGroupingSize = 3;
-  /**
-   * Set to true if the format has explicitly set the grouping size.
-   */
+
+  /// Set to true if the format has explicitly set the grouping size.
   bool _groupingSizeSetExplicitly = false;
   bool _decimalSeparatorAlwaysShown = false;
   bool _useSignForPositiveExponent = false;
   bool _useExponentialNotation = false;
 
+  /// Explicitly store if we are a currency format, and so should use the
+  /// appropriate number of decimal digits for a currency.
+  // TODO(alanknight): Handle currency formats which are specified in a raw
+  /// pattern, not using one of the currency constructors.
+  bool _isForCurrency = false;
+
   int maximumIntegerDigits = 40;
   int minimumIntegerDigits = 1;
   int maximumFractionDigits = 3;
   int minimumFractionDigits = 0;
   int minimumExponentDigits = 0;
+  int _significantDigits = 0;
 
-  /**
-   * For percent and permille, what are we multiplying by in order to
-   * get the printed value, e.g. 100 for percent.
-   */
+  ///  How many significant digits should we print.
+  ///
+  ///  Note that if significantDigitsInUse is the default false, this
+  ///  will be ignored.
+  int get significantDigits => _significantDigits;
+  set significantDigits(int x) {
+    _significantDigits = x;
+    significantDigitsInUse = true;
+  }
+
+  bool significantDigitsInUse = false;
+
+  /// For percent and permille, what are we multiplying by in order to
+  /// get the printed value, e.g. 100 for percent.
   int get _multiplier => _internalMultiplier;
   set _multiplier(int x) {
     _internalMultiplier = x;
     _multiplierDigits = (log(_multiplier) / LN10).round();
   }
+
   int _internalMultiplier = 1;
 
-  /** How many digits are there in the [_multiplier]. */
+  /// How many digits are there in the [_multiplier].
   int _multiplierDigits = 0;
 
-  /**
-   * Stores the pattern used to create this format. This isn't used, but
-   * is helpful in debugging.
-   */
+  /// Stores the pattern used to create this format. This isn't used, but
+  /// is helpful in debugging.
   String _pattern;
 
-  /** The locale in which we print numbers. */
+  /// The locale in which we print numbers.
   final String _locale;
 
-  /** Caches the symbols used for our locale. */
+  /// Caches the symbols used for our locale.
   NumberSymbols _symbols;
 
-  /** The name (or symbol) of the currency to print. */
+  /// The name of the currency to print, in ISO 4217 form.
   String currencyName;
 
-  /**
-   * Transient internal state in which to build up the result of the format
-   * operation. We can have this be just an instance variable because Dart is
-   * single-threaded and unless we do an asynchronous operation in the process
-   * of formatting then there will only ever be one number being formatted
-   * at a time. In languages with threads we'd need to pass this on the stack.
-   */
+  /// The symbol to be used when formatting this as currency.
+  ///
+  /// For example, "$", "US$", or "€".
+  String _currencySymbol;
+
+  /// The symbol to be used when formatting this as currency.
+  ///
+  /// For example, "$", "US$", or "€".
+  String get currencySymbol => _currencySymbol ?? currencyName;
+
+  /// The number of decimal places to use when formatting.
+  ///
+  /// If this is not explicitly specified in the constructor, then for
+  /// currencies we use the default value for the currency if the name is given,
+  /// otherwise we use the value from the pattern for the locale.
+  ///
+  /// So, for example,
+  ///      new NumberFormat.currency(name: 'USD', decimalDigits: 7)
+  /// will format with 7 decimal digits, because that's what we asked for. But
+  ///       new NumberFormat.currency(locale: 'en_US', name: 'JPY')
+  /// will format with zero, because that's the default for JPY, and the
+  /// currency's default takes priority over the locale's default.
+  ///       new NumberFormat.currency(locale: 'en_US')
+  /// will format with two, which is the default for that locale.
+  ///
+  int get decimalDigits => _decimalDigits;
+
+  int _decimalDigits;
+
+  /// For currencies, the default number of decimal places to use in
+  /// formatting. Defaults to two for non-currencies or currencies where it's
+  /// not specified.
+  int get _defaultDecimalDigits =>
+      currencyFractionDigits[currencyName.toUpperCase()] ??
+      currencyFractionDigits['DEFAULT'];
+
+  /// If we have a currencyName, use the decimal digits for that currency,
+  /// unless we've explicitly specified some other number.
+  bool get _overridesDecimalDigits => decimalDigits != null || _isForCurrency;
+
+  /// Transient internal state in which to build up the result of the format
+  /// operation. We can have this be just an instance variable because Dart is
+  /// single-threaded and unless we do an asynchronous operation in the process
+  /// of formatting then there will only ever be one number being formatted
+  /// at a time. In languages with threads we'd need to pass this on the stack.
   final StringBuffer _buffer = new StringBuffer();
 
-  /**
-   * Create a number format that prints using [newPattern] as it applies in
-   * [locale].
-   */
+  /// Create a number format that prints using [newPattern] as it applies in
+  /// [locale].
   factory NumberFormat([String newPattern, String locale]) =>
       new NumberFormat._forPattern(locale, (x) => newPattern);
 
-  /** Create a number format that prints as DECIMAL_PATTERN. */
+  /// Create a number format that prints as DECIMAL_PATTERN.
   NumberFormat.decimalPattern([String locale])
       : this._forPattern(locale, (x) => x.DECIMAL_PATTERN);
 
-  /** Create a number format that prints as PERCENT_PATTERN. */
+  /// Create a number format that prints as PERCENT_PATTERN.
   NumberFormat.percentPattern([String locale])
       : this._forPattern(locale, (x) => x.PERCENT_PATTERN);
 
-  /** Create a number format that prints as SCIENTIFIC_PATTERN. */
+  /// Create a number format that prints as SCIENTIFIC_PATTERN.
   NumberFormat.scientificPattern([String locale])
       : this._forPattern(locale, (x) => x.SCIENTIFIC_PATTERN);
 
-  /**
-   * Create a number format that prints as CURRENCY_PATTERN. If provided,
-   * use [nameOrSymbol] in place of the default currency name. e.g.
-   *        var eurosInCurrentLocale = new NumberFormat
-   *            .currencyPattern(Intl.defaultLocale, "€");
-   */
-  NumberFormat.currencyPattern([String locale, String nameOrSymbol])
-      : this._forPattern(locale, (x) => x.CURRENCY_PATTERN, nameOrSymbol);
+  /// A regular expression to validate currency names are exactly three
+  /// alphabetic characters.
+  static final _checkCurrencyName = new RegExp(r'^[a-zA-Z]{3}$');
 
-  /**
-   * Create a number format that prints in a pattern we get from
-   * the [getPattern] function using the locale [locale].
-   */
-  NumberFormat._forPattern(String locale, Function getPattern,
-      [this.currencyName])
-      : _locale = Intl.verifiedLocale(locale, localeExists) {
+  /// Create a number format that prints as CURRENCY_PATTERN. (Deprecated:
+  /// prefer NumberFormat.currency)
+  ///
+  /// If provided,
+  /// use [nameOrSymbol] in place of the default currency name. e.g.
+  ///        var eurosInCurrentLocale = new NumberFormat
+  ///            .currencyPattern(Intl.defaultLocale, "€");
+  @Deprecated("Use NumberFormat.currency")
+  factory NumberFormat.currencyPattern(
+      [String locale, String currencyNameOrSymbol]) {
+    // If it looks like an iso4217 name, pass as name, otherwise as symbol.
+    if (currencyNameOrSymbol != null &&
+        _checkCurrencyName.hasMatch(currencyNameOrSymbol)) {
+      return new NumberFormat.currency(
+          locale: locale, name: currencyNameOrSymbol);
+    } else {
+      return new NumberFormat.currency(
+          locale: locale, symbol: currencyNameOrSymbol);
+    }
+  }
+
+  /// Create a [NumberFormat] that formats using the locale's CURRENCY_PATTERN.
+  ///
+  /// If [locale] is not specified, it will use the current default locale.
+  ///
+  /// If [name] is specified, the currency with that ISO 4217 name will be used.
+  /// Otherwise we will use the default currency name for the current locale. If
+  /// no [symbol] is specified, we will use the currency name in the formatted
+  /// result. e.g.
+  ///      var f = new NumberFormat.currency(locale: 'en_US', name: 'EUR')
+  /// will format currency like "EUR1.23". If we did not specify the name, it
+  /// would format like "USD1.23".
+  ///
+  /// If [symbol] is used, then that symbol will be used in formatting instead
+  /// of the name. e.g.
+  ///      var eurosInCurrentLocale = new NumberFormat.currency(symbol: "€");
+  /// will format like "€1.23". Otherwise it will use the currency name.
+  /// If this is not explicitly specified in the constructor, then for
+  /// currencies we use the default value for the currency if the name is given,
+  ///  otherwise we use the value from the pattern for the locale.
+  ///
+  /// If [decimalDigits] is specified, numbers will format with that many digits
+  /// after the decimal place. If it's not, they will use the default for the
+  /// currency in [name], and the default currency for [locale] if the currency
+  /// name is not specified. e.g.
+  ///       new NumberFormat.currency(name: 'USD', decimalDigits: 7)
+  /// will format with 7 decimal digits, because that's what we asked for. But
+  ///       new NumberFormat.currency(locale: 'en_US', name: 'JPY')
+  /// will format with zero, because that's the default for JPY, and the
+  /// currency's default takes priority over the locale's default.
+  ///       new NumberFormat.currency(locale: 'en_US')
+  /// will format with two, which is the default for that locale.
+  // TODO(alanknight): Should we allow decimalDigits on other numbers.
+  NumberFormat.currency(
+      {String locale, String name, String symbol, int decimalDigits})
+      : this._forPattern(locale, (x) => x.CURRENCY_PATTERN,
+            name: name,
+            currencySymbol: symbol,
+            decimalDigits: decimalDigits,
+            isForCurrency: true);
+
+  /// Creates a [NumberFormat] for currencies, using the simple symbol for the
+  /// currency if one is available (e.g. $, €), so it should only be used if the
+  /// short currency symbol will be unambiguous.
+  ///
+  /// If [locale] is not specified, it will use the current default locale.
+  ///
+  /// If [name] is specified, the currency with that ISO 4217 name will be used.
+  /// Otherwise we will use the default currency name for the current locale. We
+  /// will assume that the symbol for this is well known in the locale and
+  /// unambiguous. If you format CAD in an en_US locale using this format it
+  /// will display as "$", which may be confusing to the user.
+  ///
+  /// If [decimalDigits] is specified, numbers will format with that many digits
+  /// after the decimal place. If it's not, they will use the default for the
+  /// currency in [name], and the default currency for [locale] if the currency
+  /// name is not specified. e.g.
+  ///       new NumberFormat.simpleCurrency(name: 'USD', decimalDigits: 7)
+  /// will format with 7 decimal digits, because that's what we asked for. But
+  ///       new NumberFormat.simpleCurrency(locale: 'en_US', name: 'JPY')
+  /// will format with zero, because that's the default for JPY, and the
+  /// currency's default takes priority over the locale's default.
+  ///       new NumberFormat.simpleCurrency(locale: 'en_US')
+  /// will format with two, which is the default for that locale.
+  factory NumberFormat.simpleCurrency(
+      {String locale, String name, int decimalDigits}) {
+    return new NumberFormat._forPattern(locale, (x) => x.CURRENCY_PATTERN,
+        name: name,
+        computeCurrencySymbol: (format) =>
+            _simpleCurrencySymbols[format.currencyName] ?? format.currencyName,
+        decimalDigits: decimalDigits,
+        isForCurrency: true);
+  }
+
+  /// Returns the simple currency symbol for given currency code, or
+  /// [currencyCode] if no simple symbol is listed.
+  ///
+  /// The simple currency symbol is generally short, and the same or related to
+  /// what is used in countries having the currency as an official symbol. It
+  /// may be a symbol character, or may have letters, or both. It may be
+  /// different according to the locale: for example, for an Arabic locale it
+  /// may consist of Arabic letters, but for a French locale consist of Latin
+  /// letters. It will not be unique: for example, "$" can appear for both USD
+  /// and CAD.
+  ///
+  /// (The current implementation is the same for all locales, but this is
+  /// temporary and callers shouldn't rely on it.)
+  String simpleCurrencySymbol(String currencyCode) =>
+      _simpleCurrencySymbols[currencyCode] ?? currencyCode;
+
+  /// A map from currency names to the simple name/symbol.
+  ///
+  /// The simple currency symbol is generally short, and the same or related to
+  /// what is used in countries having the currency as an official symbol. It
+  /// may be a symbol character, or may have letters, or both. It may be
+  /// different according to the locale: for example, for an Arabic locale it
+  /// may consist of Arabic letters, but for a French locale consist of Latin
+  /// letters. It will not be unique: for example, "$" can appear for both USD
+  /// and CAD.
+  ///
+  /// (The current implementation is the same for all locales, but this is
+  /// temporary and callers shouldn't rely on it.)
+  static Map<String, String> _simpleCurrencySymbols = {
+    "AFN": "Af.",
+    "TOP": r"T$",
+    "MGA": "Ar",
+    "THB": "\u0e3f",
+    "PAB": "B/.",
+    "ETB": "Birr",
+    "VEF": "Bs",
+    "BOB": "Bs",
+    "GHS": "GHS",
+    "CRC": "\u20a1",
+    "NIO": r"C$",
+    "GMD": "GMD",
+    "MKD": "din",
+    "BHD": "din",
+    "DZD": "din",
+    "IQD": "din",
+    "JOD": "din",
+    "KWD": "din",
+    "LYD": "din",
+    "RSD": "din",
+    "TND": "din",
+    "AED": "dh",
+    "MAD": "dh",
+    "STD": "Db",
+    "BSD": r"$",
+    "FJD": r"$",
+    "GYD": r"$",
+    "KYD": r"$",
+    "LRD": r"$",
+    "SBD": r"$",
+    "SRD": r"$",
+    "AUD": r"$",
+    "BBD": r"$",
+    "BMD": r"$",
+    "BND": r"$",
+    "BZD": r"$",
+    "CAD": r"$",
+    "HKD": r"$",
+    "JMD": r"$",
+    "NAD": r"$",
+    "NZD": r"$",
+    "SGD": r"$",
+    "TTD": r"$",
+    "TWD": r"NT$",
+    "USD": r"$",
+    "XCD": r"$",
+    "VND": "\u20ab",
+    "AMD": "Dram",
+    "CVE": "CVE",
+    "EUR": "\u20ac",
+    "AWG": "Afl.",
+    "HUF": "Ft",
+    "BIF": "FBu",
+    "CDF": "FrCD",
+    "CHF": "CHF",
+    "DJF": "Fdj",
+    "GNF": "FG",
+    "RWF": "RF",
+    "XOF": "CFA",
+    "XPF": "FCFP",
+    "KMF": "CF",
+    "XAF": "FCFA",
+    "HTG": "HTG",
+    "PYG": "Gs",
+    "UAH": "\u20b4",
+    "PGK": "PGK",
+    "LAK": "\u20ad",
+    "CZK": "K\u010d",
+    "SEK": "kr",
+    "ISK": "kr",
+    "DKK": "kr",
+    "NOK": "kr",
+    "HRK": "kn",
+    "MWK": "MWK",
+    "ZMK": "ZWK",
+    "AOA": "Kz",
+    "MMK": "K",
+    "GEL": "GEL",
+    "LVL": "Ls",
+    "ALL": "Lek",
+    "HNL": "L",
+    "SLL": "SLL",
+    "MDL": "MDL",
+    "RON": "RON",
+    "BGN": "lev",
+    "SZL": "SZL",
+    "TRY": "TL",
+    "LTL": "Lt",
+    "LSL": "LSL",
+    "AZN": "man.",
+    "BAM": "KM",
+    "MZN": "MTn",
+    "NGN": "\u20a6",
+    "ERN": "Nfk",
+    "BTN": "Nu.",
+    "MRO": "MRO",
+    "MOP": "MOP",
+    "CUP": r"$",
+    "CUC": r"$",
+    "ARS": r"$",
+    "CLF": "UF",
+    "CLP": r"$",
+    "COP": r"$",
+    "DOP": r"$",
+    "MXN": r"$",
+    "PHP": "\u20b1",
+    "UYU": r"$",
+    "FKP": "£",
+    "GIP": "£",
+    "SHP": "£",
+    "EGP": "E£",
+    "LBP": "L£",
+    "SDG": "SDG",
+    "SSP": "SSP",
+    "GBP": "£",
+    "SYP": "£",
+    "BWP": "P",
+    "GTQ": "Q",
+    "ZAR": "R",
+    "BRL": r"R$",
+    "OMR": "Rial",
+    "QAR": "Rial",
+    "YER": "Rial",
+    "IRR": "Rial",
+    "KHR": "Riel",
+    "MYR": "RM",
+    "SAR": "Rial",
+    "BYR": "BYR",
+    "RUB": "руб.",
+    "MUR": "Rs",
+    "SCR": "SCR",
+    "LKR": "Rs",
+    "NPR": "Rs",
+    "INR": "\u20b9",
+    "PKR": "Rs",
+    "IDR": "Rp",
+    "ILS": "\u20aa",
+    "KES": "Ksh",
+    "SOS": "SOS",
+    "TZS": "TSh",
+    "UGX": "UGX",
+    "PEN": "S/.",
+    "KGS": "KGS",
+    "UZS": "so\u02bcm",
+    "TJS": "Som",
+    "BDT": "\u09f3",
+    "WST": "WST",
+    "KZT": "\u20b8",
+    "MNT": "\u20ae",
+    "VUV": "VUV",
+    "KPW": "\u20a9",
+    "KRW": "\u20a9",
+    "JPY": "¥",
+    "CNY": "¥",
+    "PLN": "z\u0142",
+    "MVR": "Rf",
+    "NLG": "NAf",
+    "ZMW": "ZK",
+    "ANG": "ƒ",
+    "TMT": "TMT",
+  };
+
+  /// Create a number format that prints in a pattern we get from
+  /// the [getPattern] function using the locale [locale].
+  ///
+  /// The [currencySymbol] can either be specified directly, or we can pass a
+  /// function [computeCurrencySymbol] that will compute it later, given other
+  /// information, typically the verified locale.
+  NumberFormat._forPattern(String locale, _PatternGetter getPattern,
+      {String name,
+      String currencySymbol,
+      String computeCurrencySymbol(NumberFormat),
+      int decimalDigits,
+      bool isForCurrency: false})
+      : _locale = Intl.verifiedLocale(locale, localeExists),
+        _isForCurrency = isForCurrency {
+    this._currencySymbol = currencySymbol;
+    this._decimalDigits = decimalDigits;
     _symbols = numberFormatSymbols[_locale];
-    if (currencyName == null) {
-      currencyName = _symbols.DEF_CURRENCY_CODE;
+    _localeZero = _symbols.ZERO_DIGIT.codeUnitAt(0);
+    _zeroOffset = _localeZero - _zero;
+    _negativePrefix = _symbols.MINUS_SIGN;
+    currencyName = name ?? _symbols.DEF_CURRENCY_CODE;
+    if (this._currencySymbol == null && computeCurrencySymbol != null) {
+      this._currencySymbol = computeCurrencySymbol(this);
     }
     _setPattern(getPattern(_symbols));
   }
 
-  /**
-   * Return the locale code in which we operate, e.g. 'en_US' or 'pt'.
-   */
+  /// A number format for compact representations, e.g. "1.2M" instead
+  /// of "1,200,000".
+  factory NumberFormat.compact({String locale}) {
+    return new _CompactNumberFormat(
+        locale: locale,
+        formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN);
+  }
+
+  /// A number format for "long" compact representations, e.g. "1.2 million"
+  /// instead of of "1,200,000".
+  factory NumberFormat.compactLong({String locale}) {
+    return new _CompactNumberFormat(
+        locale: locale,
+        formatType: _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN);
+  }
+
+  /// A number format for compact currency representations, e.g. "$1.2M" instead
+  /// of "$1,200,000", and which will automatically determine a currency symbol
+  /// based on the currency name or the locale. See
+  /// [NumberFormat.simpleCurrency].
+  factory NumberFormat.compactSimpleCurrency({String locale, String name}) {
+    return new _CompactNumberFormat(
+        locale: locale,
+        formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN,
+        name: name,
+        getPattern: (symbols) => symbols.CURRENCY_PATTERN,
+        computeCurrencySymbol: (format) =>
+            _simpleCurrencySymbols[format.currencyName] ?? format.currencyName,
+        isForCurrency: true);
+  }
+
+  /// A number format for compact currency representations, e.g. "$1.2M" instead
+  /// of "$1,200,000".
+  factory NumberFormat.compactCurrency(
+      {String locale, String name, String symbol, int decimalDigits}) {
+    return new _CompactNumberFormat(
+        locale: locale,
+        formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_CURRENCY_PATTERN,
+        name: name,
+        getPattern: (symbols) => symbols.CURRENCY_PATTERN,
+        currencySymbol: symbol,
+        decimalDigits: decimalDigits,
+        isForCurrency: true);
+  }
+
+  /// Return the locale code in which we operate, e.g. 'en_US' or 'pt'.
   String get locale => _locale;
 
-  /**
-   * Return true if the locale exists, or if it is null. The null case
-   * is interpreted to mean that we use the default locale.
-   */
+  /// Return true if the locale exists, or if it is null. The null case
+  /// is interpreted to mean that we use the default locale.
   static bool localeExists(localeName) {
     if (localeName == null) return false;
     return numberFormatSymbols.containsKey(localeName);
   }
 
-  /**
-   * Return the symbols which are used in our locale. Cache them to avoid
-   * repeated lookup.
-   */
+  /// Return the symbols which are used in our locale. Cache them to avoid
+  /// repeated lookup.
   NumberSymbols get symbols => _symbols;
 
-  /**
-   * Format [number] according to our pattern and return the formatted string.
-   */
+  /// Format [number] according to our pattern and return the formatted string.
   String format(number) {
     if (_isNaN(number)) return symbols.NAN;
     if (_isInfinite(number)) return "${_signPrefix(number)}${symbols.INFINITY}";
@@ -188,15 +571,11 @@
     return result;
   }
 
-  /**
-   * Parse the number represented by the string. If it's not
-   * parseable, throws a [FormatException].
-   */
+  /// Parse the number represented by the string. If it's not
+  /// parseable, throws a [FormatException].
   num parse(String text) => new _NumberParser(this, text).value;
 
-  /**
-   * Format the main part of the number in the form dictated by the pattern.
-   */
+  /// Format the main part of the number in the form dictated by the pattern.
   void _formatNumber(number) {
     if (_useExponentialNotation) {
       _formatExponential(number);
@@ -205,7 +584,7 @@
     }
   }
 
-  /** Format the number in exponential notation. */
+  /// Format the number in exponential notation.
   void _formatExponential(num number) {
     if (number == 0.0) {
       _formatFixed(number);
@@ -213,10 +592,9 @@
       return;
     }
 
-    var exponent = (log(number) / log(10)).floor();
+    var exponent = (log(number) / LN10).floor();
     var mantissa = number / pow(10.0, exponent);
 
-    var minIntDigits = minimumIntegerDigits;
     if (maximumIntegerDigits > 1 &&
         maximumIntegerDigits > minimumIntegerDigits) {
       // A repeating range is defined; adjust to it as follows.
@@ -228,7 +606,6 @@
         mantissa *= 10;
         exponent--;
       }
-      minIntDigits = 1;
     } else {
       // No repeating range is defined, use minimum integer digits.
       if (minimumIntegerDigits < 1) {
@@ -243,9 +620,7 @@
     _formatExponent(exponent);
   }
 
-  /**
-   * Format the exponent portion, e.g. in "1.3e-5" the "e-5".
-   */
+  /// Format the exponent portion, e.g. in "1.3e-5" the "e-5".
   void _formatExponent(num exponent) {
     _add(symbols.EXP_SYMBOL);
     if (exponent < 0) {
@@ -257,28 +632,84 @@
     _pad(minimumExponentDigits, exponent.toString());
   }
 
-  /** Used to test if we have exceeded Javascript integer limits. */
+  /// Used to test if we have exceeded Javascript integer limits.
   final _maxInt = pow(2, 52);
 
-  /**
-   * Helpers to check numbers that don't conform to the [num] interface,
-   * e.g. Int64
-   */
+  /// Helpers to check numbers that don't conform to the [num] interface,
+  /// e.g. Int64
   _isInfinite(number) => number is num ? number.isInfinite : false;
   _isNaN(number) => number is num ? number.isNaN : false;
-  _round(number) => number is num ? number.round() : number;
-  _floor(number) => number is num ? number.floor() : number;
 
-  /**
-   * Format the basic number portion, inluding the fractional digits.
-   */
+  /// Helper to get the floor of a number which might not be num. This should
+  /// only ever be called with an argument which is positive, or whose abs()
+  ///  is negative. The second case is the maximum negative value on a
+  ///  fixed-length integer. Since they are integers, they are also their own
+  ///  floor.
+  _floor(number) {
+    if (number.isNegative && !(number.abs().isNegative)) {
+      throw new ArgumentError(
+          "Internal error: expected positive number, got $number");
+    }
+    return (number is num) ? number.floor() : number ~/ 1;
+  }
+
+  /// Helper to round a number which might not be num.
+  _round(number) {
+    if (number is num) {
+      if (number.isInfinite) {
+        return _maxInt;
+      } else {
+        return number.round();
+      }
+    } else if (number.remainder(1) == 0) {
+      // Not a normal number, but int-like, e.g. Int64
+      return number;
+    } else {
+      // TODO(alanknight): Do this more efficiently. If IntX  had floor and round we could avoid this.
+      var basic = _floor(number);
+      var fraction = (number - basic).toDouble().round();
+      return fraction == 0 ? number : number + fraction;
+    }
+  }
+
+  // Return the number of digits left of the decimal place in [number].
+  static int numberOfIntegerDigits(number) {
+    var simpleNumber = number.toDouble().abs();
+    // It's unfortunate that we have to do this, but we get precision errors
+    // that affect the result if we use logs, e.g. 1000000
+    if (simpleNumber < 10) return 1;
+    if (simpleNumber < 100) return 2;
+    if (simpleNumber < 1000) return 3;
+    if (simpleNumber < 10000) return 4;
+    if (simpleNumber < 100000) return 5;
+    if (simpleNumber < 1000000) return 6;
+    if (simpleNumber < 10000000) return 7;
+    if (simpleNumber < 100000000) return 8;
+    if (simpleNumber < 1000000000) return 9;
+    if (simpleNumber < 10000000000) return 10;
+    if (simpleNumber < 100000000000) return 11;
+    if (simpleNumber < 1000000000000) return 12;
+    if (simpleNumber < 10000000000000) return 13;
+    if (simpleNumber < 100000000000000) return 14;
+    if (simpleNumber < 1000000000000000) return 15;
+    if (simpleNumber < 10000000000000000) return 16;
+    // We're past the point where being off by one on the number of digits
+    // will affect the pattern, so now we can use logs.
+    return max(1, (log(simpleNumber) / LN10).ceil());
+  }
+
+  int _fractionDigitsAfter(int remainingSignificantDigits) =>
+      max(0, remainingSignificantDigits);
+
+  /// Format the basic number portion, including the fractional digits.
   void _formatFixed(number) {
     var integerPart;
     int fractionPart;
     int extraIntegerDigits;
+    var fractionDigits = maximumFractionDigits;
 
-    final power = pow(10, maximumFractionDigits);
-    final digitMultiplier = power * _multiplier;
+    var power = 0;
+    var digitMultiplier;
 
     if (_isInfinite(number)) {
       integerPart = number.toInt();
@@ -293,6 +724,23 @@
       // integer pieces.
       integerPart = _floor(number);
       var fraction = number - integerPart;
+
+      /// If we have significant digits, recalculate the number of fraction
+      /// digits based on that.
+      if (significantDigitsInUse) {
+        var integerLength = numberOfIntegerDigits(integerPart);
+        var remainingSignificantDigits =
+            significantDigits - _multiplierDigits - integerLength;
+        fractionDigits = _fractionDigitsAfter(remainingSignificantDigits);
+        if (remainingSignificantDigits < 0) {
+          // We may have to round.
+          var divideBy = pow(10, integerLength - significantDigits);
+          integerPart = (integerPart / divideBy).round() * divideBy;
+        }
+      }
+      power = pow(10, fractionDigits);
+      digitMultiplier = power * _multiplier;
+
       // Multiply out to the number of decimal places and the percent, then
       // round. For fixed-size integer types this should always be zero, so
       // multiplying is OK.
@@ -306,13 +754,14 @@
       extraIntegerDigits = remainingDigits ~/ power;
       fractionPart = remainingDigits % power;
     }
-    var fractionPresent = minimumFractionDigits > 0 || fractionPart > 0;
 
     var integerDigits = _integerDigits(integerPart, extraIntegerDigits);
     var digitLength = integerDigits.length;
+    var fractionPresent =
+        fractionDigits > 0 && (minimumFractionDigits > 0 || fractionPart > 0);
 
     if (_hasIntegerDigits(integerDigits)) {
-      _pad(minimumIntegerDigits - digitLength);
+      _padEmpty(minimumIntegerDigits - digitLength);
       for (var i = 0; i < digitLength; i++) {
         _addDigit(integerDigits.codeUnitAt(i));
         _group(digitLength, i);
@@ -326,10 +775,8 @@
     _formatFractionPart((fractionPart + power).toString());
   }
 
-  /**
-   * Compute the raw integer digits which will then be printed with
-   * grouping and translated to localized digits.
-   */
+  /// Compute the raw integer digits which will then be printed with
+  /// grouping and translated to localized digits.
   String _integerDigits(integerPart, extraIntegerDigits) {
     // If the int part is larger than 2^52 and we're on Javascript (so it's
     // really a float) it will lose precision, so pad out the rest of it
@@ -338,7 +785,7 @@
     if (1 is double && integerPart is num && integerPart > _maxInt) {
       var howManyDigitsTooBig = (log(integerPart) / LN10).ceil() - 16;
       var divisor = pow(10, howManyDigitsTooBig).round();
-      paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
+      paddingDigits = '0' * howManyDigitsTooBig.toInt();
       integerPart = (integerPart / divisor).truncate();
     }
 
@@ -349,85 +796,90 @@
     return "${intDigits}${paddedExtra}${paddingDigits}";
   }
 
-  /**
-   * The digit string of the integer part. This is the empty string if the
-   * integer part is zero and otherwise is the toString() of the integer
-   * part, stripping off any minus sign.
-   */
+  /// The digit string of the integer part. This is the empty string if the
+  /// integer part is zero and otherwise is the toString() of the integer
+  /// part, stripping off any minus sign.
   String _mainIntegerDigits(integer) {
     if (integer == 0) return '';
     var digits = integer.toString();
+    if (significantDigitsInUse && digits.length > significantDigits) {
+      digits = digits.substring(0, significantDigits) +
+          ''.padLeft(digits.length - significantDigits, '0');
+    }
     // If we have a fixed-length int representation, it can have a negative
     // number whose negation is also negative, e.g. 2^-63 in 64-bit.
     // Remove the minus sign.
     return digits.startsWith('-') ? digits.substring(1) : digits;
   }
 
-  /**
-   * Format the part after the decimal place in a fixed point number.
-   */
+  /// Format the part after the decimal place in a fixed point number.
   void _formatFractionPart(String fractionPart) {
-    var fractionCodes = fractionPart.codeUnits;
     var fractionLength = fractionPart.length;
-    while (fractionCodes[fractionLength - 1] == _zero &&
+    while (fractionPart.codeUnitAt(fractionLength - 1) == _zero &&
         fractionLength > minimumFractionDigits + 1) {
       fractionLength--;
     }
     for (var i = 1; i < fractionLength; i++) {
-      _addDigit(fractionCodes[i]);
+      _addDigit(fractionPart.codeUnitAt(i));
     }
   }
 
-  /** Print the decimal separator if appropriate. */
+  /// Print the decimal separator if appropriate.
   void _decimalSeparator(bool fractionPresent) {
     if (_decimalSeparatorAlwaysShown || fractionPresent) {
       _add(symbols.DECIMAL_SEP);
     }
   }
 
-  /**
-   * Return true if we have a main integer part which is printable, either
-   * because we have digits left of the decimal point (this may include digits
-   * which have been moved left because of percent or permille formatting),
-   * or because the minimum number of printable digits is greater than 1.
-   */
+  /// Return true if we have a main integer part which is printable, either
+  /// because we have digits left of the decimal point (this may include digits
+  /// which have been moved left because of percent or permille formatting),
+  /// or because the minimum number of printable digits is greater than 1.
   bool _hasIntegerDigits(String digits) =>
       digits.isNotEmpty || minimumIntegerDigits > 0;
 
-  /** A group of methods that provide support for writing digits and other
-   * required characters into [_buffer] easily.
-   */
+  /// A group of methods that provide support for writing digits and other
+  /// required characters into [_buffer] easily.
   void _add(String x) {
     _buffer.write(x);
   }
-  void _addCharCode(int x) {
-    _buffer.writeCharCode(x);
-  }
+
   void _addZero() {
     _buffer.write(symbols.ZERO_DIGIT);
   }
+
   void _addDigit(int x) {
-    _buffer.writeCharCode(_localeZero + x - _zero);
+    _buffer.writeCharCode(x + _zeroOffset);
   }
 
-  /** Print padding up to [numberOfDigits] above what's included in [basic]. */
-  void _pad(int numberOfDigits, [String basic = '']) {
+  void _padEmpty(int howMany) {
+    _buffer.write(symbols.ZERO_DIGIT * howMany);
+  }
+
+  void _pad(int numberOfDigits, String basic) {
+    if (_zeroOffset == 0) {
+      _buffer.write(basic.padLeft(numberOfDigits, '0'));
+    } else {
+      _slowPad(numberOfDigits, basic);
+    }
+  }
+
+  /// Print padding up to [numberOfDigits] above what's included in [basic].
+  void _slowPad(int numberOfDigits, String basic) {
     for (var i = 0; i < numberOfDigits - basic.length; i++) {
       _add(symbols.ZERO_DIGIT);
     }
-    for (var x in basic.codeUnits) {
-      _addDigit(x);
+    for (int i = 0; i < basic.length; i++) {
+      _addDigit(basic.codeUnitAt(i));
     }
   }
 
-  /**
-   * We are printing the digits of the number from left to right. We may need
-   * to print a thousands separator or other grouping character as appropriate
-   * to the locale. So we find how many places we are from the end of the number
-   * by subtracting our current [position] from the [totalLength] and printing
-   * the separator character every [_groupingSize] digits, with the final
-   * grouping possibly being of a different size, [_finalGroupingSize].
-   */
+  /// We are printing the digits of the number from left to right. We may need
+  /// to print a thousands separator or other grouping character as appropriate
+  /// to the locale. So we find how many places we are from the end of the number
+  /// by subtracting our current [position] from the [totalLength] and printing
+  /// the separator character every [_groupingSize] digits, with the final
+  /// grouping possibly being of a different size, [_finalGroupingSize].
   void _group(int totalLength, int position) {
     var distanceFromEnd = totalLength - position;
     if (distanceFromEnd <= 1 || _groupingSize <= 0) return;
@@ -439,171 +891,166 @@
     }
   }
 
-  /** Returns the code point for the character '0'. */
-  final _zero = '0'.codeUnits.first;
+  /// The code point for the character '0'.
+  static const _zero = 48;
 
-  /** Returns the code point for the locale's zero digit. */
-  // Note that there is a slight risk of a locale's zero digit not fitting
-  // into a single code unit, but it seems very unlikely, and if it did,
-  // there's a pretty good chance that our assumptions about being able to do
-  // arithmetic on it would also be invalid.
-  get _localeZero => symbols.ZERO_DIGIT.codeUnits.first;
+  /// The code point for the locale's zero digit.
+  ///
+  ///  Initialized when the locale is set.
+  int _localeZero = 0;
 
-  /**
-   * Returns the prefix for [x] based on whether it's positive or negative.
-   * In en_US this would be '' and '-' respectively.
-   */
+  /// The difference between our zero and '0'.
+  ///
+  /// In other words, a constant _localeZero - _zero. Initialized when
+  /// the locale is set.
+  int _zeroOffset = 0;
+
+  /// Returns the prefix for [x] based on whether it's positive or negative.
+  /// In en_US this would be '' and '-' respectively.
   String _signPrefix(x) => x.isNegative ? _negativePrefix : _positivePrefix;
 
-  /**
-   * Returns the suffix for [x] based on wether it's positive or negative.
-   * In en_US there are no suffixes for positive or negative.
-   */
+  /// Returns the suffix for [x] based on wether it's positive or negative.
+  /// In en_US there are no suffixes for positive or negative.
   String _signSuffix(x) => x.isNegative ? _negativeSuffix : _positiveSuffix;
 
   void _setPattern(String newPattern) {
     if (newPattern == null) return;
     // Make spaces non-breaking
     _pattern = newPattern.replaceAll(' ', '\u00a0');
-    var parser = new _NumberFormatParser(this, newPattern, currencyName);
+    var parser = new _NumberFormatParser(
+        this, newPattern, currencySymbol, decimalDigits);
     parser.parse();
+    if (_overridesDecimalDigits) {
+      _decimalDigits ??= _defaultDecimalDigits;
+      minimumFractionDigits = _decimalDigits;
+      maximumFractionDigits = _decimalDigits;
+    }
+  }
+
+  /// Explicitly turn off any grouping (e.g. by thousands) in this format.
+  ///
+  /// This is used in compact number formatting, where we
+  /// omit the normal grouping. Best to know what you're doing if you call it.
+  void turnOffGrouping() {
+    _groupingSize = 0;
+    _finalGroupingSize = 0;
   }
 
   String toString() => "NumberFormat($_locale, $_pattern)";
 }
 
-/**
- *  A one-time object for parsing a particular numeric string. One-time here
- * means an instance can only parse one string. This is implemented by
- * transforming from a locale-specific format to one that the system can parse,
- * then calls the system parsing methods on it.
- */
+///  A one-time object for parsing a particular numeric string. One-time here
+/// means an instance can only parse one string. This is implemented by
+/// transforming from a locale-specific format to one that the system can parse,
+/// then calls the system parsing methods on it.
 class _NumberParser {
-
-  /** The format for which we are parsing. */
+  /// The format for which we are parsing.
   final NumberFormat format;
 
-  /** The text we are parsing. */
+  /// The text we are parsing.
   final String text;
 
-  /** What we use to iterate over the input text. */
+  /// What we use to iterate over the input text.
   final _Stream input;
 
-  /**
-   * The result of parsing [text] according to [format]. Automatically
-   * populated in the constructor.
-   */
+  /// The result of parsing [text] according to [format]. Automatically
+  /// populated in the constructor.
   num value;
 
-  /** The symbols used by our format. */
+  /// The symbols used by our format.
   NumberSymbols get symbols => format.symbols;
 
-  /** Where we accumulate the normalized representation of the number. */
+  /// Where we accumulate the normalized representation of the number.
   final StringBuffer _normalized = new StringBuffer();
 
-  /**
-   * Did we see something that indicates this is, or at least might be,
-   * a positive number.
-   */
+  /// Did we see something that indicates this is, or at least might be,
+  /// a positive number.
   bool gotPositive = false;
 
-  /**
-   * Did we see something that indicates this is, or at least might be,
-   * a negative number.
-   */
+  /// Did we see something that indicates this is, or at least might be,
+  /// a negative number.
   bool gotNegative = false;
-  /**
-   * Did we see the required positive suffix at the end. Should
-   * match [gotPositive].
-   */
+
+  /// Did we see the required positive suffix at the end. Should
+  /// match [gotPositive].
   bool gotPositiveSuffix = false;
-  /**
-   * Did we see the required negative suffix at the end. Should
-   * match [gotNegative].
-   */
+
+  /// Did we see the required negative suffix at the end. Should
+  /// match [gotNegative].
   bool gotNegativeSuffix = false;
 
-  /** Should we stop parsing before hitting the end of the string. */
+  /// Should we stop parsing before hitting the end of the string.
   bool done = false;
 
-  /** Have we already skipped over any required prefixes. */
+  /// Have we already skipped over any required prefixes.
   bool prefixesSkipped = false;
 
-  /** If the number is percent or permill, what do we divide by at the end. */
+  /// If the number is percent or permill, what do we divide by at the end.
   int scale = 1;
 
   String get _positivePrefix => format._positivePrefix;
   String get _negativePrefix => format._negativePrefix;
   String get _positiveSuffix => format._positiveSuffix;
   String get _negativeSuffix => format._negativeSuffix;
-  int get _zero => format._zero;
+  int get _zero => NumberFormat._zero;
   int get _localeZero => format._localeZero;
 
-  /**
-   *  Create a new [_NumberParser] on which we can call parse().
-   */
+  ///  Create a new [_NumberParser] on which we can call parse().
   _NumberParser(this.format, text)
       : this.text = text,
         this.input = new _Stream(text) {
+    scale = format._internalMultiplier;
     value = parse();
   }
 
-  /**
-   *  The strings we might replace with functions that return the replacement
-   * values. They are functions because we might need to check something
-   * in the context. Note that the ordering is important here. For example,
-   * [symbols.PERCENT] might be " %", and we must handle that before we
-   * look at an individual space.
-   */
-  Map<String, Function> get replacements => _replacements == null
-      ? _replacements = _initializeReplacements()
-      : _replacements;
+  ///  The strings we might replace with functions that return the replacement
+  /// values. They are functions because we might need to check something
+  /// in the context. Note that the ordering is important here. For example,
+  /// [symbols.PERCENT] might be " %", and we must handle that before we
+  /// look at an individual space.
+  Map<String, Function> get replacements =>
+      _replacements ??= _initializeReplacements();
 
-  var _replacements;
+  Map<String, Function> _replacements;
 
-  Map _initializeReplacements() => {
-    symbols.DECIMAL_SEP: () => '.',
-    symbols.EXP_SYMBOL: () => 'E',
-    symbols.GROUP_SEP: handleSpace,
-    symbols.PERCENT: () {
-      scale = _NumberFormatParser._PERCENT_SCALE;
-      return '';
-    },
-    symbols.PERMILL: () {
-      scale = _NumberFormatParser._PER_MILLE_SCALE;
-      return '';
-    },
-    ' ': handleSpace,
-    '\u00a0': handleSpace,
-    '+': () => '+',
-    '-': () => '-',
-  };
+  Map<String, Function> _initializeReplacements() => {
+        symbols.DECIMAL_SEP: () => '.',
+        symbols.EXP_SYMBOL: () => 'E',
+        symbols.GROUP_SEP: handleSpace,
+        symbols.PERCENT: () {
+          scale = _NumberFormatParser._PERCENT_SCALE;
+          return '';
+        },
+        symbols.PERMILL: () {
+          scale = _NumberFormatParser._PER_MILLE_SCALE;
+          return '';
+        },
+        ' ': handleSpace,
+        '\u00a0': handleSpace,
+        '+': () => '+',
+        '-': () => '-',
+      };
 
   invalidFormat() =>
       throw new FormatException("Invalid number: ${input.contents}");
 
-  /**
-   * Replace a space in the number with the normalized form. If space is not
-   * a significant character (normally grouping) then it's just invalid. If it
-   * is the grouping character, then it's only valid if it's followed by a
-   * digit. e.g. '$12 345.00'
-   */
+  /// Replace a space in the number with the normalized form. If space is not
+  /// a significant character (normally grouping) then it's just invalid. If it
+  /// is the grouping character, then it's only valid if it's followed by a
+  /// digit. e.g. '$12 345.00'
   handleSpace() =>
       groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit ? '' : invalidFormat();
 
-  /**
-   * Determine if a space is a valid character in the number. See [handleSpace].
-   */
+  /// Determine if a space is a valid character in the number. See
+  /// [handleSpace].
   bool get groupingIsNotASpaceOrElseItIsSpaceFollowedByADigit {
     if (symbols.GROUP_SEP != '\u00a0' || symbols.GROUP_SEP != ' ') return true;
     var peeked = input.peek(symbols.GROUP_SEP.length + 1);
     return asDigit(peeked[peeked.length - 1]) != null;
   }
 
-  /**
-   * Turn [char] into a number representing a digit, or null if it doesn't
-   * represent a digit in this locale.
-   */
+  /// Turn [char] into a number representing a digit, or null if it doesn't
+  /// represent a digit in this locale.
   int asDigit(String char) {
     var charCode = char.codeUnitAt(0);
     var digitValue = charCode - _localeZero;
@@ -614,25 +1061,20 @@
     }
   }
 
-  /**
-   * Check to see if the input begins with either the positive or negative
-   * prefixes. Set the [gotPositive] and [gotNegative] variables accordingly.
-   */
+  /// Check to see if the input begins with either the positive or negative
+  /// prefixes. Set the [gotPositive] and [gotNegative] variables accordingly.
   void checkPrefixes({bool skip: false}) {
-    bool checkPrefix(String prefix, skip) {
-      var matched = prefix.isNotEmpty && input.startsWith(prefix);
-      if (skip && matched) input.read(prefix.length);
-      return matched;
-    }
+    bool checkPrefix(String prefix) =>
+        prefix.isNotEmpty && input.startsWith(prefix);
 
     // TODO(alanknight): There's a faint possibility of a bug here where
     // a positive prefix is followed by a negative prefix that's also a valid
     // part of the number, but that seems very unlikely.
-    if (checkPrefix(_positivePrefix, skip)) gotPositive = true;
-    if (checkPrefix(_negativePrefix, skip)) gotNegative = true;
+    if (checkPrefix(_positivePrefix)) gotPositive = true;
+    if (checkPrefix(_negativePrefix)) gotNegative = true;
 
-    // Copied from Closure. It doesn't seem to be necessary to pass the test
-    // suite, so I'm not sure it's really needed.
+    // The positive prefix might be a substring of the negative, in
+    // which case both would match.
     if (gotPositive && gotNegative) {
       if (_positivePrefix.length > _negativePrefix.length) {
         gotNegative = false;
@@ -640,25 +1082,35 @@
         gotPositive = false;
       }
     }
+    if (skip) {
+      if (gotPositive) input.read(_positivePrefix.length);
+      if (gotNegative) input.read(_negativePrefix.length);
+    }
   }
 
-  /**
-   * If the rest of our input is either the positive or negative suffix,
-   * set [gotPositiveSuffix] or [gotNegativeSuffix] accordingly.
-   */
+  /// If the rest of our input is either the positive or negative suffix,
+  /// set [gotPositiveSuffix] or [gotNegativeSuffix] accordingly.
   void checkSuffixes() {
     var remainder = input.rest();
     if (remainder == _positiveSuffix) gotPositiveSuffix = true;
     if (remainder == _negativeSuffix) gotNegativeSuffix = true;
   }
 
-  /**
-   * We've encountered a character that's not a digit. Go through our
-   * replacement rules looking for how to handle it. If we see something
-   * that's not a digit and doesn't have a replacement, then we're done
-   * and the number is probably invalid.
-   */
+  /// We've encountered a character that's not a digit. Go through our
+  /// replacement rules looking for how to handle it. If we see something
+  /// that's not a digit and doesn't have a replacement, then we're done
+  /// and the number is probably invalid.
   void processNonDigit() {
+    // It might just be a prefix that we haven't skipped. We don't want to
+    // skip them initially because they might also be semantically meaningful,
+    // e.g. leading %. So we allow them through the loop, but only once.
+    var foundAnInterpretation = false;
+    if (input.index == 0 && !prefixesSkipped) {
+      prefixesSkipped = true;
+      checkPrefixes(skip: true);
+      foundAnInterpretation = true;
+    }
+
     for (var key in replacements.keys) {
       if (input.startsWith(key)) {
         _normalized.write(replacements[key]());
@@ -666,21 +1118,14 @@
         return;
       }
     }
-    // It might just be a prefix that we haven't skipped. We don't want to
-    // skip them initially because they might also be semantically meaningful,
-    // e.g. leading %. So we allow them through the loop, but only once.
-    if (input.index == 0 && !prefixesSkipped) {
-      prefixesSkipped = true;
-      checkPrefixes(skip: true);
-    } else {
+    // We haven't found either of these things, this seems invalid.
+    if (!foundAnInterpretation) {
       done = true;
     }
   }
 
-  /**
-   * Parse [text] and return the resulting number. Throws [FormatException]
-   * if we can't parse it.
-   */
+  /// Parse [text] and return the resulting number. Throws [FormatException]
+  /// if we can't parse it.
   num parse() {
     if (text == symbols.NAN) return double.NAN;
     if (text == "$_positivePrefix${symbols.INFINITY}$_positiveSuffix") {
@@ -700,15 +1145,16 @@
     return parsed;
   }
 
-  /** The number is invalid, throw a [FormatException]. */
+  /// The number is invalid, throw a [FormatException].
   void invalidNumber() =>
       throw new FormatException("Invalid Number: ${input.contents}");
 
-  /**
-   * Parse the number portion of the input, i.e. not any prefixes or suffixes,
-   * and assuming NaN and Infinity are already handled.
-   */
+  /// Parse the number portion of the input, i.e. not any prefixes or suffixes,
+  /// and assuming NaN and Infinity are already handled.
   num parseNumber(_Stream input) {
+    if (gotNegative) {
+      _normalized.write('-');
+    }
     while (!done && !input.atEnd()) {
       int digit = asDigit(input.peek());
       if (digit != null) {
@@ -727,18 +1173,13 @@
   }
 }
 
-/**
- * Private class that parses the numeric formatting pattern and sets the
- * variables in [format] to appropriate values. Instances of this are
- * transient and store parsing state in instance variables, so can only be used
- * to parse a single pattern.
- */
+/// Private class that parses the numeric formatting pattern and sets the
+/// variables in [format] to appropriate values. Instances of this are
+/// transient and store parsing state in instance variables, so can only be used
+/// to parse a single pattern.
 class _NumberFormatParser {
-
-  /**
-   * The special characters in the pattern language. All others are treated
-   * as literals.
-   */
+  /// The special characters in the pattern language. All others are treated
+  /// as literals.
   static const _PATTERN_SEPARATOR = ';';
   static const _QUOTE = "'";
   static const _PATTERN_DIGIT = '#';
@@ -753,28 +1194,31 @@
   static const _PATTERN_EXPONENT = 'E';
   static const _PATTERN_PLUS = '+';
 
-  /** The format whose state we are setting. */
+  /// The format whose state we are setting.
   final NumberFormat format;
 
-  /** The pattern we are parsing. */
+  /// The pattern we are parsing.
   final _StringIterator pattern;
 
-  /** We can be passed a specific currency symbol, regardless of the locale. */
-  String currencyName;
+  /// We can be passed a specific currency symbol, regardless of the locale.
+  String currencySymbol;
 
-  /**
-   * Create a new [_NumberFormatParser] for a particular [NumberFormat] and
-   * [input] pattern.
-   */
-  _NumberFormatParser(this.format, input, this.currencyName)
+  /// We can be given a specific number of decimal places, overriding the
+  /// default.
+  final int decimalDigits;
+
+  /// Create a new [_NumberFormatParser] for a particular [NumberFormat] and
+  /// [input] pattern.
+  _NumberFormatParser(
+      this.format, input, this.currencySymbol, this.decimalDigits)
       : pattern = _iterator(input) {
     pattern.moveNext();
   }
 
-  /** The [NumberSymbols] for the locale in which our [format] prints. */
+  /// The [NumberSymbols] for the locale in which our [format] prints.
   NumberSymbols get symbols => format.symbols;
 
-  /** Parse the input pattern and set the values. */
+  /// Parse the input pattern and set the values.
   void parse() {
     format._positivePrefix = _parseAffix();
     var trunk = _parseTrunk();
@@ -801,16 +1245,12 @@
     }
   }
 
-  /**
-   * Variable used in parsing prefixes and suffixes to keep track of
-   * whether or not we are in a quoted region.
-   */
+  /// Variable used in parsing prefixes and suffixes to keep track of
+  /// whether or not we are in a quoted region.
   bool inQuote = false;
 
-  /**
-   * Parse a prefix or suffix and return the prefix/suffix string. Note that
-   * this also may modify the state of [format].
-   */
+  /// Parse a prefix or suffix and return the prefix/suffix string. Note that
+  /// this also may modify the state of [format].
   String _parseAffix() {
     var affix = new StringBuffer();
     inQuote = false;
@@ -818,11 +1258,9 @@
     return affix.toString();
   }
 
-  /**
-   * Parse an individual character as part of a prefix or suffix.  Return true
-   * if we should continue to look for more affix characters, and false if
-   * we have reached the end.
-   */
+  /// Parse an individual character as part of a prefix or suffix.  Return true
+  /// if we should continue to look for more affix characters, and false if
+  /// we have reached the end.
   bool parseCharacterAffix(StringBuffer affix) {
     var ch = pattern.current;
     if (ch == null) return false;
@@ -848,7 +1286,7 @@
           return false;
         case _PATTERN_CURRENCY_SIGN:
           // TODO(alanknight): Handle the local/global/portable currency signs
-          affix.write(currencyName);
+          affix.write(currencySymbol);
           break;
         case _PATTERN_PERCENT:
           if (format._multiplier != 1 && format._multiplier != _PERCENT_SCALE) {
@@ -872,17 +1310,15 @@
     return true;
   }
 
-  /** Variables used in [_parseTrunk] and [parseTrunkCharacter]. */
+  /// Variables used in [_parseTrunk] and [parseTrunkCharacter].
   var decimalPos = -1;
   var digitLeftCount = 0;
   var zeroDigitCount = 0;
   var digitRightCount = 0;
   var groupingCount = -1;
 
-  /**
-   * Parse the "trunk" portion of the pattern, the piece that doesn't include
-   * positive or negative prefixes or suffixes.
-   */
+  /// Parse the "trunk" portion of the pattern, the piece that doesn't include
+  /// positive or negative prefixes or suffixes.
   String _parseTrunk() {
     var loop = true;
     var trunk = new StringBuffer();
@@ -945,11 +1381,9 @@
     return trunk.toString();
   }
 
-  /**
-   * Parse an individual character of the trunk. Return true if we should
-   * continue to look for additional trunk characters or false if we have
-   * reached the end.
-   */
+  /// Parse an individual character of the trunk. Return true if we should
+  /// continue to look for additional trunk characters or false if we have
+  /// reached the end.
   bool parseTrunkCharacter(trunk) {
     var ch = pattern.current;
     switch (ch) {
@@ -1027,31 +1461,23 @@
   }
 }
 
-/**
- * Returns an [Iterable] on the string as a list of substrings.
- */
+/// Returns an [Iterable] on the string as a list of substrings.
 Iterable _iterable(String s) => new _StringIterable(s);
 
-/**
- * Return an iterator on the string as a list of substrings.
- */
-Iterator _iterator(String s) => new _StringIterator(s);
+/// Return an iterator on the string as a list of substrings.
+Iterator<String> _iterator(String s) => new _StringIterator(s);
 
 // TODO(nweiz): remove this when issue 3780 is fixed.
-/**
- * Provides an Iterable that wraps [_iterator] so it can be used in a `for`
- * loop.
- */
+/// Provides an Iterable that wraps [_iterator] so it can be used in a `for`
+/// loop.
 class _StringIterable extends IterableBase<String> {
   final Iterator<String> iterator;
 
   _StringIterable(String s) : iterator = _iterator(s);
 }
 
-/**
- * Provides an iterator over a string as a list of substrings, and also
- * gives us a lookahead of one via the [peek] method.
- */
+/// Provides an iterator over a string as a list of substrings, and also
+/// gives us a lookahead of one via the [peek] method.
 class _StringIterator implements Iterator<String> {
   final String input;
   int nextIndex = 0;
@@ -1079,3 +1505,82 @@
     return input;
   }
 }
+
+/// Used primarily for currency formatting, this number-like class stores
+/// millionths of a currency unit, typically as an Int64.
+///
+/// It supports no operations other than being used for Intl number formatting.
+abstract class MicroMoney {
+  factory MicroMoney(micros) => new _MicroMoney(micros);
+}
+
+/// Used primarily for currency formatting, this stores millionths of a
+/// currency unit, typically as an Int64.
+///
+/// This private class provides the operations needed by the formatting code.
+class _MicroMoney implements MicroMoney {
+  var _micros;
+  _MicroMoney(this._micros);
+  static const _multiplier = 1000000;
+
+  get _integerPart => _micros ~/ _multiplier;
+  int get _fractionPart => (this - _integerPart)._micros.toInt().abs();
+
+  bool get isNegative => _micros.isNegative;
+
+  _MicroMoney abs() => isNegative ? new _MicroMoney(_micros.abs()) : this;
+
+  // Note that if this is done in a general way there's a risk of integer
+  // overflow on JS when multiplying out the [other] parameter, which may be
+  // an Int64. In formatting we only ever subtract out our own integer part.
+  _MicroMoney operator -(other) {
+    if (other is _MicroMoney) return new _MicroMoney(_micros - other._micros);
+    return new _MicroMoney(_micros - (other * _multiplier));
+  }
+
+  _MicroMoney operator +(other) {
+    if (other is _MicroMoney) return new _MicroMoney(_micros + other._micros);
+    return new _MicroMoney(_micros + (other * _multiplier));
+  }
+
+  _MicroMoney operator ~/(divisor) {
+    if (divisor is! int) {
+      throw new ArgumentError.value(
+          divisor, 'divisor', '_MicroMoney ~/ only supports int arguments.');
+    }
+    return new _MicroMoney((_integerPart ~/ divisor) * _multiplier);
+  }
+
+  _MicroMoney operator *(other) {
+    if (other is! int) {
+      throw new ArgumentError.value(
+          other, 'other', '_MicroMoney * only supports int arguments.');
+    }
+    return new _MicroMoney(
+        (_integerPart * other) * _multiplier + (_fractionPart * other));
+  }
+
+  /// Note that this only really supports remainder from an int,
+  /// not division by another MicroMoney
+  _MicroMoney remainder(other) {
+    if (other is! int) {
+      throw new ArgumentError.value(
+          other, 'other', '_MicroMoney.remainder only supports int arguments.');
+    }
+    return new _MicroMoney(_micros.remainder(other * _multiplier));
+  }
+
+  double toDouble() => _micros.toDouble() / _multiplier;
+
+  int toInt() => _integerPart.toInt();
+
+  String toString() {
+    var beforeDecimal = _integerPart.toString();
+    var decimalPart = '';
+    var fractionPart = _fractionPart;
+    if (fractionPart != 0) {
+      decimalPart = '.' + fractionPart.toString();
+    }
+    return '$beforeDecimal$decimalPart';
+  }
+}
diff --git a/packages/intl/lib/src/intl_helpers.dart b/packages/intl/lib/src/intl_helpers.dart
index f88ff8e..a54609a 100644
--- a/packages/intl/lib/src/intl_helpers.dart
+++ b/packages/intl/lib/src/intl_helpers.dart
@@ -2,33 +2,68 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * A library for general helper code associated with the intl library
- * rather than confined to specific parts of it.
- */
+/// A library for general helper code associated with the intl library
+/// rather than confined to specific parts of it.
 
 library intl_helpers;
 
 import 'dart:async';
+import 'package:intl/intl.dart';
 
-/**
- * This is used as a marker for a locale data map that hasn't been initialized,
- * and will throw an exception on any usage that isn't the fallback
- * patterns/symbols provided.
- */
-class UninitializedLocaleData<F> {
+/// Type for the callback action when a message translation is not found.
+typedef MessageIfAbsent(String message_str, List args);
+
+/// This is used as a marker for a locale data map that hasn't been initialized,
+/// and will throw an exception on any usage that isn't the fallback
+/// patterns/symbols provided.
+class UninitializedLocaleData<F> implements MessageLookup {
   final String message;
   final F fallbackData;
-  const UninitializedLocaleData(this.message, this.fallbackData);
+  UninitializedLocaleData(this.message, this.fallbackData);
 
   operator [](String key) =>
       (key == 'en_US') ? fallbackData : _throwException();
 
-  String lookupMessage(String message_str, [final String desc = '',
-      final Map examples = const {}, String locale, String name,
-      List<String> args, String meaning]) => message_str;
+  /// If a message is looked up before any locale initialization, record it,
+  /// and throw an exception with that information once the locale is
+  /// initialized.
+  ///
+  /// Set this during development to find issues with race conditions between
+  /// message caching and locale initialization. If the results of Intl.message
+  /// calls aren't being cached, then this won't help.
+  ///
+  /// There's nothing that actually sets this, so checking this requires
+  /// patching the code here.
+  static final bool throwOnFallback = false;
 
-  List get keys => _throwException();
+  /// The messages that were called before the locale was initialized.
+  List<String> _badMessages = [];
+
+  void _reportErrors() {
+    if (throwOnFallback && _badMessages.length > 0) {
+      throw new StateError(
+          "The following messages were called before locale initialization:"
+          " $_uninitializedMessages");
+    }
+  }
+
+  String get _uninitializedMessages =>
+      (_badMessages.toSet().toList()..sort()).join("\n    ");
+
+  String lookupMessage(
+      String message_str, String locale, String name, List args, String meaning,
+      {MessageIfAbsent ifAbsent}) {
+    if (throwOnFallback) {
+      _badMessages.add(name ?? message_str);
+    }
+    return message_str;
+  }
+
+  /// Given an initial locale or null, returns the locale that will be used
+  /// for messages.
+  String findLocale(String locale) => locale ?? Intl.getCurrentLocale();
+
+  List<String> get keys => _throwException() as List<String>;
 
   bool containsKey(String key) => (key == 'en_US') ? true : _throwException();
 
@@ -36,6 +71,15 @@
     throw new LocaleDataException("Locale data has not been initialized"
         ", call $message.");
   }
+
+  void addLocale(String localeName, Function findLocale) => _throwException();
+}
+
+abstract class MessageLookup {
+  String lookupMessage(
+      String message_str, String locale, String name, List args, String meaning,
+      {MessageIfAbsent ifAbsent});
+  void addLocale(String localeName, Function findLocale);
 }
 
 class LocaleDataException implements Exception {
@@ -44,28 +88,32 @@
   toString() => "LocaleDataException: $message";
 }
 
-/**
- *  An abstract superclass for data readers to keep the type system happy.
- */
+///  An abstract superclass for data readers to keep the type system happy.
 abstract class LocaleDataReader {
   Future read(String locale);
 }
 
-/**
- * The internal mechanism for looking up messages. We expect this to be set
- * by the implementing package so that we're not dependent on its
- * implementation.
- */
-var messageLookup =
-    const UninitializedLocaleData('initializeMessages(<locale>)', null);
+/// The internal mechanism for looking up messages. We expect this to be set
+/// by the implementing package so that we're not dependent on its
+/// implementation.
+MessageLookup messageLookup =
+    new UninitializedLocaleData('initializeMessages(<locale>)', null);
 
-/**
- * Initialize the message lookup mechanism. This is for internal use only.
- * User applications should import `message_lookup_by_library.dart` and call
- * `initializeMessages`
- */
+/// Initialize the message lookup mechanism. This is for internal use only.
+/// User applications should import `message_lookup_by_library.dart` and call
+/// `initializeMessages`
 void initializeInternalMessageLookup(Function lookupFunction) {
   if (messageLookup is UninitializedLocaleData) {
+    // This line has to be precisely this way to work around an analyzer crash.
+    (messageLookup as UninitializedLocaleData)._reportErrors();
     messageLookup = lookupFunction();
   }
 }
+
+/// If a message is a string literal without interpolation, compute
+/// a name based on that and the meaning, if present.
+// NOTE: THIS LOGIC IS DUPLICATED IN intl_translation AND THE TWO MUST MATCH.
+String computeMessageName(String name, String text, String meaning) {
+  if (name != null && name != "") return name;
+  return meaning == null ? text : "${text}_${meaning}";
+}
diff --git a/packages/intl/lib/src/intl_message.dart b/packages/intl/lib/src/intl_message.dart
deleted file mode 100644
index 3df4a61..0000000
--- a/packages/intl/lib/src/intl_message.dart
+++ /dev/null
@@ -1,767 +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.
-
-/**
- * This provides classes to represent the internal structure of the
- * arguments to `Intl.message`. It is used when parsing sources to extract
- * messages or to generate code for message substitution. Normal programs
- * using Intl would not import this library.
- *
- * While it's written
- * in a somewhat abstract way, it has some assumptions about ICU-style
- * message syntax for parameter substitutions, choices, selects, etc.
- *
- * For example, if we have the message
- *      plurals(num) => Intl.message("""${Intl.plural(num,
- *          zero : 'Is zero plural?',
- *          one : 'This is singular.',
- *          other : 'This is plural ($num).')
- *         }""",
- *         name: "plurals", args: [num], desc: "Basic plurals");
- * That is represented as a MainMessage which has only one message component, a
- * Plural, but also has a name, list of arguments, and a description.
- * The Plural has three different clauses. The `zero` clause is
- * a LiteralString containing 'Is zero plural?'. The `other` clause is a
- * CompositeMessage containing three pieces, a LiteralString for
- * 'This is plural (', a VariableSubstitution for `num`. amd a LiteralString
- * for '.)'.
- *
- * This representation isn't used at runtime. Rather, we read some format
- * from a translation file, parse it into these objects, and they are then
- * used to generate the code representation above.
- */
-library intl_message;
-
-import 'package:analyzer/analyzer.dart';
-
-/** A default function for the [Message.expanded] method. */
-_nullTransform(msg, chunk) => chunk;
-
-/**
- * An abstract superclass for Intl.message/plural/gender calls in the
- * program's source text. We
- * assemble these into objects that can be used to write out some translation
- * format and can also print themselves into code.
- */
-abstract class Message {
-
-  /**
-   * All [Message]s except a [MainMessage] are contained inside some parent,
-   * terminating at an Intl.message call which supplies the arguments we
-   * use for variable substitutions.
-   */
-  Message parent;
-
-  Message(this.parent);
-
-  /**
-   * We find the arguments from the top-level [MainMessage] and use those to
-   * do variable substitutions. [MainMessage] overrides this to return
-   * the actual arguments.
-   */
-  get arguments => parent == null ? const [] : parent.arguments;
-
-  /**
-   * We find the examples from the top-level [MainMessage] and use those
-   * when writing out variables. [MainMessage] overrides this to return
-   * the actual examples.
-   */
-  get examples => parent == null ? const [] : parent.examples;
-
-  /**
-   * The name of the top-level [MainMessage].
-   */
-  String get name => parent == null ? '<unnamed>' : parent.name;
-
-  String checkValidity(MethodInvocation node, List arguments, String outerName,
-      FormalParameterList outerArgs) {
-    var hasArgs = arguments.any(
-        (each) => each is NamedExpression && each.name.label.name == 'args');
-    var hasParameters = !outerArgs.parameters.isEmpty;
-    if (!hasArgs && hasParameters) {
-      return "The 'args' argument for Intl.message must be specified";
-    }
-
-    var messageName = arguments.firstWhere((eachArg) =>
-            eachArg is NamedExpression && eachArg.name.label.name == 'name',
-        orElse: () => null);
-    if (messageName == null) {
-      return "The 'name' argument for Intl.message must be specified";
-    }
-    if (messageName.expression is! SimpleStringLiteral) {
-      return "The 'name' argument for Intl.message must be a simple string "
-          "literal.";
-    }
-    var hasOuterName = outerName != null;
-    var givenName = messageName.expression.value;
-    var simpleMatch = outerName == givenName;
-    ClassDeclaration classNode(n) {
-      if (n == null) return null;
-      if (n is ClassDeclaration) return n;
-      return classNode(n.parent);
-    }
-    var classDeclaration = classNode(node);
-    var classPlusMethod = classDeclaration == null
-        ? null
-        : "${classDeclaration.name.token.toString()}_$outerName";
-    var classMatch = classPlusMethod != null && (givenName == classPlusMethod);
-    if (!(hasOuterName && (simpleMatch || classMatch))) {
-      return "The 'name' argument for Intl.message must match either"
-          "the name of the containing function or <className>_<methodName> ("
-          "'$givenName' vs. '$outerName')";
-    }
-    var simpleArguments = arguments.where((each) => each is NamedExpression &&
-        ["desc", "name"].contains(each.name.label.name));
-    var values = simpleArguments.map((each) => each.expression).toList();
-    for (var arg in values) {
-      if (arg is! StringLiteral) {
-        return ("Intl.message arguments must be string literals: $arg");
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Turn a value, typically read from a translation file or created out of an
-   * AST for a source program, into the appropriate
-   * subclass. We expect to get literal Strings, variable substitutions
-   * represented by integers, things that are already MessageChunks and
-   * lists of the same.
-   */
-  static Message from(value, Message parent) {
-    if (value is String) return new LiteralString(value, parent);
-    if (value is int) return new VariableSubstitution(value, parent);
-    if (value is Iterable) {
-      if (value.length == 1) return Message.from(value[0], parent);
-      var result = new CompositeMessage([], parent);
-      var items = value.map((x) => from(x, result)).toList();
-      result.pieces.addAll(items);
-      return result;
-    }
-    // We assume this is already a Message.
-    value.parent = parent;
-    return value;
-  }
-
-  /**
-   * Return a string representation of this message for use in generated Dart
-   * code.
-   */
-  String toCode();
-
-  /**
-   * Escape the string for use in generated Dart code and validate that it
-   * doesn't  doesn't contain any illegal interpolations. We only allow
-   * simple variables ("$foo", but not "${foo}") and Intl.gender/plural
-   * calls.
-   */
-  String escapeAndValidateString(String value) {
-    const escapes = const {
-      r"\": r"\\",
-      '"': r'\"',
-      "\b": r"\b",
-      "\f": r"\f",
-      "\n": r"\n",
-      "\r": r"\r",
-      "\t": r"\t",
-      "\v": r"\v",
-      "'": r"\'",
-    };
-
-    _escape(String s) => (escapes[s] == null) ? s : escapes[s];
-
-    var escaped = value.splitMapJoin("", onNonMatch: _escape);
-
-    // We don't allow any ${} expressions, only $variable to avoid malicious
-    // code. Disallow any usage of "${". If that makes a false positive
-    // on a translation that legitimately contains "\\${" or other variations,
-    // we'll live with that rather than risk a false negative.
-    var validInterpolations = new RegExp(r"(\$\w+)|(\${\w+})");
-    var validMatches = validInterpolations.allMatches(escaped);
-    escapeInvalidMatches(Match m) {
-      var valid = validMatches.any((x) => x.start == m.start);
-      if (valid) {
-        return m.group(0);
-      } else {
-        return "\\${m.group(0)}";
-      }
-    }
-    return escaped.replaceAllMapped("\$", escapeInvalidMatches);
-  }
-
-  /**
-   * Expand this string out into a printed form. The function [f] will be
-   * applied to any sub-messages, allowing this to be used to generate a form
-   * suitable for a wide variety of translation file formats.
-   */
-  String expanded([Function f]);
-}
-
-/**
- * Abstract class for messages with internal structure, representing the
- * main Intl.message call, plurals, and genders.
- */
-abstract class ComplexMessage extends Message {
-  ComplexMessage(parent) : super(parent);
-
-  /**
-   * When we create these from strings or from AST nodes, we want to look up and
-   * set their attributes by string names, so we override the indexing operators
-   * so that they behave like maps with respect to those attribute names.
-   */
-  operator [](x);
-
-  /**
-   * When we create these from strings or from AST nodes, we want to look up and
-   * set their attributes by string names, so we override the indexing operators
-   * so that they behave like maps with respect to those attribute names.
-   */
-  operator []=(x, y);
-
-  List<String> get attributeNames;
-
-  /**
-   * Return the name of the message type, as it will be generated into an
-   * ICU-type format. e.g. choice, select
-   */
-  String get icuMessageName;
-
-  /**
-   * Return the message name we would use for this when doing Dart code
-   * generation, e.g. "Intl.plural".
-   */
-  String get dartMessageName;
-}
-
-/**
- * This represents a message chunk that is a list of multiple sub-pieces,
- * each of which is in turn a [Message].
- */
-class CompositeMessage extends Message {
-  List<Message> pieces;
-
-  CompositeMessage.withParent(parent) : super(parent);
-  CompositeMessage(this.pieces, ComplexMessage parent) : super(parent) {
-    pieces.forEach((x) => x.parent = this);
-  }
-  toCode() => pieces.map((each) => each.toCode()).join('');
-  toString() => "CompositeMessage(" + pieces.toString() + ")";
-  String expanded([Function f = _nullTransform]) =>
-      pieces.map((chunk) => f(this, chunk)).join("");
-}
-
-/** Represents a simple constant string with no dynamic elements. */
-class LiteralString extends Message {
-  String string;
-  LiteralString(this.string, Message parent) : super(parent);
-  toCode() => escapeAndValidateString(string);
-  toString() => "Literal($string)";
-  String expanded([Function f = _nullTransform]) => f(this, string);
-}
-
-/**
- * Represents an interpolation of a variable value in a message. We expect
- * this to be specified as an [index] into the list of variables, or else
- * as the name of a variable that exists in [arguments] and we will
- * compute the variable name or the index based on the value of the other.
- */
-class VariableSubstitution extends Message {
-  VariableSubstitution(this._index, Message parent) : super(parent);
-
-  /**
-   * Create a substitution based on the name rather than the index. The name
-   * may have been used as all upper-case in the translation tool, so we
-   * save it separately and look it up case-insensitively once the parent
-   * (and its arguments) are definitely available.
-   */
-  VariableSubstitution.named(String name, Message parent) : super(parent) {
-    _variableNameUpper = name.toUpperCase();
-  }
-
-  /** The index in the list of parameters of the containing function. */
-  int _index;
-  int get index {
-    if (_index != null) return _index;
-    if (arguments.isEmpty) return null;
-    // We may have been given an all-uppercase version of the name, so compare
-    // case-insensitive.
-    _index = arguments
-        .map((x) => x.toUpperCase())
-        .toList()
-        .indexOf(_variableNameUpper);
-    if (_index == -1) {
-      throw new ArgumentError(
-          "Cannot find parameter named '$_variableNameUpper' in "
-          "message named '$name'. Available "
-          "parameters are $arguments");
-    }
-    return _index;
-  }
-
-  /**
-   * The variable name we get from parsing. This may be an all uppercase version
-   * of the Dart argument name.
-   */
-  String _variableNameUpper;
-
-  /**
-   * The name of the variable in the parameter list of the containing function.
-   * Used when generating code for the interpolation.
-   */
-  String get variableName =>
-      _variableName == null ? _variableName = arguments[index] : _variableName;
-  String _variableName;
-  // Although we only allow simple variable references, we always enclose them
-  // in curly braces so that there's no possibility of ambiguity with
-  // surrounding text.
-  toCode() => "\${${variableName}}";
-  toString() => "VariableSubstitution($index)";
-  String expanded([Function f = _nullTransform]) => f(this, index);
-}
-
-class MainMessage extends ComplexMessage {
-  MainMessage() : super(null);
-
-  /**
-   * All the pieces of the message. When we go to print, these will
-   * all be expanded appropriately. The exact form depends on what we're
-   * printing it for See [expanded], [toCode].
-   */
-  List<Message> messagePieces = [];
-
-  /** Verify that this looks like a correct Intl.message invocation. */
-  String checkValidity(MethodInvocation node, List arguments, String outerName,
-      FormalParameterList outerArgs) {
-    if (arguments.first is! StringLiteral) {
-      return "Intl.message messages must be string literals";
-    }
-
-    return super.checkValidity(node, arguments, outerName, outerArgs);
-  }
-
-  void addPieces(List<Message> messages) {
-    for (var each in messages) {
-      messagePieces.add(Message.from(each, this));
-    }
-  }
-
-  /** The description provided in the Intl.message call. */
-  String description;
-
-  /** The examples from the Intl.message call */
-  Map<String, dynamic> examples;
-
-  /**
-   * A field to disambiguate two messages that might have exactly the
-   * same text. The two messages will also need different names, but
-   * this can be used by machine translation tools to distinguish them.
-   */
-  String meaning;
-
-  /**
-   * The name, which may come from the function name, from the arguments
-   * to Intl.message, or we may just re-use the message.
-   */
-  String _name;
-
-  /**
-   * A placeholder for any other identifier that the translation format
-   * may want to use.
-   */
-  String id;
-
-  /** The arguments list from the Intl.message call. */
-  List arguments;
-
-  /**
-   * When generating code, we store translations for each locale
-   * associated with the original message.
-   */
-  Map<String, String> translations = new Map();
-
-  /**
-   * If the message was not given a name, we use the entire message string as
-   * the name.
-   */
-  String get name => _name == null ? computeName() : _name;
-  set name(String newName) {
-    _name = newName;
-  }
-
-  String computeName() => name = expanded((msg, chunk) => "");
-
-  /**
-   * Return the full message, with any interpolation expressions transformed
-   * by [f] and all the results concatenated. The chunk argument to [f] may be
-   * either a String, an int or an object representing a more complex
-   * message entity.
-   * See [messagePieces].
-   */
-  String expanded([Function f = _nullTransform]) =>
-      messagePieces.map((chunk) => f(this, chunk)).join("");
-
-  /**
-   * Record the translation for this message in the given locale, after
-   * suitably escaping it.
-   */
-  void addTranslation(String locale, Message translated) {
-    translated.parent = this;
-    translations[locale] = translated.toCode();
-  }
-
-  toCode() =>
-      throw new UnsupportedError("MainMessage.toCode requires a locale");
-
-  /**
-   * Generate code for this message, expecting it to be part of a map
-   * keyed by name with values the function that calls Intl.message.
-   */
-  String toCodeForLocale(String locale) {
-    var out = new StringBuffer()
-      ..write('static $name(')
-      ..write(arguments.join(", "))
-      ..write(') => "')
-      ..write(translations[locale])
-      ..write('";');
-    return out.toString();
-  }
-
-  /**
-   * The AST node will have the attribute names as strings, so we translate
-   * between those and the fields of the class.
-   */
-  void operator []=(attributeName, value) {
-    switch (attributeName) {
-      case "desc":
-        description = value;
-        return;
-      case "examples":
-        examples = value;
-        return;
-      case "name":
-        name = value;
-        return;
-      // We use the actual args from the parser rather than what's given in the
-      // arguments to Intl.message.
-      case "args":
-        return;
-      case "meaning":
-        meaning = value;
-        return;
-      default:
-        return;
-    }
-  }
-
-  /**
-   * The AST node will have the attribute names as strings, so we translate
-   * between those and the fields of the class.
-   */
-  operator [](attributeName) {
-    switch (attributeName) {
-      case "desc":
-        return description;
-      case "examples":
-        return examples;
-      case "name":
-        return name;
-      // We use the actual args from the parser rather than what's given in the
-      // arguments to Intl.message.
-      case "args":
-        return [];
-      case "meaning":
-        return meaning;
-      default:
-        return null;
-    }
-  }
-
-  // This is the top-level construct, so there's no meaningful ICU name.
-  get icuMessageName => '';
-
-  get dartMessageName => "message";
-
-  /** The parameters that the Intl.message call may provide. */
-  get attributeNames => const ["name", "desc", "examples", "args", "meaning"];
-
-  String toString() =>
-      "Intl.message(${expanded()}, $name, $description, $examples, $arguments)";
-}
-
-/**
- * An abstract class to represent sub-sections of a message, primarily
- * plurals and genders.
- */
-abstract class SubMessage extends ComplexMessage {
-  SubMessage() : super(null);
-
-  /**
-   * Creates the sub-message, given a list of [clauses] in the sort of form
-   * that we're likely to get them from parsing a translation file format,
-   * as a list of [key, value] where value may in turn be a list.
-   */
-  SubMessage.from(this.mainArgument, List clauses, parent) : super(parent) {
-    for (var clause in clauses) {
-      this[clause.first] = (clause.last is List) ? clause.last : [clause.last];
-    }
-  }
-
-  toString() => expanded();
-
-  /**
-   * The name of the main argument, which is expected to have the value
-   * which is one of [attributeNames] and is used to decide which clause to use.
-   */
-  String mainArgument;
-
-  /**
-   * Return the arguments that affect this SubMessage as a map of
-   * argument names and values.
-   */
-  Map argumentsOfInterestFor(MethodInvocation node) {
-    var basicArguments = node.argumentList.arguments;
-    var others = basicArguments.where((each) => each is NamedExpression);
-    return new Map.fromIterable(others,
-        key: (node) => node.name.label.token.value(),
-        value: (node) => node.expression);
-  }
-
-  /**
-   * Return the list of attribute names to use when generating code. This
-   *  may be different from [attributeNames] if there are multiple aliases
-   *  that map to the same clause.
-   */
-  List<String> get codeAttributeNames;
-
-  String expanded([Function transform = _nullTransform]) {
-    fullMessageForClause(key) =>
-        key + '{' + transform(parent, this[key]).toString() + '}';
-    var clauses = attributeNames
-        .where((key) => this[key] != null)
-        .map(fullMessageForClause)
-        .toList();
-    return "{$mainArgument,$icuMessageName, ${clauses.join("")}}";
-  }
-
-  String toCode() {
-    var out = new StringBuffer();
-    out.write('\${');
-    out.write(dartMessageName);
-    out.write('(');
-    out.write(mainArgument);
-    var args = codeAttributeNames.where((attribute) => this[attribute] != null);
-    args.fold(
-        out, (buffer, arg) => buffer..write(", $arg: '${this[arg].toCode()}'"));
-    out.write(")}");
-    return out.toString();
-  }
-}
-
-/**
- * Represents a message send of [Intl.gender] inside a message that is to
- * be internationalized. This corresponds to an ICU message syntax "select"
- * with "male", "female", and "other" as the possible options.
- */
-class Gender extends SubMessage {
-  Gender();
-  /**
-   * Create a new Gender providing [mainArgument] and the list of possible
-   * clauses. Each clause is expected to be a list whose first element is a
-   * variable name and whose second element is either a [String] or
-   * a list of strings and [Message] or [VariableSubstitution].
-   */
-  Gender.from(String mainArgument, List clauses, Message parent)
-      : super.from(mainArgument, clauses, parent);
-
-  Message female;
-  Message male;
-  Message other;
-
-  String get icuMessageName => "select";
-  String get dartMessageName => 'Intl.gender';
-
-  get attributeNames => ["female", "male", "other"];
-  get codeAttributeNames => attributeNames;
-
-  /**
-   * The node will have the attribute names as strings, so we translate
-   * between those and the fields of the class.
-   */
-  void operator []=(attributeName, rawValue) {
-    var value = Message.from(rawValue, this);
-    switch (attributeName) {
-      case "female":
-        female = value;
-        return;
-      case "male":
-        male = value;
-        return;
-      case "other":
-        other = value;
-        return;
-      default:
-        return;
-    }
-  }
-  Message operator [](String attributeName) {
-    switch (attributeName) {
-      case "female":
-        return female;
-      case "male":
-        return male;
-      case "other":
-        return other;
-      default:
-        return other;
-    }
-  }
-}
-
-class Plural extends SubMessage {
-  Plural();
-  Plural.from(String mainArgument, List clauses, Message parent)
-      : super.from(mainArgument, clauses, parent);
-
-  Message zero;
-  Message one;
-  Message two;
-  Message few;
-  Message many;
-  Message other;
-
-  String get icuMessageName => "plural";
-  String get dartMessageName => "Intl.plural";
-
-  get attributeNames => ["=0", "=1", "=2", "few", "many", "other"];
-  get codeAttributeNames => ["zero", "one", "two", "few", "many", "other"];
-
-  /**
-    * The node will have the attribute names as strings, so we translate
-    * between those and the fields of the class.
-    */
-  void operator []=(String attributeName, rawValue) {
-    var value = Message.from(rawValue, this);
-    switch (attributeName) {
-      case "zero":
-        zero = value;
-        return;
-      case "=0":
-        zero = value;
-        return;
-      case "one":
-        one = value;
-        return;
-      case "=1":
-        one = value;
-        return;
-      case "two":
-        two = value;
-        return;
-      case "=2":
-        two = value;
-        return;
-      case "few":
-        few = value;
-        return;
-      case "many":
-        many = value;
-        return;
-      case "other":
-        other = value;
-        return;
-      default:
-        return;
-    }
-  }
-
-  Message operator [](String attributeName) {
-    switch (attributeName) {
-      case "zero":
-        return zero;
-      case "=0":
-        return zero;
-      case "one":
-        return one;
-      case "=1":
-        return one;
-      case "two":
-        return two;
-      case "=2":
-        return two;
-      case "few":
-        return few;
-      case "many":
-        return many;
-      case "other":
-        return other;
-      default:
-        return other;
-    }
-  }
-}
-
-/**
- * Represents a message send of [Intl.select] inside a message that is to
- * be internationalized. This corresponds to an ICU message syntax "select"
- * with arbitrary options.
- */
-class Select extends SubMessage {
-  Select();
-  /**
-   * Create a new [Select] providing [mainArgument] and the list of possible
-   * clauses. Each clause is expected to be a list whose first element is a
-   * variable name and whose second element is either a String or
-   * a list of strings and [Message]s or [VariableSubstitution]s.
-   */
-  Select.from(String mainArgument, List clauses, Message parent)
-      : super.from(mainArgument, clauses, parent);
-
-  Map<String, Message> cases = new Map<String, Message>();
-
-  String get icuMessageName => "select";
-  String get dartMessageName => 'Intl.select';
-
-  get attributeNames => cases.keys;
-  get codeAttributeNames => attributeNames;
-
-  void operator []=(attributeName, rawValue) {
-    var value = Message.from(rawValue, this);
-    cases[attributeName] = value;
-  }
-
-  Message operator [](String attributeName) {
-    var exact = cases[attributeName];
-    return exact == null ? cases["other"] : exact;
-  }
-
-  /**
-   * Return the arguments that we care about for the select. In this
-   * case they will all be passed in as a Map rather than as the named
-   * arguments used in Plural/Gender.
-   */
-  Map argumentsOfInterestFor(MethodInvocation node) {
-    var casesArgument = node.argumentList.arguments[1];
-    return new Map.fromIterable(casesArgument.entries,
-        key: (node) => node.key.value, value: (node) => node.value);
-  }
-
-  /**
-   * Write out the generated representation of this message. This differs
-   * from Plural/Gender in that it prints a literal map rather than
-   * named arguments.
-   */
-  String toCode() {
-    var out = new StringBuffer();
-    out.write('\${');
-    out.write(dartMessageName);
-    out.write('(');
-    out.write(mainArgument);
-    var args = codeAttributeNames;
-    out.write(", {");
-    args.fold(out,
-        (buffer, arg) => buffer..write("'$arg': '${this[arg].toCode()}', "));
-    out.write("})}");
-    return out.toString();
-  }
-}
diff --git a/packages/intl/lib/src/lazy_locale_data.dart b/packages/intl/lib/src/lazy_locale_data.dart
index 9be1c0d..07d46f7 100644
--- a/packages/intl/lib/src/lazy_locale_data.dart
+++ b/packages/intl/lib/src/lazy_locale_data.dart
@@ -2,11 +2,9 @@
 // for 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 defines a class for loading locale data incrementally from
- * an external source as JSON. The external sources expected are either
- * local files or via HTTP request.
- */
+/// This defines a class for loading locale data incrementally from
+/// an external source as JSON. The external sources expected are either
+/// local files or via HTTP request.
 
 library lazy_locale_data;
 
@@ -14,11 +12,9 @@
 import 'dart:convert';
 import 'intl_helpers.dart';
 
-/**
- * This implements the very basic map-type operations which are used
- * in locale lookup, and looks them up based on a URL that defines
- * the external source.
- */
+/// This implements the very basic map-type operations which are used
+/// in locale lookup, and looks them up based on a URL that defines
+/// the external source.
 class LazyLocaleData {
   /// This holds the data we have loaded.
   Map map;
@@ -26,52 +22,41 @@
   /// The object that actually does the data reading.
   LocaleDataReader _reader;
 
-  /**
-   * In order to avoid a potentially remote call to see if a locale
-   * is available, we hold a complete list of all the available
-   * locales.
-   */
+  /// In order to avoid a potentially remote call to see if a locale
+  /// is available, we hold a complete list of all the available
+  /// locales.
   List availableLocales;
 
-  /**
-   * Given a piece of remote data, apply [_creationFunction] to it to
-   * convert it into the right form. Typically this means converting it
-   * from a Map into an object form.
-   */
+  /// Given a piece of remote data, apply [_creationFunction] to it to
+  /// convert it into the right form. Typically this means converting it
+  /// from a Map into an object form.
   Function _creationFunction;
 
-  /**
-   * The set of available locales.
-   */
+  /// The set of available locales.
   Set availableLocaleSet;
 
-  /**
-   * The constructor. The [_reader] specifies where the data comes
-   * from. The [_creationFunction] creates the appropriate data type
-   * from the remote data (which typically comes in as a Map). The
-   * [keys] lists the set of remotely available locale names so we know which
-   * things can be fetched without having to check remotely.
-   */
+  /// The constructor. The [_reader] specifies where the data comes
+  /// from. The [_creationFunction] creates the appropriate data type
+  /// from the remote data (which typically comes in as a Map). The
+  /// [keys] lists the set of remotely available locale names so we know which
+  /// things can be fetched without having to check remotely.
   LazyLocaleData(this._reader, this._creationFunction, List keys) {
     map = new Map();
     availableLocales = keys;
     availableLocaleSet = new Set.from(availableLocales);
   }
 
-  /**
-   *  Tests if we have data for the locale available. Note that this returns
-   * true even if the data is known to be available remotely but not yet loaded.
-   */
+  ///  Tests if we have data for the locale available. Note that this returns
+  /// true even if the data is known to be available remotely but not yet
+  /// loaded.
   bool containsKey(String locale) => availableLocaleSet.contains(locale);
 
-  /** Returns the list of keys/locale names. */
+  /// Returns the list of keys/locale names.
   List get keys => availableLocales;
 
-  /**
-   * Returns the data stored for [localeName]. If no data has been loaded
-   * for [localeName], throws an exception. If no data is available for
-   * [localeName] then throw an exception with a different message.
-   */
+  /// Returns the data stored for [localeName]. If no data has been loaded
+  /// for [localeName], throws an exception. If no data is available for
+  /// [localeName] then throw an exception with a different message.
   operator [](String localeName) {
     if (containsKey(localeName)) {
       var data = map[localeName];
@@ -87,18 +72,14 @@
     }
   }
 
-  /**
-   * Throw an exception indicating that the locale has no data available,
-   * either locally or remotely.
-   */
+  /// Throw an exception indicating that the locale has no data available,
+  /// either locally or remotely.
   unsupportedLocale(localeName) {
     throw new LocaleDataException('Locale $localeName has no data available');
   }
 
-  /**
-   * Initialize for locale. Internal use only. As a user, call
-   * initializeDateFormatting instead.
-   */
+  /// Initialize for locale. Internal use only. As a user, call
+  /// initializeDateFormatting instead.
   Future initLocale(String localeName) {
     var data = _reader.read(localeName);
     return jsonData(data).then((input) {
@@ -106,10 +87,8 @@
     });
   }
 
-  /**
-   * Given a Future [input] whose value is expected to be a string in JSON form,
-   * return another future that parses the JSON into a usable format.
-   */
+  /// Given a Future [input] whose value is expected to be a string in JSON
+  /// form, return another future that parses the JSON into a usable format.
   Future jsonData(Future input) {
     return input.then((response) => JSON.decode(response));
   }
diff --git a/packages/intl/lib/src/plural_rules.dart b/packages/intl/lib/src/plural_rules.dart
new file mode 100644
index 0000000..d6174f3
--- /dev/null
+++ b/packages/intl/lib/src/plural_rules.dart
@@ -0,0 +1,498 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Provides locale-specific plural rules. Based on pluralrules.js from Closure.
+///
+/// Each function does the calculation for one or more locales. These are done in terms of
+/// various values used by the CLDR syntax and defined by UTS #35
+/// http://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax
+///
+/// * n - absolute value of the source number (integer and decimals).
+/// * i	- integer digits of n.
+/// * v	- number of visible fraction digits in n, with trailing zeros.
+/// * w	- number of visible fraction digits in n, without trailing zeros.
+/// * f	- visible fractional digits in n, with trailing zeros.
+/// * t	- visible fractional digits in n, without trailing zeros.
+library plural_rules;
+
+typedef PluralCase PluralRule();
+
+/// The possible cases used in a plural rule.
+enum PluralCase { ZERO, ONE, TWO, FEW, MANY, OTHER }
+
+/// The default rule in case we don't have anything more specific for a locale.
+PluralCase _default_rule() => OTHER;
+
+/// This must be called before evaluating a new rule, because we're using
+/// library-global state to both keep the rules terse and minimize space.
+startRuleEvaluation(int howMany) {
+  _n = howMany;
+}
+
+/// The number whose [PluralCase] we are trying to find.
+///
+// This is library-global state, along with the other variables. This allows us
+// to avoid calculating parameters that the functions don't need and also
+// not introduce a subclass per locale or have instance tear-offs which
+// we can't cache. This is fine as long as these methods aren't async, which
+// they should never be.
+int _n;
+
+/// The integer part of [_n] - since we only support integers, it's the same as
+/// [_n].
+int get _i => _n;
+int opt_precision; // Not currently used.
+
+/// Number of visible fraction digits. Always zero since we only support int.
+int get _v => 0;
+
+/// Number of visible fraction digits without trailing zeros. Always zero
+/// since we only support int.
+//int get _w => 0;
+
+/// The visible fraction digits in n, with trailing zeros. Always zero since
+/// we only support int.
+int get _f => 0;
+
+/// The visible fraction digits in n, without trailing zeros. Always zero since
+/// we only support int.
+int get _t => 0;
+
+PluralCase get ZERO => PluralCase.ZERO;
+PluralCase get ONE => PluralCase.ONE;
+PluralCase get TWO => PluralCase.TWO;
+PluralCase get FEW => PluralCase.FEW;
+PluralCase get MANY => PluralCase.MANY;
+PluralCase get OTHER => PluralCase.OTHER;
+
+PluralCase _fil_rule() {
+  if (_v == 0 && (_i == 1 || _i == 2 || _i == 3) ||
+      _v == 0 && _i % 10 != 4 && _i % 10 != 6 && _i % 10 != 9 ||
+      _v != 0 && _f % 10 != 4 && _f % 10 != 6 && _f % 10 != 9) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _pt_PT_rule() {
+  if (_n == 1 && _v == 0) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _br_rule() {
+  if (_n % 10 == 1 && _n % 100 != 11 && _n % 100 != 71 && _n % 100 != 91) {
+    return ONE;
+  }
+  if (_n % 10 == 2 && _n % 100 != 12 && _n % 100 != 72 && _n % 100 != 92) {
+    return TWO;
+  }
+  if ((_n % 10 >= 3 && _n % 10 <= 4 || _n % 10 == 9) &&
+      (_n % 100 < 10 || _n % 100 > 19) &&
+      (_n % 100 < 70 || _n % 100 > 79) &&
+      (_n % 100 < 90 || _n % 100 > 99)) {
+    return FEW;
+  }
+  if (_n != 0 && _n % 1000000 == 0) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _sr_rule() {
+  if (_v == 0 && _i % 10 == 1 && _i % 100 != 11 ||
+      _f % 10 == 1 && _f % 100 != 11) {
+    return ONE;
+  }
+  if (_v == 0 &&
+          _i % 10 >= 2 &&
+          _i % 10 <= 4 &&
+          (_i % 100 < 12 || _i % 100 > 14) ||
+      _f % 10 >= 2 && _f % 10 <= 4 && (_f % 100 < 12 || _f % 100 > 14)) {
+    return FEW;
+  }
+  return OTHER;
+}
+
+PluralCase _ro_rule() {
+  if (_i == 1 && _v == 0) {
+    return ONE;
+  }
+  if (_v != 0 || _n == 0 || _n != 1 && _n % 100 >= 1 && _n % 100 <= 19) {
+    return FEW;
+  }
+  return OTHER;
+}
+
+PluralCase _hi_rule() {
+  if (_i == 0 || _n == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _fr_rule() {
+  if (_i == 0 || _i == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _cs_rule() {
+  if (_i == 1 && _v == 0) {
+    return ONE;
+  }
+  if (_i >= 2 && _i <= 4 && _v == 0) {
+    return FEW;
+  }
+  if (_v != 0) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _pl_rule() {
+  if (_i == 1 && _v == 0) {
+    return ONE;
+  }
+  if (_v == 0 &&
+      _i % 10 >= 2 &&
+      _i % 10 <= 4 &&
+      (_i % 100 < 12 || _i % 100 > 14)) {
+    return FEW;
+  }
+  if (_v == 0 && _i != 1 && _i % 10 >= 0 && _i % 10 <= 1 ||
+      _v == 0 && _i % 10 >= 5 && _i % 10 <= 9 ||
+      _v == 0 && _i % 100 >= 12 && _i % 100 <= 14) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _lv_rule() {
+  if (_n % 10 == 0 ||
+      _n % 100 >= 11 && _n % 100 <= 19 ||
+      _v == 2 && _f % 100 >= 11 && _f % 100 <= 19) {
+    return ZERO;
+  }
+  if (_n % 10 == 1 && _n % 100 != 11 ||
+      _v == 2 && _f % 10 == 1 && _f % 100 != 11 ||
+      _v != 2 && _f % 10 == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _he_rule() {
+  if (_i == 1 && _v == 0) {
+    return ONE;
+  }
+  if (_i == 2 && _v == 0) {
+    return TWO;
+  }
+  if (_v == 0 && (_n < 0 || _n > 10) && _n % 10 == 0) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _mt_rule() {
+  if (_n == 1) {
+    return ONE;
+  }
+  if (_n == 0 || _n % 100 >= 2 && _n % 100 <= 10) {
+    return FEW;
+  }
+  if (_n % 100 >= 11 && _n % 100 <= 19) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _si_rule() {
+  if ((_n == 0 || _n == 1) || _i == 0 && _f == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _cy_rule() {
+  if (_n == 0) {
+    return ZERO;
+  }
+  if (_n == 1) {
+    return ONE;
+  }
+  if (_n == 2) {
+    return TWO;
+  }
+  if (_n == 3) {
+    return FEW;
+  }
+  if (_n == 6) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _da_rule() {
+  if (_n == 1 || _t != 0 && (_i == 0 || _i == 1)) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _ru_rule() {
+  if (_v == 0 && _i % 10 == 1 && _i % 100 != 11) {
+    return ONE;
+  }
+  if (_v == 0 &&
+      _i % 10 >= 2 &&
+      _i % 10 <= 4 &&
+      (_i % 100 < 12 || _i % 100 > 14)) {
+    return FEW;
+  }
+  if (_v == 0 && _i % 10 == 0 ||
+      _v == 0 && _i % 10 >= 5 && _i % 10 <= 9 ||
+      _v == 0 && _i % 100 >= 11 && _i % 100 <= 14) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _be_rule() {
+  if (_n % 10 == 1 && _n % 100 != 11) {
+    return ONE;
+  }
+  if (_n % 10 >= 2 && _n % 10 <= 4 && (_n % 100 < 12 || _n % 100 > 14)) {
+    return FEW;
+  }
+  if (_n % 10 == 0 ||
+      _n % 10 >= 5 && _n % 10 <= 9 ||
+      _n % 100 >= 11 && _n % 100 <= 14) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _mk_rule() {
+  if (_v == 0 && _i % 10 == 1 || _f % 10 == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _ga_rule() {
+  if (_n == 1) {
+    return ONE;
+  }
+  if (_n == 2) {
+    return TWO;
+  }
+  if (_n >= 3 && _n <= 6) {
+    return FEW;
+  }
+  if (_n >= 7 && _n <= 10) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _pt_rule() {
+  if (_n >= 0 && _n <= 2 && _n != 2) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _es_rule() {
+  if (_n == 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _is_rule() {
+  if (_t == 0 && _i % 10 == 1 && _i % 100 != 11 || _t != 0) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _ar_rule() {
+  if (_n == 0) {
+    return ZERO;
+  }
+  if (_n == 1) {
+    return ONE;
+  }
+  if (_n == 2) {
+    return TWO;
+  }
+  if (_n % 100 >= 3 && _n % 100 <= 10) {
+    return FEW;
+  }
+  if (_n % 100 >= 11 && _n % 100 <= 99) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _sl_rule() {
+  if (_v == 0 && _i % 100 == 1) {
+    return ONE;
+  }
+  if (_v == 0 && _i % 100 == 2) {
+    return TWO;
+  }
+  if (_v == 0 && _i % 100 >= 3 && _i % 100 <= 4 || _v != 0) {
+    return FEW;
+  }
+  return OTHER;
+}
+
+PluralCase _lt_rule() {
+  if (_n % 10 == 1 && (_n % 100 < 11 || _n % 100 > 19)) {
+    return ONE;
+  }
+  if (_n % 10 >= 2 && _n % 10 <= 9 && (_n % 100 < 11 || _n % 100 > 19)) {
+    return FEW;
+  }
+  if (_f != 0) {
+    return MANY;
+  }
+  return OTHER;
+}
+
+PluralCase _en_rule() {
+  if (_i == 1 && _v == 0) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+PluralCase _ak_rule() {
+  if (_n >= 0 && _n <= 1) {
+    return ONE;
+  }
+  return OTHER;
+}
+
+/// Selected Plural rules by locale.
+final Map pluralRules = {
+  'af': _es_rule,
+  'am': _hi_rule,
+  'ar': _ar_rule,
+  'az': _es_rule,
+  'be': _be_rule,
+  'bg': _es_rule,
+  'bn': _hi_rule,
+  'br': _br_rule,
+  'bs': _sr_rule,
+  'ca': _en_rule,
+  'chr': _es_rule,
+  'cs': _cs_rule,
+  'cy': _cy_rule,
+  'da': _da_rule,
+  'de': _en_rule,
+  'de_AT': _en_rule,
+  'de_CH': _en_rule,
+  'el': _es_rule,
+  'en': _en_rule,
+  'en_AU': _en_rule,
+  'en_CA': _en_rule,
+  'en_GB': _en_rule,
+  'en_IE': _en_rule,
+  'en_IN': _en_rule,
+  'en_SG': _en_rule,
+  'en_US': _en_rule,
+  'en_ZA': _en_rule,
+  'es': _es_rule,
+  'es_419': _es_rule,
+  'es_ES': _es_rule,
+  'es_MX': _es_rule,
+  'es_US': _es_rule,
+  'et': _en_rule,
+  'eu': _es_rule,
+  'fa': _hi_rule,
+  'fi': _en_rule,
+  'fil': _fil_rule,
+  'fr': _fr_rule,
+  'fr_CA': _fr_rule,
+  'ga': _ga_rule,
+  'gl': _en_rule,
+  'gsw': _es_rule,
+  'gu': _hi_rule,
+  'haw': _es_rule,
+  'he': _he_rule,
+  'hi': _hi_rule,
+  'hr': _sr_rule,
+  'hu': _es_rule,
+  'hy': _fr_rule,
+  'id': _default_rule,
+  'in': _default_rule,
+  'is': _is_rule,
+  'it': _en_rule,
+  'iw': _he_rule,
+  'ja': _default_rule,
+  'ka': _es_rule,
+  'kk': _es_rule,
+  'km': _default_rule,
+  'kn': _hi_rule,
+  'ko': _default_rule,
+  'ky': _es_rule,
+  'ln': _ak_rule,
+  'lo': _default_rule,
+  'lt': _lt_rule,
+  'lv': _lv_rule,
+  'mk': _mk_rule,
+  'ml': _es_rule,
+  'mn': _es_rule,
+  'mo': _ro_rule,
+  'mr': _hi_rule,
+  'ms': _default_rule,
+  'mt': _mt_rule,
+  'my': _default_rule,
+  'nb': _es_rule,
+  'ne': _es_rule,
+  'nl': _en_rule,
+  'no': _es_rule,
+  'no_NO': _es_rule,
+  'or': _es_rule,
+  'pa': _ak_rule,
+  'pl': _pl_rule,
+  'pt': _pt_rule,
+  'pt_BR': _pt_rule,
+  'pt_PT': _pt_PT_rule,
+  'ro': _ro_rule,
+  'ru': _ru_rule,
+  'sh': _sr_rule,
+  'si': _si_rule,
+  'sk': _cs_rule,
+  'sl': _sl_rule,
+  'sq': _es_rule,
+  'sr': _sr_rule,
+  'sr_Latn': _sr_rule,
+  'sv': _en_rule,
+  'sw': _en_rule,
+  'ta': _es_rule,
+  'te': _es_rule,
+  'th': _default_rule,
+  'tl': _fil_rule,
+  'tr': _es_rule,
+  'uk': _ru_rule,
+  'ur': _en_rule,
+  'uz': _es_rule,
+  'vi': _default_rule,
+  'zh': _default_rule,
+  'zh_CN': _default_rule,
+  'zh_HK': _default_rule,
+  'zh_TW': _default_rule,
+  'zu': _hi_rule,
+  'default': _default_rule
+};
+
+/// Do we have plural rules specific to [locale]
+bool localeHasPluralRules(String locale) => pluralRules.containsKey(locale);
diff --git a/packages/intl/pubspec.yaml b/packages/intl/pubspec.yaml
index 33b6ac5..a4b3315 100644
--- a/packages/intl/pubspec.yaml
+++ b/packages/intl/pubspec.yaml
@@ -1,31 +1,19 @@
 name: intl
-version: 0.12.4+3
+version: 0.15.1
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: https://github.com/dart-lang/intl
 environment:
-  sdk: '>=1.4.0 <2.0.0'
+  sdk: '>=1.24.0 <2.0.0'
 documentation: http://www.dartdocs.org/documentation/intl/latest
 dependencies:
-  analyzer: '>=0.13.2 <0.28.0'
-  args: '>=0.12.1 <0.14.0'
   path: '>=0.9.0 <2.0.0'
-  petitparser: '>=1.1.3 <2.0.0'
 dev_dependencies:
   fixnum: '>=0.9.0 <0.11.0'
-  unittest: '>=0.10.0 <0.12.0'
+  test: '>=0.12.0 <0.13.0'
 transformers:
 - $dart2js:
     $exclude:
     - test/date_time_format_file_even_test.dart
     - test/date_time_format_file_odd_test.dart
     - test/find_default_locale_standalone_test.dart
-    - test/message_extraction/embedded_plural_text_after_test.dart
-    - test/message_extraction/embedded_plural_text_before_test.dart
-    - test/message_extraction/examples_parsing_test.dart
-    - test/message_extraction/failed_extraction_test.dart
-    - test/message_extraction/make_hardcoded_translation.dart
-    - test/message_extraction/message_extraction_no_deferred_test.dart
-    - test/message_extraction/message_extraction_test.dart
-    - test/message_extraction/really_fail_extraction_test.dart
-    - test/intl_message_basic_example_test.dart # invalid import under pub's package-layout
diff --git a/packages/intl/test/bidi_format_test.dart b/packages/intl/test/bidi_format_test.dart
index 1656411..2421c85 100644
--- a/packages/intl/test/bidi_format_test.dart
+++ b/packages/intl/test/bidi_format_test.dart
@@ -5,11 +5,9 @@
 library bidi_format_test;
 
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
-/**
- * Tests the bidirectional text formatting library.
- */
+/// Tests the bidirectional text formatting library.
 main() {
   var LTR = TextDirection.LTR;
   var RTL = TextDirection.RTL;
diff --git a/packages/intl/test/bidi_utils_test.dart b/packages/intl/test/bidi_utils_test.dart
index b5b4fe5..a6f0832 100644
--- a/packages/intl/test/bidi_utils_test.dart
+++ b/packages/intl/test/bidi_utils_test.dart
@@ -5,11 +5,9 @@
 library bidi_utils_test;
 
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
-/**
- * Tests the bidi utilities library.
- */
+/// Tests the bidi utilities library.
 main() {
   var LRE = '\u202A';
   var RLE = '\u202B';
@@ -33,6 +31,15 @@
     expect(Bidi.isRtlLanguage('az-Arab'), isTrue);
     expect(Bidi.isRtlLanguage('az-ARAB-IR'), isTrue);
     expect(Bidi.isRtlLanguage('az_arab_IR'), isTrue);
+    Intl.withLocale('en_US', () {
+      expect(Bidi.isRtlLanguage(), isFalse);
+    });
+    Intl.withLocale('ar', () {
+      expect(Bidi.isRtlLanguage(), isTrue);
+    });
+    Intl.withLocale(null, () {
+      expect(Bidi.isRtlLanguage(), Bidi.isRtlLanguage(Intl.systemLocale));
+    });
   });
 
   test('hasAnyLtr', () {
@@ -192,67 +199,116 @@
         equals(TextDirection.LTR.value));
     expect(Bidi.estimateDirectionOfText('http://foo/bar/', isHtml: false).value,
         equals(TextDirection.LTR.value));
-    expect(Bidi.estimateDirectionOfText(
-            'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
-            '\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
-            '\u05d0\u05d0\u05d0\u05d0\u05d0').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
+                '\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0'
+                '\u05d0\u05d0\u05d0\u05d0\u05d0')
+            .value,
         equals(TextDirection.LTR.value));
     expect(Bidi.estimateDirectionOfText('\u05d0', isHtml: false).value,
         equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText('9 \u05d0 -> 17.5, 23, 45, 19',
-        isHtml: false).value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-            'http://foo/bar/ \u05d0 http://foo2/bar2/ http://foo3/bar3/').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText('9 \u05d0 -> 17.5, 23, 45, 19',
+                isHtml: false)
+            .value,
         equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0'
-        '\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4'
-        '\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9'
-        '\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9'
-        '\u05dd').value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        '\u05db\u05d0 - http://geek.co.il/gallery/v/2007-06 - \u05d0\u05d9'
-        '\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0\u05d5\u05ea:'
-        ' \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1 '
-        '\u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9\u05d9 \u05de\u05e6'
-        '\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9\u05dd \u05d1\u05e2\u05d9\u05e7'
-        ' \u05d4\u05e8\u05d1\u05d4 \u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4'
-        ' \u05e9\u05db\u05df - \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6'
-        '\u05dc \u05d0\u05ea \u05d4\u05d4 \u05d3\u05d6\u05de\u05e0\u05d5 '
-        '\u05dc\u05d4\u05e1\u05ea\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 '
-        '\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05de\u05e9\u05e9\u05e2\u05d5'
-        '\u05ea \u05d9\u05e9\u05e0\u05d5 \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9'
-        '\u05e9 \u05dc\u05d9 \u05d1\u05d0\u05ea\u05e8',
-        isHtml: false).value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
-        '\u05de\u05d3\u05d9?').value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. \u05e9\u05d0\u05dc'
-        '\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0\u05e0\u05d9 '
-        '\u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 \u05dc\u05d7'
-        '\u05d2').value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-            '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc\u05d0 \u05d4\u05d9'
-            '\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                'http://foo/bar/ \u05d0 http://foo2/bar2/ http://foo3/bar3/')
+            .value,
         equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4\u05e0\u05e9\u05d9'
-        '\u05e7\u05d4', isHtml: false).value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-        '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
-        'http://www.gmail.com').value, equals(TextDirection.RTL.value));
-    expect(Bidi.estimateDirectionOfText(
-            '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0'
+                '\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4'
+                '\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9'
+                '\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9'
+                '\u05dd')
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '\u05db\u05d0 - http://geek.co.il/gallery/v/2007-06 - \u05d0\u05d9'
+                '\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc\u05e8\u05d0\u05d5\u05ea:'
+                ' \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1 '
+                '\u05d5\u05d2\u05dd \u05d0\u05dd \u05d4\u05d9\u05d9\u05d9 \u05de\u05e6'
+                '\u05dc\u05dd, \u05d4\u05d9\u05d4 \u05e9\u05dd \u05d1\u05e2\u05d9\u05e7'
+                ' \u05d4\u05e8\u05d1\u05d4 \u05d0\u05e0\u05e9\u05d9\u05dd. \u05de\u05d4'
+                ' \u05e9\u05db\u05df - \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e0\u05e6'
+                '\u05dc \u05d0\u05ea \u05d4\u05d4 \u05d3\u05d6\u05de\u05e0\u05d5 '
+                '\u05dc\u05d4\u05e1\u05ea\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 '
+                '\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05de\u05e9\u05e9\u05e2\u05d5'
+                '\u05ea \u05d9\u05e9\u05e0\u05d5 \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9'
+                '\u05e9 \u05dc\u05d9 \u05d1\u05d0\u05ea\u05e8',
+                isHtml: false)
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
+                '\u05de\u05d3\u05d9?')
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. \u05e9\u05d0\u05dc'
+                '\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0\u05e0\u05d9 '
+                '\u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 \u05dc\u05d7'
+                '\u05d2')
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc\u05d0 \u05d4\u05d9'
+                '\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.')
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4\u05e0\u05e9\u05d9'
+                '\u05e7\u05d4',
+                isHtml: false)
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
+                'http://www.gmail.com')
+            .value,
+        equals(TextDirection.RTL.value));
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '\u05d4\u05d3\u05dc <some quite nasty html mark up>')
+            .value,
         equals(TextDirection.LTR.value));
-    expect(Bidi.estimateDirectionOfText(
-            '\u05d4\u05d3\u05dc <some quite nasty html mark up>').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText(
+                '\u05d4\u05d3\u05dc <some quite nasty html mark up>')
+            .value,
         equals(TextDirection.LTR.value));
-    expect(Bidi.estimateDirectionOfText(
-            '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;').value,
+    expect(
+        Bidi
+            .estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;')
+            .value,
         equals(TextDirection.LTR.value));
-    expect(Bidi.estimateDirectionOfText(
-            '\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;', isHtml: true).value,
+    expect(
+        Bidi
+            .estimateDirectionOfText('\u05d4\u05d3\u05dc\u05ea &amp; &lt; &gt;',
+                isHtml: true)
+            .value,
         equals(TextDirection.RTL.value));
   });
 
@@ -261,14 +317,17 @@
     var item = new SampleItem('Pure Ascii content');
     bidiText.add(item);
 
-    item = new SampleItem('\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4'
+    item = new SampleItem(
+        '\u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4'
         ' \u05dc\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc'
         '\u05de\u05ea\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd '
         '\u05d0\u05dd \u05d4\u05d9\u05d9\u05ea\u05d9 \u05de\u05e6\u05dc\u05dd, '
-        '\u05d4\u05d9\u05d4 \u05e9\u05dd', true);
+        '\u05d4\u05d9\u05d4 \u05e9\u05dd',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('\u05db\u05d0\u05df - http://geek.co.il/gallery/v/'
+    item = new SampleItem(
+        '\u05db\u05d0\u05df - http://geek.co.il/gallery/v/'
         '2007-06 - \u05d0\u05d9\u05df \u05de\u05de\u05e9 \u05de\u05d4 \u05dc'
         '\u05e8\u05d0\u05d5\u05ea: \u05dc\u05d0 \u05e6\u05d9\u05dc\u05de\u05ea'
         '\u05d9 \u05d4\u05e8\u05d1\u05d4 \u05d5\u05d2\u05dd \u05d0\u05dd \u05d4'
@@ -280,29 +339,40 @@
         '\u05db\u05dc \u05e2\u05dc \u05db\u05de\u05d4 \u05ea\u05de\u05d5\u05e0'
         '\u05d5\u05ea \u05de\u05e9\u05e2\u05e9\u05e2\u05d5\u05ea \u05d9\u05e9'
         '\u05e0\u05d5\u05ea \u05d9\u05d5\u05ea\u05e8 \u05e9\u05d9\u05e9 \u05dc'
-        '\u05d9 \u05d1\u05d0\u05ea\u05e8', true);
+        '\u05d9 \u05d1\u05d0\u05ea\u05e8',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
-        '\u05de\u05d3\u05d9?', true);
+    item = new SampleItem(
+        'CAPTCHA \u05de\u05e9\u05d5\u05db\u05dc\u05dc '
+        '\u05de\u05d3\u05d9?',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. '
+    item = new SampleItem(
+        'Yes Prime Minister \u05e2\u05d3\u05db\u05d5\u05df. '
         '\u05e9\u05d0\u05dc\u05d5 \u05d0\u05d5\u05ea\u05d9 \u05de\u05d4 \u05d0'
         '\u05e0\u05d9 \u05e8\u05d5\u05e6\u05d4 \u05de\u05ea\u05e0\u05d4 '
-        '\u05dc\u05d7\u05d2', true);
+        '\u05dc\u05d7\u05d2',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc'
-        '\u05d0 \u05d4\u05d9\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.', true);
+    item = new SampleItem(
+        '17.4.02 \u05e9\u05e2\u05d4:13-20 .15-00 .\u05dc'
+        '\u05d0 \u05d4\u05d9\u05d9\u05ea\u05d9 \u05db\u05d0\u05df.',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4'
-        '\u05e0\u05e9\u05d9\u05e7\u05d4', true);
+    item = new SampleItem(
+        '5710 5720 5730. \u05d4\u05d3\u05dc\u05ea. \u05d4'
+        '\u05e0\u05e9\u05d9\u05e7\u05d4',
+        true);
     bidiText.add(item);
 
-    item = new SampleItem('\u05d4\u05d3\u05dc\u05ea http://www.google.com '
-        'http://www.gmail.com', true);
+    item = new SampleItem(
+        '\u05d4\u05d3\u05dc\u05ea http://www.google.com '
+        'http://www.gmail.com',
+        true);
     bidiText.add(item);
 
     item = new SampleItem('&gt;\u05d4&lt;', true, true);
@@ -314,13 +384,13 @@
     for (var i = 0; i < bidiText.length; i++) {
       var isRtlDir = Bidi.detectRtlDirectionality(bidiText[i].text,
           isHtml: bidiText[i].isHtml);
+
       if (isRtlDir != bidiText[i].isRtl) {
         var str = '"${bidiText[i].text} " should be '
             '${bidiText[i].isRtl ? "rtl" : "ltr"} but detected as '
             '${isRtlDir ? "rtl" : "ltr"}';
-        //alert(str);
+        fail(str);
       }
-      expect(bidiText[i].isRtl, isRtlDir);
     }
   });
 }
diff --git a/packages/intl/test/compact_number_test_data.dart b/packages/intl/test/compact_number_test_data.dart
new file mode 100644
index 0000000..122858e
--- /dev/null
+++ b/packages/intl/test/compact_number_test_data.dart
@@ -0,0 +1,3440 @@
+// Copyright (c) 2016, the Dart project authors.
+// Please see the AUTHORS file
+// for details. All rights reserved. Use of this source
+// code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test data for compact number formatting.
+///
+/// DO NOT EDIT. This file is autogenerated by script.  See
+/// i18n/tools:dart_compact_number_test_data
+
+/// The test data. A map, keyed by locale name, whose values
+/// are a list of [basic, shortform, longform] formatted data
+/// for different numbers.
+Map<String, List<List<String>>> compactNumberTestData = {
+  "af": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4,32 duisend"],
+    ["54321", "54300", "54,3 duisend"],
+    ["654321", "654000", "654 duisend"],
+    ["7654321", "7,65 m", "7,65 miljoen"],
+    ["87654321", "87,7 m", "87,7 miljoen"],
+    ["987654321", "988 m", "988 miljoen"],
+    ["1087654321", "1,09 mjd", "1,09 miljard"],
+    ["11987654321", "12 mjd", "12 miljard"],
+    ["129987654321", "130 mjd", "130 miljard"],
+    ["1398987654321", "1,4 bn", "1,4 biljoen"],
+    ["14987987654321", "15 bn", "15 biljoen"],
+    ["159876987654321", "160 bn", "160 biljoen"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10000", "10 duisend"],
+    ["99999", "100000", "100 duisend"],
+    ["99999", "100000", "100 duisend"],
+    ["999999", "1 m", "1 miljoen"],
+    ["9999999", "10 m", "10 miljoen"],
+    ["99999999", "100 m", "100 miljoen"],
+    ["9994", "9990", "9,99 duisend"],
+    ["99944", "99900", "99,9 duisend"],
+    ["999444", "999000", "999 duisend"],
+    ["9994444", "9,99 m", "9,99 miljoen"],
+    ["999444444", "999 m", "999 miljoen"],
+    ["9994444444", "9,99 mjd", "9,99 miljard"],
+  ],
+  "am": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 ሺ", "4.32 ሺ"],
+    ["54321", "54.3 ሺ", "54.3 ሺ"],
+    ["654321", "654 ሺ", "654 ሺ"],
+    ["7654321", "7.65 ሜትር", "7.65 ሚሊዮን"],
+    ["87654321", "87.7 ሜትር", "87.7 ሚሊዮን"],
+    ["987654321", "988ሜ", "988 ሚሊዮን"],
+    ["1087654321", "1.09 ቢ", "1.09 ቢሊዮን"],
+    ["11987654321", "12 ቢ", "12 ቢሊዮን"],
+    ["129987654321", "130 ቢ", "130 ቢሊዮን"],
+    ["1398987654321", "1.4 ት", "1.4 ትሪሊዮን"],
+    ["14987987654321", "15 ት", "15 ትሪሊዮን"],
+    ["159876987654321", "160 ት", "160 ትሪሊዮን"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ሺ", "10 ሺ"],
+    ["99999", "100 ሺ", "100 ሺ"],
+    ["99999", "100 ሺ", "100 ሺ"],
+    ["999999", "1 ሜትር", "1 ሚሊዮን"],
+    ["9999999", "10 ሜትር", "10 ሚሊዮን"],
+    ["99999999", "100ሜ", "100 ሚሊዮን"],
+    ["9994", "9.99 ሺ", "9.99 ሺ"],
+    ["99944", "99.9 ሺ", "99.9 ሺ"],
+    ["999444", "999 ሺ", "999 ሺ"],
+    ["9994444", "9.99 ሜትር", "9.99 ሚሊዮን"],
+    ["999444444", "999ሜ", "999 ሚሊዮን"],
+    ["9994444444", "9.99 ቢ", "9.99 ቢሊዮን"],
+  ],
+  "ar": [
+    ["1", "١", "١"],
+    ["21", "٢١", "٢١"],
+    ["321", "٣٢١", "٣٢١"],
+    ["4321", "٤٫٣٢ ألف", "٤٫٣٢ ألف"],
+    ["54321", "٥٤٫٣ ألف", "٥٤٫٣ ألف"],
+    ["654321", "٦٥٤ ألف", "٦٥٤ ألف"],
+    ["7654321", "٧٫٦٥ مليو", "٧٫٦٥ مليون"],
+    ["87654321", "٨٧٫٧ مليو", "٨٧٫٧ مليون"],
+    ["987654321", "٩٨٨ مليو", "٩٨٨ مليون"],
+    ["1087654321", "١٫٠٩ مليا", "١٫٠٩ مليار"],
+    ["11987654321", "١٢ مليا", "١٢ مليار"],
+    ["129987654321", "١٣٠ مليا", "١٣٠ مليار"],
+    ["1398987654321", "١٫٤ ترليو", "١٫٤ تريليون"],
+    ["14987987654321", "١٥ ترليو", "١٥ تريليون"],
+    ["159876987654321", "١٦٠ ترليو", "١٦٠ تريليون"],
+    ["9", "٩", "٩"],
+    ["99", "٩٩", "٩٩"],
+    ["999", "٩٩٩", "٩٩٩"],
+    ["9999", "١٠ ألف", "١٠ ألف"],
+    ["99999", "١٠٠ ألف", "١٠٠ ألف"],
+    ["99999", "١٠٠ ألف", "١٠٠ ألف"],
+    ["999999", "١ مليو", "١ مليون"],
+    ["9999999", "١٠ مليو", "١٠ ملايين"],
+    ["99999999", "١٠٠ مليو", "١٠٠ مليون"],
+    ["9994", "٩٫٩٩ ألف", "٩٫٩٩ ألف"],
+    ["99944", "٩٩٫٩ ألف", "٩٩٫٩ ألف"],
+    ["999444", "٩٩٩ ألف", "٩٩٩ ألف"],
+    ["9994444", "٩٫٩٩ مليو", "٩٫٩٩ مليون"],
+    ["999444444", "٩٩٩ مليو", "٩٩٩ مليون"],
+    ["9994444444", "٩٫٩٩ مليا", "٩٫٩٩ مليار"],
+  ],
+  "az": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32K", "4,32K"],
+    ["54321", "54,3K", "54,3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7,65M", "7,65M"],
+    ["87654321", "87,7M", "87,7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1,09G", "1,09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1,4T", "1,4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9,99K", "9,99K"],
+    ["99944", "99,9K", "99,9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9,99M", "9,99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9,99G", "9,99G"],
+  ],
+  "be": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 тыс.", "4,32 тысячы"],
+    ["54321", "54,3 тыс.", "54,3 тысячы"],
+    ["654321", "654 тыс.", "654 тысячы"],
+    ["7654321", "7,65 млн", "7,65 мільёна"],
+    ["87654321", "87,7 млн", "87,7 мільёна"],
+    ["987654321", "988 млн", "988 мільёнаў"],
+    ["1087654321", "1,09 млрд", "1,09 мільярда"],
+    ["11987654321", "12 млрд", "12 мільярдаў"],
+    ["129987654321", "130 млрд", "130 мільярдаў"],
+    ["1398987654321", "1,4 трлн", "1,4 трыльёна"],
+    ["14987987654321", "15 трлн", "15 трыльёнаў"],
+    ["159876987654321", "160 трлн", "160 трыльёнаў"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 тыс.", "10 тысяч"],
+    ["99999", "100 тыс.", "100 тысяч"],
+    ["99999", "100 тыс.", "100 тысяч"],
+    ["999999", "1 млн", "1 мільён"],
+    ["9999999", "10 млн", "10 мільёнаў"],
+    ["99999999", "100 млн", "100 мільёнаў"],
+    ["9994", "9,99 тыс.", "9,99 тысячы"],
+    ["99944", "99,9 тыс.", "99,9 тысячы"],
+    ["999444", "999 тыс.", "999 тысяч"],
+    ["9994444", "9,99 млн", "9,99 мільёна"],
+    ["999444444", "999 млн", "999 мільёнаў"],
+    ["9994444444", "9,99 млрд", "9,99 мільярда"],
+  ],
+  "bg": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 хил.", "4,32 хиляди"],
+    ["54321", "54,3 хил.", "54,3 хиляди"],
+    ["654321", "654 хил.", "654 хиляди"],
+    ["7654321", "7,65 млн.", "7,65 милиона"],
+    ["87654321", "87,7 млн.", "87,7 милиона"],
+    ["987654321", "988 млн", "988 милиона"],
+    ["1087654321", "1,09 млрд.", "1,09 милиарда"],
+    ["11987654321", "12 млрд.", "12 милиарда"],
+    ["129987654321", "130 млрд.", "130 милиарда"],
+    ["1398987654321", "1,4 трлн.", "1,4 трилиона"],
+    ["14987987654321", "15 трлн.", "15 трилиона"],
+    ["159876987654321", "160 трлн.", "160 трилиона"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 хил.", "10 хиляди"],
+    ["99999", "100 хил.", "100 хиляди"],
+    ["99999", "100 хил.", "100 хиляди"],
+    ["999999", "1 млн.", "1 милион"],
+    ["9999999", "10 млн.", "10 милиона"],
+    ["99999999", "100 млн", "100 милиона"],
+    ["9994", "9,99 хил.", "9,99 хиляди"],
+    ["99944", "99,9 хил.", "99,9 хиляди"],
+    ["999444", "999 хил.", "999 хиляди"],
+    ["9994444", "9,99 млн.", "9,99 милиона"],
+    ["999444444", "999 млн", "999 милиона"],
+    ["9994444444", "9,99 млрд.", "9,99 милиарда"],
+  ],
+  "bn": [
+    ["1", "১", "১"],
+    ["21", "২১", "২১"],
+    ["321", "৩২১", "৩২১"],
+    ["4321", "৪.৩২ হাজার", "৪.৩২ হাজার"],
+    ["54321", "৫৪.৩ হাজার", "৫৪.৩ হাজার"],
+    ["654321", "৬.৫৪ লাখ", "৬.৫৪ লাখ"],
+    ["7654321", "৭.৬৫M", "৭.৬৫ মিলিয়ন"],
+    ["87654321", "৮৭.৭M", "৮৭.৭ মিলিয়ন"],
+    ["987654321", "৯৮৮M", "৯৮৮ মিলিয়ন"],
+    ["1087654321", "১.০৯B", "১.০৯ বিলিয়ন"],
+    ["11987654321", "১২B", "১২ বিলিয়ন"],
+    ["129987654321", "১৩০B", "১৩০ বিলিয়ন"],
+    ["1398987654321", "১.৪T", "১.৪ ট্রিলিয়ন"],
+    ["14987987654321", "১৫T", "১৫ ট্রিলিয়ন"],
+    ["159876987654321", "১৬০T", "১৬০ ট্রিলিয়ন"],
+    ["9", "৯", "৯"],
+    ["99", "৯৯", "৯৯"],
+    ["999", "৯৯৯", "৯৯৯"],
+    ["9999", "১০ হাজার", "১০ হাজার"],
+    ["99999", "১ লাখ", "১ লাখ"],
+    ["99999", "১ লাখ", "১ লাখ"],
+    ["999999", "১M", "১ মিলিয়ন"],
+    ["9999999", "১০M", "১০ মিলিয়ন"],
+    ["99999999", "১০০M", "১০০ মিলিয়ন"],
+    ["9994", "৯.৯৯ হাজার", "৯.৯৯ হাজার"],
+    ["99944", "৯৯.৯ হাজার", "৯৯.৯ হাজার"],
+    ["999444", "৯.৯৯ লাখ", "৯.৯৯ লাখ"],
+    ["9994444", "৯.৯৯M", "৯.৯৯ মিলিয়ন"],
+    ["999444444", "৯৯৯M", "৯৯৯ মিলিয়ন"],
+    ["9994444444", "৯.৯৯B", "৯.৯৯ বিলিয়ন"],
+  ],
+  "br": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32K", "4,32K"],
+    ["54321", "54,3K", "54,3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7,65M", "7,65M"],
+    ["87654321", "87,7M", "87,7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1,09G", "1,09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1,4T", "1,4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9,99K", "9,99K"],
+    ["99944", "99,9K", "99,9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9,99M", "9,99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9,99G", "9,99G"],
+  ],
+  "bs": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 hilj.", "4,32 hiljade"],
+    ["54321", "54,3 hilj.", "54,3 hiljade"],
+    ["654321", "654 hilj.", "654 hiljade"],
+    ["7654321", "7,65 mil.", "7,65 miliona"],
+    ["87654321", "87,7 mil.", "87,7 miliona"],
+    ["987654321", "988 mil.", "988 miliona"],
+    ["1087654321", "1,09 mlr.", "1,09 milijardi"],
+    ["11987654321", "12 mlr.", "12 milijardi"],
+    ["129987654321", "130 mlr.", "130 milijardi"],
+    ["1398987654321", "1,4 bil.", "1,4 biliona"],
+    ["14987987654321", "15 bil.", "15 biliona"],
+    ["159876987654321", "160 bil.", "160 biliona"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 hilj.", "10 hiljada"],
+    ["99999", "100 hilj.", "100 hiljada"],
+    ["99999", "100 hilj.", "100 hiljada"],
+    ["999999", "1 mil.", "1 milion"],
+    ["9999999", "10 mil.", "10 miliona"],
+    ["99999999", "100 mil.", "100 miliona"],
+    ["9994", "9,99 hilj.", "9,99 hiljada"],
+    ["99944", "99,9 hilj.", "99,9 hiljada"],
+    ["999444", "999 hilj.", "999 hiljada"],
+    ["9994444", "9,99 mil.", "9,99 miliona"],
+    ["999444444", "999 mil.", "999 miliona"],
+    ["9994444444", "9,99 mlr.", "9,99 milijardi"],
+  ],
+  "ca": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32m", "4,32 milers"],
+    ["54321", "54,3m", "54,3 milers"],
+    ["654321", "654m", "654 milers"],
+    ["7654321", "7,65M", "7,65 milions"],
+    ["87654321", "87,7 M", "87,7 milions"],
+    ["987654321", "988 M", "988 milions"],
+    ["1087654321", "1090 M", "1,09 milers de milions"],
+    ["11987654321", "12mM", "12 milers de milions"],
+    ["129987654321", "130mM", "130 milers de milions"],
+    ["1398987654321", "1,4B", "1,4 bilions"],
+    ["14987987654321", "15 B", "15 bilions"],
+    ["159876987654321", "160 B", "160 bilions"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10m", "10 milers"],
+    ["99999", "100m", "100 milers"],
+    ["99999", "100m", "100 milers"],
+    ["999999", "1M", "1 milió"],
+    ["9999999", "10 M", "10 milions"],
+    ["99999999", "100 M", "100 milions"],
+    ["9994", "9,99m", "9,99 milers"],
+    ["99944", "99,9m", "99,9 milers"],
+    ["999444", "999m", "999 milers"],
+    ["9994444", "9,99M", "9,99 milions"],
+    ["999444444", "999 M", "999 milions"],
+    ["9994444444", "9990 M", "9,99 milers de milions"],
+  ],
+  "chr": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 ᎢᏯᎦᏴᎵ"],
+    ["54321", "54.3K", "54.3 ᎢᏯᎦᏴᎵ"],
+    ["654321", "654K", "654 ᎢᏯᎦᏴᎵ"],
+    ["7654321", "7.65M", "7.65 ᎢᏳᏆᏗᏅᏛ"],
+    ["87654321", "87.7M", "87.7 ᎢᏳᏆᏗᏅᏛ"],
+    ["987654321", "988M", "988 ᎢᏳᏆᏗᏅᏛ"],
+    ["1087654321", "1.09B", "1.09 ᎢᏯᏔᎳᏗᏅᏛ"],
+    ["11987654321", "12B", "12 ᎢᏯᏔᎳᏗᏅᏛ"],
+    ["129987654321", "130B", "130 ᎢᏯᏔᎳᏗᏅᏛ"],
+    ["1398987654321", "1.4T", "1.4 ᎢᏯᏦᎠᏗᏅᏛ"],
+    ["14987987654321", "15T", "15 ᎢᏯᏦᎠᏗᏅᏛ"],
+    ["159876987654321", "160T", "160 ᎢᏯᏦᎠᏗᏅᏛ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 ᎢᏯᎦᏴᎵ"],
+    ["99999", "100K", "100 ᎢᏯᎦᏴᎵ"],
+    ["99999", "100K", "100 ᎢᏯᎦᏴᎵ"],
+    ["999999", "1M", "1 ᎢᏳᏆᏗᏅᏛ"],
+    ["9999999", "10M", "10 ᎢᏳᏆᏗᏅᏛ"],
+    ["99999999", "100M", "100 ᎢᏳᏆᏗᏅᏛ"],
+    ["9994", "9.99K", "9.99 ᎢᏯᎦᏴᎵ"],
+    ["99944", "99.9K", "99.9 ᎢᏯᎦᏴᎵ"],
+    ["999444", "999K", "999 ᎢᏯᎦᏴᎵ"],
+    ["9994444", "9.99M", "9.99 ᎢᏳᏆᏗᏅᏛ"],
+    ["999444444", "999M", "999 ᎢᏳᏆᏗᏅᏛ"],
+    ["9994444444", "9.99B", "9.99 ᎢᏯᏔᎳᏗᏅᏛ"],
+  ],
+  "cs": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tis.", "4,32 tisíce"],
+    ["54321", "54,3 tis.", "54,3 tisíce"],
+    ["654321", "654 tis.", "654 tisíc"],
+    ["7654321", "7,65 mil.", "7,65 milionu"],
+    ["87654321", "87,7 mil.", "87,7 milionu"],
+    ["987654321", "988 mil.", "988 milionů"],
+    ["1087654321", "1,09 mld.", "1,09 miliardy"],
+    ["11987654321", "12 mld.", "12 miliard"],
+    ["129987654321", "130 mld.", "130 miliard"],
+    ["1398987654321", "1,4 bil.", "1,4 bilionu"],
+    ["14987987654321", "15 bil.", "15 bilionů"],
+    ["159876987654321", "160 bil.", "160 bilionů"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tis.", "10 tisíc"],
+    ["99999", "100 tis.", "100 tisíc"],
+    ["99999", "100 tis.", "100 tisíc"],
+    ["999999", "1 mil.", "1 milion"],
+    ["9999999", "10 mil.", "10 milionů"],
+    ["99999999", "100 mil.", "100 milionů"],
+    ["9994", "9,99 tis.", "9,99 tisíce"],
+    ["99944", "99,9 tis.", "99,9 tisíce"],
+    ["999444", "999 tis.", "999 tisíc"],
+    ["9994444", "9,99 mil.", "9,99 milionu"],
+    ["999444444", "999 mil.", "999 milionů"],
+    ["9994444444", "9,99 mld.", "9,99 miliardy"],
+  ],
+  "cy": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 mil"],
+    ["54321", "54.3K", "54.3 mil"],
+    ["654321", "654K", "654 mil"],
+    ["7654321", "7.65M", "7.65 miliwn"],
+    ["87654321", "87.7M", "87.7 miliwn"],
+    ["987654321", "988M", "988 miliwn"],
+    ["1087654321", "1.09B", "1.09 biliwn"],
+    ["11987654321", "12B", "12 biliwn"],
+    ["129987654321", "130B", "130 biliwn"],
+    ["1398987654321", "1.4T", "1.4 triliwn"],
+    ["14987987654321", "15T", "15 triliwn"],
+    ["159876987654321", "160T", "160 triliwn"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 mil"],
+    ["99999", "100K", "100 mil"],
+    ["99999", "100K", "100 mil"],
+    ["999999", "1M", "1 miliwn"],
+    ["9999999", "10M", "10 miliwn"],
+    ["99999999", "100M", "100 miliwn"],
+    ["9994", "9.99K", "9.99 mil"],
+    ["99944", "99.9K", "99.9 mil"],
+    ["999444", "999K", "999 mil"],
+    ["9994444", "9.99M", "9.99 miliwn"],
+    ["999444444", "999M", "999 miliwn"],
+    ["9994444444", "9.99B", "9.99 biliwn"],
+  ],
+  "da": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 td", "4,32 tusind"],
+    ["54321", "54,3 td", "54,3 tusind"],
+    ["654321", "654 td", "654 tusind"],
+    ["7654321", "7,65 mio", "7,65 millioner"],
+    ["87654321", "87,7 mio", "87,7 millioner"],
+    ["987654321", "988 mio", "988 millioner"],
+    ["1087654321", "1,09 mia", "1,09 milliard"],
+    ["11987654321", "12 mia", "12 milliarder"],
+    ["129987654321", "130 mia", "130 milliarder"],
+    ["1398987654321", "1,4 bio", "1,4 billion"],
+    ["14987987654321", "15 bio", "15 billioner"],
+    ["159876987654321", "160 bio", "160 billioner"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 td", "10 tusind"],
+    ["99999", "100 td", "100 tusind"],
+    ["99999", "100 td", "100 tusind"],
+    ["999999", "1 mio", "1 million"],
+    ["9999999", "10 mio", "10 millioner"],
+    ["99999999", "100 mio", "100 millioner"],
+    ["9994", "9,99 td", "9,99 tusind"],
+    ["99944", "99,9 td", "99,9 tusind"],
+    ["999444", "999 td", "999 tusind"],
+    ["9994444", "9,99 mio", "9,99 millioner"],
+    ["999444444", "999 mio", "999 millioner"],
+    ["9994444444", "9,99 mia", "9,99 milliarder"],
+  ],
+  "de": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 Tsd.", "4,32 Tausend"],
+    ["54321", "54,3 Tsd.", "54,3 Tausend"],
+    ["654321", "654 Tsd.", "654 Tausend"],
+    ["7654321", "7,65 Mio.", "7,65 Millionen"],
+    ["87654321", "87,7 Mio.", "87,7 Millionen"],
+    ["987654321", "988 Mio.", "988 Millionen"],
+    ["1087654321", "1,09 Mrd.", "1,09 Milliarden"],
+    ["11987654321", "12 Mrd.", "12 Milliarden"],
+    ["129987654321", "130 Mrd.", "130 Milliarden"],
+    ["1398987654321", "1,4 Bio.", "1,4 Billionen"],
+    ["14987987654321", "15 Bio.", "15 Billionen"],
+    ["159876987654321", "160 Bio.", "160 Billionen"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 Tsd.", "10 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["999999", "1 Mio.", "1 Million"],
+    ["9999999", "10 Mio.", "10 Millionen"],
+    ["99999999", "100 Mio.", "100 Millionen"],
+    ["9994", "9,99 Tsd.", "9,99 Tausend"],
+    ["99944", "99,9 Tsd.", "99,9 Tausend"],
+    ["999444", "999 Tsd.", "999 Tausend"],
+    ["9994444", "9,99 Mio.", "9,99 Millionen"],
+    ["999444444", "999 Mio.", "999 Millionen"],
+    ["9994444444", "9,99 Mrd.", "9,99 Milliarden"],
+  ],
+  "de_AT": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 Tsd.", "4,32 Tausend"],
+    ["54321", "54,3 Tsd.", "54,3 Tausend"],
+    ["654321", "654 Tsd.", "654 Tausend"],
+    ["7654321", "7,65 Mio.", "7,65 Millionen"],
+    ["87654321", "87,7 Mio.", "87,7 Millionen"],
+    ["987654321", "988 Mio.", "988 Millionen"],
+    ["1087654321", "1,09 Mrd.", "1,09 Milliarden"],
+    ["11987654321", "12 Mrd.", "12 Milliarden"],
+    ["129987654321", "130 Mrd.", "130 Milliarden"],
+    ["1398987654321", "1,4 Bio.", "1,4 Billionen"],
+    ["14987987654321", "15 Bio.", "15 Billionen"],
+    ["159876987654321", "160 Bio.", "160 Billionen"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 Tsd.", "10 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["999999", "1 Mio.", "1 Million"],
+    ["9999999", "10 Mio.", "10 Millionen"],
+    ["99999999", "100 Mio.", "100 Millionen"],
+    ["9994", "9,99 Tsd.", "9,99 Tausend"],
+    ["99944", "99,9 Tsd.", "99,9 Tausend"],
+    ["999444", "999 Tsd.", "999 Tausend"],
+    ["9994444", "9,99 Mio.", "9,99 Millionen"],
+    ["999444444", "999 Mio.", "999 Millionen"],
+    ["9994444444", "9,99 Mrd.", "9,99 Milliarden"],
+  ],
+  "de_CH": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 Tsd.", "4.32 Tausend"],
+    ["54321", "54.3 Tsd.", "54.3 Tausend"],
+    ["654321", "654 Tsd.", "654 Tausend"],
+    ["7654321", "7.65 Mio.", "7.65 Millionen"],
+    ["87654321", "87.7 Mio.", "87.7 Millionen"],
+    ["987654321", "988 Mio.", "988 Millionen"],
+    ["1087654321", "1.09 Mrd.", "1.09 Milliarden"],
+    ["11987654321", "12 Mrd.", "12 Milliarden"],
+    ["129987654321", "130 Mrd.", "130 Milliarden"],
+    ["1398987654321", "1.4 Bio.", "1.4 Billionen"],
+    ["14987987654321", "15 Bio.", "15 Billionen"],
+    ["159876987654321", "160 Bio.", "160 Billionen"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 Tsd.", "10 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["99999", "100 Tsd.", "100 Tausend"],
+    ["999999", "1 Mio.", "1 Million"],
+    ["9999999", "10 Mio.", "10 Millionen"],
+    ["99999999", "100 Mio.", "100 Millionen"],
+    ["9994", "9.99 Tsd.", "9.99 Tausend"],
+    ["99944", "99.9 Tsd.", "99.9 Tausend"],
+    ["999444", "999 Tsd.", "999 Tausend"],
+    ["9994444", "9.99 Mio.", "9.99 Millionen"],
+    ["999444444", "999 Mio.", "999 Millionen"],
+    ["9994444444", "9.99 Mrd.", "9.99 Milliarden"],
+  ],
+  "el": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 χιλ.", "4,32 χιλιάδες"],
+    ["54321", "54,3 χιλ.", "54,3 χιλιάδες"],
+    ["654321", "654 χιλ.", "654 χιλιάδες"],
+    ["7654321", "7,65 εκ.", "7,65 εκατομμύρια"],
+    ["87654321", "87,7 εκ.", "87,7 εκατομμύρια"],
+    ["987654321", "988 εκ.", "988 εκατομμύρια"],
+    ["1087654321", "1,09 δισ.", "1,09 δισεκατομμύρια"],
+    ["11987654321", "12 δισ.", "12 δισεκατομμύρια"],
+    ["129987654321", "130 δισ.", "130 δισεκατομμύρια"],
+    ["1398987654321", "1,4 τρισ.", "1,4 τρισεκατομμύρια"],
+    ["14987987654321", "15 τρισ.", "15 τρισεκατομμύρια"],
+    ["159876987654321", "160 τρισ.", "160 τρισεκατομμύρια"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 χιλ.", "10 χιλιάδες"],
+    ["99999", "100 χιλ.", "100 χιλιάδες"],
+    ["99999", "100 χιλ.", "100 χιλιάδες"],
+    ["999999", "1 εκ.", "1 εκατομμύριο"],
+    ["9999999", "10 εκ.", "10 εκατομμύρια"],
+    ["99999999", "100 εκ.", "100 εκατομμύρια"],
+    ["9994", "9,99 χιλ.", "9,99 χιλιάδες"],
+    ["99944", "99,9 χιλ.", "99,9 χιλιάδες"],
+    ["999444", "999 χιλ.", "999 χιλιάδες"],
+    ["9994444", "9,99 εκ.", "9,99 εκατομμύρια"],
+    ["999444444", "999 εκ.", "999 εκατομμύρια"],
+    ["9994444444", "9,99 δισ.", "9,99 δισεκατομμύρια"],
+  ],
+  "en": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_AU": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_CA": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_GB": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_IE": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_IN": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_SG": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_US": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 thousand"],
+    ["54321", "54.3K", "54.3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7.65M", "7.65 million"],
+    ["87654321", "87.7M", "87.7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1.09B", "1.09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1.4T", "1.4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9.99K", "9.99 thousand"],
+    ["99944", "99.9K", "99.9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9.99M", "9.99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9.99B", "9.99 billion"],
+  ],
+  "en_ZA": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32K", "4,32 thousand"],
+    ["54321", "54,3K", "54,3 thousand"],
+    ["654321", "654K", "654 thousand"],
+    ["7654321", "7,65M", "7,65 million"],
+    ["87654321", "87,7M", "87,7 million"],
+    ["987654321", "988M", "988 million"],
+    ["1087654321", "1,09B", "1,09 billion"],
+    ["11987654321", "12B", "12 billion"],
+    ["129987654321", "130B", "130 billion"],
+    ["1398987654321", "1,4T", "1,4 trillion"],
+    ["14987987654321", "15T", "15 trillion"],
+    ["159876987654321", "160T", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["99999", "100K", "100 thousand"],
+    ["999999", "1M", "1 million"],
+    ["9999999", "10M", "10 million"],
+    ["99999999", "100M", "100 million"],
+    ["9994", "9,99K", "9,99 thousand"],
+    ["99944", "99,9K", "99,9 thousand"],
+    ["999444", "999K", "999 thousand"],
+    ["9994444", "9,99M", "9,99 million"],
+    ["999444444", "999M", "999 million"],
+    ["9994444444", "9,99B", "9,99 billion"],
+  ],
+  "es": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 K", "4,32 mil"],
+    ["54321", "54,3 K", "54,3 mil"],
+    ["654321", "654 K", "654 mil"],
+    ["7654321", "7,65 M", "7,65 millones"],
+    ["87654321", "87,7 M", "87,7 millones"],
+    ["987654321", "988 M", "988 millones"],
+    ["1087654321", "1090 M", "1,09 mil millones"],
+    ["11987654321", "12 MRD", "12 mil millones"],
+    ["129987654321", "130 MRD", "130 mil millones"],
+    ["1398987654321", "1,4 B", "1,4 billones"],
+    ["14987987654321", "15 B", "15 billones"],
+    ["159876987654321", "160 B", "160 billones"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 K", "10 mil"],
+    ["99999", "100 K", "100 mil"],
+    ["99999", "100 K", "100 mil"],
+    ["999999", "1 M", "1 millón"],
+    ["9999999", "10 M", "10 millones"],
+    ["99999999", "100 M", "100 millones"],
+    ["9994", "9,99 K", "9,99 mil"],
+    ["99944", "99,9 K", "99,9 mil"],
+    ["999444", "999 K", "999 mil"],
+    ["9994444", "9,99 M", "9,99 millones"],
+    ["999444444", "999 M", "999 millones"],
+    ["9994444444", "9990 M", "9,99 mil millones"],
+  ],
+  "es_419": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32k", "4.32 mil"],
+    ["54321", "54.3k", "54.3 mil"],
+    ["654321", "654k", "654 mil"],
+    ["7654321", "7.65 M", "7.65 millones"],
+    ["87654321", "87.7 M", "87.7 millones"],
+    ["987654321", "988 M", "988 millones"],
+    ["1087654321", "1.09k M", "1.09 mil millones"],
+    ["11987654321", "12k M", "12 mil millones"],
+    ["129987654321", "130k M", "130 mil millones"],
+    ["1398987654321", "1.4 B", "1.4 billones"],
+    ["14987987654321", "15 B", "15 billones"],
+    ["159876987654321", "160 B", "160 billones"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 mil"],
+    ["99999", "100k", "100 mil"],
+    ["99999", "100k", "100 mil"],
+    ["999999", "1 M", "1 millón"],
+    ["9999999", "10 M", "10 millones"],
+    ["99999999", "100 M", "100 millones"],
+    ["9994", "9.99k", "9.99 mil"],
+    ["99944", "99.9k", "99.9 mil"],
+    ["999444", "999k", "999 mil"],
+    ["9994444", "9.99 M", "9.99 millones"],
+    ["999444444", "999 M", "999 millones"],
+    ["9994444444", "9.99k M", "9.99 mil millones"],
+  ],
+  "es_ES": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 K", "4,32 mil"],
+    ["54321", "54,3 K", "54,3 mil"],
+    ["654321", "654 K", "654 mil"],
+    ["7654321", "7,65 M", "7,65 millones"],
+    ["87654321", "87,7 M", "87,7 millones"],
+    ["987654321", "988 M", "988 millones"],
+    ["1087654321", "1090 M", "1,09 mil millones"],
+    ["11987654321", "12 MRD", "12 mil millones"],
+    ["129987654321", "130 MRD", "130 mil millones"],
+    ["1398987654321", "1,4 B", "1,4 billones"],
+    ["14987987654321", "15 B", "15 billones"],
+    ["159876987654321", "160 B", "160 billones"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 K", "10 mil"],
+    ["99999", "100 K", "100 mil"],
+    ["99999", "100 K", "100 mil"],
+    ["999999", "1 M", "1 millón"],
+    ["9999999", "10 M", "10 millones"],
+    ["99999999", "100 M", "100 millones"],
+    ["9994", "9,99 K", "9,99 mil"],
+    ["99944", "99,9 K", "99,9 mil"],
+    ["999444", "999 K", "999 mil"],
+    ["9994444", "9,99 M", "9,99 millones"],
+    ["999444444", "999 M", "999 millones"],
+    ["9994444444", "9990 M", "9,99 mil millones"],
+  ],
+  "es_MX": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32k", "4.32 mil"],
+    ["54321", "54.3k", "54.3 mil"],
+    ["654321", "654k", "654 mil"],
+    ["7654321", "7.65 M", "7.65 millones"],
+    ["87654321", "87.7 M", "87.7 millones"],
+    ["987654321", "988 M", "988 millones"],
+    ["1087654321", "1.09k M", "1.09 mil millones"],
+    ["11987654321", "12k M", "12 mil millones"],
+    ["129987654321", "130k M", "130 mil millones"],
+    ["1398987654321", "1.4 B", "1.4 billones"],
+    ["14987987654321", "15 B", "15 billones"],
+    ["159876987654321", "160 B", "160 billones"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 mil"],
+    ["99999", "100k", "100 mil"],
+    ["99999", "100k", "100 mil"],
+    ["999999", "1 M", "1 millón"],
+    ["9999999", "10 M", "10 millones"],
+    ["99999999", "100 M", "100 millones"],
+    ["9994", "9.99k", "9.99 mil"],
+    ["99944", "99.9k", "99.9 mil"],
+    ["999444", "999k", "999 mil"],
+    ["9994444", "9.99 M", "9.99 millones"],
+    ["999444444", "999 M", "999 millones"],
+    ["9994444444", "9.99k M", "9.99 mil millones"],
+  ],
+  "es_US": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4.32 mil"],
+    ["54321", "54.3k", "54.3 mil"],
+    ["654321", "654k", "654 mil"],
+    ["7654321", "7.65 M", "7.65 millones"],
+    ["87654321", "87.7 M", "87.7 millones"],
+    ["987654321", "988 M", "988 millones"],
+    ["1087654321", "1.09k M", "1.09 mil millones"],
+    ["11987654321", "12k M", "12 mil millones"],
+    ["129987654321", "130k M", "130 mil millones"],
+    ["1398987654321", "1.4 B", "1.4 billones"],
+    ["14987987654321", "15 B", "15 billones"],
+    ["159876987654321", "160 B", "160 billones"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 mil"],
+    ["99999", "100k", "100 mil"],
+    ["99999", "100k", "100 mil"],
+    ["999999", "1 M", "1 millón"],
+    ["9999999", "10 M", "10 millones"],
+    ["99999999", "100 M", "100 millones"],
+    ["9994", "9990", "9.99 mil"],
+    ["99944", "99.9k", "99.9 mil"],
+    ["999444", "999k", "999 mil"],
+    ["9994444", "9.99 M", "9.99 millones"],
+    ["999444444", "999 M", "999 millones"],
+    ["9994444444", "9.99k M", "9.99 mil millones"],
+  ],
+  "et": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tuh", "4,32 tuhat"],
+    ["54321", "54,3 tuh", "54,3 tuhat"],
+    ["654321", "654 tuh", "654 tuhat"],
+    ["7654321", "7,65 mln", "7,65 miljonit"],
+    ["87654321", "87,7 mln", "87,7 miljonit"],
+    ["987654321", "988 mln", "988 miljonit"],
+    ["1087654321", "1,09 mld", "1,09 miljardit"],
+    ["11987654321", "12 mld", "12 miljardit"],
+    ["129987654321", "130 mld", "130 miljardit"],
+    ["1398987654321", "1,4 trl", "1,4 triljonit"],
+    ["14987987654321", "15 trl", "15 triljonit"],
+    ["159876987654321", "160 trl", "160 triljonit"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tuh", "10 tuhat"],
+    ["99999", "100 tuh", "100 tuhat"],
+    ["99999", "100 tuh", "100 tuhat"],
+    ["999999", "1 mln", "1 miljon"],
+    ["9999999", "10 mln", "10 miljonit"],
+    ["99999999", "100 mln", "100 miljonit"],
+    ["9994", "9,99 tuh", "9,99 tuhat"],
+    ["99944", "99,9 tuh", "99,9 tuhat"],
+    ["999444", "999 tuh", "999 tuhat"],
+    ["9994444", "9,99 mln", "9,99 miljonit"],
+    ["999444444", "999 mln", "999 miljonit"],
+    ["9994444444", "9,99 mld", "9,99 miljardit"],
+  ],
+  "eu": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4320"],
+    ["54321", "54300", "54300"],
+    ["654321", "654000", "654000"],
+    ["7654321", "7,65 M", "7,65 milioi"],
+    ["87654321", "87,7 M", "87,7 milioi"],
+    ["987654321", "988 M", "988 milioi"],
+    ["1087654321", "1090 M", "1090 milioi"],
+    ["11987654321", "12000 M", "12000 milioi"],
+    ["129987654321", "130000 M", "130000 milioi"],
+    ["1398987654321", "1,4 B", "1,4 bilioi"],
+    ["14987987654321", "15 B", "15 bilioi"],
+    ["159876987654321", "160 B", "160 bilioi"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10000", "10000"],
+    ["99999", "100000", "100000"],
+    ["99999", "100000", "100000"],
+    ["999999", "1 M", "1 milioi"],
+    ["9999999", "10 M", "10 milioi"],
+    ["99999999", "100 M", "100 milioi"],
+    ["9994", "9990", "9990"],
+    ["99944", "99900", "99900"],
+    ["999444", "999000", "999000"],
+    ["9994444", "9,99 M", "9,99 milioi"],
+    ["999444444", "999 M", "999 milioi"],
+    ["9994444444", "9990 M", "9990 milioi"],
+  ],
+  "fa": [
+    ["1", "۱", "۱"],
+    ["21", "۲۱", "۲۱"],
+    ["321", "۳۲۱", "۳۲۱"],
+    ["4321", "۴٫۳۲ هزار", "۴٫۳۲ هزار"],
+    ["54321", "۵۴٫۳ هزار", "۵۴٫۳ هزار"],
+    ["654321", "۶۵۴ هزار", "۶۵۴ هزار"],
+    ["7654321", "۷٫۶۵ میلیون", "۷٫۶۵ میلیون"],
+    ["87654321", "۸۷٫۷ میلیون", "۸۷٫۷ میلیون"],
+    ["987654321", "۹۸۸ م", "۹۸۸ میلیون"],
+    ["1087654321", "۱٫۰۹ م", "۱٫۰۹ میلیارد"],
+    ["11987654321", "۱۲ م", "۱۲ میلیارد"],
+    ["129987654321", "۱۳۰ میلیارد", "۱۳۰ میلیارد"],
+    ["1398987654321", "۱٫۴ تریلیون", "۱٫۴ هزارمیلیارد"],
+    ["14987987654321", "۱۵ ت", "۱۵ هزارمیلیارد"],
+    ["159876987654321", "۱۶۰ ت", "۱۶۰ هزارمیلیارد"],
+    ["9", "۹", "۹"],
+    ["99", "۹۹", "۹۹"],
+    ["999", "۹۹۹", "۹۹۹"],
+    ["9999", "۱۰ هزار", "۱۰ هزار"],
+    ["99999", "۱۰۰ هزار", "۱۰۰ هزار"],
+    ["99999", "۱۰۰ هزار", "۱۰۰ هزار"],
+    ["999999", "۱ میلیون", "۱ میلیون"],
+    ["9999999", "۱۰ میلیون", "۱۰ میلیون"],
+    ["99999999", "۱۰۰ م", "۱۰۰ میلیون"],
+    ["9994", "۹٫۹۹ هزار", "۹٫۹۹ هزار"],
+    ["99944", "۹۹٫۹ هزار", "۹۹٫۹ هزار"],
+    ["999444", "۹۹۹ هزار", "۹۹۹ هزار"],
+    ["9994444", "۹٫۹۹ میلیون", "۹٫۹۹ میلیون"],
+    ["999444444", "۹۹۹ م", "۹۹۹ میلیون"],
+    ["9994444444", "۹٫۹۹ م", "۹٫۹۹ میلیارد"],
+  ],
+  "fi": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 t.", "4,32 tuhatta"],
+    ["54321", "54,3 t.", "54,3 tuhatta"],
+    ["654321", "654 t.", "654 tuhatta"],
+    ["7654321", "7,65 milj.", "7,65 miljoonaa"],
+    ["87654321", "87,7 milj.", "87,7 miljoonaa"],
+    ["987654321", "988 milj.", "988 miljoonaa"],
+    ["1087654321", "1,09 mrd.", "1,09 miljardia"],
+    ["11987654321", "12 mrd.", "12 miljardia"],
+    ["129987654321", "130 mrd.", "130 miljardia"],
+    ["1398987654321", "1,4 bilj.", "1,4 biljoonaa"],
+    ["14987987654321", "15 bilj.", "15 biljoonaa"],
+    ["159876987654321", "160 bilj.", "160 biljoonaa"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 t.", "10 tuhatta"],
+    ["99999", "100 t.", "100 tuhatta"],
+    ["99999", "100 t.", "100 tuhatta"],
+    ["999999", "1 milj.", "1 miljoona"],
+    ["9999999", "10 milj.", "10 miljoonaa"],
+    ["99999999", "100 milj.", "100 miljoonaa"],
+    ["9994", "9,99 t.", "9,99 tuhatta"],
+    ["99944", "99,9 t.", "99,9 tuhatta"],
+    ["999444", "999 t.", "999 tuhatta"],
+    ["9994444", "9,99 milj.", "9,99 miljoonaa"],
+    ["999444444", "999 milj.", "999 miljoonaa"],
+    ["9994444444", "9,99 mrd.", "9,99 miljardia"],
+  ],
+  "fil": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 libo"],
+    ["54321", "54.3K", "54.3 libo"],
+    ["654321", "654K", "654 na libo"],
+    ["7654321", "7.65M", "7.65 milyon"],
+    ["87654321", "87.7M", "87.7 milyon"],
+    ["987654321", "988M", "988 milyon"],
+    ["1087654321", "1.09B", "1.09 bilyon"],
+    ["11987654321", "12B", "12 bilyon"],
+    ["129987654321", "130B", "130 bilyon"],
+    ["1398987654321", "1.4T", "1.4 na trilyon"],
+    ["14987987654321", "15T", "15 trilyon"],
+    ["159876987654321", "160T", "160 trilyon"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 libo"],
+    ["99999", "100K", "100 libo"],
+    ["99999", "100K", "100 libo"],
+    ["999999", "1M", "1 milyon"],
+    ["9999999", "10M", "10 milyon"],
+    ["99999999", "100M", "100 milyon"],
+    ["9994", "9.99K", "9.99 na libo"],
+    ["99944", "99.9K", "99.9 na libo"],
+    ["999444", "999K", "999 na libo"],
+    ["9994444", "9.99M", "9.99 na milyon"],
+    ["999444444", "999M", "999 na milyon"],
+    ["9994444444", "9.99B", "9.99 na bilyon"],
+  ],
+  "fr": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 k", "4,32 mille"],
+    ["54321", "54,3 k", "54,3 mille"],
+    ["654321", "654 k", "654 mille"],
+    ["7654321", "7,65 M", "7,65 millions"],
+    ["87654321", "87,7 M", "87,7 millions"],
+    ["987654321", "988 M", "988 millions"],
+    ["1087654321", "1,09 Md", "1,09 milliard"],
+    ["11987654321", "12 Md", "12 milliards"],
+    ["129987654321", "130 Md", "130 milliards"],
+    ["1398987654321", "1,4 Bn", "1,4 billion"],
+    ["14987987654321", "15 Bn", "15 billions"],
+    ["159876987654321", "160 Bn", "160 billions"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 k", "10 mille"],
+    ["99999", "100 k", "100 mille"],
+    ["99999", "100 k", "100 mille"],
+    ["999999", "1 M", "1 million"],
+    ["9999999", "10 M", "10 millions"],
+    ["99999999", "100 M", "100 millions"],
+    ["9994", "9,99 k", "9,99 mille"],
+    ["99944", "99,9 k", "99,9 mille"],
+    ["999444", "999 k", "999 mille"],
+    ["9994444", "9,99 M", "9,99 millions"],
+    ["999444444", "999 M", "999 millions"],
+    ["9994444444", "9,99 Md", "9,99 milliards"],
+  ],
+  "fr_CA": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 k", "4,32 mille"],
+    ["54321", "54,3 k", "54,3 mille"],
+    ["654321", "654 k", "654 mille"],
+    ["7654321", "7,65 M", "7,65 millions"],
+    ["87654321", "87,7 M", "87,7 millions"],
+    ["987654321", "988 M", "988 millions"],
+    ["1087654321", "1,09 G", "1,09 milliard"],
+    ["11987654321", "12 G", "12 milliards"],
+    ["129987654321", "130 G", "130 milliards"],
+    ["1398987654321", "1,4 T", "1,4 billion"],
+    ["14987987654321", "15 T", "15 billions"],
+    ["159876987654321", "160 T", "160 billions"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 k", "10 mille"],
+    ["99999", "100 k", "100 mille"],
+    ["99999", "100 k", "100 mille"],
+    ["999999", "1 M", "1 million"],
+    ["9999999", "10 M", "10 millions"],
+    ["99999999", "100 M", "100 millions"],
+    ["9994", "9,99 k", "9,99 mille"],
+    ["99944", "99,9 k", "99,9 mille"],
+    ["999444", "999 k", "999 mille"],
+    ["9994444", "9,99 M", "9,99 millions"],
+    ["999444444", "999 M", "999 millions"],
+    ["9994444444", "9,99 G", "9,99 milliards"],
+  ],
+  "ga": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32k", "4.32 míle"],
+    ["54321", "54.3k", "54.3 míle"],
+    ["654321", "654k", "654 míle"],
+    ["7654321", "7.65M", "7.65 milliún"],
+    ["87654321", "87.7M", "87.7 milliún"],
+    ["987654321", "988M", "988 milliún"],
+    ["1087654321", "1.09B", "1.09 billiún"],
+    ["11987654321", "12B", "12 billiún"],
+    ["129987654321", "130B", "130 billiún"],
+    ["1398987654321", "1.4T", "1.4 trilliún"],
+    ["14987987654321", "15T", "15 trilliún"],
+    ["159876987654321", "160T", "160 trilliún"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 míle"],
+    ["99999", "100k", "100 míle"],
+    ["99999", "100k", "100 míle"],
+    ["999999", "1M", "1 mhilliún"],
+    ["9999999", "10M", "10 milliún"],
+    ["99999999", "100M", "100 milliún"],
+    ["9994", "9.99k", "9.99 míle"],
+    ["99944", "99.9k", "99.9 míle"],
+    ["999444", "999k", "999 míle"],
+    ["9994444", "9.99M", "9.99 milliún"],
+    ["999444444", "999M", "999 milliún"],
+    ["9994444444", "9.99B", "9.99 billiún"],
+  ],
+  "gl": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4320"],
+    ["54321", "54300", "54300"],
+    ["654321", "654000", "654000"],
+    ["7654321", "7,65 mill.", "7,65 millóns"],
+    ["87654321", "87,7 mill.", "87,7 millóns"],
+    ["987654321", "988 mill", "988 millóns"],
+    ["1087654321", "1090000000", "1090000000"],
+    ["11987654321", "12000000000", "12000000000"],
+    ["129987654321", "130000000000", "130000000000"],
+    ["1398987654321", "1,4 bill.", "1,4 billóns"],
+    ["14987987654321", "15 bill.", "15 billóns"],
+    ["159876987654321", "160 bill.", "160 billóns"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10000", "10000"],
+    ["99999", "100000", "100000"],
+    ["99999", "100000", "100000"],
+    ["999999", "1 mill.", "1 millón"],
+    ["9999999", "10 mill.", "10 millóns"],
+    ["99999999", "100 mill", "100 millóns"],
+    ["9994", "9990", "9990"],
+    ["99944", "99900", "99900"],
+    ["999444", "999000", "999000"],
+    ["9994444", "9,99 mill.", "9,99 millóns"],
+    ["999444444", "999 mill", "999 millóns"],
+    ["9994444444", "9990000000", "9990000000"],
+  ],
+  "gsw": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32K"],
+    ["54321", "54.3K", "54.3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7.65M", "7.65M"],
+    ["87654321", "87.7M", "87.7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1.09G", "1.09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1.4T", "1.4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9.99K", "9.99K"],
+    ["99944", "99.9K", "99.9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9.99M", "9.99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9.99G", "9.99G"],
+  ],
+  "gu": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 હજાર", "4.32 હજાર"],
+    ["54321", "54.3 હજાર", "54.3 હજાર"],
+    ["654321", "6.54 લાખ", "6.54 લાખ"],
+    ["7654321", "76.5 લાખ", "76.5 લાખ"],
+    ["87654321", "8.77 કરોડ", "8.77 કરોડ"],
+    ["987654321", "98.8 કરોડ", "98.8 કરોડ"],
+    ["1087654321", "1.09 અબજ", "1.09 અબજ"],
+    ["11987654321", "12 અબજ", "12 અબજ"],
+    ["129987654321", "1.3 નિખર્વ", "1.3 નિખર્વ"],
+    ["1398987654321", "1.4 મહાપદ્મ", "1.4 મહાપદ્મ"],
+    ["14987987654321", "1.5 શંકુ", "1.5 શંકુ"],
+    ["159876987654321", "1.6 જલધિ", "1.6 જલધિ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 હજાર", "10 હજાર"],
+    ["99999", "1 લાખ", "1 લાખ"],
+    ["99999", "1 લાખ", "1 લાખ"],
+    ["999999", "10 લાખ", "10 લાખ"],
+    ["9999999", "1 કરોડ", "1 કરોડ"],
+    ["99999999", "10 કરોડ", "10 કરોડ"],
+    ["9994", "9.99 હજાર", "9.99 હજાર"],
+    ["99944", "99.9 હજાર", "99.9 હજાર"],
+    ["999444", "9.99 લાખ", "9.99 લાખ"],
+    ["9994444", "99.9 લાખ", "99.9 લાખ"],
+    ["999444444", "99.9 કરોડ", "99.9 કરોડ"],
+    ["9994444444", "9.99 અબજ", "9.99 અબજ"],
+  ],
+  "haw": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32K"],
+    ["54321", "54.3K", "54.3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7.65M", "7.65M"],
+    ["87654321", "87.7M", "87.7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1.09G", "1.09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1.4T", "1.4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9.99K", "9.99K"],
+    ["99944", "99.9K", "99.9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9.99M", "9.99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9.99G", "9.99G"],
+  ],
+  "he": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "‏4.32 אלף"],
+    ["54321", "54.3K", "‏54.3 אלף"],
+    ["654321", "654K", "‏654 אלף"],
+    ["7654321", "7.65M", "‏7.65 מיליון"],
+    ["87654321", "87.7M", "‏87.7 מיליון"],
+    ["987654321", "988M", "‏988 מיליון"],
+    ["1087654321", "1.09B", "‏1.09 מיליארד"],
+    ["11987654321", "12B", "‏12 מיליארד"],
+    ["129987654321", "130B", "‏130 מיליארד"],
+    ["1398987654321", "1.4T", "‏1.4 טריליון"],
+    ["14987987654321", "15T", "‏15 טריליון"],
+    ["159876987654321", "160T", "‏160 טריליון"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "‏10 אלף"],
+    ["99999", "100K", "‏100 אלף"],
+    ["99999", "100K", "‏100 אלף"],
+    ["999999", "1M", "‏1 מיליון"],
+    ["9999999", "10M", "‏10 מיליון"],
+    ["99999999", "100M", "‏100 מיליון"],
+    ["9994", "9.99K", "‏9.99 אלף"],
+    ["99944", "99.9K", "‏99.9 אלף"],
+    ["999444", "999K", "‏999 אלף"],
+    ["9994444", "9.99M", "‏9.99 מיליון"],
+    ["999444444", "999M", "‏999 מיליון"],
+    ["9994444444", "9.99B", "‏9.99 מיליארד"],
+  ],
+  "hi": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 हज़ार", "4.32 हज़ार"],
+    ["54321", "54.3 हज़ार", "54.3 हज़ार"],
+    ["654321", "6.54 लाख", "6.54 लाख"],
+    ["7654321", "76.5 लाख", "76.5 लाख"],
+    ["87654321", "8.77 क.", "8.77 करोड़"],
+    ["987654321", "98.8 क.", "98.8 करोड़"],
+    ["1087654321", "1.09 अ.", "1.09 अरब"],
+    ["11987654321", "12 अ.", "12 अरब"],
+    ["129987654321", "1.3 ख.", "1.3 खरब"],
+    ["1398987654321", "14 ख.", "14 खरब"],
+    ["14987987654321", "1.5 नील", "150 खरब"],
+    ["159876987654321", "16 नील", "1600 खरब"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 हज़ार", "10 हज़ार"],
+    ["99999", "1 लाख", "1 लाख"],
+    ["99999", "1 लाख", "1 लाख"],
+    ["999999", "10 लाख", "10 लाख"],
+    ["9999999", "1 क.", "1 करोड़"],
+    ["99999999", "10 क.", "10 करोड़"],
+    ["9994", "9.99 हज़ार", "9.99 हज़ार"],
+    ["99944", "99.9 हज़ार", "99.9 हज़ार"],
+    ["999444", "9.99 लाख", "9.99 लाख"],
+    ["9994444", "99.9 लाख", "99.9 लाख"],
+    ["999444444", "99.9 क.", "99.9 करोड़"],
+    ["9994444444", "9.99 अ.", "9.99 अरब"],
+  ],
+  "hr": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tis.", "4,32 tisuće"],
+    ["54321", "54,3 tis.", "54,3 tisuće"],
+    ["654321", "654 tis.", "654 tisuće"],
+    ["7654321", "7,65 mil.", "7,65 milijuna"],
+    ["87654321", "87,7 mil.", "87,7 milijuna"],
+    ["987654321", "988 mil.", "988 milijuna"],
+    ["1087654321", "1,09 mlr.", "1,09 milijardi"],
+    ["11987654321", "12 mlr.", "12 milijardi"],
+    ["129987654321", "130 mlr.", "130 milijardi"],
+    ["1398987654321", "1,4 bil.", "1,4 bilijuna"],
+    ["14987987654321", "15 bil.", "15 bilijuna"],
+    ["159876987654321", "160 bil.", "160 bilijuna"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tis.", "10 tisuća"],
+    ["99999", "100 tis.", "100 tisuća"],
+    ["99999", "100 tis.", "100 tisuća"],
+    ["999999", "1 mil.", "1 milijun"],
+    ["9999999", "10 mil.", "10 milijuna"],
+    ["99999999", "100 mil.", "100 milijuna"],
+    ["9994", "9,99 tis.", "9,99 tisuća"],
+    ["99944", "99,9 tis.", "99,9 tisuća"],
+    ["999444", "999 tis.", "999 tisuća"],
+    ["9994444", "9,99 mil.", "9,99 milijuna"],
+    ["999444444", "999 mil.", "999 milijuna"],
+    ["9994444444", "9,99 mlr.", "9,99 milijardi"],
+  ],
+  "hu": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 E", "4,32 ezer"],
+    ["54321", "54,3 E", "54,3 ezer"],
+    ["654321", "654 E", "654 ezer"],
+    ["7654321", "7,65 M", "7,65 millió"],
+    ["87654321", "87,7 M", "87,7 millió"],
+    ["987654321", "988 M", "988 millió"],
+    ["1087654321", "1,09 Mrd", "1,09 milliárd"],
+    ["11987654321", "12 Mrd", "12 milliárd"],
+    ["129987654321", "130 Mrd", "130 milliárd"],
+    ["1398987654321", "1,4 B", "1,4 billió"],
+    ["14987987654321", "15 B", "15 billió"],
+    ["159876987654321", "160 B", "160 billió"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 E", "10 ezer"],
+    ["99999", "100 E", "100 ezer"],
+    ["99999", "100 E", "100 ezer"],
+    ["999999", "1 M", "1 millió"],
+    ["9999999", "10 M", "10 millió"],
+    ["99999999", "100 M", "100 millió"],
+    ["9994", "9,99 E", "9,99 ezer"],
+    ["99944", "99,9 E", "99,9 ezer"],
+    ["999444", "999 E", "999 ezer"],
+    ["9994444", "9,99 M", "9,99 millió"],
+    ["999444444", "999 M", "999 millió"],
+    ["9994444444", "9,99 Mrd", "9,99 milliárd"],
+  ],
+  "hy": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 հզր", "4,32 հազար"],
+    ["54321", "54,3 հզր", "54,3 հազար"],
+    ["654321", "654 հզր", "654 հազար"],
+    ["7654321", "7,65 մլն", "7,65 միլիոն"],
+    ["87654321", "87,7 մլն", "87,7 միլիոն"],
+    ["987654321", "988 մլն", "988 միլիոն"],
+    ["1087654321", "1,09 մլրդ", "1,09 միլիարդ"],
+    ["11987654321", "12 մլրդ", "12 միլիարդ"],
+    ["129987654321", "130 մլրդ", "130 միլիարդ"],
+    ["1398987654321", "1,4 տրլն", "1,4 տրիլիոն"],
+    ["14987987654321", "15 տրլն", "15 տրիլիոն"],
+    ["159876987654321", "160 տրլն", "160 տրիլիոն"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 հզր", "10 հազար"],
+    ["99999", "100 հզր", "100 հազար"],
+    ["99999", "100 հզր", "100 հազար"],
+    ["999999", "1 մլն", "1 միլիոն"],
+    ["9999999", "10 մլն", "10 միլիոն"],
+    ["99999999", "100 մլն", "100 միլիոն"],
+    ["9994", "9,99 հզր", "9,99 հազար"],
+    ["99944", "99,9 հզր", "99,9 հազար"],
+    ["999444", "999 հզր", "999 հազար"],
+    ["9994444", "9,99 մլն", "9,99 միլիոն"],
+    ["999444444", "999 մլն", "999 միլիոն"],
+    ["9994444444", "9,99 մլրդ", "9,99 միլիարդ"],
+  ],
+  "id": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 rb", "4,32 ribu"],
+    ["54321", "54,3 rb", "54,3 ribu"],
+    ["654321", "654 rb", "654 ribu"],
+    ["7654321", "7,65 jt", "7,65 juta"],
+    ["87654321", "87,7 jt", "87,7 juta"],
+    ["987654321", "988 jt", "988 juta"],
+    ["1087654321", "1,09 M", "1,09 miliar"],
+    ["11987654321", "12 M", "12 miliar"],
+    ["129987654321", "130 M", "130 miliar"],
+    ["1398987654321", "1,4 T", "1,4 triliun"],
+    ["14987987654321", "15 T", "15 triliun"],
+    ["159876987654321", "160 T", "160 triliun"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 rb", "10 ribu"],
+    ["99999", "100 rb", "100 ribu"],
+    ["99999", "100 rb", "100 ribu"],
+    ["999999", "1 jt", "1 juta"],
+    ["9999999", "10 jt", "10 juta"],
+    ["99999999", "100 jt", "100 juta"],
+    ["9994", "9,99 rb", "9,99 ribu"],
+    ["99944", "99,9 rb", "99,9 ribu"],
+    ["999444", "999 rb", "999 ribu"],
+    ["9994444", "9,99 jt", "9,99 juta"],
+    ["999444444", "999 jt", "999 juta"],
+    ["9994444444", "9,99 M", "9,99 miliar"],
+  ],
+  "in": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 rb", "4,32 ribu"],
+    ["54321", "54,3 rb", "54,3 ribu"],
+    ["654321", "654 rb", "654 ribu"],
+    ["7654321", "7,65 jt", "7,65 juta"],
+    ["87654321", "87,7 jt", "87,7 juta"],
+    ["987654321", "988 jt", "988 juta"],
+    ["1087654321", "1,09 M", "1,09 miliar"],
+    ["11987654321", "12 M", "12 miliar"],
+    ["129987654321", "130 M", "130 miliar"],
+    ["1398987654321", "1,4 T", "1,4 triliun"],
+    ["14987987654321", "15 T", "15 triliun"],
+    ["159876987654321", "160 T", "160 triliun"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 rb", "10 ribu"],
+    ["99999", "100 rb", "100 ribu"],
+    ["99999", "100 rb", "100 ribu"],
+    ["999999", "1 jt", "1 juta"],
+    ["9999999", "10 jt", "10 juta"],
+    ["99999999", "100 jt", "100 juta"],
+    ["9994", "9,99 rb", "9,99 ribu"],
+    ["99944", "99,9 rb", "99,9 ribu"],
+    ["999444", "999 rb", "999 ribu"],
+    ["9994444", "9,99 jt", "9,99 juta"],
+    ["999444444", "999 jt", "999 juta"],
+    ["9994444444", "9,99 M", "9,99 miliar"],
+  ],
+  "is": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 þ.", "4,32 þúsund"],
+    ["54321", "54,3 þ.", "54,3 þúsund"],
+    ["654321", "654 þ.", "654 þúsund"],
+    ["7654321", "7,65 m.", "7,65 milljón"],
+    ["87654321", "87,7 m.", "87,7 milljón"],
+    ["987654321", "988 m.", "988 milljónir"],
+    ["1087654321", "1,09 ma.", "1,09 milljarður"],
+    ["11987654321", "12 ma.", "12 milljarðar"],
+    ["129987654321", "130 ma.", "130 milljarðar"],
+    ["1398987654321", "1,4 bn", "1,4 billjón"],
+    ["14987987654321", "15 bn", "15 billjónir"],
+    ["159876987654321", "160 bn", "160 billjónir"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 þ.", "10 þúsund"],
+    ["99999", "100 þ.", "100 þúsund"],
+    ["99999", "100 þ.", "100 þúsund"],
+    ["999999", "1 m.", "1 milljón"],
+    ["9999999", "10 m.", "10 milljónir"],
+    ["99999999", "100 m.", "100 milljónir"],
+    ["9994", "9,99 þ.", "9,99 þúsund"],
+    ["99944", "99,9 þ.", "99,9 þúsund"],
+    ["999444", "999 þ.", "999 þúsund"],
+    ["9994444", "9,99 m.", "9,99 milljón"],
+    ["999444444", "999 m.", "999 milljónir"],
+    ["9994444444", "9,99 ma.", "9,99 milljarður"],
+  ],
+  "it": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4,32 mila"],
+    ["54321", "54300", "54,3 mila"],
+    ["654321", "654000", "654 mila"],
+    ["7654321", "7,65 Mln", "7,65 milioni"],
+    ["87654321", "87,7 Mln", "87,7 milioni"],
+    ["987654321", "988 Mln", "988 milioni"],
+    ["1087654321", "1,09 Mld", "1,09 miliardi"],
+    ["11987654321", "12 Mld", "12 miliardi"],
+    ["129987654321", "130 Mld", "130 miliardi"],
+    ["1398987654321", "1,4 Bln", "1,4 mila miliardi"],
+    ["14987987654321", "15 Bln", "15 mila miliardi"],
+    ["159876987654321", "160 Bln", "160 mila miliardi"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10000", "10 mila"],
+    ["99999", "100000", "100 mila"],
+    ["99999", "100000", "100 mila"],
+    ["999999", "1 Mln", "1 milione"],
+    ["9999999", "10 Mln", "10 milioni"],
+    ["99999999", "100 Mln", "100 milioni"],
+    ["9994", "9990", "9,99 mila"],
+    ["99944", "99900", "99,9 mila"],
+    ["999444", "999000", "999 mila"],
+    ["9994444", "9,99 Mln", "9,99 milioni"],
+    ["999444444", "999 Mln", "999 milioni"],
+    ["9994444444", "9,99 Mld", "9,99 miliardi"],
+  ],
+  "iw": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "‏4.32 אלף"],
+    ["54321", "54.3K", "‏54.3 אלף"],
+    ["654321", "654K", "‏654 אלף"],
+    ["7654321", "7.65M", "‏7.65 מיליון"],
+    ["87654321", "87.7M", "‏87.7 מיליון"],
+    ["987654321", "988M", "‏988 מיליון"],
+    ["1087654321", "1.09B", "‏1.09 מיליארד"],
+    ["11987654321", "12B", "‏12 מיליארד"],
+    ["129987654321", "130B", "‏130 מיליארד"],
+    ["1398987654321", "1.4T", "‏1.4 טריליון"],
+    ["14987987654321", "15T", "‏15 טריליון"],
+    ["159876987654321", "160T", "‏160 טריליון"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "‏10 אלף"],
+    ["99999", "100K", "‏100 אלף"],
+    ["99999", "100K", "‏100 אלף"],
+    ["999999", "1M", "‏1 מיליון"],
+    ["9999999", "10M", "‏10 מיליון"],
+    ["99999999", "100M", "‏100 מיליון"],
+    ["9994", "9.99K", "‏9.99 אלף"],
+    ["99944", "99.9K", "‏99.9 אלף"],
+    ["999444", "999K", "‏999 אלף"],
+    ["9994444", "9.99M", "‏9.99 מיליון"],
+    ["999444444", "999M", "‏999 מיליון"],
+    ["9994444444", "9.99B", "‏9.99 מיליארד"],
+  ],
+  "ja": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4320", "4320"],
+    ["54321", "5.43万", "5.43万"],
+    ["654321", "65.4万", "65.4万"],
+    ["7654321", "765万", "765万"],
+    ["87654321", "8770万", "8770万"],
+    ["987654321", "9.88億", "9.88億"],
+    ["1087654321", "10.9億", "10.9億"],
+    ["11987654321", "120億", "120億"],
+    ["129987654321", "1300億", "1300億"],
+    ["1398987654321", "1.4兆", "1.4兆"],
+    ["14987987654321", "15兆", "15兆"],
+    ["159876987654321", "160兆", "160兆"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1万", "1万"],
+    ["99999", "10万", "10万"],
+    ["99999", "10万", "10万"],
+    ["999999", "100万", "100万"],
+    ["9999999", "1000万", "1000万"],
+    ["99999999", "1億", "1億"],
+    ["9994", "9990", "9990"],
+    ["99944", "9.99万", "9.99万"],
+    ["999444", "99.9万", "99.9万"],
+    ["9994444", "999万", "999万"],
+    ["999444444", "9.99億", "9.99億"],
+    ["9994444444", "99.9億", "99.9億"],
+  ],
+  "ka": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 ათ.", "4,32 ათასი"],
+    ["54321", "54,3 ათ.", "54,3 ათასი"],
+    ["654321", "654 ათ.", "654 ათასი"],
+    ["7654321", "7,65 მლნ.", "7,65 მილიონი"],
+    ["87654321", "87,7 მლნ.", "87,7 მილიონი"],
+    ["987654321", "988 მლნ.", "988 მილიონი"],
+    ["1087654321", "1,09 მლრდ.", "1,09 მილიარდი"],
+    ["11987654321", "12 მლრდ.", "12 მილიარდი"],
+    ["129987654321", "130 მლრ.", "130 მილიარდი"],
+    ["1398987654321", "1,4 ტრლ.", "1,4 ტრილიონი"],
+    ["14987987654321", "15 ტრლ.", "15 ტრილიონი"],
+    ["159876987654321", "160 ტრლ.", "160 ტრილიონი"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ათ.", "10 ათასი"],
+    ["99999", "100 ათ.", "100 ათასი"],
+    ["99999", "100 ათ.", "100 ათასი"],
+    ["999999", "1 მლნ.", "1 მილიონი"],
+    ["9999999", "10 მლნ.", "10 მილიონი"],
+    ["99999999", "100 მლნ.", "100 მილიონი"],
+    ["9994", "9,99 ათ.", "9,99 ათასი"],
+    ["99944", "99,9 ათ.", "99,9 ათასი"],
+    ["999444", "999 ათ.", "999 ათასი"],
+    ["9994444", "9,99 მლნ.", "9,99 მილიონი"],
+    ["999444444", "999 მლნ.", "999 მილიონი"],
+    ["9994444444", "9,99 მლრდ.", "9,99 მილიარდი"],
+  ],
+  "kk": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 мың", "4,32 мың"],
+    ["54321", "54,3 мың", "54,3 мың"],
+    ["654321", "654 м.", "654 мың"],
+    ["7654321", "7,65 млн", "7,65 миллион"],
+    ["87654321", "87,7 млн", "87,7 миллион"],
+    ["987654321", "988 млн", "988 миллион"],
+    ["1087654321", "1,09 млрд", "1,09 миллиард"],
+    ["11987654321", "12 млрд", "12 миллиард"],
+    ["129987654321", "130 млрд", "130 миллиард"],
+    ["1398987654321", "1,4 трлн", "1,4 триллион"],
+    ["14987987654321", "15 трлн", "15 триллион"],
+    ["159876987654321", "160 трлн", "160 триллион"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 мың", "10 мың"],
+    ["99999", "100 м.", "100 мың"],
+    ["99999", "100 м.", "100 мың"],
+    ["999999", "1 млн", "1 миллион"],
+    ["9999999", "10 млн", "10 миллион"],
+    ["99999999", "100 млн", "100 миллион"],
+    ["9994", "9,99 мың", "9,99 мың"],
+    ["99944", "99,9 мың", "99,9 мың"],
+    ["999444", "999 м.", "999 мың"],
+    ["9994444", "9,99 млн", "9,99 миллион"],
+    ["999444444", "999 млн", "999 миллион"],
+    ["9994444444", "9,99 млрд", "9,99 миллиард"],
+  ],
+  "km": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32ពាន់", "4,32ពាន់"],
+    ["54321", "5,43​មឺុន", "5,43​មឺុន"],
+    ["654321", "6,54សែន", "6,54សែន"],
+    ["7654321", "7,65លាន", "7,65លាន"],
+    ["87654321", "8,77​ដប់​លាន", "8,77​ដប់​លាន"],
+    ["987654321", "9,88​រយលាន", "9,88​រយលាន"],
+    ["1087654321", "1,09​កោដិ", "1,09​កោដិ"],
+    ["11987654321", "1,2​ដប់​កោដិ", "1,2​ដប់​កោដិ"],
+    ["129987654321", "1,3​រយ​កោដិ", "1,3​រយ​កោដិ"],
+    ["1398987654321", "1,4​ពាន់​កោដិ", "1,4​ពាន់​កោដិ"],
+    ["14987987654321", "1,5​មឺុន​កោដិ", "1,5​មឺុន​កោដិ"],
+    ["159876987654321", "1,6​សែន​កោដិ", "1,6​សែន​កោដិ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1​មឺុន", "1​មឺុន"],
+    ["99999", "1សែន", "1សែន"],
+    ["99999", "1សែន", "1សែន"],
+    ["999999", "1លាន", "1លាន"],
+    ["9999999", "1​ដប់​លាន", "1​ដប់​លាន"],
+    ["99999999", "1​រយលាន", "1​រយលាន"],
+    ["9994", "9,99ពាន់", "9,99ពាន់"],
+    ["99944", "9,99​មឺុន", "9,99​មឺុន"],
+    ["999444", "9,99សែន", "9,99សែន"],
+    ["9994444", "9,99លាន", "9,99លាន"],
+    ["999444444", "9,99​រយលាន", "9,99​រយលាន"],
+    ["9994444444", "9,99​កោដិ", "9,99​កោដិ"],
+  ],
+  "kn": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32ಸಾ", "4.32 ಸಾವಿರ"],
+    ["54321", "54.3ಸಾ", "54.3 ಸಾವಿರ"],
+    ["654321", "654ಸಾ", "654 ಸಾವಿರ"],
+    ["7654321", "7.65ಮಿ", "7.65 ಮಿಲಿಯನ್"],
+    ["87654321", "87.7ಮಿ", "87.7 ಮಿಲಿಯನ್"],
+    ["987654321", "988ಮಿ", "988 ಮಿಲಿಯನ್"],
+    ["1087654321", "1.09ಬಿ", "1.09 ಬಿಲಿಯನ್"],
+    ["11987654321", "12ಬಿ", "12 ಬಿಲಿಯನ್"],
+    ["129987654321", "130ಬಿ", "130 ಬಿಲಿಯನ್"],
+    ["1398987654321", "1.4ಟ್ರಿ", "1.4 ಟ್ರಿಲಿಯನ್‌"],
+    ["14987987654321", "15ಟ್ರಿ", "15 ಟ್ರಿಲಿಯನ್‌"],
+    ["159876987654321", "160ಟ್ರಿ", "160 ಟ್ರಿಲಿಯನ್‌"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10ಸಾ", "10 ಸಾವಿರ"],
+    ["99999", "100ಸಾ", "100 ಸಾವಿರ"],
+    ["99999", "100ಸಾ", "100 ಸಾವಿರ"],
+    ["999999", "1ಮಿ", "1 ಮಿಲಿಯನ್"],
+    ["9999999", "10ಮಿ", "10 ಮಿಲಿಯನ್"],
+    ["99999999", "100ಮಿ", "100 ಮಿಲಿಯನ್"],
+    ["9994", "9.99ಸಾ", "9.99 ಸಾವಿರ"],
+    ["99944", "99.9ಸಾ", "99.9 ಸಾವಿರ"],
+    ["999444", "999ಸಾ", "999 ಸಾವಿರ"],
+    ["9994444", "9.99ಮಿ", "9.99 ಮಿಲಿಯನ್"],
+    ["999444444", "999ಮಿ", "999 ಮಿಲಿಯನ್"],
+    ["9994444444", "9.99ಬಿ", "9.99 ಬಿಲಿಯನ್"],
+  ],
+  "ko": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32천", "4.32천"],
+    ["54321", "5.43만", "5.43만"],
+    ["654321", "65.4만", "65.4만"],
+    ["7654321", "765만", "765만"],
+    ["87654321", "8770만", "8770만"],
+    ["987654321", "9.88억", "9.88억"],
+    ["1087654321", "10.9억", "10.9억"],
+    ["11987654321", "120억", "120억"],
+    ["129987654321", "1300억", "1300억"],
+    ["1398987654321", "1.4조", "1.4조"],
+    ["14987987654321", "15조", "15조"],
+    ["159876987654321", "160조", "160조"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1만", "1만"],
+    ["99999", "10만", "10만"],
+    ["99999", "10만", "10만"],
+    ["999999", "100만", "100만"],
+    ["9999999", "1000만", "1000만"],
+    ["99999999", "1억", "1억"],
+    ["9994", "9.99천", "9.99천"],
+    ["99944", "9.99만", "9.99만"],
+    ["999444", "99.9만", "99.9만"],
+    ["9994444", "999만", "999만"],
+    ["999444444", "9.99억", "9.99억"],
+    ["9994444444", "99.9억", "99.9억"],
+  ],
+  "ky": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 миӊ", "4,32 миӊ"],
+    ["54321", "54,3 миӊ", "54,3 миӊ"],
+    ["654321", "654 миӊ", "654 миӊ"],
+    ["7654321", "7,65 млн", "7,65 миллион"],
+    ["87654321", "87,7 млн", "87,7 миллион"],
+    ["987654321", "988 млн", "988 миллион"],
+    ["1087654321", "1,09 млд", "1,09 миллиард"],
+    ["11987654321", "12 млд", "12 миллиард"],
+    ["129987654321", "130 млд", "130 миллиард"],
+    ["1398987654321", "1,4 трлн", "1,4 триллион"],
+    ["14987987654321", "15 трлн", "15 триллион"],
+    ["159876987654321", "160 трлн", "160 триллион"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 миӊ", "10 миӊ"],
+    ["99999", "100 миӊ", "100 миӊ"],
+    ["99999", "100 миӊ", "100 миӊ"],
+    ["999999", "1 млн", "1 миллион"],
+    ["9999999", "10 млн", "10 миллион"],
+    ["99999999", "100 млн", "100 миллион"],
+    ["9994", "9,99 миӊ", "9,99 миӊ"],
+    ["99944", "99,9 миӊ", "99,9 миӊ"],
+    ["999444", "999 миӊ", "999 миӊ"],
+    ["9994444", "9,99 млн", "9,99 миллион"],
+    ["999444444", "999 млн", "999 миллион"],
+    ["9994444444", "9,99 млд", "9,99 миллиард"],
+  ],
+  "ln": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32K", "4,32K"],
+    ["54321", "54,3K", "54,3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7,65M", "7,65M"],
+    ["87654321", "87,7M", "87,7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1,09G", "1,09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1,4T", "1,4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9,99K", "9,99K"],
+    ["99944", "99,9K", "99,9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9,99M", "9,99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9,99G", "9,99G"],
+  ],
+  "lo": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 ພັນ", "4,32 ພັນ"],
+    ["54321", "54,3 ພັນ", "54,3 ພັນ"],
+    ["654321", "654 ກີບ", "6,54 ແສນ"],
+    ["7654321", "7,65 ລ້ານ", "7,65 ລ້ານ"],
+    ["87654321", "87,7 ລ້ານ", "87,7 ລ້ານ"],
+    ["987654321", "988 ລ້ານ", "988 ລ້ານ"],
+    ["1087654321", "1,09 ຕື້", "1,09 ຕື້"],
+    ["11987654321", "12 ຕື້", "12 ຕື້"],
+    ["129987654321", "130 ຕື້", "130 ຕື້"],
+    ["1398987654321", "1,4 ລ້ານລ້ານ", "1,4 ລ້ານລ້ານ"],
+    ["14987987654321", "15ລລ", "15 ລ້ານລ້ານ"],
+    ["159876987654321", "160ລລ", "160 ລ້ານລ້ານ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ພັນ", "10 ພັນ"],
+    ["99999", "100 ກີບ", "1 ແສນ"],
+    ["99999", "100 ກີບ", "1 ແສນ"],
+    ["999999", "1 ລ້ານ", "1 ລ້ານ"],
+    ["9999999", "10 ລ້ານ", "10 ລ້ານ"],
+    ["99999999", "100 ລ້ານ", "100 ລ້ານ"],
+    ["9994", "9,99 ພັນ", "9,99 ພັນ"],
+    ["99944", "99,9 ພັນ", "99,9 ພັນ"],
+    ["999444", "999 ກີບ", "9,99 ແສນ"],
+    ["9994444", "9,99 ລ້ານ", "9,99 ລ້ານ"],
+    ["999444444", "999 ລ້ານ", "999 ລ້ານ"],
+    ["9994444444", "9,99 ຕື້", "9,99 ຕື້"],
+  ],
+  "lt": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tūkst.", "4,32 tūkstančio"],
+    ["54321", "54,3 tūkst.", "54,3 tūkstančio"],
+    ["654321", "654 tūkst.", "654 tūkstančiai"],
+    ["7654321", "7,65 mln.", "7,65 milijono"],
+    ["87654321", "87,7 mln.", "87,7 milijono"],
+    ["987654321", "988 mln.", "988 milijonai"],
+    ["1087654321", "1,09 mlrd.", "1,09 milijardo"],
+    ["11987654321", "12 mlrd.", "12 milijardų"],
+    ["129987654321", "130 mlrd.", "130 milijardų"],
+    ["1398987654321", "1,4 trln.", "1,4 trilijono"],
+    ["14987987654321", "15 trln.", "15 trilijonų"],
+    ["159876987654321", "160 trln.", "160 trilijonų"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tūkst.", "10 tūkstančių"],
+    ["99999", "100 tūkst.", "100 tūkstančių"],
+    ["99999", "100 tūkst.", "100 tūkstančių"],
+    ["999999", "1 mln.", "1 milijonas"],
+    ["9999999", "10 mln.", "10 milijonų"],
+    ["99999999", "100 mln.", "100 milijonų"],
+    ["9994", "9,99 tūkst.", "9,99 tūkstančio"],
+    ["99944", "99,9 tūkst.", "99,9 tūkstančio"],
+    ["999444", "999 tūkst.", "999 tūkstančiai"],
+    ["9994444", "9,99 mln.", "9,99 milijono"],
+    ["999444444", "999 mln.", "999 milijonai"],
+    ["9994444444", "9,99 mlrd.", "9,99 milijardo"],
+  ],
+  "lv": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tūkst.", "4,32 tūkstoši"],
+    ["54321", "54,3 tūkst.", "54,3 tūkstoši"],
+    ["654321", "654 tūkst.", "654 tūkstoši"],
+    ["7654321", "7,65 milj.", "7,65 miljoni"],
+    ["87654321", "87,7 milj.", "87,7 miljoni"],
+    ["987654321", "988 milj.", "988 miljoni"],
+    ["1087654321", "1,09 mljrd.", "1,09 miljardi"],
+    ["11987654321", "12 mljrd.", "12 miljardi"],
+    ["129987654321", "130 mljrd.", "130 miljardi"],
+    ["1398987654321", "1,4 trilj.", "1,4 triljoni"],
+    ["14987987654321", "15 trilj.", "15 triljoni"],
+    ["159876987654321", "160 trilj.", "160 triljoni"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tūkst.", "10 tūkstoši"],
+    ["99999", "100 tūkst.", "100 tūkstoši"],
+    ["99999", "100 tūkst.", "100 tūkstoši"],
+    ["999999", "1 milj.", "1 miljons"],
+    ["9999999", "10 milj.", "10 miljoni"],
+    ["99999999", "100 milj.", "100 miljoni"],
+    ["9994", "9,99 tūkst.", "9,99 tūkstoši"],
+    ["99944", "99,9 tūkst.", "99,9 tūkstoši"],
+    ["999444", "999 tūkst.", "999 tūkstoši"],
+    ["9994444", "9,99 milj.", "9,99 miljoni"],
+    ["999444444", "999 milj.", "999 miljoni"],
+    ["9994444444", "9,99 mljrd.", "9,99 miljardi"],
+  ],
+  "mk": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 илј.", "4,32 илјади"],
+    ["54321", "54,3 илј.", "54,3 илјади"],
+    ["654321", "654 илј.", "654 илјади"],
+    ["7654321", "7,65 мил.", "7,65 милиони"],
+    ["87654321", "87,7 мил.", "87,7 милиони"],
+    ["987654321", "988 М", "988 милиони"],
+    ["1087654321", "1,09 милј.", "1,09 милијарди"],
+    ["11987654321", "12 милј.", "12 милијарди"],
+    ["129987654321", "130 милј.", "130 милијарди"],
+    ["1398987654321", "1,4 трил.", "1,4 трилиони"],
+    ["14987987654321", "15 трил.", "15 трилиони"],
+    ["159876987654321", "160 трил.", "160 трилиони"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 илј.", "10 илјади"],
+    ["99999", "100 илј.", "100 илјади"],
+    ["99999", "100 илј.", "100 илјади"],
+    ["999999", "1 мил.", "1 милион"],
+    ["9999999", "10 мил.", "10 милиони"],
+    ["99999999", "100 М", "100 милиони"],
+    ["9994", "9,99 илј.", "9,99 илјади"],
+    ["99944", "99,9 илј.", "99,9 илјади"],
+    ["999444", "999 илј.", "999 илјади"],
+    ["9994444", "9,99 мил.", "9,99 милиони"],
+    ["999444444", "999 М", "999 милиони"],
+    ["9994444444", "9,99 милј.", "9,99 милијарди"],
+  ],
+  "ml": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 ആയിരം"],
+    ["54321", "54.3K", "54.3 ആയിരം"],
+    ["654321", "654K", "654 ആയിരം"],
+    ["7654321", "7.65M", "7.65 ദശലക്ഷം"],
+    ["87654321", "87.7M", "87.7 ദശലക്ഷം"],
+    ["987654321", "988M", "988 ദശലക്ഷം"],
+    ["1087654321", "1.09B", "1.09 ലക്ഷം കോടി"],
+    ["11987654321", "12B", "12 ലക്ഷം കോടി"],
+    ["129987654321", "130B", "130 ലക്ഷം കോടി"],
+    ["1398987654321", "1.4T", "1.4 ട്രില്യൺ"],
+    ["14987987654321", "15T", "15 ട്രില്യൺ"],
+    ["159876987654321", "160T", "160 ട്രില്യൺ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 ആയിരം"],
+    ["99999", "100K", "100 ആയിരം"],
+    ["99999", "100K", "100 ആയിരം"],
+    ["999999", "1M", "1 ദശലക്ഷം"],
+    ["9999999", "10M", "10 ദശലക്ഷം"],
+    ["99999999", "100M", "100 ദശലക്ഷം"],
+    ["9994", "9.99K", "9.99 ആയിരം"],
+    ["99944", "99.9K", "99.9 ആയിരം"],
+    ["999444", "999K", "999 ആയിരം"],
+    ["9994444", "9.99M", "9.99 ദശലക്ഷം"],
+    ["999444444", "999M", "999 ദശലക്ഷം"],
+    ["9994444444", "9.99B", "9.99 ലക്ഷം കോടി"],
+  ],
+  "mn": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32мянга", "4.32 мянга"],
+    ["54321", "54.3мянга", "54.3 мянга"],
+    ["654321", "654М", "654 мянга"],
+    ["7654321", "7.65сая", "7.65 сая"],
+    ["87654321", "87.7сая", "87.7 сая"],
+    ["987654321", "988сая", "988 сая"],
+    ["1087654321", "1.09тэрбум", "1.09 тэрбум"],
+    ["11987654321", "12Т", "12 тэрбум"],
+    ["129987654321", "130Т", "130 тэрбум"],
+    ["1398987654321", "1.4ИН", "1.4 их наяд"],
+    ["14987987654321", "15ИН", "15 их наяд"],
+    ["159876987654321", "160ИН", "160 их наяд"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10мянга", "10 мянга"],
+    ["99999", "100М", "100 мянга"],
+    ["99999", "100М", "100 мянга"],
+    ["999999", "1сая", "1 сая"],
+    ["9999999", "10сая", "10 сая"],
+    ["99999999", "100сая", "100 сая"],
+    ["9994", "9.99мянга", "9.99 мянга"],
+    ["99944", "99.9мянга", "99.9 мянга"],
+    ["999444", "999М", "999 мянга"],
+    ["9994444", "9.99сая", "9.99 сая"],
+    ["999444444", "999сая", "999 сая"],
+    ["9994444444", "9.99тэрбум", "9.99 тэрбум"],
+  ],
+  "mr": [
+    ["1", "१", "१"],
+    ["21", "२१", "२१"],
+    ["321", "३२१", "३२१"],
+    ["4321", "४.३२ ह", "४.३२ हजार"],
+    ["54321", "५४.३ ह", "५४.३ हजार"],
+    ["654321", "६.५४ लाख", "६.५४ लाख"],
+    ["7654321", "७६.५ लाख", "७६.५ लाख"],
+    ["87654321", "८.७७ कोटी", "८.७७ कोटी"],
+    ["987654321", "९८.८ कोटी", "९८.८ कोटी"],
+    ["1087654321", "१.०९ अब्ज", "१.०९ अब्ज"],
+    ["11987654321", "१२ अब्ज", "१२ अब्ज"],
+    ["129987654321", "१.३ खर्व", "१.३ खर्व"],
+    ["1398987654321", "१४ खर्व", "१४ खर्व"],
+    ["14987987654321", "१.५ पद्म", "१.५ पद्म"],
+    ["159876987654321", "१६ पद्म", "१६ पद्म"],
+    ["9", "९", "९"],
+    ["99", "९९", "९९"],
+    ["999", "९९९", "९९९"],
+    ["9999", "१० ह", "१० हजार"],
+    ["99999", "१ लाख", "१ लाख"],
+    ["99999", "१ लाख", "१ लाख"],
+    ["999999", "१० लाख", "१० लाख"],
+    ["9999999", "१ कोटी", "१ कोटी"],
+    ["99999999", "१० कोटी", "१० कोटी"],
+    ["9994", "९.९९ ह", "९.९९ हजार"],
+    ["99944", "९९.९ ह", "९९.९ हजार"],
+    ["999444", "९.९९ लाख", "९.९९ लाख"],
+    ["9994444", "९९.९ लाख", "९९.९ लाख"],
+    ["999444444", "९९.९ कोटी", "९९.९ कोटी"],
+    ["9994444444", "९.९९ अब्ज", "९.९९ अब्ज"],
+  ],
+  "ms": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 ribu"],
+    ["54321", "54.3K", "54.3 ribu"],
+    ["654321", "654K", "654 ribu"],
+    ["7654321", "7.65J", "7.65 juta"],
+    ["87654321", "87.7J", "87.7 juta"],
+    ["987654321", "988J", "988 juta"],
+    ["1087654321", "1.09B", "1.09 bilion"],
+    ["11987654321", "12B", "12 bilion"],
+    ["129987654321", "130B", "130 bilion"],
+    ["1398987654321", "1.4T", "1.4 trilion"],
+    ["14987987654321", "15T", "15 trilion"],
+    ["159876987654321", "160T", "160 trilion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 ribu"],
+    ["99999", "100K", "100 ribu"],
+    ["99999", "100K", "100 ribu"],
+    ["999999", "1J", "1 juta"],
+    ["9999999", "10J", "10 juta"],
+    ["99999999", "100J", "100 juta"],
+    ["9994", "9.99K", "9.99 ribu"],
+    ["99944", "99.9K", "99.9 ribu"],
+    ["999444", "999K", "999 ribu"],
+    ["9994444", "9.99J", "9.99 juta"],
+    ["999444444", "999J", "999 juta"],
+    ["9994444444", "9.99B", "9.99 bilion"],
+  ],
+  "mt": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32K"],
+    ["54321", "54.3K", "54.3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7.65M", "7.65M"],
+    ["87654321", "87.7M", "87.7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1.09G", "1.09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1.4T", "1.4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9.99K", "9.99K"],
+    ["99944", "99.9K", "99.9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9.99M", "9.99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9.99G", "9.99G"],
+  ],
+  "my": [
+    ["1", "၁", "၁"],
+    ["21", "၂၁", "၂၁"],
+    ["321", "၃၂၁", "၃၂၁"],
+    ["4321", "၄.၃၂ထောင်", "၄.၃၂ထောင်"],
+    ["54321", "၅.၄၃သောင်း", "၅.၄၃သောင်း"],
+    ["654321", "၆.၅၄သိန်း", "၆.၅၄သိန်း"],
+    ["7654321", "၇.၆၅သန်း", "၇.၆၅သန်း"],
+    ["87654321", "၈.၇၇ကုဋေ", "၈.၇၇ကုဋေ"],
+    ["987654321", "၉၈.၈ကုဋေ", "၉၈.၈ကုဋေ"],
+    ["1087654321", "ကုဋေ၁၀၉", "ကုဋေ၁၀၉"],
+    ["11987654321", "ကုဋေ၁.၂ထ", "ကုဋေ၁၂၀၀"],
+    ["129987654321", "ကုဋေ၁.၃သ", "ကုဋေ၁.၃သောင်း"],
+    ["1398987654321", "ဋေ၁.၄သိန်း", "ကုဋေ၁.၄သိန်း"],
+    ["14987987654321", "ဋေ၁.၅သန်း", "ကုဋေ၁.၅သန်း"],
+    ["159876987654321", "၁.၆ကောဋိ", "၁.၆ကောဋိ"],
+    ["9", "၉", "၉"],
+    ["99", "၉၉", "၉၉"],
+    ["999", "၉၉၉", "၉၉၉"],
+    ["9999", "၁သောင်း", "၁သောင်း"],
+    ["99999", "၁သိန်း", "၁သိန်း"],
+    ["99999", "၁သိန်း", "၁သိန်း"],
+    ["999999", "၁သန်း", "၁သန်း"],
+    ["9999999", "၁ကုဋေ", "၁ကုဋေ"],
+    ["99999999", "၁၀ကုဋေ", "၁၀ကုဋေ"],
+    ["9994", "၉.၉၉ထောင်", "၉.၉၉ထောင်"],
+    ["99944", "၉.၉၉သောင်း", "၉.၉၉သောင်း"],
+    ["999444", "၉.၉၉သိန်း", "၉.၉၉သိန်း"],
+    ["9994444", "၉.၉၉သန်း", "၉.၉၉သန်း"],
+    ["999444444", "၉၉.၉ကုဋေ", "၉၉.၉ကုဋေ"],
+    ["9994444444", "ကုဋေ၉၉၉", "ကုဋေ၉၉၉"],
+  ],
+  "nb": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32k", "4,32 tusen"],
+    ["54321", "54,3k", "54,3 tusen"],
+    ["654321", "654k", "654 tusen"],
+    ["7654321", "7,65 mill", "7,65 millioner"],
+    ["87654321", "87,7 mill", "87,7 millioner"],
+    ["987654321", "988 mill", "988 millioner"],
+    ["1087654321", "1,09 mrd", "1,09 milliarder"],
+    ["11987654321", "12 mrd", "12 milliarder"],
+    ["129987654321", "130 mrd", "130 milliarder"],
+    ["1398987654321", "1,4 bill", "1,4 billioner"],
+    ["14987987654321", "15 bill", "15 billioner"],
+    ["159876987654321", "160 bill", "160 billioner"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["999999", "1 mill", "1 million"],
+    ["9999999", "10 mill", "10 millioner"],
+    ["99999999", "100 mill", "100 millioner"],
+    ["9994", "9,99k", "9,99 tusen"],
+    ["99944", "99,9k", "99,9 tusen"],
+    ["999444", "999k", "999 tusen"],
+    ["9994444", "9,99 mill", "9,99 millioner"],
+    ["999444444", "999 mill", "999 millioner"],
+    ["9994444444", "9,99 mrd", "9,99 milliarder"],
+  ],
+  "ne": [
+    ["1", "१", "१"],
+    ["21", "२१", "२१"],
+    ["321", "३२१", "३२१"],
+    ["4321", "४.३२ हजार", "४.३२ हजार"],
+    ["54321", "५४.३ हजार", "५४.३ हजार"],
+    ["654321", "६.५४ लाख", "६.५४ लाख"],
+    ["7654321", "७६.५ लाख", "७.६५ करोड"],
+    ["87654321", "८.७७ करोड", "८७.७ करोड"],
+    ["987654321", "९८.८ करोड", "९८८ करोड"],
+    ["1087654321", "१.०९ अरब", "१.०९ अर्ब"],
+    ["11987654321", "१२ अरब", "१२ अर्ब"],
+    ["129987654321", "१.३ खरब", "१३० अरब"],
+    ["1398987654321", "१४ खरब", "१.४ खर्ब"],
+    ["14987987654321", "१.५ शंख", "१.५ शंख"],
+    ["159876987654321", "१६ शंख", "१६ शंख"],
+    ["9", "९", "९"],
+    ["99", "९९", "९९"],
+    ["999", "९९९", "९९९"],
+    ["9999", "१० हजार", "१० हजार"],
+    ["99999", "१ लाख", "१ लाख"],
+    ["99999", "१ लाख", "१ लाख"],
+    ["999999", "१० लाख", "१ करोड"],
+    ["9999999", "१ करोड", "१० करोड"],
+    ["99999999", "१० करोड", "१०० करोड"],
+    ["9994", "९.९९ हजार", "९.९९ हजार"],
+    ["99944", "९९.९ हजार", "९९.९ हजार"],
+    ["999444", "९.९९ लाख", "९.९९ लाख"],
+    ["9994444", "९९.९ लाख", "९.९९ करोड"],
+    ["999444444", "९९.९ करोड", "९९९ करोड"],
+    ["9994444444", "९.९९ अरब", "९.९९ अर्ब"],
+  ],
+  "nl": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32K", "4,32 duizend"],
+    ["54321", "54,3K", "54,3 duizend"],
+    ["654321", "654K", "654 duizend"],
+    ["7654321", "7,65 mln.", "7,65 miljoen"],
+    ["87654321", "87,7 mln.", "87,7 miljoen"],
+    ["987654321", "988 mln.", "988 miljoen"],
+    ["1087654321", "1,09 mld.", "1,09 miljard"],
+    ["11987654321", "12 mld.", "12 miljard"],
+    ["129987654321", "130 mld.", "130 miljard"],
+    ["1398987654321", "1,4 bln.", "1,4 biljoen"],
+    ["14987987654321", "15 bln.", "15 biljoen"],
+    ["159876987654321", "160 bln.", "160 biljoen"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 duizend"],
+    ["99999", "100K", "100 duizend"],
+    ["99999", "100K", "100 duizend"],
+    ["999999", "1 mln.", "1 miljoen"],
+    ["9999999", "10 mln.", "10 miljoen"],
+    ["99999999", "100 mln.", "100 miljoen"],
+    ["9994", "9,99K", "9,99 duizend"],
+    ["99944", "99,9K", "99,9 duizend"],
+    ["999444", "999K", "999 duizend"],
+    ["9994444", "9,99 mln.", "9,99 miljoen"],
+    ["999444444", "999 mln.", "999 miljoen"],
+    ["9994444444", "9,99 mld.", "9,99 miljard"],
+  ],
+  "no": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32k", "4,32 tusen"],
+    ["54321", "54,3k", "54,3 tusen"],
+    ["654321", "654k", "654 tusen"],
+    ["7654321", "7,65 mill", "7,65 millioner"],
+    ["87654321", "87,7 mill", "87,7 millioner"],
+    ["987654321", "988 mill", "988 millioner"],
+    ["1087654321", "1,09 mrd", "1,09 milliarder"],
+    ["11987654321", "12 mrd", "12 milliarder"],
+    ["129987654321", "130 mrd", "130 milliarder"],
+    ["1398987654321", "1,4 bill", "1,4 billioner"],
+    ["14987987654321", "15 bill", "15 billioner"],
+    ["159876987654321", "160 bill", "160 billioner"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["999999", "1 mill", "1 million"],
+    ["9999999", "10 mill", "10 millioner"],
+    ["99999999", "100 mill", "100 millioner"],
+    ["9994", "9,99k", "9,99 tusen"],
+    ["99944", "99,9k", "99,9 tusen"],
+    ["999444", "999k", "999 tusen"],
+    ["9994444", "9,99 mill", "9,99 millioner"],
+    ["999444444", "999 mill", "999 millioner"],
+    ["9994444444", "9,99 mrd", "9,99 milliarder"],
+  ],
+  "no_NO": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32k", "4,32 tusen"],
+    ["54321", "54,3k", "54,3 tusen"],
+    ["654321", "654k", "654 tusen"],
+    ["7654321", "7,65 mill", "7,65 millioner"],
+    ["87654321", "87,7 mill", "87,7 millioner"],
+    ["987654321", "988 mill", "988 millioner"],
+    ["1087654321", "1,09 mrd", "1,09 milliarder"],
+    ["11987654321", "12 mrd", "12 milliarder"],
+    ["129987654321", "130 mrd", "130 milliarder"],
+    ["1398987654321", "1,4 bill", "1,4 billioner"],
+    ["14987987654321", "15 bill", "15 billioner"],
+    ["159876987654321", "160 bill", "160 billioner"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10k", "10 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["99999", "100k", "100 tusen"],
+    ["999999", "1 mill", "1 million"],
+    ["9999999", "10 mill", "10 millioner"],
+    ["99999999", "100 mill", "100 millioner"],
+    ["9994", "9,99k", "9,99 tusen"],
+    ["99944", "99,9k", "99,9 tusen"],
+    ["999444", "999k", "999 tusen"],
+    ["9994444", "9,99 mill", "9,99 millioner"],
+    ["999444444", "999 mill", "999 millioner"],
+    ["9994444444", "9,99 mrd", "9,99 milliarder"],
+  ],
+  "or": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32K"],
+    ["54321", "54.3K", "54.3K"],
+    ["654321", "654K", "654K"],
+    ["7654321", "7.65M", "7.65M"],
+    ["87654321", "87.7M", "87.7M"],
+    ["987654321", "988M", "988M"],
+    ["1087654321", "1.09G", "1.09G"],
+    ["11987654321", "12G", "12G"],
+    ["129987654321", "130G", "130G"],
+    ["1398987654321", "1.4T", "1.4T"],
+    ["14987987654321", "15T", "15T"],
+    ["159876987654321", "160T", "160T"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10K"],
+    ["99999", "100K", "100K"],
+    ["99999", "100K", "100K"],
+    ["999999", "1M", "1M"],
+    ["9999999", "10M", "10M"],
+    ["99999999", "100M", "100M"],
+    ["9994", "9.99K", "9.99K"],
+    ["99944", "99.9K", "99.9K"],
+    ["999444", "999K", "999K"],
+    ["9994444", "9.99M", "9.99M"],
+    ["999444444", "999M", "999M"],
+    ["9994444444", "9.99G", "9.99G"],
+  ],
+  "pa": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 ਹਜ਼ਾਰ", "4.32 ਹਜ਼ਾਰ"],
+    ["54321", "54.3 ਹਜ਼ਾਰ", "54.3 ਹਜ਼ਾਰ"],
+    ["654321", "6.54 ਲੱਖ", "6.54 ਲੱਖ"],
+    ["7654321", "76.5 ਲੱਖ", "76.5 ਲੱਖ"],
+    ["87654321", "8.77 ਕਰੋੜ", "8.77 ਕਰੋੜ"],
+    ["987654321", "98.8 ਕਰੋੜ", "98.8 ਕਰੋੜ"],
+    ["1087654321", "1.09 ਅਰਬ", "1.09 ਅਰਬ"],
+    ["11987654321", "12 ਅਰਬ", "12 ਅਰਬ"],
+    ["129987654321", "1.3 ਖਰਬ", "1.3 ਖਰਬ"],
+    ["1398987654321", "14 ਖਰਬ", "14 ਖਰਬ"],
+    ["14987987654321", "1.5 ਨੀਲ", "1.5 ਨੀਲ"],
+    ["159876987654321", "16 ਨੀਲ", "16 ਨੀਲ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ਹਜ਼ਾਰ", "10 ਹਜ਼ਾਰ"],
+    ["99999", "1 ਲੱਖ", "1 ਲੱਖ"],
+    ["99999", "1 ਲੱਖ", "1 ਲੱਖ"],
+    ["999999", "10 ਲੱਖ", "10 ਲੱਖ"],
+    ["9999999", "1 ਕਰੋੜ", "1 ਕਰੋੜ"],
+    ["99999999", "10 ਕਰੋੜ", "10 ਕਰੋੜ"],
+    ["9994", "9.99 ਹਜ਼ਾਰ", "9.99 ਹਜ਼ਾਰ"],
+    ["99944", "99.9 ਹਜ਼ਾਰ", "99.9 ਹਜ਼ਾਰ"],
+    ["999444", "9.99 ਲੱਖ", "9.99 ਲੱਖ"],
+    ["9994444", "99.9 ਲੱਖ", "99.9 ਲੱਖ"],
+    ["999444444", "99.9 ਕਰੋੜ", "99.9 ਕਰੋੜ"],
+    ["9994444444", "9.99 ਅਰਬ", "9.99 ਅਰਬ"],
+  ],
+  "pl": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tys.", "4,32 tysiąca"],
+    ["54321", "54,3 tys.", "54,3 tysiąca"],
+    ["654321", "654 tys.", "654 tysiące"],
+    ["7654321", "7,65 mln", "7,65 miliona"],
+    ["87654321", "87,7 mln", "87,7 miliona"],
+    ["987654321", "988 mln", "988 milionów"],
+    ["1087654321", "1,09 mld", "1,09 miliarda"],
+    ["11987654321", "12 mld", "12 miliardów"],
+    ["129987654321", "130 mld", "130 miliardów"],
+    ["1398987654321", "1,4 bln", "1,4 biliona"],
+    ["14987987654321", "15 bln", "15 bilionów"],
+    ["159876987654321", "160 bln", "160 bilionów"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tys.", "10 tysięcy"],
+    ["99999", "100 tys.", "100 tysięcy"],
+    ["99999", "100 tys.", "100 tysięcy"],
+    ["999999", "1 mln", "1 milion"],
+    ["9999999", "10 mln", "10 milionów"],
+    ["99999999", "100 mln", "100 milionów"],
+    ["9994", "9,99 tys.", "9,99 tysiąca"],
+    ["99944", "99,9 tys.", "99,9 tysiąca"],
+    ["999444", "999 tys.", "999 tysięcy"],
+    ["9994444", "9,99 mln", "9,99 miliona"],
+    ["999444444", "999 mln", "999 milionów"],
+    ["9994444444", "9,99 mld", "9,99 miliarda"],
+  ],
+  "pt": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 mil", "4,32 mil"],
+    ["54321", "54,3 mil", "54,3 mil"],
+    ["654321", "654 mil", "654 mil"],
+    ["7654321", "7,65 mi", "7,65 milhões"],
+    ["87654321", "87,7 mi", "87,7 milhões"],
+    ["987654321", "988 mi", "988 milhões"],
+    ["1087654321", "1,09 bi", "1,09 bilhões"],
+    ["11987654321", "12 bi", "12 bilhões"],
+    ["129987654321", "130 bi", "130 bilhões"],
+    ["1398987654321", "1,4 tri", "1,4 trilhões"],
+    ["14987987654321", "15 tri", "15 trilhões"],
+    ["159876987654321", "160 tri", "160 trilhões"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 mil", "10 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["999999", "1 mi", "1 milhão"],
+    ["9999999", "10 mi", "10 milhões"],
+    ["99999999", "100 mi", "100 milhões"],
+    ["9994", "9,99 mil", "9,99 mil"],
+    ["99944", "99,9 mil", "99,9 mil"],
+    ["999444", "999 mil", "999 mil"],
+    ["9994444", "9,99 mi", "9,99 milhões"],
+    ["999444444", "999 mi", "999 milhões"],
+    ["9994444444", "9,99 bi", "9,99 bilhões"],
+  ],
+  "pt_BR": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 mil", "4,32 mil"],
+    ["54321", "54,3 mil", "54,3 mil"],
+    ["654321", "654 mil", "654 mil"],
+    ["7654321", "7,65 mi", "7,65 milhões"],
+    ["87654321", "87,7 mi", "87,7 milhões"],
+    ["987654321", "988 mi", "988 milhões"],
+    ["1087654321", "1,09 bi", "1,09 bilhões"],
+    ["11987654321", "12 bi", "12 bilhões"],
+    ["129987654321", "130 bi", "130 bilhões"],
+    ["1398987654321", "1,4 tri", "1,4 trilhões"],
+    ["14987987654321", "15 tri", "15 trilhões"],
+    ["159876987654321", "160 tri", "160 trilhões"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 mil", "10 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["999999", "1 mi", "1 milhão"],
+    ["9999999", "10 mi", "10 milhões"],
+    ["99999999", "100 mi", "100 milhões"],
+    ["9994", "9,99 mil", "9,99 mil"],
+    ["99944", "99,9 mil", "99,9 mil"],
+    ["999444", "999 mil", "999 mil"],
+    ["9994444", "9,99 mi", "9,99 milhões"],
+    ["999444444", "999 mi", "999 milhões"],
+    ["9994444444", "9,99 bi", "9,99 bilhões"],
+  ],
+  "pt_PT": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 mil", "4,32 mil"],
+    ["54321", "54,3 mil", "54,3 mil"],
+    ["654321", "654 mil", "654 mil"],
+    ["7654321", "7,65 M", "7,65 milhões"],
+    ["87654321", "87,7 M", "87,7 milhões"],
+    ["987654321", "988 M", "988 milhões"],
+    ["1087654321", "1,09 mM", "1,09 mil milhões"],
+    ["11987654321", "12 mM", "12 mil milhões"],
+    ["129987654321", "130 mM", "130 mil milhões"],
+    ["1398987654321", "1,4 Bi", "1,4 biliões"],
+    ["14987987654321", "15 Bi", "15 biliões"],
+    ["159876987654321", "160 Bi", "160 biliões"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 mil", "10 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["99999", "100 mil", "100 mil"],
+    ["999999", "1 M", "1 milhão"],
+    ["9999999", "10 M", "10 milhões"],
+    ["99999999", "100 M", "100 milhões"],
+    ["9994", "9,99 mil", "9,99 mil"],
+    ["99944", "99,9 mil", "99,9 mil"],
+    ["999444", "999 mil", "999 mil"],
+    ["9994444", "9,99 M", "9,99 milhões"],
+    ["999444444", "999 M", "999 milhões"],
+    ["9994444444", "9,99 mM", "9,99 mil milhões"],
+  ],
+  "ro": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 K", "4,32 mii"],
+    ["54321", "54,3 K", "54,3 mii"],
+    ["654321", "654 K", "654 de mii"],
+    ["7654321", "7,65 mil.", "7,65 milioane"],
+    ["87654321", "87,7 mil.", "87,7 milioane"],
+    ["987654321", "988 mil.", "988 de milioane"],
+    ["1087654321", "1,09 mld.", "1,09 miliarde"],
+    ["11987654321", "12 mld.", "12 miliarde"],
+    ["129987654321", "130 mld.", "130 de miliarde"],
+    ["1398987654321", "1,4 tril.", "1,4 trilioane"],
+    ["14987987654321", "15 tril.", "15 trilioane"],
+    ["159876987654321", "160 tril.", "160 de trilioane"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 K", "10 mii"],
+    ["99999", "100 K", "100 de mii"],
+    ["99999", "100 K", "100 de mii"],
+    ["999999", "1 mil.", "1 milion"],
+    ["9999999", "10 mil.", "10 milioane"],
+    ["99999999", "100 mil.", "100 de milioane"],
+    ["9994", "9,99 K", "9,99 mii"],
+    ["99944", "99,9 K", "99,9 mii"],
+    ["999444", "999 K", "999 de mii"],
+    ["9994444", "9,99 mil.", "9,99 milioane"],
+    ["999444444", "999 mil.", "999 de milioane"],
+    ["9994444444", "9,99 mld.", "9,99 miliarde"],
+  ],
+  "ru": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 тыс.", "4,32 тысячи"],
+    ["54321", "54,3 тыс.", "54,3 тысячи"],
+    ["654321", "654 тыс.", "654 тысячи"],
+    ["7654321", "7,65 млн", "7,65 миллиона"],
+    ["87654321", "87,7 млн", "87,7 миллиона"],
+    ["987654321", "988 млн", "988 миллионов"],
+    ["1087654321", "1,09 млрд", "1,09 миллиарда"],
+    ["11987654321", "12 млрд", "12 миллиардов"],
+    ["129987654321", "130 млрд", "130 миллиардов"],
+    ["1398987654321", "1,4 трлн", "1,4 триллиона"],
+    ["14987987654321", "15 трлн", "15 триллионов"],
+    ["159876987654321", "160 трлн", "160 триллионов"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 тыс.", "10 тысяч"],
+    ["99999", "100 тыс.", "100 тысяч"],
+    ["99999", "100 тыс.", "100 тысяч"],
+    ["999999", "1 млн", "1 миллион"],
+    ["9999999", "10 млн", "10 миллионов"],
+    ["99999999", "100 млн", "100 миллионов"],
+    ["9994", "9,99 тыс.", "9,99 тысячи"],
+    ["99944", "99,9 тыс.", "99,9 тысячи"],
+    ["999444", "999 тыс.", "999 тысяч"],
+    ["9994444", "9,99 млн", "9,99 миллиона"],
+    ["999444444", "999 млн", "999 миллионов"],
+    ["9994444444", "9,99 млрд", "9,99 миллиарда"],
+  ],
+  "si": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "ද4.32", "දහස 4.32"],
+    ["54321", "ද54.3", "දහස 54.3"],
+    ["654321", "ද654", "දහස 654"],
+    ["7654321", "මි7.65", "මිලියන 7.65"],
+    ["87654321", "මි87.7", "මිලියන 87.7"],
+    ["987654321", "මි988", "මිලියන 988"],
+    ["1087654321", "බි1.09", "බිලියන 1.09"],
+    ["11987654321", "බි12", "බිලියන 12"],
+    ["129987654321", "බි130", "බිලියන 130"],
+    ["1398987654321", "ට්‍රි1.4", "ට්‍රිලියන 1.4"],
+    ["14987987654321", "ට්‍රි15", "ට්‍රිලියන 15"],
+    ["159876987654321", "ට්‍රි160", "ට්‍රිලියන 160"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "ද10", "දහස 10"],
+    ["99999", "ද100", "දහස 100"],
+    ["99999", "ද100", "දහස 100"],
+    ["999999", "මි1", "මිලියන 1"],
+    ["9999999", "මි10", "මිලියන 10"],
+    ["99999999", "මි100", "මිලියන 100"],
+    ["9994", "ද9.99", "දහස 9.99"],
+    ["99944", "ද99.9", "දහස 99.9"],
+    ["999444", "ද999", "දහස 999"],
+    ["9994444", "මි9.99", "මිලියන 9.99"],
+    ["999444444", "මි999", "මිලියන 999"],
+    ["9994444444", "බි9.99", "බිලියන 9.99"],
+  ],
+  "sk": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tis.", "4,32 tisíca"],
+    ["54321", "54,3 tis.", "54,3 tisíca"],
+    ["654321", "654 tis.", "654 tisíc"],
+    ["7654321", "7,65 mil.", "7,65 milióna"],
+    ["87654321", "87,7 mil.", "87,7 milióna"],
+    ["987654321", "988 mil.", "988 miliónov"],
+    ["1087654321", "1,09 mld.", "1,09 miliardy"],
+    ["11987654321", "12 mld.", "12 miliárd"],
+    ["129987654321", "130 mld.", "130 miliárd"],
+    ["1398987654321", "1,4 bil.", "1,4 bilióna"],
+    ["14987987654321", "15 bil.", "15 biliónov"],
+    ["159876987654321", "160 bil.", "160 biliónov"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tis.", "10 tisíc"],
+    ["99999", "100 tis.", "100 tisíc"],
+    ["99999", "100 tis.", "100 tisíc"],
+    ["999999", "1 mil.", "1 milión"],
+    ["9999999", "10 mil.", "10 miliónov"],
+    ["99999999", "100 mil.", "100 miliónov"],
+    ["9994", "9,99 tis.", "9,99 tisíca"],
+    ["99944", "99,9 tis.", "99,9 tisíca"],
+    ["999444", "999 tis.", "999 tisíc"],
+    ["9994444", "9,99 mil.", "9,99 milióna"],
+    ["999444444", "999 mil.", "999 miliónov"],
+    ["9994444444", "9,99 mld.", "9,99 miliardy"],
+  ],
+  "sl": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tis.", "4,32 tisoč"],
+    ["54321", "54,3 tis.", "54,3 tisoč"],
+    ["654321", "654 tis.", "654 tisoč"],
+    ["7654321", "7,65 mio.", "7,65 milijone"],
+    ["87654321", "87,7 mio.", "87,7 milijoni"],
+    ["987654321", "988 mio.", "988 milijonov"],
+    ["1087654321", "1,09 mrd.", "1,09 milijarde"],
+    ["11987654321", "12 mrd.", "12 milijard"],
+    ["129987654321", "130 mrd.", "130 milijard"],
+    ["1398987654321", "1,4 bil.", "1,4 bilijoni"],
+    ["14987987654321", "15 bil.", "15 bilijonov"],
+    ["159876987654321", "160 bil.", "160 bilijonov"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tis.", "10 tisoč"],
+    ["99999", "100 tis.", "100 tisoč"],
+    ["99999", "100 tis.", "100 tisoč"],
+    ["999999", "1 mio.", "1 milijon"],
+    ["9999999", "10 mio.", "10 milijonov"],
+    ["99999999", "100 mio.", "100 milijonov"],
+    ["9994", "9,99 tis.", "9,99 tisoč"],
+    ["99944", "99,9 tis.", "99,9 tisoč"],
+    ["999444", "999 tis.", "999 tisoč"],
+    ["9994444", "9,99 mio.", "9,99 milijone"],
+    ["999444444", "999 mio.", "999 milijonov"],
+    ["9994444444", "9,99 mrd.", "9,99 milijarde"],
+  ],
+  "sq": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 mijë", "4,32 mijë"],
+    ["54321", "54,3 mijë", "54,3 mijë"],
+    ["654321", "654 mijë", "654 mijë"],
+    ["7654321", "7,65 Mln", "7,65 milion"],
+    ["87654321", "87,7 Mln", "87,7 milion"],
+    ["987654321", "988 Mln", "988 milion"],
+    ["1087654321", "1,09 Mld", "1,09 miliard"],
+    ["11987654321", "12 Mld", "12 miliard"],
+    ["129987654321", "130 Mld", "130 miliard"],
+    ["1398987654321", "1,4 Bln", "1,4 bilion"],
+    ["14987987654321", "15 Bln", "15 bilion"],
+    ["159876987654321", "160 Bln", "160 bilion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 mijë", "10 mijë"],
+    ["99999", "100 mijë", "100 mijë"],
+    ["99999", "100 mijë", "100 mijë"],
+    ["999999", "1 Mln", "1 milion"],
+    ["9999999", "10 Mln", "10 milion"],
+    ["99999999", "100 Mln", "100 milion"],
+    ["9994", "9,99 mijë", "9,99 mijë"],
+    ["99944", "99,9 mijë", "99,9 mijë"],
+    ["999444", "999 mijë", "999 mijë"],
+    ["9994444", "9,99 Mln", "9,99 milion"],
+    ["999444444", "999 Mln", "999 milion"],
+    ["9994444444", "9,99 Mld", "9,99 miliard"],
+  ],
+  "sr": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 хиљ.", "4,32 хиљаде"],
+    ["54321", "54,3 хиљ.", "54,3 хиљаде"],
+    ["654321", "654 хиљ.", "654 хиљаде"],
+    ["7654321", "7,65 мил.", "7,65 милиона"],
+    ["87654321", "87,7 мил.", "87,7 милиона"],
+    ["987654321", "988 мил.", "988 милиона"],
+    ["1087654321", "1,09 млрд.", "1,09 милијарди"],
+    ["11987654321", "12 млрд.", "12 милијарди"],
+    ["129987654321", "130 млрд.", "130 милијарди"],
+    ["1398987654321", "1,4 бил.", "1,4 билиона"],
+    ["14987987654321", "15 бил.", "15 билиона"],
+    ["159876987654321", "160 бил.", "160 билиона"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 хиљ.", "10 хиљада"],
+    ["99999", "100 хиљ.", "100 хиљада"],
+    ["99999", "100 хиљ.", "100 хиљада"],
+    ["999999", "1 мил.", "1 милион"],
+    ["9999999", "10 мил.", "10 милиона"],
+    ["99999999", "100 мил.", "100 милиона"],
+    ["9994", "9,99 хиљ.", "9,99 хиљада"],
+    ["99944", "99,9 хиљ.", "99,9 хиљада"],
+    ["999444", "999 хиљ.", "999 хиљада"],
+    ["9994444", "9,99 мил.", "9,99 милиона"],
+    ["999444444", "999 мил.", "999 милиона"],
+    ["9994444444", "9,99 млрд.", "9,99 милијарди"],
+  ],
+  "sr_Latn": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 hilj.", "4,32 hiljade"],
+    ["54321", "54,3 hilj.", "54,3 hiljade"],
+    ["654321", "654 hilj.", "654 hiljade"],
+    ["7654321", "7,65 mil.", "7,65 miliona"],
+    ["87654321", "87,7 mil.", "87,7 miliona"],
+    ["987654321", "988 mil.", "988 miliona"],
+    ["1087654321", "1,09 mlrd.", "1,09 milijardi"],
+    ["11987654321", "12 mlrd.", "12 milijardi"],
+    ["129987654321", "130 mlrd.", "130 milijardi"],
+    ["1398987654321", "1,4 bil.", "1,4 biliona"],
+    ["14987987654321", "15 bil.", "15 biliona"],
+    ["159876987654321", "160 bil.", "160 biliona"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 hilj.", "10 hiljada"],
+    ["99999", "100 hilj.", "100 hiljada"],
+    ["99999", "100 hilj.", "100 hiljada"],
+    ["999999", "1 mil.", "1 milion"],
+    ["9999999", "10 mil.", "10 miliona"],
+    ["99999999", "100 mil.", "100 miliona"],
+    ["9994", "9,99 hilj.", "9,99 hiljada"],
+    ["99944", "99,9 hilj.", "99,9 hiljada"],
+    ["999444", "999 hilj.", "999 hiljada"],
+    ["9994444", "9,99 mil.", "9,99 miliona"],
+    ["999444444", "999 mil.", "999 miliona"],
+    ["9994444444", "9,99 mlrd.", "9,99 milijardi"],
+  ],
+  "sv": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 tn", "4,32 tusen"],
+    ["54321", "54,3 tn", "54,3 tusen"],
+    ["654321", "654 tn", "654 tusen"],
+    ["7654321", "7,65 mn", "7,65 miljoner"],
+    ["87654321", "87,7 mn", "87,7 miljoner"],
+    ["987654321", "988 mn", "988 miljoner"],
+    ["1087654321", "1,09 md", "1,09 miljarder"],
+    ["11987654321", "12 md", "12 miljarder"],
+    ["129987654321", "130 md", "130 miljarder"],
+    ["1398987654321", "1,4 bn", "1,4 biljoner"],
+    ["14987987654321", "15 bn", "15 biljoner"],
+    ["159876987654321", "160 bn", "160 biljoner"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 tn", "10 tusen"],
+    ["99999", "100 tn", "100 tusen"],
+    ["99999", "100 tn", "100 tusen"],
+    ["999999", "1 mn", "1 miljon"],
+    ["9999999", "10 mn", "10 miljoner"],
+    ["99999999", "100 mn", "100 miljoner"],
+    ["9994", "9,99 tn", "9,99 tusen"],
+    ["99944", "99,9 tn", "99,9 tusen"],
+    ["999444", "999 tn", "999 tusen"],
+    ["9994444", "9,99 mn", "9,99 miljoner"],
+    ["999444444", "999 mn", "999 miljoner"],
+    ["9994444444", "9,99 md", "9,99 miljarder"],
+  ],
+  "sw": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "elfu 4.32", "Elfu 4.32"],
+    ["54321", "elfu 54.3", "Elfu 54.3"],
+    ["654321", "elfu 654", "Elfu 654"],
+    ["7654321", "M7.65", "Milioni 7.65"],
+    ["87654321", "M87.7", "Milioni 87.7"],
+    ["987654321", "M988", "Milioni 988"],
+    ["1087654321", "B1.09", "Bilioni 1.09"],
+    ["11987654321", "B12", "Bilioni 12"],
+    ["129987654321", "B130", "Bilioni 130"],
+    ["1398987654321", "T1.4", "Trilioni 1.4"],
+    ["14987987654321", "T15", "Trilioni 15"],
+    ["159876987654321", "T160", "Trilioni 160"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "elfu 10", "Elfu 10"],
+    ["99999", "elfu 100", "Elfu 100"],
+    ["99999", "elfu 100", "Elfu 100"],
+    ["999999", "M1", "Milioni 1"],
+    ["9999999", "M10", "Milioni 10"],
+    ["99999999", "M100", "Milioni 100"],
+    ["9994", "elfu 9.99", "Elfu 9.99"],
+    ["99944", "elfu 99.9", "Elfu 99.9"],
+    ["999444", "elfu 999", "Elfu 999"],
+    ["9994444", "M9.99", "Milioni 9.99"],
+    ["999444444", "M999", "Milioni 999"],
+    ["9994444444", "B9.99", "Bilioni 9.99"],
+  ],
+  "ta": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32ஆ", "4.32 ஆயிரம்"],
+    ["54321", "54.3ஆ", "54.3 ஆயிரம்"],
+    ["654321", "654ஆ", "654 ஆயிரம்"],
+    ["7654321", "7.65மி", "7.65 மில்லியன்"],
+    ["87654321", "87.7மி", "87.7 மில்லியன்"],
+    ["987654321", "988மி", "988 மில்லியன்"],
+    ["1087654321", "1.09பி", "1.09 பில்லியன்"],
+    ["11987654321", "12பி", "12 பில்லியன்"],
+    ["129987654321", "130பி", "130 பில்லியன்"],
+    ["1398987654321", "1.4டி", "1.4 டிரில்லியன்"],
+    ["14987987654321", "15டி", "15 டிரில்லியன்"],
+    ["159876987654321", "160டி", "160 டிரில்லியன்"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10ஆ", "10 ஆயிரம்"],
+    ["99999", "100ஆ", "100 ஆயிரம்"],
+    ["99999", "100ஆ", "100 ஆயிரம்"],
+    ["999999", "1மி", "1 மில்லியன்"],
+    ["9999999", "10மி", "10 மில்லியன்"],
+    ["99999999", "100மி", "100 மில்லியன்"],
+    ["9994", "9.99ஆ", "9.99 ஆயிரம்"],
+    ["99944", "99.9ஆ", "99.9 ஆயிரம்"],
+    ["999444", "999ஆ", "999 ஆயிரம்"],
+    ["9994444", "9.99மி", "9.99 மில்லியன்"],
+    ["999444444", "999மி", "999 மில்லியன்"],
+    ["9994444444", "9.99பி", "9.99 பில்லியன்"],
+  ],
+  "te": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32వే", "4.32 వేలు"],
+    ["54321", "54.3వే", "54.3 వేలు"],
+    ["654321", "654వే", "654 వేలు"],
+    ["7654321", "7.65మి", "7.65 మిలియన్లు"],
+    ["87654321", "87.7మి", "87.7 మిలియన్లు"],
+    ["987654321", "988మి", "988 మిలియన్లు"],
+    ["1087654321", "1.09బి", "1.09 బిలియన్లు"],
+    ["11987654321", "12బి", "12 బిలియన్లు"],
+    ["129987654321", "130బి", "130 బిలియన్లు"],
+    ["1398987654321", "1.4ట్రి", "1.4 ట్రిలియన్లు"],
+    ["14987987654321", "15ట్రి", "15 ట్రిలియన్లు"],
+    ["159876987654321", "160ట్రి", "160 ట్రిలియన్లు"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10వే", "10 వేలు"],
+    ["99999", "100వే", "100 వేలు"],
+    ["99999", "100వే", "100 వేలు"],
+    ["999999", "1మి", "1 మిలియన్"],
+    ["9999999", "10మి", "10 మిలియన్లు"],
+    ["99999999", "100మి", "100 మిలియన్లు"],
+    ["9994", "9.99వే", "9.99 వేలు"],
+    ["99944", "99.9వే", "99.9 వేలు"],
+    ["999444", "999వే", "999 వేలు"],
+    ["9994444", "9.99మి", "9.99 మిలియన్లు"],
+    ["999444444", "999మి", "999 మిలియన్లు"],
+    ["9994444444", "9.99బి", "9.99 బిలియన్లు"],
+  ],
+  "th": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 พ.", "4.32 พัน"],
+    ["54321", "5.43 ม.", "5.43 หมื่น"],
+    ["654321", "6.54 ส.", "6.54 แสน"],
+    ["7654321", "7.65 ล.", "7.65 ล้าน"],
+    ["87654321", "87.7 ล.", "87.7 ล้าน"],
+    ["987654321", "988 ล.", "988 ล้าน"],
+    ["1087654321", "1.09 พ.ล.", "1.09 พันล้าน"],
+    ["11987654321", "1.2 ม.ล.", "1.2 หมื่นล้าน"],
+    ["129987654321", "1.3 ส.ล.", "1.3 แสนล้าน"],
+    ["1398987654321", "1.4 ล.ล.", "1.4 ล้านล้าน"],
+    ["14987987654321", "15 ล.ล.", "15 ล้านล้าน"],
+    ["159876987654321", "160 ล.ล.", "160 ล้านล้าน"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1 ม.", "1 หมื่น"],
+    ["99999", "1 ส.", "1 แสน"],
+    ["99999", "1 ส.", "1 แสน"],
+    ["999999", "1 ล.", "1 ล้าน"],
+    ["9999999", "10 ล.", "10 ล้าน"],
+    ["99999999", "100 ล.", "100 ล้าน"],
+    ["9994", "9.99 พ.", "9.99 พัน"],
+    ["99944", "9.99 ม.", "9.99 หมื่น"],
+    ["999444", "9.99 ส.", "9.99 แสน"],
+    ["9994444", "9.99 ล.", "9.99 ล้าน"],
+    ["999444444", "999 ล.", "999 ล้าน"],
+    ["9994444444", "9.99 พ.ล.", "9.99 พันล้าน"],
+  ],
+  "tl": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 libo"],
+    ["54321", "54.3K", "54.3 libo"],
+    ["654321", "654K", "654 na libo"],
+    ["7654321", "7.65M", "7.65 milyon"],
+    ["87654321", "87.7M", "87.7 milyon"],
+    ["987654321", "988M", "988 milyon"],
+    ["1087654321", "1.09B", "1.09 bilyon"],
+    ["11987654321", "12B", "12 bilyon"],
+    ["129987654321", "130B", "130 bilyon"],
+    ["1398987654321", "1.4T", "1.4 na trilyon"],
+    ["14987987654321", "15T", "15 trilyon"],
+    ["159876987654321", "160T", "160 trilyon"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 libo"],
+    ["99999", "100K", "100 libo"],
+    ["99999", "100K", "100 libo"],
+    ["999999", "1M", "1 milyon"],
+    ["9999999", "10M", "10 milyon"],
+    ["99999999", "100M", "100 milyon"],
+    ["9994", "9.99K", "9.99 na libo"],
+    ["99944", "99.9K", "99.9 na libo"],
+    ["999444", "999K", "999 na libo"],
+    ["9994444", "9.99M", "9.99 na milyon"],
+    ["999444444", "999M", "999 na milyon"],
+    ["9994444444", "9.99B", "9.99 na bilyon"],
+  ],
+  "tr": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 B", "4,32 bin"],
+    ["54321", "54,3 B", "54,3 bin"],
+    ["654321", "654 B", "654 bin"],
+    ["7654321", "7,65 Mn", "7,65 milyon"],
+    ["87654321", "87,7 Mn", "87,7 milyon"],
+    ["987654321", "988 Mn", "988 milyon"],
+    ["1087654321", "1,09 Mr", "1,09 milyar"],
+    ["11987654321", "12 Mr", "12 milyar"],
+    ["129987654321", "130 Mr", "130 milyar"],
+    ["1398987654321", "1,4 Tn", "1,4 trilyon"],
+    ["14987987654321", "15 Tn", "15 trilyon"],
+    ["159876987654321", "160 Tn", "160 trilyon"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 B", "10 bin"],
+    ["99999", "100 B", "100 bin"],
+    ["99999", "100 B", "100 bin"],
+    ["999999", "1 Mn", "1 milyon"],
+    ["9999999", "10 Mn", "10 milyon"],
+    ["99999999", "100 Mn", "100 milyon"],
+    ["9994", "9,99 B", "9,99 bin"],
+    ["99944", "99,9 B", "99,9 bin"],
+    ["999444", "999 B", "999 bin"],
+    ["9994444", "9,99 Mn", "9,99 milyon"],
+    ["999444444", "999 Mn", "999 milyon"],
+    ["9994444444", "9,99 Mr", "9,99 milyar"],
+  ],
+  "uk": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 тис.", "4,32 тисячі"],
+    ["54321", "54,3 тис.", "54,3 тисячі"],
+    ["654321", "654 тис.", "654 тисячі"],
+    ["7654321", "7,65 млн", "7,65 мільйона"],
+    ["87654321", "87,7 млн", "87,7 мільйона"],
+    ["987654321", "988 млн", "988 мільйонів"],
+    ["1087654321", "1,09 млрд", "1,09 мільярда"],
+    ["11987654321", "12 млрд", "12 мільярдів"],
+    ["129987654321", "130 млрд", "130 мільярдів"],
+    ["1398987654321", "1,4 трлн", "1,4 трильйона"],
+    ["14987987654321", "15 трлн", "15 трильйонів"],
+    ["159876987654321", "160 трлн", "160 трильйонів"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 тис.", "10 тисяч"],
+    ["99999", "100 тис.", "100 тисяч"],
+    ["99999", "100 тис.", "100 тисяч"],
+    ["999999", "1 млн", "1 мільйон"],
+    ["9999999", "10 млн", "10 мільйонів"],
+    ["99999999", "100 млн", "100 мільйонів"],
+    ["9994", "9,99 тис.", "9,99 тисячі"],
+    ["99944", "99,9 тис.", "99,9 тисячі"],
+    ["999444", "999 тис.", "999 тисяч"],
+    ["9994444", "9,99 млн", "9,99 мільйона"],
+    ["999444444", "999 млн", "999 мільйонів"],
+    ["9994444444", "9,99 млрд", "9,99 мільярда"],
+  ],
+  "ur": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32 ہزار", "4.32 ہزار"],
+    ["54321", "54.3 ہزار", "54.3 ہزار"],
+    ["654321", "6.54 لاکھ", "6.54 لاکھ"],
+    ["7654321", "76.5 لاکھ", "76.5 لاکھ"],
+    ["87654321", "8.77 کروڑ", "8.77 کروڑ"],
+    ["987654321", "98.8 کروڑ", "98.8 کروڑ"],
+    ["1087654321", "1.09 ارب", "1.09 ارب"],
+    ["11987654321", "12 ارب", "12 ارب"],
+    ["129987654321", "1.3 کھرب", "1.3 کھرب"],
+    ["1398987654321", "14 کھرب", "14 کھرب"],
+    ["14987987654321", "15 ٹریلین", "15 ٹریلین"],
+    ["159876987654321", "160 ٹریلین", "160 ٹریلین"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ہزار", "10 ہزار"],
+    ["99999", "1 لاکھ", "1 لاکھ"],
+    ["99999", "1 لاکھ", "1 لاکھ"],
+    ["999999", "10 لاکھ", "10 لاکھ"],
+    ["9999999", "1 کروڑ", "1 کروڑ"],
+    ["99999999", "10 کروڑ", "10 کروڑ"],
+    ["9994", "9.99 ہزار", "9.99 ہزار"],
+    ["99944", "99.9 ہزار", "99.9 ہزار"],
+    ["999444", "9.99 لاکھ", "9.99 لاکھ"],
+    ["9994444", "99.9 لاکھ", "99.9 لاکھ"],
+    ["999444444", "99.9 کروڑ", "99.9 کروڑ"],
+    ["9994444444", "9.99 ارب", "9.99 ارب"],
+  ],
+  "uz": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 ming", "4,32 ming"],
+    ["54321", "54,3 ming", "54,3 ming"],
+    ["654321", "654 ming", "654 ming"],
+    ["7654321", "7,65 mln", "7,65 million"],
+    ["87654321", "87,7 mln", "87,7 million"],
+    ["987654321", "988 mln", "988 million"],
+    ["1087654321", "1,09 mlrd", "1,09 milliard"],
+    ["11987654321", "12 mlrd", "12 milliard"],
+    ["129987654321", "130 mlrd", "130 milliard"],
+    ["1398987654321", "1,4 trln", "1,4 trillion"],
+    ["14987987654321", "15 trln", "15 trillion"],
+    ["159876987654321", "160 trln", "160 trillion"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 ming", "10 ming"],
+    ["99999", "100 ming", "100 ming"],
+    ["99999", "100 ming", "100 ming"],
+    ["999999", "1 mln", "1 million"],
+    ["9999999", "10 mln", "10 million"],
+    ["99999999", "100 mln", "100 million"],
+    ["9994", "9,99 ming", "9,99 ming"],
+    ["99944", "99,9 ming", "99,9 ming"],
+    ["999444", "999 ming", "999 ming"],
+    ["9994444", "9,99 mln", "9,99 million"],
+    ["999444444", "999 mln", "999 million"],
+    ["9994444444", "9,99 mlrd", "9,99 milliard"],
+  ],
+  "vi": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4,32 N", "4,32 nghìn"],
+    ["54321", "54,3 N", "54,3 nghìn"],
+    ["654321", "654 N", "654 nghìn"],
+    ["7654321", "7,65 Tr", "7,65 triệu"],
+    ["87654321", "87,7 Tr", "87,7 triệu"],
+    ["987654321", "988 Tr", "988 triệu"],
+    ["1087654321", "1,09 T", "1,09 tỷ"],
+    ["11987654321", "12 T", "12 tỷ"],
+    ["129987654321", "130 T", "130 tỷ"],
+    ["1398987654321", "1,4 NT", "1,4 nghìn tỷ"],
+    ["14987987654321", "15 NT", "15 nghìn tỷ"],
+    ["159876987654321", "160 NT", "160 nghìn tỷ"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10 N", "10 nghìn"],
+    ["99999", "100 N", "100 nghìn"],
+    ["99999", "100 N", "100 nghìn"],
+    ["999999", "1 Tr", "1 triệu"],
+    ["9999999", "10 Tr", "10 triệu"],
+    ["99999999", "100 Tr", "100 triệu"],
+    ["9994", "9,99 N", "9,99 nghìn"],
+    ["99944", "99,9 N", "99,9 nghìn"],
+    ["999444", "999 N", "999 nghìn"],
+    ["9994444", "9,99 Tr", "9,99 triệu"],
+    ["999444444", "999 Tr", "999 triệu"],
+    ["9994444444", "9,99 T", "9,99 tỷ"],
+  ],
+  "zh": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32千", "4.32千"],
+    ["54321", "5.43万", "5.43万"],
+    ["654321", "65.4万", "65.4万"],
+    ["7654321", "765万", "765万"],
+    ["87654321", "8770万", "8770万"],
+    ["987654321", "9.88亿", "9.88亿"],
+    ["1087654321", "10.9亿", "10.9亿"],
+    ["11987654321", "120亿", "120亿"],
+    ["129987654321", "1300亿", "1300亿"],
+    ["1398987654321", "1.4兆", "1.4兆"],
+    ["14987987654321", "15兆", "15兆"],
+    ["159876987654321", "160兆", "160兆"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1万", "1万"],
+    ["99999", "10万", "10万"],
+    ["99999", "10万", "10万"],
+    ["999999", "100万", "100万"],
+    ["9999999", "1000万", "1000万"],
+    ["99999999", "1亿", "1亿"],
+    ["9994", "9.99千", "9.99千"],
+    ["99944", "9.99万", "9.99万"],
+    ["999444", "99.9万", "99.9万"],
+    ["9994444", "999万", "999万"],
+    ["999444444", "9.99亿", "9.99亿"],
+    ["9994444444", "99.9亿", "99.9亿"],
+  ],
+  "zh_CN": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32千", "4.32千"],
+    ["54321", "5.43万", "5.43万"],
+    ["654321", "65.4万", "65.4万"],
+    ["7654321", "765万", "765万"],
+    ["87654321", "8770万", "8770万"],
+    ["987654321", "9.88亿", "9.88亿"],
+    ["1087654321", "10.9亿", "10.9亿"],
+    ["11987654321", "120亿", "120亿"],
+    ["129987654321", "1300亿", "1300亿"],
+    ["1398987654321", "1.4兆", "1.4兆"],
+    ["14987987654321", "15兆", "15兆"],
+    ["159876987654321", "160兆", "160兆"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1万", "1万"],
+    ["99999", "10万", "10万"],
+    ["99999", "10万", "10万"],
+    ["999999", "100万", "100万"],
+    ["9999999", "1000万", "1000万"],
+    ["99999999", "1亿", "1亿"],
+    ["9994", "9.99千", "9.99千"],
+    ["99944", "9.99万", "9.99万"],
+    ["999444", "99.9万", "99.9万"],
+    ["9994444", "999万", "999万"],
+    ["999444444", "9.99亿", "9.99亿"],
+    ["9994444444", "99.9亿", "99.9亿"],
+  ],
+  "zh_HK": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32千"],
+    ["54321", "54.3K", "5.43萬"],
+    ["654321", "654K", "65.4萬"],
+    ["7654321", "7.65M", "765萬"],
+    ["87654321", "87.7M", "8770萬"],
+    ["987654321", "988M", "9.88億"],
+    ["1087654321", "1.09B", "10.9億"],
+    ["11987654321", "12B", "120億"],
+    ["129987654321", "130B", "1300億"],
+    ["1398987654321", "1.4T", "1.4兆"],
+    ["14987987654321", "15T", "15兆"],
+    ["159876987654321", "160T", "160兆"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "1萬"],
+    ["99999", "100K", "10萬"],
+    ["99999", "100K", "10萬"],
+    ["999999", "1M", "100萬"],
+    ["9999999", "10M", "1000萬"],
+    ["99999999", "100M", "1億"],
+    ["9994", "9.99K", "9.99千"],
+    ["99944", "99.9K", "9.99萬"],
+    ["999444", "999K", "99.9萬"],
+    ["9994444", "9.99M", "999萬"],
+    ["999444444", "999M", "9.99億"],
+    ["9994444444", "9.99B", "99.9億"],
+  ],
+  "zh_TW": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32千", "4.32千"],
+    ["54321", "5.43萬", "5.43萬"],
+    ["654321", "65.4萬", "65.4萬"],
+    ["7654321", "765萬", "765萬"],
+    ["87654321", "8770萬", "8770萬"],
+    ["987654321", "9.88億", "9.88億"],
+    ["1087654321", "10.9億", "10.9億"],
+    ["11987654321", "120億", "120億"],
+    ["129987654321", "1300億", "1300億"],
+    ["1398987654321", "1.4兆", "1.4兆"],
+    ["14987987654321", "15兆", "15兆"],
+    ["159876987654321", "160兆", "160兆"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "1萬", "1萬"],
+    ["99999", "10萬", "10萬"],
+    ["99999", "10萬", "10萬"],
+    ["999999", "100萬", "100萬"],
+    ["9999999", "1000萬", "1000萬"],
+    ["99999999", "1億", "1億"],
+    ["9994", "9.99千", "9.99千"],
+    ["99944", "9.99萬", "9.99萬"],
+    ["999444", "99.9萬", "99.9萬"],
+    ["9994444", "999萬", "999萬"],
+    ["999444444", "9.99億", "9.99億"],
+    ["9994444444", "99.9億", "99.9億"],
+  ],
+  "zu": [
+    ["1", "1", "1"],
+    ["21", "21", "21"],
+    ["321", "321", "321"],
+    ["4321", "4.32K", "4.32 inkulungwane"],
+    ["54321", "54.3K", "54.3 inkulungwane"],
+    ["654321", "654K", "654 inkulungwane"],
+    ["7654321", "7.65M", "7.65 isigidi"],
+    ["87654321", "87.7M", "87.7 isigidi"],
+    ["987654321", "988M", "988 isigidi"],
+    ["1087654321", "1.09B", "1.09 isigidi sezigidi"],
+    ["11987654321", "12B", "12 isigidi sezigidi"],
+    ["129987654321", "130B", "130 isigidi sezigidi"],
+    ["1398987654321", "1.4T", "1.4 isigidintathu"],
+    ["14987987654321", "15T", "15 isigidintathu"],
+    ["159876987654321", "160T", "160 isigidintathu"],
+    ["9", "9", "9"],
+    ["99", "99", "99"],
+    ["999", "999", "999"],
+    ["9999", "10K", "10 inkulungwane"],
+    ["99999", "100K", "100 inkulungwane"],
+    ["99999", "100K", "100 inkulungwane"],
+    ["999999", "1M", "1 isigidi"],
+    ["9999999", "10M", "10 isigidi"],
+    ["99999999", "100M", "100 isigidi"],
+    ["9994", "9.99K", "9.99 inkulungwane"],
+    ["99944", "99.9K", "99.9 inkulungwane"],
+    ["999444", "999K", "999 inkulungwane"],
+    ["9994444", "9.99M", "9.99 isigidi"],
+    ["999444444", "999M", "999 isigidi"],
+    ["9994444444", "9.99B", "9.99 isigidi sezigidi"],
+  ],
+};
diff --git a/packages/intl/test/data_directory.dart b/packages/intl/test/data_directory.dart
index 70aa385..72e33c6 100644
--- a/packages/intl/test/data_directory.dart
+++ b/packages/intl/test/data_directory.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * A utility function for test and tools that compensates (at least for very
- * simple cases) for file-dependent programs being run from different
- * directories. The important cases are
- *   - running in the directory that contains the test itself, i.e.
- *    test/ or a sub-directory.
- *   - running in root of this package, which is where the editor and bots will
- *   run things by default
- */
+/// A utility function for test and tools that compensates (at least for very
+/// simple cases) for file-dependent programs being run from different
+/// directories. The important cases are
+///   - running in the directory that contains the test itself, i.e.
+///    test/ or a sub-directory.
+///   - running in root of this package, which is where the editor and bots will
+///   run things by default
 library data_directory;
 
 import "dart:io";
@@ -29,7 +27,12 @@
 }
 
 String get intlDirectory {
-  var dir = path.fromUri(Platform.script);
+  var dir;
+  if (Platform.script.scheme == 'file') {
+    dir = path.fromUri(Platform.script);
+  } else {
+    dir = Directory.current.absolute.path;
+  }
   var root = path.rootPrefix(dir);
 
   while (dir != root) {
diff --git a/packages/intl/test/date_time_format_file_even_test.dart b/packages/intl/test/date_time_format_file_even_test.dart
index b6f8202..1ff0fcf 100644
--- a/packages/intl/test/date_time_format_file_even_test.dart
+++ b/packages/intl/test/date_time_format_file_even_test.dart
@@ -2,20 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Tests date formatting and parsing using locale data read from the
- * local file system. This tests one half the locales, since testing all
- * of them takes long enough that it may cause timeouts in the test bots.
- */
+/// Tests date formatting and parsing using locale data read from the
+/// local file system. This tests one half the locales, since testing all
+/// of them takes long enough that it may cause timeouts in the test bots.
 
+@Timeout(const Duration(seconds: 60))
 library date_time_format_file_test_2;
 
 import 'date_time_format_test_stub.dart';
 import 'data_directory.dart';
 import 'package:intl/date_symbol_data_file.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
-  unittestConfiguration.timeout = new Duration(seconds: 60);
   runWith(evenLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/packages/intl/test/date_time_format_file_odd_test.dart b/packages/intl/test/date_time_format_file_odd_test.dart
index 79d6d11..6d7e7b0 100644
--- a/packages/intl/test/date_time_format_file_odd_test.dart
+++ b/packages/intl/test/date_time_format_file_odd_test.dart
@@ -2,20 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Tests date formatting and parsing using locale data read from the
- * local file system. This tests one half the locales, since testing all
- * of them takes long enough that it may cause timeouts in the test bots.
- */
+/// Tests date formatting and parsing using locale data read from the
+/// local file system. This tests one half the locales, since testing all
+/// of them takes long enough that it may cause timeouts in the test bots.
 
+@Timeout(const Duration(seconds: 60))
 library date_time_format_file_test_1;
 
 import 'date_time_format_test_stub.dart';
 import 'data_directory.dart';
 import 'package:intl/date_symbol_data_file.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
-  unittestConfiguration.timeout = new Duration(seconds: 60);
   runWith(oddLocales, dataDirectory, initializeDateFormatting);
 }
diff --git a/packages/intl/test/date_time_format_http_request_test.dart b/packages/intl/test/date_time_format_http_request_test.dart
deleted file mode 100644
index 9412be0..0000000
--- a/packages/intl/test/date_time_format_http_request_test.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// or details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Test date formatting and parsing using locale data read via an http request
- * to a server.
- */
-
-library date_time_format_http_request_test;
-
-import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import 'package:intl/date_symbol_data_http_request.dart';
-import 'date_time_format_test_stub.dart';
-
-main() {
-  useHtmlConfiguration();
-  var url = "http://localhost:${window.location.port}"
-      "/packages/intl/src/data/dates/";
-
-  test("Initializing a locale that needs fallback", () {
-    initializeDateFormatting("de_DE", url).then(expectAsync((_) => true));
-  });
-
-  runWith(smallSetOfLocales, url, initializeDateFormatting);
-}
diff --git a/packages/intl/test/date_time_format_local_even_test.dart b/packages/intl/test/date_time_format_local_even_test.dart
index 4115a53..cbeee35 100644
--- a/packages/intl/test/date_time_format_local_even_test.dart
+++ b/packages/intl/test/date_time_format_local_even_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Test date formatting and parsing using locale data which is available
- * directly in the program as a constant. This tests one half the locales,
- * since testing all of them takes long enough that it may cause timeouts in
- * the test bots.
- */
+/// Test date formatting and parsing using locale data which is available
+/// directly in the program as a constant. This tests one half the locales,
+/// since testing all of them takes long enough that it may cause timeouts in
+/// the test bots.
 
 library date_time_format_test_2;
 
diff --git a/packages/intl/test/date_time_format_local_odd_test.dart b/packages/intl/test/date_time_format_local_odd_test.dart
index a6c94f2..5102bcc 100644
--- a/packages/intl/test/date_time_format_local_odd_test.dart
+++ b/packages/intl/test/date_time_format_local_odd_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Test date formatting and parsing using locale data which is available
- * directly in the program as a constant. This tests one half the locales,
- * since testing all of them takes long enough that it may cause timeouts in
- * the test bots.
- */
+/// Test date formatting and parsing using locale data which is available
+/// directly in the program as a constant. This tests one half the locales,
+/// since testing all of them takes long enough that it may cause timeouts in
+/// the test bots.
 
 library date_time_format_test_1;
 
diff --git a/packages/intl/test/date_time_format_test_core.dart b/packages/intl/test/date_time_format_test_core.dart
index 11fa551..55519de 100644
--- a/packages/intl/test/date_time_format_test_core.dart
+++ b/packages/intl/test/date_time_format_test_core.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Tests the DateFormat library in dart. This file contains core tests that
- * are run regardless of where the locale data is found, so it doesn't expect to
- * be run on its own, but rather to be imported and run from another test file.
- */
+/// Tests the DateFormat library in dart. This file contains core tests that are
+/// run regardless of where the locale data is found, so it doesn't expect to be
+/// run on its own, but rather to be imported and run from another test file.
 
 library date_time_format_tests;
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'date_time_format_test_data.dart';
 import 'package:intl/intl.dart';
 
@@ -119,12 +117,10 @@
   // ABBR_UTC_TZ
 ];
 
-/**
- * Exercise all of the formats we have explicitly defined on a particular
- * locale. [expectedResults] is a map from ICU format names to the
- * expected result of formatting [date] according to that format in
- * [localeName].
- */
+/// Exercise all of the formats we have explicitly defined on a particular
+/// locale. [expectedResults] is a map from ICU format names to the
+/// expected result of formatting [date] according to that format in
+/// [localeName].
 testLocale(String localeName, Map expectedResults, DateTime date) {
   var intl = new Intl(localeName);
   for (int i = 0; i < formatsToTest.length; i++) {
@@ -132,7 +128,8 @@
     var format = intl.date(skeleton);
     var icuName = icuFormatNamesToTest[i];
     var actualResult = format.format(date);
-    expect(expectedResults[icuName], equals(actualResult));
+    expect(expectedResults[icuName], equals(actualResult),
+        reason: "Mismatch in $localeName, testing skeleton '$skeleton'");
   }
 }
 
@@ -168,10 +165,11 @@
   }
 }
 
-/** A shortcut for returning all the locales we have available.*/
+/// A shortcut for returning all the locales we have available.
 List<String> allLocales() => DateFormat.allLocalesWithSymbols();
 
-Function _subsetFunc;
+typedef List<String> SubsetFuncType();
+SubsetFuncType _subsetFunc;
 
 List<String> _subsetValue;
 
@@ -185,7 +183,7 @@
 // TODO(alanknight): Run specific tests for the en_ISO locale which isn't
 // included in CLDR, and check that our patterns for it are correct (they
 // very likely aren't).
-void runDateTests(Function subsetFunc) {
+void runDateTests(SubsetFuncType subsetFunc) {
   assert(subsetFunc != null);
   _subsetFunc = subsetFunc;
 
@@ -363,18 +361,40 @@
     }
   });
 
-  /**
-   * Generate a map from day numbers in the given [year] (where Jan 1 == 1)
-   * to a Date object. If [year] is a leap year, then pass 1 for
-   * [leapDay], otherwise pass 0.
-   */
+  test('Quarter formatting', () {
+    var date = new DateTime(2012, 02, 27);
+    var formats = {
+      'Q': '1',
+      'QQ': '01',
+      'QQQ': 'Q1',
+      'QQQQ': '1st quarter',
+      'QQQQQ': '00001'
+    };
+    formats.forEach((pattern, result) {
+      expect(new DateFormat(pattern, 'en_US').format(date), result);
+    });
+
+    if (subset.contains('zh_CN')) {
+      // Especially test zh_CN formatting for `QQQ` and `yQQQ` because it
+      // contains a single `Q`.
+      expect(new DateFormat.QQQ('zh_CN').format(date), '1季度');
+      expect(new DateFormat.yQQQ('zh_CN').format(date), '2012年第1季度');
+    }
+  });
+
+  /// Generate a map from day numbers in the given [year] (where Jan 1 == 1)
+  /// to a Date object. If [year] is a leap year, then pass 1 for
+  /// [leapDay], otherwise pass 0.
   Map<int, DateTime> generateDates(int year, int leapDay) =>
-      new Iterable.generate(365 + leapDay, (n) => n + 1).map((day) {
-    var result = new DateTime(year, 1, day);
-    // TODO(alanknight): This is a workaround for dartbug.com/15560.
-    if (result.toUtc() == result) result = new DateTime(year, 1, day);
-    return result;
-  }).toList().asMap();
+      new Iterable.generate(365 + leapDay, (n) => n + 1)
+          .map/*<DateTime>*/((day) {
+            var result = new DateTime(year, 1, day);
+            // TODO(alanknight): This is a workaround for dartbug.com/15560.
+            if (result.toUtc() == result) result = new DateTime(year, 1, day);
+            return result;
+          })
+          .toList()
+          .asMap();
 
   void verifyOrdinals(Map dates) {
     var f = new DateFormat("D");
diff --git a/packages/intl/test/date_time_format_test_data.dart b/packages/intl/test/date_time_format_test_data.dart
index 7dfaee5..f9382f8 100644
--- a/packages/intl/test/date_time_format_test_data.dart
+++ b/packages/intl/test/date_time_format_test_data.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Test data for one particular date formatted for a small number of locales.
- * Provides at least a basic check on formatting, including formatting with
- * non-ASCII characters and some different orderings.
- */
+/// Test data for one particular date formatted for a small number of locales.
+/// Provides at least a basic check on formatting, including formatting with
+/// non-ASCII characters and some different orderings.
 
 // TODO(alanknight): Test more locales and a wider variety of test data,
 // possibly by generating test data out of ICU.
@@ -69,7 +67,7 @@
 
 var German = const {
   "DAY": "27",
-  "ABBR_WEEKDAY": "Fr.",
+  "ABBR_WEEKDAY": "Fr",
   "WEEKDAY": "Freitag",
   "ABBR_STANDALONE_MONTH": "Jan",
   "STANDALONE_MONTH": "Januar",
@@ -124,7 +122,7 @@
 
 var Austrian = const {
   "DAY": "27",
-  "ABBR_WEEKDAY": "Fr.",
+  "ABBR_WEEKDAY": "Fr",
   "WEEKDAY": "Freitag",
   "ABBR_STANDALONE_MONTH": "Jän",
   "STANDALONE_MONTH": "Jänner",
@@ -184,8 +182,8 @@
   "ABBR_STANDALONE_MONTH": "janv.",
   "STANDALONE_MONTH": "janvier",
   "NUM_MONTH": "1",
-  "NUM_MONTH_DAY": "27/1",
-  "NUM_MONTH_WEEKDAY_DAY": "ven. 27/1",
+  "NUM_MONTH_DAY": "27/01",
+  "NUM_MONTH_WEEKDAY_DAY": "ven. 27/01",
   "ABBR_MONTH": "janv.",
   "ABBR_MONTH_DAY": "27 janv.",
   "ABBR_MONTH_WEEKDAY_DAY": "ven. 27 janv.",
@@ -195,9 +193,9 @@
   "ABBR_QUARTER": "T1",
   "QUARTER": "1er trimestre",
   "YEAR": "2012",
-  "YEAR_NUM_MONTH": "1/2012",
-  "YEAR_NUM_MONTH_DAY": "27/1/2012",
-  "YEAR_NUM_MONTH_WEEKDAY_DAY": "ven. 27/1/2012",
+  "YEAR_NUM_MONTH": "01/2012",
+  "YEAR_NUM_MONTH_DAY": "27/01/2012",
+  "YEAR_NUM_MONTH_WEEKDAY_DAY": "ven. 27/01/2012",
   "YEAR_ABBR_MONTH": "janv. 2012",
   "YEAR_ABBR_MONTH_DAY": "27 janv. 2012",
   "YEAR_ABBR_MONTH_WEEKDAY_DAY": "ven. 27 janv. 2012",
@@ -290,14 +288,14 @@
   "ABBR_WEEKDAY": "Παρ",
   "WEEKDAY": "Παρασκευή",
   "ABBR_STANDALONE_MONTH": "Ιαν",
-  "STANDALONE_MONTH": "Ιανουάριος",
+  "STANDALONE_MONTH": "Ιανουαρίου",
   "NUM_MONTH": "1",
   "NUM_MONTH_DAY": "27/1",
   "NUM_MONTH_WEEKDAY_DAY": "Παρ, 27/1",
   "ABBR_MONTH": "Ιαν",
   "ABBR_MONTH_DAY": "27 Ιαν",
   "ABBR_MONTH_WEEKDAY_DAY": "Παρ, 27 Ιαν",
-  "MONTH": "Ιανουάριος",
+  "MONTH": "Ιανουαρίου",
   "MONTH_DAY": "27 Ιανουαρίου",
   "MONTH_WEEKDAY_DAY": "Παρασκευή, 27 Ιανουαρίου",
   "ABBR_QUARTER": "Τ1",
diff --git a/packages/intl/test/date_time_format_test_stub.dart b/packages/intl/test/date_time_format_test_stub.dart
index e8141f6..b6c3f9d 100644
--- a/packages/intl/test/date_time_format_test_stub.dart
+++ b/packages/intl/test/date_time_format_test_stub.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Test date formatting and parsing using locale data which is available
- * directly in the program as a constant.
- */
+/// Test date formatting and parsing using locale data which is available
+/// directly in the program as a constant.
 
 library date_time_format_test;
 
 import 'dart:async';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:intl/intl.dart';
 import 'date_time_format_test_core.dart';
 
@@ -18,26 +16,20 @@
 
 typedef Future InitializeDateFormattingFunc(String locale, String filePath);
 
-/**
- * Return only the odd-numbered locales. A simple way to divide the list into
- * two roughly equal parts.
- */
+/// Return only the odd-numbered locales. A simple way to divide the list into
+/// two roughly equal parts.
 List<String> oddLocales() {
   int i = 1;
   return allLocales().where((x) => (i++).isOdd).toList();
 }
 
-/**
- * Return a set of a few locales to run just the tests on a small sample.
- */
-List smallSetOfLocales() {
+/// Return a set of a few locales to run just the tests on a small sample.
+List<String> smallSetOfLocales() {
   return allLocales().sublist(0, 10);
 }
 
-/**
- * Return only the even-numbered locales. A simple way to divide the list into
- * two roughly equal parts.
- */
+/// Return only the even-numbered locales. A simple way to divide the list into
+/// two roughly equal parts.
 List<String> evenLocales() {
   int i = 1;
   return allLocales().where((x) => !((i++).isOdd)).toList();
diff --git a/packages/intl/test/date_time_format_uninitialized_test.dart b/packages/intl/test/date_time_format_uninitialized_test.dart
index d460c47..49c081b 100644
--- a/packages/intl/test/date_time_format_uninitialized_test.dart
+++ b/packages/intl/test/date_time_format_uninitialized_test.dart
@@ -2,10 +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.
 
-/**
- * Tests date formatting and parsing using locale data read from the
- * local file system.
- */
+/// Tests date formatting and parsing using locale data read from the
+/// local file system.
 library date_time_format_file_test;
 
 import 'date_time_format_test_core.dart';
diff --git a/packages/intl/test/date_time_loose_parsing_test.dart b/packages/intl/test/date_time_loose_parsing_test.dart
index 6b37470..aa4fdf7 100644
--- a/packages/intl/test/date_time_loose_parsing_test.dart
+++ b/packages/intl/test/date_time_loose_parsing_test.dart
@@ -3,12 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests for the loose option when parsing dates and times, which accept
-/// mixed-case input and are able to skip missing delimiters. This is only
-/// tested in basic US locale, it's hard to define for others.
+/// mixed-case input and are able to skip missing delimiters. Such valid input
+/// is only tested in basic US locale, it's hard to define for others.
+/// Inputs which should fail because they're missing data (currently only the
+/// year) are tested in more locales.
 library date_time_loose_test;
 
+import 'package:intl/date_symbol_data_local.dart';
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
   var format;
@@ -34,6 +37,7 @@
     check("september 3, 2014");
     check("sEPTembER 3, 2014");
     check("seP 3, 2014");
+    check("Sep 3,2014");
   });
 
   test("Loose parsing yMMMd that parses strict", () {
@@ -45,12 +49,57 @@
     check("09 3 2014");
     check("09 00003    2014");
     check("09/    03/2014");
-    expect(() => format.parseLoose("09 / 03 / 2014"),
-        throwsA(new isInstanceOf<FormatException>()));
+    check("09 / 03 / 2014");
   });
 
   test("Loose parsing yMd that parses strict", () {
     expect(format.parseLoose("09/03/2014"), date);
     expect(format.parseLoose("09/3/2014"), date);
   });
+
+  test("Loose parsing should handle standalone month format", () {
+    // This checks that LL actually sets the month.
+    // The appended whitespace and extra d pattern are present to trigger the
+    // loose parsing code path.
+    expect(new DateFormat('LL/d', 'en_US').parseLoose("05/ 2").month, 5);
+  });
+
+  group("Loose parsing with year formats", () {
+    test("should fail when year is omitted (en_US)", () {
+      expect(() => new DateFormat('yyyy-MM-dd').parseLoose("1/11"),
+          throwsFormatException);
+    });
+
+    test("should fail when year is omitted (ja)", () {
+      initializeDateFormatting('ja', null);
+      expect(() => new DateFormat.yMMMd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMEd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMEd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMMd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMMEEEEd("ja").parseLoose('12月12日'),
+          throwsFormatException);
+    });
+
+    test("should fail when year is omitted (hu)", () {
+      initializeDateFormatting('hu', null);
+      expect(() => new DateFormat.yMMMd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMEd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMEd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMMd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+      expect(() => new DateFormat.yMMMMEEEEd("hu").parseLoose('3. 17.'),
+          throwsFormatException);
+    });
+  });
 }
diff --git a/packages/intl/test/date_time_strict_test.dart b/packages/intl/test/date_time_strict_test.dart
index f7ed30e..cc5f597 100644
--- a/packages/intl/test/date_time_strict_test.dart
+++ b/packages/intl/test/date_time_strict_test.dart
@@ -8,7 +8,7 @@
 library date_time_strict_test;
 
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
   test("All input consumed", () {
diff --git a/packages/intl/test/find_default_locale_browser_test.dart b/packages/intl/test/find_default_locale_browser_test.dart
index f00b4c8..8aac05a 100644
--- a/packages/intl/test/find_default_locale_browser_test.dart
+++ b/packages/intl/test/find_default_locale_browser_test.dart
@@ -2,11 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+@TestOn("browser")
 library find_default_locale_browser_test;
 
 import 'package:intl/intl.dart';
 import 'package:intl/intl_browser.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
   test("Find system locale in browser", () {
@@ -14,11 +15,13 @@
     // should find a way to force the system locale before the test is run
     // and then verify that it's actually the correct value.
     Intl.systemLocale = 'xx_YY';
-    var callback = expectAsync(verifyLocale);
+    ThenArgument callback = expectAsync(verifyLocale) as ThenArgument;
     findSystemLocale().then(callback);
   });
 }
 
+typedef ThenArgument(String _);
+
 verifyLocale(_) {
   expect(Intl.systemLocale, isNot(equals("xx_YY")));
   // Allow either en_US or just en type locales. Windows in particular may
diff --git a/packages/intl/test/find_default_locale_standalone_test.dart b/packages/intl/test/find_default_locale_standalone_test.dart
index a89f8ad..10d5f27 100644
--- a/packages/intl/test/find_default_locale_standalone_test.dart
+++ b/packages/intl/test/find_default_locale_standalone_test.dart
@@ -2,11 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library find_default_locale_browser_test;
-
+@TestOn("vm")
 import 'package:intl/intl.dart';
 import 'package:intl/intl_standalone.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 main() {
   test("Find system locale standalone", () {
@@ -15,11 +14,12 @@
     // and then verify that it's actually the correct value.
     // We have no way of getting this reliably for Windows, so it will fail.
     Intl.systemLocale = "xx_YY";
-    var callback = expectAsync(verifyLocale);
+    var callback = expectAsync(verifyLocale) as ThenArgument;
     findSystemLocale().then(callback);
   });
 }
 
+typedef ThenArgument(String _);
 verifyLocale(_) {
   expect(Intl.systemLocale, isNot(equals("xx_YY")));
   var pattern = new RegExp(r"\w\w_[A-Z0-9]+");
diff --git a/packages/intl/test/fixnum_test.dart b/packages/intl/test/fixnum_test.dart
index 747a8bb..12978b3 100644
--- a/packages/intl/test/fixnum_test.dart
+++ b/packages/intl/test/fixnum_test.dart
@@ -2,14 +2,15 @@
 // for 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 intl_test;
+library fixnum_test;
 
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:fixnum/fixnum.dart';
 
 var int64Values = {
   new Int64(12345): ["USD12,345.00", "1,234,500%"],
+  new Int64(-12345): ["-USD12,345.00", "-1,234,500%"],
   new Int64(0x7FFFFFFFFFFFF): [
     "USD2,251,799,813,685,247.00",
     "225,179,981,368,524,700%"
@@ -28,13 +29,40 @@
   new Int32(12345): ["USD12,345.00", "1,234,500%"],
   new Int32(0x7FFFF): ["USD524,287.00", "52,428,700%"],
   Int32.parseHex('7FFFFFF'): ["USD134,217,727.00", "13,421,772,700%"],
+  Int32.parseHex('7FFFFFFF'): ["USD2,147,483,647.00", "214,748,364,700%"],
   Int32.parseHex('80000000'): ["-USD2,147,483,648.00", "-214,748,364,800%"]
 };
 
+var microMoneyValues = {
+  new MicroMoney(new Int64(12345670000)): ["USD12,345.67", "1,234,567%"],
+  new MicroMoney(new Int64(12345671000)): ["USD12,345.67", "1,234,567%"],
+  new MicroMoney(new Int64(12345678000)): ["USD12,345.68", "1,234,568%"],
+  new MicroMoney(new Int64(-12345670000)): ["-USD12,345.67", "-1,234,567%"],
+  new MicroMoney(new Int64(-12345671000)): ["-USD12,345.67", "-1,234,567%"],
+  new MicroMoney(new Int64(-12345678000)): ["-USD12,345.68", "-1,234,568%"],
+  new MicroMoney(new Int64(12340000000)): ["USD12,340.00", "1,234,000%"],
+  new MicroMoney(new Int64(0x7FFFFFFFFFFFF)): [
+    "USD2,251,799,813.69",
+    "225,179,981,369%"
+  ],
+  new MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFF')): [
+    "USD576,460,752,303.42",
+    "57,646,075,230,342%"
+  ],
+  new MicroMoney(Int64.parseHex('7FFFFFFFFFFFFFFF')): [
+    "USD9,223,372,036,854.78",
+    "922,337,203,685,478%"
+  ],
+  new MicroMoney(Int64.parseHex('8000000000000000')): [
+    "-USD9,223,372,036,854.78",
+    "-922,337,203,685,478%"
+  ]
+};
+
 main() {
   test('int64', () {
     int64Values.forEach((number, expected) {
-      var currency = new NumberFormat.currencyPattern().format(number);
+      var currency = new NumberFormat.currency().format(number);
       expect(currency, expected.first);
       var percent = new NumberFormat.percentPattern().format(number);
       expect(percent, expected[1]);
@@ -43,6 +71,15 @@
 
   test('int32', () {
     int32Values.forEach((number, expected) {
+      var currency = new NumberFormat.currency().format(number);
+      expect(currency, expected.first);
+      var percent = new NumberFormat.percentPattern().format(number);
+      expect(percent, expected[1]);
+    });
+  });
+
+  test('micro money', () {
+    microMoneyValues.forEach((number, expected) {
       var currency = new NumberFormat.currencyPattern().format(number);
       expect(currency, expected.first);
       var percent = new NumberFormat.percentPattern().format(number);
diff --git a/packages/intl/test/intl_message_basic_example_test.dart b/packages/intl/test/intl_message_basic_example_test.dart
deleted file mode 100644
index f87faf1..0000000
--- a/packages/intl/test/intl_message_basic_example_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Tests internationalization of messages using the basic example as a template.
- */
-library intl_message_test_2;
-
-import '../example/basic/basic_example.dart';
-import 'package:unittest/unittest.dart';
-import 'dart:async';
-
-main() {
-  var list = [];
-  var waitForIt = new Completer();
-
-  addToList(x) {
-    list.add(x);
-    if (list.length == 4) {
-      waitForIt.complete(list);
-    }
-  }
-
-  test('Verify basic example printing localized messages', () {
-    runAllTests(_) {
-      setup(expectAsync(runProgram), addToList);
-    }
-    setup(expectAsync(runAllTests), addToList);
-    waitForIt.future.then(expectAsync((_) {
-      expect(list[0], "Ran at 00:00:00 on Thursday, January 1, 1970");
-      expect(list[1], "Ausgedruckt am 00:00:00 am Donnerstag, 1. Januar 1970.");
-      expect(list[2], "วิ่ง 00:00:00 on วันพฤหัสบดี 1 มกราคม 1970.");
-      expect(list[3], "วิ่ง now on today.");
-    }));
-  });
-}
diff --git a/packages/intl/test/intl_test.dart b/packages/intl/test/intl_test.dart
index 268d765..e19ed5a 100644
--- a/packages/intl/test/intl_test.dart
+++ b/packages/intl/test/intl_test.dart
@@ -5,7 +5,7 @@
 library intl_test;
 
 import 'package:intl/intl.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:intl/date_symbol_data_local.dart';
 
 main() {
@@ -78,4 +78,17 @@
     checkAsDateDefault('en-ZZ', 'en');
     checkAsDateDefault('es-999', 'es');
   });
+
+  test("toBeginningOfSentenceCase", () {
+    expect(toBeginningOfSentenceCase(null), null);
+    expect(toBeginningOfSentenceCase(""), "");
+    expect(toBeginningOfSentenceCase("A"), "A");
+    expect(toBeginningOfSentenceCase("a"), "A");
+    expect(toBeginningOfSentenceCase("abc"), "Abc");
+    expect(toBeginningOfSentenceCase("[a]"), "[a]");
+    expect(toBeginningOfSentenceCase("ABc"), "ABc");
+    expect(toBeginningOfSentenceCase("ı"), "I");
+    expect(toBeginningOfSentenceCase("i"), "I");
+    expect(toBeginningOfSentenceCase("i", "tr"), "\u0130");
+  });
 }
diff --git a/packages/intl/test/message_extraction/debug.sh b/packages/intl/test/message_extraction/debug.sh
deleted file mode 100755
index 82c8b87..0000000
--- a/packages/intl/test/message_extraction/debug.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-# The message_extraction_test.dart test uses a temporary directory and spawns 
-# separate processes for each step. This can make it very painful to debug the
-# steps. 
-# This script runs the steps individually, putting the files in the current
-# directory. You can run the script to run the test locally, or use this to
-# run individual steps or create them as launches in the editor.
-dart ../../bin/extract_to_arb.dart sample_with_messages.dart \
-part_of_sample_with_messages.dart
-dart make_hardcoded_translation.dart intl_messages.arb
-dart ../../bin/generate_from_arb.dart --generated-file-prefix=foo_ \
-sample_with_messages.dart part_of_sample_with_messages.dart \
-translation_fr.arb translation_de_DE.arb
diff --git a/packages/intl/test/message_extraction/embedded_plural_text_after.dart b/packages/intl/test/message_extraction/embedded_plural_text_after.dart
deleted file mode 100644
index cda5bae..0000000
--- a/packages/intl/test/message_extraction/embedded_plural_text_after.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A test library that should fail because there is a plural with text
-/// following the plural expression.
-library embedded_plural_text_after;
-
-import "package:intl/intl.dart";
-
-embeddedPlural2(n) => Intl.message(
-    "${Intl.plural(n, zero: 'none', one: 'one', other: 'some')} plus text.",
-    name: 'embeddedPlural2', desc: 'An embedded plural', args: [n]);
diff --git a/packages/intl/test/message_extraction/embedded_plural_text_after_test.dart b/packages/intl/test/message_extraction/embedded_plural_text_after_test.dart
deleted file mode 100644
index 3a53dba..0000000
--- a/packages/intl/test/message_extraction/embedded_plural_text_after_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library embedded_plural_text_after_test;
-
-import "failed_extraction_test.dart";
-import "package:unittest/unittest.dart";
-
-main() {
-  test("Expect failure because of embedded plural with text after it", () {
-    var specialFiles = ['embedded_plural_text_after.dart'];
-    runTestWithWarnings(
-        warningsAreErrors: true,
-        expectedExitCode: 1,
-        embeddedPlurals: false,
-        sourceFiles: specialFiles);
-  });
-}
diff --git a/packages/intl/test/message_extraction/embedded_plural_text_before.dart b/packages/intl/test/message_extraction/embedded_plural_text_before.dart
deleted file mode 100644
index 4843831..0000000
--- a/packages/intl/test/message_extraction/embedded_plural_text_before.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A test library that should fail because there is a plural with text
-/// before the plural expression.
-library embedded_plural_text_before;
-
-import "package:intl/intl.dart";
-
-embeddedPlural(n) => Intl.message(
-    "There are ${Intl.plural(n, zero: 'nothing', one: 'one', other: 'some')}.",
-    name: 'embeddedPlural', desc: 'An embedded plural', args: [n]);
diff --git a/packages/intl/test/message_extraction/embedded_plural_text_before_test.dart b/packages/intl/test/message_extraction/embedded_plural_text_before_test.dart
deleted file mode 100644
index ebfa1bf..0000000
--- a/packages/intl/test/message_extraction/embedded_plural_text_before_test.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library embedded_plural_text_before_test;
-
-import "failed_extraction_test.dart";
-import "package:unittest/unittest.dart";
-
-main() {
-  test("Expect failure because of embedded plural with text before it", () {
-    var files = ['embedded_plural_text_before.dart'];
-    runTestWithWarnings(
-        warningsAreErrors: true,
-        expectedExitCode: 1,
-        embeddedPlurals: false,
-        sourceFiles: files);
-  });
-}
diff --git a/packages/intl/test/message_extraction/examples_parsing_test.dart b/packages/intl/test/message_extraction/examples_parsing_test.dart
deleted file mode 100644
index 55be5bd..0000000
--- a/packages/intl/test/message_extraction/examples_parsing_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Test for parsing the examples argument from an Intl.message call. Very
- * minimal so far.
- */
-import 'package:unittest/unittest.dart';
-import 'package:intl/extract_messages.dart';
-import '../data_directory.dart';
-import 'package:path/path.dart' as path;
-import 'dart:io';
-
-main() {
-  test("Message examples are correctly extracted", () {
-    var file = path.join(intlDirectory, 'test', 'message_extraction',
-        'sample_with_messages.dart');
-    var messages = parseFile(new File(file));
-    expect(messages['message2'].examples, {"x": 3});
-  });
-}
diff --git a/packages/intl/test/message_extraction/failed_extraction_test.dart b/packages/intl/test/message_extraction/failed_extraction_test.dart
deleted file mode 100644
index 51b2c4b..0000000
--- a/packages/intl/test/message_extraction/failed_extraction_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library failed_extraction_test;
-
-import "message_extraction_test.dart";
-import "dart:io";
-import "package:unittest/unittest.dart";
-
-main() {
-  test("Expect warnings but successful extraction", () {
-    runTestWithWarnings(warningsAreErrors: false, expectedExitCode: 0);
-  });
-}
-
-const defaultFiles = const [
-  "sample_with_messages.dart",
-  "part_of_sample_with_messages.dart"
-];
-
-void runTestWithWarnings({bool warningsAreErrors, int expectedExitCode,
-    bool embeddedPlurals: true, List<String> sourceFiles: defaultFiles}) {
-  void verify(ProcessResult result) {
-    try {
-      expect(result.exitCode, expectedExitCode);
-    } finally {
-      deleteGeneratedFiles();
-    }
-  }
-
-  copyFilesToTempDirectory();
-  var program = asTestDirPath("../../bin/extract_to_arb.dart");
-  var args = ["--output-dir=$tempDir"];
-  if (warningsAreErrors) {
-    args.add('--warnings-are-errors');
-  }
-  if (!embeddedPlurals) {
-    args.add('--no-embedded-plurals');
-  }
-  var files = sourceFiles.map(asTempDirPath).toList();
-  var allArgs = [program]
-    ..addAll(args)
-    ..addAll(files);
-  var callback = expectAsync(verify);
-  run(null, allArgs).then(callback);
-}
diff --git a/packages/intl/test/message_extraction/foo_messages_all.dart b/packages/intl/test/message_extraction/foo_messages_all.dart
deleted file mode 100644
index 06b482e..0000000
--- a/packages/intl/test/message_extraction/foo_messages_all.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library keep_the_static_analysis_from_complaining;
-
-initializeMessages(_) => throw new UnimplementedError(
-    "This entire file is only here to make the static"
-    " analysis happy. It will be generated during actual tests.");
diff --git a/packages/intl/test/message_extraction/make_hardcoded_translation.dart b/packages/intl/test/message_extraction/make_hardcoded_translation.dart
deleted file mode 100644
index 90bcfc4..0000000
--- a/packages/intl/test/message_extraction/make_hardcoded_translation.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/usr/bin/env dart
-// 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.
-
-/**
- * This simulates a translation process, reading the messages generated
- * from extract_message.dart for the files sample_with_messages.dart and
- * part_of_sample_with_messages.dart and writing out hard-coded translations for
- * German and French locales.
- */
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:path/path.dart' as path;
-import 'package:args/args.dart';
-
-/** A list of the French translations that we will produce. */
-var french = {
-  "types": r"{a}, {b}, {c}",
-  "multiLine": "Cette message prend plusiers lignes.",
-  "message2": r"Un autre message avec un seul paramètre {x}",
-  "alwaysTranslated": "Cette chaîne est toujours traduit",
-  "message1": "Il s'agit d'un message",
-  "leadingQuotes": "\"Soi-disant\"",
-  "trickyInterpolation": r"L'interpolation est délicate "
-      r"quand elle se termine une phrase comme {s}.",
-  "message3": "Caractères qui doivent être échapper, par exemple barres \\ "
-      "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
-      "des citations \" "
-      "avec quelques paramètres ainsi {a}, {b}, et {c}",
-  "YouveGotMessages_method": "Cela vient d'une méthode",
-  "nonLambda": "Cette méthode n'est pas un lambda",
-  "staticMessage": "Cela vient d'une méthode statique",
-  "notAlwaysTranslated": "Ce manque certaines traductions",
-  "thisNameIsNotInTheOriginal": "Could this lead to something malicious?",
-  "originalNotInBMP": "Anciens caractères grecs jeux du pendu: 𐅆𐅇.",
-  "escapable": "Escapes: \n\r\f\b\t\v.",
-  "sameContentsDifferentName": "Bonjour tout le monde",
-  "differentNameSameContents": "Bonjour tout le monde",
-  "rentToBePaid": "loyer",
-  "rentAsVerb": "louer",
-  "plurals": "{num,plural, =0{Est-ce que nulle est pluriel?}=1{C'est singulier}"
-      "other{C'est pluriel ({num}).}}",
-  "whereTheyWentMessage": "{gender,select, male{{name} est allé à sa {place}}"
-      "female{{name} est allée à sa {place}}other{{name}"
-      " est allé à sa {place}}}",
-  // Gratuitously different translation for testing. Ignoring gender of place.
-  "nestedMessage": "{combinedGender,select, "
-      "other{"
-      "{number,plural, "
-      "=0{Personne n'avait allé à la {place}}"
-      "=1{{names} était allé à la {place}}"
-      "other{{names} étaient allés à la {place}}"
-      "}"
-      "}"
-      "female{"
-      "{number,plural, "
-      "=1{{names} était allée à la {place}}"
-      "other{{names} étaient allées à la {place}}"
-      "}"
-      "}"
-      "}",
-  "outerPlural": "{n,plural, =0{rien}=1{un}other{quelques-uns}}",
-  "outerGender": "{g,select, male {homme} female {femme} other {autre}}",
-  "pluralThatFailsParsing": "{noOfThings,plural, "
-      "=1{1 chose:}other{{noOfThings} choses:}}",
-  "nestedOuter": "{number,plural, other{"
-      "{gen,select, male{{number} homme}other{{number} autre}}}}",
-  "outerSelect": "{currency,select, CDN{{amount} dollars Canadiens}"
-      "other{{amount} certaine devise ou autre.}}}",
-  "nestedSelect": "{currency,select, CDN{{amount,plural, "
-      "=1{{amount} dollar Canadien}"
-      "other{{amount} dollars Canadiens}}}"
-      "other{N'importe quoi}"
-      "}}"
-};
-
-/** A list of the German translations that we will produce. */
-var german = {
-  "types": r"{a}, {b}, {c}",
-  "multiLine": "Dieser String erstreckt sich über mehrere Zeilen erstrecken.",
-  "message2": r"Eine weitere Meldung mit dem Parameter {x}",
-  "alwaysTranslated": "Diese Zeichenkette wird immer übersetzt",
-  "message1": "Dies ist eine Nachricht",
-  "leadingQuotes": "\"Sogenannt\"",
-  "trickyInterpolation": r"Interpolation ist schwierig, wenn es einen Satz "
-      "wie dieser endet {s}.",
-  "message3": "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
-      "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
-      "Zitate \" Parameter {a}, {b} und {c}",
-  "YouveGotMessages_method": "Dies ergibt sich aus einer Methode",
-  "nonLambda": "Diese Methode ist nicht eine Lambda",
-  "staticMessage": "Dies ergibt sich aus einer statischen Methode",
-  "thisNameIsNotInTheOriginal": "Could this lead to something malicious?",
-  "originalNotInBMP": "Antike griechische Galgenmännchen Zeichen: 𐅆𐅇",
-  "escapable": "Escapes: \n\r\f\b\t\v.",
-  "sameContentsDifferentName": "Hallo Welt",
-  "differentNameSameContents": "Hallo Welt",
-  "rentToBePaid": "Miete",
-  "rentAsVerb": "mieten",
-  "plurals": "{num,plural, =0{Ist Null Plural?}=1{Dies ist einmalig}"
-      "other{Dies ist Plural ({num}).}}",
-  "whereTheyWentMessage": "{gender,select, male{{name} ging zu seinem {place}}"
-      "female{{name} ging zu ihrem {place}}other{{name} ging zu seinem {place}}}",
-  //Note that we're only using the gender of the people. The gender of the
-  //place also matters, but we're not dealing with that here.
-  "nestedMessage": "{combinedGender,select, "
-      "other{"
-      "{number,plural, "
-      "=0{Niemand ging zu {place}}"
-      "=1{{names} ging zum {place}}"
-      "other{{names} gingen zum {place}}"
-      "}"
-      "}"
-      "female{"
-      "{number,plural, "
-      "=1{{names} ging in dem {place}}"
-      "other{{names} gingen zum {place}}"
-      "}"
-      "}"
-      "}",
-  "outerPlural": "{n,plural, =0{Null}=1{ein}other{einige}}",
-  "outerGender": "{g,select, male{Mann}female{Frau}other{andere}}",
-  "pluralThatFailsParsing": "{noOfThings,plural, "
-      "=1{eins:}other{{noOfThings} Dinge:}}",
-  "nestedOuter": "{number,plural, other{"
-      "{gen,select, male{{number} Mann}other{{number} andere}}}}",
-  "outerSelect": "{currency,select, CDN{{amount} Kanadischen dollar}"
-      "other{{amount} einige Währung oder anderen.}}}",
-  "nestedSelect": "{currency,select, CDN{{amount,plural, "
-      "=1{{amount} Kanadischer dollar}"
-      "other{{amount} Kanadischen dollar}}}"
-      "other{whatever}"
-      "}"
-};
-
-/** The output directory for translated files. */
-String targetDir;
-
-/**
- * Generate a translated json version from [originals] in [locale] looking
- * up the translations in [translations].
- */
-void translate(Map originals, String locale, Map translations) {
-  var translated = {"_locale": locale};
-  originals.forEach((name, text) {
-    translated[name] = translations[name];
-  });
-  var file = new File(path.join(targetDir, 'translation_$locale.arb'));
-  file.writeAsStringSync(JSON.encode(translated));
-}
-
-main(List<String> args) {
-  if (args.length == 0) {
-    print('Usage: make_hardcoded_translation [--output-dir=<dir>] '
-        '[originalFile.arb]');
-    exit(0);
-  }
-  var parser = new ArgParser();
-  parser.addOption("output-dir",
-      defaultsTo: '.', callback: (value) => targetDir = value);
-  parser.parse(args);
-
-  var fileArgs = args.where((x) => x.contains('.arb'));
-
-  var messages = JSON.decode(new File(fileArgs.first).readAsStringSync());
-  translate(messages, "fr", french);
-  translate(messages, "de_DE", german);
-}
diff --git a/packages/intl/test/message_extraction/message_extraction_no_deferred_test.dart b/packages/intl/test/message_extraction/message_extraction_no_deferred_test.dart
deleted file mode 100644
index 5c7cea4..0000000
--- a/packages/intl/test/message_extraction/message_extraction_no_deferred_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/** 
- * A test for message extraction and code generation not using deferred 
- * loading for the generated code.
- */
-library message_extraction_no_deferred_test;
-
-import 'message_extraction_test.dart' as mainTest;
-
-main(arguments) {
-  mainTest.useDeferredLoading = false;
-  mainTest.main(arguments);
-}
diff --git a/packages/intl/test/message_extraction/message_extraction_test.dart b/packages/intl/test/message_extraction/message_extraction_test.dart
deleted file mode 100644
index 6b7de6b..0000000
--- a/packages/intl/test/message_extraction/message_extraction_test.dart
+++ /dev/null
@@ -1,174 +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 message_extraction_test;
-
-import 'package:unittest/unittest.dart';
-import 'dart:io';
-import 'dart:async';
-import 'dart:convert';
-import 'package:path/path.dart' as path;
-import '../data_directory.dart';
-
-final dart = Platform.executable;
-
-/** Should we use deferred loading. */
-bool useDeferredLoading = true;
-
-String get _deferredLoadPrefix => useDeferredLoading ? '' : 'no-';
-
-String get deferredLoadArg => '--${_deferredLoadPrefix}use-deferred-loading';
-
-/** The VM arguments we were given, most important package-root. */
-final vmArgs = Platform.executableArguments;
-
-/**
- * For testing we move the files into a temporary directory so as not to leave
- * generated files around after a failed test. For debugging, we omit that
- * step if [useLocalDirectory] is true. The place we move them to is saved as
- * [tempDir].
- */
-String get tempDir => _tempDir == null ? _tempDir = _createTempDir() : _tempDir;
-var _tempDir;
-_createTempDir() => useLocalDirectory
-    ? '.'
-    : Directory.systemTemp.createTempSync('message_extraction_test').path;
-
-var useLocalDirectory = false;
-
-/**
- * Translate a relative file path into this test directory. This is
- * applied to all the arguments of [run]. It will ignore a string that
- * is an absolute path or begins with "--", because some of the arguments
- * might be command-line options.
- */
-String asTestDirPath([String s]) {
-  if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
-  return path.join(intlDirectory, 'test', 'message_extraction', s);
-}
-
-/**
- * Translate a relative file path into our temp directory. This is
- * applied to all the arguments of [run]. It will ignore a string that
- * is an absolute path or begins with "--", because some of the arguments
- * might be command-line options.
- */
-String asTempDirPath([String s]) {
-  if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
-  return path.join(tempDir, s);
-}
-
-main(arguments) {
-  // If debugging, use --local to avoid copying everything to temporary
-  // directories to make it even harder to debug. Note that this will also
-  // not delete the generated files, so may require manual cleanup.
-  if (arguments.contains("--local")) {
-    print("Testing using local directory for generated files");
-    useLocalDirectory = true;
-  }
-  setUp(copyFilesToTempDirectory);
-  tearDown(deleteGeneratedFiles);
-  test("Test round trip message extraction, translation, code generation, "
-      "and printing", () {
-    var makeSureWeVerify = expectAsync(runAndVerify);
-    return extractMessages(null).then((result) {
-      return generateTranslationFiles(result);
-    }).then((result) {
-      return generateCodeFromTranslation(result);
-    }).then(makeSureWeVerify).then(checkResult);
-  });
-}
-
-void copyFilesToTempDirectory() {
-  if (useLocalDirectory) return;
-  var files = [
-    asTestDirPath('sample_with_messages.dart'),
-    asTestDirPath('part_of_sample_with_messages.dart'),
-    asTestDirPath('verify_messages.dart'),
-    asTestDirPath('run_and_verify.dart'),
-    asTestDirPath('embedded_plural_text_before.dart'),
-    asTestDirPath('embedded_plural_text_after.dart'),
-    asTestDirPath('print_to_list.dart')
-  ];
-  for (var filename in files) {
-    var file = new File(filename);
-    file.copySync(path.join(tempDir, path.basename(filename)));
-  }
-}
-
-void deleteGeneratedFiles() {
-  if (useLocalDirectory) return;
-  try {
-    new Directory(tempDir).deleteSync(recursive: true);
-  } on Error catch (e) {
-    print("Failed to delete $tempDir");
-    print("Exception:\n$e");
-  }
-}
-
-/**
- * Run the process with the given list of filenames, which we assume
- * are in dir() and need to be qualified in case that's not our working
- * directory.
- */
-Future<ProcessResult> run(
-    ProcessResult previousResult, List<String> filenames) {
-  // If there's a failure in one of the sub-programs, print its output.
-  checkResult(previousResult);
-  var filesInTheRightDirectory = filenames
-      .map((x) => asTempDirPath(x))
-      .map((x) => path.normalize(x))
-      .toList();
-  // Inject the script argument --output-dir in between the script and its
-  // arguments.
-  var args = []
-    ..addAll(vmArgs)
-    ..add(filesInTheRightDirectory.first)
-    ..addAll(["--output-dir=$tempDir"])
-    ..addAll(filesInTheRightDirectory.skip(1));
-  var result =
-      Process.run(dart, args, stdoutEncoding: UTF8, stderrEncoding: UTF8);
-  return result;
-}
-
-void checkResult(ProcessResult previousResult) {
-  if (previousResult != null) {
-    if (previousResult.exitCode != 0) {
-      print("Error running sub-program:");
-    }
-    print(previousResult.stdout);
-    print(previousResult.stderr);
-    print("exitCode=${previousResult.exitCode}");
-    // Fail the test.
-    expect(previousResult.exitCode, 0);
-  }
-}
-
-Future<ProcessResult> extractMessages(ProcessResult previousResult) => run(
-    previousResult, [
-  asTestDirPath('../../bin/extract_to_arb.dart'),
-  '--suppress-warnings',
-  'sample_with_messages.dart',
-  'part_of_sample_with_messages.dart'
-]);
-
-Future<ProcessResult> generateTranslationFiles(ProcessResult previousResult) =>
-    run(previousResult, [
-  asTestDirPath('make_hardcoded_translation.dart'),
-  'intl_messages.arb'
-]);
-
-Future<ProcessResult> generateCodeFromTranslation(
-    ProcessResult previousResult) => run(previousResult, [
-  asTestDirPath('../../bin/generate_from_arb.dart'),
-  deferredLoadArg,
-  '--generated-file-prefix=foo_',
-  'sample_with_messages.dart',
-  'part_of_sample_with_messages.dart',
-  'translation_fr.arb',
-  'translation_de_DE.arb'
-]);
-
-Future<ProcessResult> runAndVerify(ProcessResult previousResult) =>
-    run(previousResult, [asTempDirPath('run_and_verify.dart')]);
diff --git a/packages/intl/test/message_extraction/part_of_sample_with_messages.dart b/packages/intl/test/message_extraction/part_of_sample_with_messages.dart
deleted file mode 100644
index 31cddcc..0000000
--- a/packages/intl/test/message_extraction/part_of_sample_with_messages.dart
+++ /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.part of sample;
-
-part of sample;
-
-class Person {
-  String name;
-  String gender;
-  Person(this.name, this.gender);
-}
-
-class YouveGotMessages {
-
-  // A static message, rather than a standalone function.
-  static staticMessage() =>
-      Intl.message("This comes from a static method", name: 'staticMessage');
-
-  // An instance method, rather than a standalone function.
-  method() => Intl.message("This comes from a method",
-      name: 'YouveGotMessages_method', desc: 'This is a method with a '
-      'long description which spans '
-      'multiple lines.');
-
-  // A non-lambda, i.e. not using => syntax, and with an additional statement
-  // before the Intl.message call.
-  nonLambda() {
-    var aTrueValue = true;
-    var msg = Intl.message("This method is not a lambda", name: 'nonLambda');
-    expect(aTrueValue, isTrue,
-        reason: 'Parser should not fail with additional code.');
-    return msg;
-  }
-
-  plurals(num) => Intl.message("""${Intl.plural(num,
-         zero : 'Is zero plural?',
-         one : 'This is singular.',
-         other : 'This is plural ($num).')
-        }""", name: "plurals", args: [num], desc: "Basic plurals");
-
-  whereTheyWent(Person person, String place) =>
-      whereTheyWentMessage(person.name, person.gender, place);
-
-  whereTheyWentMessage(String name, String gender, String place) {
-    return Intl.message("${Intl.gender(gender,
-            male: '$name went to his $place',
-            female: '$name went to her $place',
-            other: '$name went to its $place')
-        }",
-        name: "whereTheyWentMessage",
-        args: [name, gender, place],
-        desc: 'A person went to some place that they own, e.g. their room');
-  }
-
-  // English doesn't do enough with genders, so this example is French.
-  nested(List people, String place) {
-    var names = people.map((x) => x.name).join(", ");
-    var number = people.length;
-    var combinedGender =
-        people.every((x) => x.gender == "female") ? "female" : "other";
-    if (number == 0) combinedGender = "other";
-
-    nestedMessage(names, number, combinedGender, place) => Intl.message(
-        '''${Intl.gender(combinedGender,
-          other: '${Intl.plural(number,
-            zero: "Personne n'est allé au $place",
-            one: "${names} est allé au $place",
-            other: "${names} sont allés au $place")}',
-          female: '${Intl.plural(number,
-            one: "$names est allée au $place",
-          other: "$names sont allées au $place")}'
-        )}''',
-        name: "nestedMessage", args: [names, number, combinedGender, place]);
-    return nestedMessage(names, number, combinedGender, place);
-  }
-}
diff --git a/packages/intl/test/message_extraction/print_to_list.dart b/packages/intl/test/message_extraction/print_to_list.dart
deleted file mode 100644
index f5446d4..0000000
--- a/packages/intl/test/message_extraction/print_to_list.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-/// This provides a way for a test to print to an internal list so the
-/// results can be verified rather than writing to and reading a file.
-
-library print_to_list.dart;
-
-List<String> lines = [];
-
-void printOut(String s) {
-  lines.add(s);
-}
diff --git a/packages/intl/test/message_extraction/really_fail_extraction_test.dart b/packages/intl/test/message_extraction/really_fail_extraction_test.dart
deleted file mode 100644
index 76f5251..0000000
--- a/packages/intl/test/message_extraction/really_fail_extraction_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library really_fail_extraction_test;
-
-import "failed_extraction_test.dart";
-import "package:unittest/unittest.dart";
-
-main() {
-  test("Expect failure because warnings are errors", () {
-    runTestWithWarnings(warningsAreErrors: true, expectedExitCode: 1);
-  });
-}
diff --git a/packages/intl/test/message_extraction/run_and_verify.dart b/packages/intl/test/message_extraction/run_and_verify.dart
deleted file mode 100644
index ef9a1a0..0000000
--- a/packages/intl/test/message_extraction/run_and_verify.dart
+++ /dev/null
@@ -1,11 +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 verify_and_run;
-
-import 'sample_with_messages.dart' as sample;
-import 'verify_messages.dart';
-
-main() {
-  sample.main().then(verifyResult);
-}
diff --git a/packages/intl/test/message_extraction/sample_with_messages.dart b/packages/intl/test/message_extraction/sample_with_messages.dart
deleted file mode 100644
index 70a45dc..0000000
--- a/packages/intl/test/message_extraction/sample_with_messages.dart
+++ /dev/null
@@ -1,241 +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.
-
-/**
- * This is a program with various [Intl.message] messages. It just prints
- * all of them, and is used for testing of message extraction, translation,
- * and code generation.
- */
-library sample;
-
-import "package:intl/intl.dart";
-import "foo_messages_all.dart";
-import "print_to_list.dart";
-import "dart:async";
-import "package:unittest/unittest.dart";
-
-part 'part_of_sample_with_messages.dart';
-
-message1() => Intl.message("This is a message", name: 'message1', desc: 'foo');
-
-message2(x) => Intl.message("Another message with parameter $x",
-    name: 'message2', desc: 'Description 2', args: [x], examples: {'x': 3});
-
-// A string with multiple adjacent strings concatenated together, verify
-// that the parser handles this properly.
-multiLine() => Intl.message("This "
-    "string "
-    "extends "
-    "across "
-    "multiple "
-    "lines.", name: "multiLine");
-
-// Have types on the enclosing function's arguments.
-types(int a, String b, List c) =>
-    Intl.message("$a, $b, $c", name: 'types', args: [a, b, c]);
-
-// This string will be printed with a French locale, so it will always show
-// up in the French version, regardless of the current locale.
-alwaysTranslated() => Intl.message("This string is always translated",
-    locale: 'fr', name: 'alwaysTranslated');
-
-// Test interpolation with curly braces around the expression, but it must
-// still be just a variable reference.
-trickyInterpolation(s) => Intl.message(
-    "Interpolation is tricky when it ends a sentence like ${s}.",
-    name: 'trickyInterpolation', args: [s]);
-
-get leadingQuotes => Intl.message("\"So-called\"", name: 'leadingQuotes');
-
-// A message with characters not in the basic multilingual plane.
-originalNotInBMP() => Intl.message("Ancient Greek hangman characters: 𐅆𐅇.",
-    name: "originalNotInBMP");
-
-// A string for which we don't provide all translations.
-notAlwaysTranslated() => Intl.message("This is missing some translations",
-    name: "notAlwaysTranslated");
-
-// This is invalid and should be recognized as such, because the message has
-// to be a literal. Otherwise, interpolations would be outside of the function
-// scope.
-var someString = "No, it has to be a literal string";
-noVariables() => Intl.message(someString, name: "noVariables");
-
-// This is unremarkable in English, but the translated versions will contain
-// characters that ought to be escaped during code generation.
-escapable() => Intl.message("Escapable characters here: ", name: "escapable");
-
-outerPlural(n) => Intl.plural(n,
-    zero: 'none',
-    one: 'one',
-    other: 'some',
-    name: 'outerPlural',
-    desc: 'A plural with no enclosing message',
-    args: [n]);
-
-outerGender(g) => Intl.gender(g,
-    male: 'm',
-    female: 'f',
-    other: 'o',
-    name: 'outerGender',
-    desc: 'A gender with no enclosing message',
-    args: [g]);
-
-pluralThatFailsParsing(noOfThings) => Intl.plural(noOfThings,
-    one: "1 thing:",
-    other: "$noOfThings things:",
-    name: "pluralThatFailsParsing",
-    args: [noOfThings],
-    desc: "How many things are there?");
-
-// A standalone gender message where we don't provide name or args. This should
-// be rejected by validation code.
-invalidOuterGender(g) => Intl.gender(g, other: 'o');
-
-// A general select
-outerSelect(currency, amount) => Intl.select(currency, {
-  "CDN": "$amount Canadian dollars",
-  "other": "$amount some currency or other."
-}, name: "outerSelect", args: [currency, amount]);
-
-// A select with a plural inside the expressions.
-nestedSelect(currency, amount) => Intl.select(currency, {
-  "CDN": """${Intl.plural(amount, one: '$amount Canadian dollar',
-          other: '$amount Canadian dollars')}""",
-  "other": "Whatever",
-}, name: "nestedSelect", args: [currency, amount]);
-
-// A trivial nested plural/gender where both are done directly rather than
-// in interpolations.
-nestedOuter(number, gen) => Intl.plural(number,
-    other: Intl.gender(gen, male: "$number male", other: "$number other"),
-    name: 'nestedOuter',
-    args: [number, gen]);
-
-sameContentsDifferentName() => Intl.message("Hello World",
-    name: "sameContentsDifferentName",
-    desc: "One of two messages with the same contents, but different names");
-
-differentNameSameContents() => Intl.message("Hello World",
-    name: "differentNameSameContents",
-    desc: "One of two messages with the same contents, but different names");
-
-/// Distinguish two messages with identical text using the meaning parameter.
-rentToBePaid() => Intl.message("rent",
-    name: "rentToBePaid",
-    meaning: 'Money for rent',
-    desc: "Money to be paid for rent");
-
-rentAsVerb() => Intl.message("rent",
-    name: "rentAsVerb",
-    meaning: 'rent as a verb',
-    desc: "The action of renting, as in rent a car");
-
-printStuff(Intl locale) {
-
-  // Use a name that's not a literal so this will get skipped. Then we have
-  // a name that's not in the original but we include it in the French
-  // translation. Because it's not in the original it shouldn't get included
-  // in the generated catalog and shouldn't get translated.
-  if (locale.locale == 'fr') {
-    var badName = "thisNameIsNotInTheOriginal";
-    var notInOriginal = Intl.message("foo", name: badName);
-    if (notInOriginal != "foo") {
-      throw "You shouldn't be able to introduce a new message in a translation";
-    }
-  }
-
-  // A function that is assigned to a variable. It's also nested
-  // within another function definition.
-  message3(a, b, c) => Intl.message(
-      "Characters that need escaping, e.g slashes \\ dollars \${ (curly braces "
-      "are ok) and xml reserved characters <& and quotes \" "
-      "parameters $a, $b, and $c", name: 'message3', args: [a, b, c]);
-  var messageVariable = message3;
-
-  printOut("-------------------------------------------");
-  printOut("Printing messages for ${locale.locale}");
-  Intl.withLocale(locale.locale, () {
-    printOut(message1());
-    printOut(message2("hello"));
-    printOut(messageVariable(1, 2, 3));
-    printOut(multiLine());
-    printOut(types(1, "b", ["c", "d"]));
-    printOut(leadingQuotes);
-    printOut(alwaysTranslated());
-    printOut(trickyInterpolation("this"));
-    var thing = new YouveGotMessages();
-    printOut(thing.method());
-    printOut(thing.nonLambda());
-    printOut(YouveGotMessages.staticMessage());
-    printOut(notAlwaysTranslated());
-    printOut(originalNotInBMP());
-    printOut(escapable());
-
-    printOut(thing.plurals(0));
-    printOut(thing.plurals(1));
-    printOut(thing.plurals(2));
-    printOut(thing.plurals(3));
-    printOut(thing.plurals(4));
-    printOut(thing.plurals(5));
-    printOut(thing.plurals(6));
-    printOut(thing.plurals(7));
-    printOut(thing.plurals(8));
-    printOut(thing.plurals(9));
-    printOut(thing.plurals(10));
-    printOut(thing.plurals(11));
-    printOut(thing.plurals(20));
-    printOut(thing.plurals(100));
-    printOut(thing.plurals(101));
-    printOut(thing.plurals(100000));
-    var alice = new Person("Alice", "female");
-    var bob = new Person("Bob", "male");
-    var cat = new Person("cat", null);
-    printOut(thing.whereTheyWent(alice, "house"));
-    printOut(thing.whereTheyWent(bob, "house"));
-    printOut(thing.whereTheyWent(cat, "litter box"));
-    printOut(thing.nested([alice, bob], "magasin"));
-    printOut(thing.nested([alice], "magasin"));
-    printOut(thing.nested([], "magasin"));
-    printOut(thing.nested([bob, bob], "magasin"));
-    printOut(thing.nested([alice, alice], "magasin"));
-
-    printOut(outerPlural(0));
-    printOut(outerPlural(1));
-    printOut(outerGender("male"));
-    printOut(outerGender("female"));
-    printOut(nestedOuter(7, "male"));
-    printOut(outerSelect("CDN", 7));
-    printOut(outerSelect("EUR", 5));
-    printOut(nestedSelect("CDN", 1));
-    printOut(nestedSelect("CDN", 2));
-    printOut(pluralThatFailsParsing(1));
-    printOut(pluralThatFailsParsing(2));
-    printOut(differentNameSameContents());
-    printOut(sameContentsDifferentName());
-    printOut(rentAsVerb());
-    printOut(rentToBePaid());
-  });
-}
-
-var localeToUse = 'en_US';
-
-main() {
-  var fr = new Intl("fr");
-  var english = new Intl("en_US");
-  var de = new Intl("de_DE");
-  // Throw in an initialize of a null locale to make sure it doesn't throw.
-  initializeMessages(null);
-
-  // Verify that a translated message isn't initially present.
-  var messageInGerman = Intl.withLocale('de_DE', message1);
-  expect(messageInGerman, "This is a message");
-
-  var f1 = initializeMessages(fr.locale)
-      // Since English has the one message which is always translated, we
-      // can't print it until French is ready.
-      .then((_) => printStuff(english)).then((_) => printStuff(fr));
-  var f2 = initializeMessages('de-de').then((_) => printStuff(de));
-  return Future.wait([f1, f2]);
-}
diff --git a/packages/intl/test/message_extraction/verify_messages.dart b/packages/intl/test/message_extraction/verify_messages.dart
deleted file mode 100644
index 712dc12..0000000
--- a/packages/intl/test/message_extraction/verify_messages.dart
+++ /dev/null
@@ -1,205 +0,0 @@
-library verify_messages;
-
-import "print_to_list.dart";
-import "package:unittest/unittest.dart";
-
-verifyResult(ignored) {
-  test("Verify message translation output", actuallyVerifyResult);
-}
-actuallyVerifyResult() {
-  var lineIterator;
-  verify(String s) {
-    lineIterator.moveNext();
-    var value = lineIterator.current;
-    expect(value, s);
-  }
-
-  var expanded = lines.expand((line) => line.split("\n")).toList();
-  lineIterator = expanded.iterator..moveNext();
-  verify("Printing messages for en_US");
-  verify("This is a message");
-  verify("Another message with parameter hello");
-  verify("Characters that need escaping, e.g slashes \\ dollars \${ "
-      "(curly braces are ok) and xml reserved characters <& and "
-      "quotes \" parameters 1, 2, and 3");
-  verify("This string extends across multiple lines.");
-  verify("1, b, [c, d]");
-  verify('"So-called"');
-  verify("Cette chaîne est toujours traduit");
-  verify("Interpolation is tricky when it ends a sentence like this.");
-  verify("This comes from a method");
-  verify("This method is not a lambda");
-  verify("This comes from a static method");
-  verify("This is missing some translations");
-  verify("Ancient Greek hangman characters: 𐅆𐅇.");
-  verify("Escapable characters here: ");
-
-  verify('Is zero plural?');
-  verify('This is singular.');
-  verify('This is plural (2).');
-  verify('This is plural (3).');
-  verify('This is plural (4).');
-  verify('This is plural (5).');
-  verify('This is plural (6).');
-  verify('This is plural (7).');
-  verify('This is plural (8).');
-  verify('This is plural (9).');
-  verify('This is plural (10).');
-  verify('This is plural (11).');
-  verify('This is plural (20).');
-  verify('This is plural (100).');
-  verify('This is plural (101).');
-  verify('This is plural (100000).');
-  verify('Alice went to her house');
-  verify('Bob went to his house');
-  verify('cat went to its litter box');
-  verify('Alice, Bob sont allés au magasin');
-  verify('Alice est allée au magasin');
-  verify('Personne n\'est allé au magasin');
-  verify('Bob, Bob sont allés au magasin');
-  verify('Alice, Alice sont allées au magasin');
-  verify('none');
-  verify('one');
-  verify('m');
-  verify('f');
-  verify('7 male');
-  verify('7 Canadian dollars');
-  verify('5 some currency or other.');
-  verify('1 Canadian dollar');
-  verify('2 Canadian dollars');
-  verify('1 thing:');
-  verify('2 things:');
-  verify('Hello World');
-  verify('Hello World');
-  verify('rent');
-  verify('rent');
-
-  var fr_lines =
-      expanded.skip(1).skipWhile((line) => !line.contains('----')).toList();
-  lineIterator = fr_lines.iterator..moveNext();
-  verify("Printing messages for fr");
-  verify("Il s'agit d'un message");
-  verify("Un autre message avec un seul paramètre hello");
-  verify("Caractères qui doivent être échapper, par exemple barres \\ "
-      "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
-      "des citations \" "
-      "avec quelques paramètres ainsi 1, 2, et 3");
-  verify("Cette message prend plusiers lignes.");
-  verify("1, b, [c, d]");
-  verify('"Soi-disant"');
-  verify("Cette chaîne est toujours traduit");
-  verify("L'interpolation est délicate quand elle se termine une "
-      "phrase comme this.");
-  verify("Cela vient d'une méthode");
-  verify("Cette méthode n'est pas un lambda");
-  verify("Cela vient d'une méthode statique");
-  verify("Ce manque certaines traductions");
-  verify("Anciens caractères grecs jeux du pendu: 𐅆𐅇.");
-  verify("Escapes: ");
-  verify("\r\f\b\t\v.");
-
-  verify('Est-ce que nulle est pluriel?');
-  verify('C\'est singulier');
-  verify('C\'est pluriel (2).');
-  verify('C\'est pluriel (3).');
-  verify('C\'est pluriel (4).');
-  verify('C\'est pluriel (5).');
-  verify('C\'est pluriel (6).');
-  verify('C\'est pluriel (7).');
-  verify('C\'est pluriel (8).');
-  verify('C\'est pluriel (9).');
-  verify('C\'est pluriel (10).');
-  verify('C\'est pluriel (11).');
-  verify('C\'est pluriel (20).');
-  verify('C\'est pluriel (100).');
-  verify('C\'est pluriel (101).');
-  verify('C\'est pluriel (100000).');
-  verify('Alice est allée à sa house');
-  verify('Bob est allé à sa house');
-  verify('cat est allé à sa litter box');
-  verify('Alice, Bob étaient allés à la magasin');
-  verify('Alice était allée à la magasin');
-  verify('Personne n\'avait allé à la magasin');
-  verify('Bob, Bob étaient allés à la magasin');
-  verify('Alice, Alice étaient allées à la magasin');
-  verify('rien');
-  verify('un');
-  verify('homme');
-  verify('femme');
-  verify('7 homme');
-  verify('7 dollars Canadiens');
-  verify('5 certaine devise ou autre.');
-  verify('1 dollar Canadien');
-  verify('2 dollars Canadiens');
-  verify('1 chose:');
-  verify('2 choses:');
-  verify('Bonjour tout le monde');
-  verify('Bonjour tout le monde');
-  verify('louer');
-  verify('loyer');
-
-  var de_lines =
-      fr_lines.skip(1).skipWhile((line) => !line.contains('----')).toList();
-  lineIterator = de_lines.iterator..moveNext();
-  verify("Printing messages for de_DE");
-  verify("Dies ist eine Nachricht");
-  verify("Eine weitere Meldung mit dem Parameter hello");
-  verify("Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
-      "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
-      "Zitate \" Parameter 1, 2 und 3");
-  verify("Dieser String erstreckt sich über mehrere "
-      "Zeilen erstrecken.");
-  verify("1, b, [c, d]");
-  verify('"Sogenannt"');
-  // This is correct, the message is forced to French, even in a German locale.
-  verify("Cette chaîne est toujours traduit");
-  verify(
-      "Interpolation ist schwierig, wenn es einen Satz wie dieser endet this.");
-  verify("Dies ergibt sich aus einer Methode");
-  verify("Diese Methode ist nicht eine Lambda");
-  verify("Dies ergibt sich aus einer statischen Methode");
-  verify("This is missing some translations");
-  verify("Antike griechische Galgenmännchen Zeichen: 𐅆𐅇");
-  verify("Escapes: ");
-  verify("\r\f\b\t\v.");
-
-  verify('Ist Null Plural?');
-  verify('Dies ist einmalig');
-  verify('Dies ist Plural (2).');
-  verify('Dies ist Plural (3).');
-  verify('Dies ist Plural (4).');
-  verify('Dies ist Plural (5).');
-  verify('Dies ist Plural (6).');
-  verify('Dies ist Plural (7).');
-  verify('Dies ist Plural (8).');
-  verify('Dies ist Plural (9).');
-  verify('Dies ist Plural (10).');
-  verify('Dies ist Plural (11).');
-  verify('Dies ist Plural (20).');
-  verify('Dies ist Plural (100).');
-  verify('Dies ist Plural (101).');
-  verify('Dies ist Plural (100000).');
-  verify('Alice ging zu ihrem house');
-  verify('Bob ging zu seinem house');
-  verify('cat ging zu seinem litter box');
-  verify('Alice, Bob gingen zum magasin');
-  verify('Alice ging in dem magasin');
-  verify('Niemand ging zu magasin');
-  verify('Bob, Bob gingen zum magasin');
-  verify('Alice, Alice gingen zum magasin');
-  verify('Null');
-  verify('ein');
-  verify('Mann');
-  verify('Frau');
-  verify('7 Mann');
-  verify('7 Kanadischen dollar');
-  verify('5 einige Währung oder anderen.');
-  verify('1 Kanadischer dollar');
-  verify('2 Kanadischen dollar');
-  verify('eins:');
-  verify('2 Dinge:');
-  verify('Hallo Welt');
-  verify('Hallo Welt');
-  verify('mieten');
-  verify('Miete');
-}
diff --git a/packages/intl/test/number_closure_test.dart b/packages/intl/test/number_closure_test.dart
index 8f4410c..af43bda 100644
--- a/packages/intl/test/number_closure_test.dart
+++ b/packages/intl/test/number_closure_test.dart
@@ -1,14 +1,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Tests based on the closure number formatting tests.
- */
+/// Tests based on the closure number formatting tests.
 library number_closure_test;
 
 import 'dart:async';
 import "package:intl/intl.dart";
-import "package:unittest/unittest.dart";
+import "package:test/test.dart";
 
 main() {
   test("testVeryBigNumber", testVeryBigNumber);
@@ -27,10 +25,8 @@
   test("testLocaleSwitchAsync", testLocaleSwitchAsync);
 }
 
-/**
- * Test two large numbers for equality, assuming that there may be some
- * loss of precision in the less significant digits.
- */
+/// Test two large numbers for equality, assuming that there may be some
+/// loss of precision in the less significant digits.
 veryBigNumberCompare(str1, str2) {
   return str1.length == str2.length &&
       str1.substring(0, 8) == str2.substring(0, 8);
@@ -383,9 +379,11 @@
   Intl.withLocale("fr", verifyFrenchLocale);
 }
 
+typedef void TimerArgument();
 testLocaleSwitchAsync() {
   Intl.withLocale("fr", () {
-    new Timer(new Duration(milliseconds: 10), expectAsync(verifyFrenchLocale));
+    new Timer(new Duration(milliseconds: 10),
+        expectAsync(verifyFrenchLocale) as TimerArgument);
   });
   // Verify that things running outside the zone still get en_US.
   testStandardFormat();
diff --git a/packages/intl/test/number_format_compact_test.dart b/packages/intl/test/number_format_compact_test.dart
new file mode 100644
index 0000000..607dc20
--- /dev/null
+++ b/packages/intl/test/number_format_compact_test.dart
@@ -0,0 +1,282 @@
+/// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+/// for details. All rights reserved. Use of this source code is governed by a
+/// BSD-style license that can be found in the LICENSE file.
+
+/// Tests for compact format numbers, e.g. 1.2M rather than 1,200,000
+import 'dart:math';
+import 'package:test/test.dart';
+import 'package:intl/intl.dart';
+import 'package:fixnum/fixnum.dart';
+import 'compact_number_test_data.dart' as testdata;
+
+/// A place to put a case that's causing a problem and have it run first when
+/// debugging
+var interestingCases = {
+//  "mn" : [["4321", "4.32M", "whatever"]]
+};
+
+main() {
+  interestingCases.forEach(validate);
+  testdata.compactNumberTestData.forEach(validate);
+
+  // ICU doesn't support compact currencies yet, so we don't have a way to
+  // generate automatic data for comparison. Hard-coded a couple of cases as a
+  // smoke test. JPY is a useful test because it has no decimalDigits and
+  // different grouping than USD, as well as a different currency symbol and
+  // suffixes.
+  testCurrency("ja", 1.2345, "¥1", "¥1");
+  testCurrency("ja", 1, "¥1", "¥1");
+  testCurrency("ja", 12, "¥12", "¥10");
+  testCurrency("ja", 123, "¥123", "¥100");
+  testCurrency("ja", 1234, "¥1230", "¥1000");
+  testCurrency("ja", 12345, "¥1.23\u4E07", "¥1\u4E07");
+  testCurrency("ja", 123456, "¥12.3\u4E07", "¥10\u4E07");
+  testCurrency("ja", 1234567, "¥123\u4e07", "¥100\u4e07");
+  testCurrency("ja", 12345678, "¥1230\u4e07", "¥1000\u4e07");
+  testCurrency("ja", 123456789, "¥1.23\u5104", "¥1\u5104");
+
+  testCurrency("ja", 0.9876, "¥1", "¥1");
+  testCurrency("ja", 9, "¥9", "¥9");
+  testCurrency("ja", 98, "¥98", "¥100");
+  testCurrency("ja", 987, "¥987", "¥1000");
+  testCurrency("ja", 9876, "¥9880", "¥1\u4E07");
+  testCurrency("ja", 98765, "¥9.88\u4E07", "¥10\u4E07");
+  testCurrency("ja", 987656, "¥98.8\u4E07", "¥100\u4E07");
+  testCurrency("ja", 9876567, "¥988\u4e07", "¥1000\u4e07");
+  testCurrency("ja", 98765678, "¥9880\u4e07", "¥1\u5104");
+  testCurrency("ja", 987656789, "¥9.88\u5104", "¥10\u5104");
+
+  testCurrency("en_US", 1.2345, r"$1.23", r"$1");
+  testCurrency("en_US", 1, r"$1.00", r"$1");
+  testCurrency("en_US", 12, r"$12.00", r"$10");
+  testCurrency("en_US", 12.3, r"$12.30", r"$10");
+  testCurrency("en_US", 123, r"$123", r"$100");
+  testCurrency("en_US", 1234, r"$1.23K", r"$1K");
+  testCurrency("en_US", 12345, r"$12.3K", r"$10K");
+  testCurrency("en_US", 123456, r"$123K", r"$100K");
+  testCurrency("en_US", 1234567, r"$1.23M", r"$1M");
+
+  // Check for order of currency symbol when currency is a suffix.
+  testCurrency("ru", 4420, "4,42\u00A0тыс.\u00A0руб.", "4\u00A0тыс.\u00A0руб.");
+
+  // Locales which don't have a suffix for thousands.
+  testCurrency("it", 442, "442\u00A0€", "400\u00A0€");
+  testCurrency("it", 4420, "4420\u00A0\$", "4000\u00A0\$", currency: 'CAD');
+  testCurrency("it", 4420000, "4,42\u00A0Mio\u00A0\$", "4\u00A0Mio\u00A0\$",
+      currency: 'USD');
+
+  test("Explicit non-default symbol with compactCurrency", () {
+    var format = new NumberFormat.compactCurrency(locale: "ja", symbol: "()");
+    var result = format.format(98765);
+    expect(result, "()9.88\u4e07");
+  });
+}
+
+testCurrency(String locale, num number, String expected, String expectedShort,
+    {String currency}) {
+  test("Compact simple currency for $locale, $number", () {
+    var format =
+        new NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
+    var result = format.format(number);
+    expect(result, expected);
+    var shortFormat =
+        new NumberFormat.compactSimpleCurrency(locale: locale, name: currency);
+    shortFormat.significantDigits = 1;
+    var shortResult = shortFormat.format(number);
+    expect(shortResult, expectedShort);
+  });
+  test("Compact currency for $locale, $number", () {
+    var symbols = {
+      "ja": "¥",
+      "en_US": r"$",
+      "ru": "руб.",
+      "it": "€",
+      "CAD": r"$",
+      "USD": r"$"
+    };
+    var symbol = symbols[currency] ?? symbols[locale];
+    var format = new NumberFormat.compactCurrency(
+        locale: locale, name: currency, symbol: symbol);
+    var result = format.format(number);
+    expect(result, expected);
+    var shortFormat = new NumberFormat.compactCurrency(
+        locale: locale, name: currency, symbol: symbol);
+    shortFormat.significantDigits = 1;
+    var shortResult = shortFormat.format(number);
+    expect(shortResult, expectedShort);
+  });
+}
+
+// TODO(alanknight): Don't just skip the whole locale if there's one problem
+// case.
+// TODO(alanknight): Fix the problems, or at least figure out precisely where
+// the differences are.
+var problemLocalesShort = [
+  "am", // AM Suffixes differ, not sure why.
+  "ca", // For CA, CLDR rules are different. Jumps from 0000 to 00 prefix, so
+  // 11 digits prints as 11900.
+  "es_419", // Some odd formatting rules for these which seem to be different
+  // from CLDR. wants e.g. '160000000000k' Actual: '160 B'
+  "es_ES", // The reverse of es_419 for a few cases. We're printing a longer
+  // form.
+  "es_US", // Like es_419 but not as many of them. e.g. Expected: '87700k'
+  // Actual: '87.7 M'
+  "es_MX", // like es_419
+  "es",
+  "fa",
+  "fr_CA", // Several where PyICU isn't compacting. Expected: '988000000'
+  // Actual: '988 M'.
+  "gsw", // Suffixes disagree
+  "in", // IN not compacting 54321, looks similar to tr.
+  "id", // ID not compacting 54321, looks similar to tr.
+  "ka", // K Slight difference in the suffix
+  "kk", "mn", // We're picking the wrong pattern for 654321.
+  "lo", "mk", "my",
+  "pt_PT", // Seems to differ in appending mil or not after thousands. pt_BR
+  // does it.
+  "th", // TH Expected abbreviations as '1.09 พ.ล.' rather than '1.09 พ'
+  "tr", // TR Doesn't have a 0B format, goes directly to 00B, as a result 54321
+  // just prints as 54321
+  "ur", // UR Fails one with Expected: '15 ٹریلین'  Actual: '150 کھرب'
+];
+
+/// Locales that have problems in the long format.
+///
+/// These are mostly minor differences in the characters, and many I can't read,
+/// but I'm suspicious many of them are essentially the difference between
+/// million and millions, which we don't distinguish. That's definitely the case
+/// with e.g. DE, but our data definitely has Millionen throughout.
+///
+//TODO(alanknight): Narrow these down to particular numbers. Often it's just
+// 999999.
+var problemLocalesLong = [
+  "ar",
+  "be", "bg", "bs",
+  "ca", "cs", "da", "de", "de_AT", "de_CH", "el", "es", "es_419", "es_ES",
+  "es_MX", "es_US", "et", "fi",
+  "fil", // FIL is different, seems like a genuine difference in suffixes
+  "fr", "fr_CA", "ga", "gl",
+  "gsw", // GSW seems like we have long forms and pyICU doesn't
+  "hr", "is", "it", "lo", // LO seems to be picking up a different pattern.
+  "lt", "lv", "mk",
+  "my", // Seems to come out in the reverse order
+  "nb", "ne", "no", "no_NO", "pl",
+  "pt", // PT has some issues with scale as well, but I think it's differences
+  // in the patterns.
+  "pt_BR", "pt_PT", "ro", "ru", "sk", "sl", "sr", "sr_Latn", "sv", "te", "tl",
+  "ur",
+  "uk",
+];
+
+void validate(String locale, List<List<String>> expected) {
+  validateShort(locale, expected);
+  validateLong(locale, expected);
+}
+
+/// Check each bit of test data against the short compact format, both
+/// formatting and parsing.
+void validateShort(String locale, List<List<String>> expected) {
+  if (problemLocalesShort.contains(locale)) {
+    print("Skipping problem locale '$locale' for SHORT compact number tests");
+    return;
+  }
+  var shortFormat = new NumberFormat.compact(locale: locale);
+  for (var data in expected) {
+    var number = num.parse(data.first);
+    test("Validate $locale SHORT for ${data.first}", () {
+      validateNumber(number, shortFormat, data[1]);
+    });
+    var int64Number = new Int64(number);
+    test("Validate Int64 SHORT on $locale for ${data.first}", () {
+      validateNumber(int64Number, shortFormat, data[1]);
+    });
+    // TODO(alanknight): Make this work for MicroMoney
+  }
+}
+
+void validateLong(String locale, List<List<String>> expected) {
+  if (problemLocalesLong.contains(locale)) {
+    print("Skipping problem locale '$locale' for LONG compact number tests");
+    return;
+  }
+  var longFormat = new NumberFormat.compactLong(locale: locale);
+  for (var data in expected) {
+    var number = num.parse(data.first);
+    test("Validate $locale LONG for ${data.first}", () {
+      validateNumber(number, longFormat, data[2]);
+    });
+  }
+}
+
+void validateNumber(number, NumberFormat format, String expected) {
+  var formatted = format.format(number);
+  var ok = closeEnough(formatted, expected);
+  if (!ok) {
+    expect(
+        "$formatted ${formatted.codeUnits}", "$expected ${expected.codeUnits}");
+  }
+  var parsed = format.parse(formatted);
+  var rounded = roundForPrinting(number, format);
+  expect((parsed - rounded) / rounded < 0.001, isTrue);
+}
+
+/// Duplicate a bit of the logic in formatting, where if we have a
+/// number that will round to print differently depending on the number
+/// of significant digits, we need to check that as well, e.g.
+/// 999999 may print as 1M.
+roundForPrinting(number, NumberFormat format) {
+  var originalLength = NumberFormat.numberOfIntegerDigits(number);
+  var additionalDigits = originalLength - format.significantDigits;
+  if (additionalDigits > 0) {
+    var divisor = pow(10, additionalDigits);
+    // If we have an Int64, value speed over precision and make it double.
+    var rounded = (number.toDouble() / divisor).round() * divisor;
+    return rounded;
+  }
+  return number.toDouble();
+}
+
+final _nbsp = 0xa0;
+final _nbspString = new String.fromCharCode(_nbsp);
+
+/// Return true if the strings are close enough to what we
+/// expected to consider a pass.
+///
+/// In particular, there seem to be minor differences between what PyICU is
+/// currently producing and the CLDR data. So if the strings differ only in the
+/// presence or absence of a period at the end or of a space between the number
+/// and the suffix, consider it close enough and return true.
+bool closeEnough(String result, String reference) {
+  var expected = reference.replaceAll(' ', _nbspString);
+  if (result == expected) {
+    return true;
+  }
+  if ('$result.' == expected) {
+    return true;
+  }
+  if (result == '$expected.') {
+    return true;
+  }
+  if (_oneSpaceOnlyDifference(result, expected)) {
+    return true;
+  }
+  return false;
+}
+
+/// Do the two strings differ only by a single space being
+/// omitted in one of them.
+///
+/// We assume non-breaking spaces because we
+/// know that's what the Intl data uses. We already know the strings aren't
+/// equal because that's checked first in the only caller.
+bool _oneSpaceOnlyDifference(String result, String expected) {
+  var resultWithoutSpaces =
+      new String.fromCharCodes(result.codeUnits.where((x) => x != _nbsp));
+  var expectedWithoutSpaces =
+      new String.fromCharCodes(expected.codeUnits.where((x) => x != _nbsp));
+  var resultDifference = result.length - resultWithoutSpaces.length;
+  var expectedDifference = expected.length - expectedWithoutSpaces.length;
+  return (resultWithoutSpaces == expectedWithoutSpaces &&
+      resultDifference <= 1 &&
+      expectedDifference <= 1);
+}
diff --git a/packages/intl/test/number_format_test.dart b/packages/intl/test/number_format_test.dart
index 14c8b3f..8ba75e4 100644
--- a/packages/intl/test/number_format_test.dart
+++ b/packages/intl/test/number_format_test.dart
@@ -1,24 +1,21 @@
-/**
- * Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
- * for details. All rights reserved. Use of this source code is governed by a
- * BSD-style license that can be found in the LICENSE file.
- */
+/// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+/// for details. All rights reserved. Use of this source code is governed by a
+/// BSD-style license that can be found in the LICENSE file.
 
 library number_format_test;
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:intl/number_symbols_data.dart';
 import 'package:intl/intl.dart';
 import 'number_test_data.dart';
 import 'dart:math';
 
-/**
- * Tests the Numeric formatting library in dart.
- */
+/// Tests the Numeric formatting library in dart.
 var testNumbersWeCanReadBack = {
   "-1": -1,
   "-2": -2.0,
   "-0.01": -0.01,
+  "-1.23": -1.23,
   "0.001": 0.001,
   "0.01": 0.01,
   "0.1": 0.1,
@@ -37,10 +34,16 @@
   "-∞": double.NEGATIVE_INFINITY,
 };
 
-/** Test numbers that we can't parse because we lose precision in formatting.*/
-var testNumbersWeCannotReadBack = {"3.142": PI,};
+/// Test numbers that we can't parse because we lose precision in formatting.
+var testNumbersWeCannotReadBack = {
+  "3.142": PI,
+  "-1.234": -1.2342,
+  "-1.235": -1.2348,
+  "1.234": 1.2342,
+  "1.235": 1.2348
+};
 
-/** Test numbers that won't work in Javascript because they're too big. */
+/// Test numbers that won't work in Javascript because they're too big.
 var testNumbersOnlyForTheVM = {
   "10,000,000,000,000,000,000,000,000,000,000":
       10000000000000000000000000000000,
@@ -78,35 +81,11 @@
     var testFormats = standardFormats(locale);
     var testLength = (testFormats.length * 3) + 1;
     var list = mainList.take(testLength).iterator;
+    list.moveNext();
     mainList = mainList.skip(testLength);
-    var nextLocaleFromList = (list..moveNext()).current;
-    test("Test against ICU data for $locale", () {
-      expect(locale, nextLocaleFromList);
-      for (var format in testFormats) {
-        var formatted = format.format(123);
-        var negative = format.format(-12.3);
-        var large = format.format(1234567890);
-        var expected = (list..moveNext()).current;
-        expect(formatted, expected);
-        var expectedNegative = (list..moveNext()).current;
-        // Some of these results from CLDR have a leading LTR/RTL indicator,
-        // which we don't want. We also treat the difference between Unicode
-        // minus sign (2212) and hyphen-minus (45) as not significant.
-        expectedNegative = expectedNegative
-            .replaceAll("\u200e", "")
-            .replaceAll("\u200f", "")
-            .replaceAll("\u2212", "-");
-        expect(negative, expectedNegative);
-        var expectedLarge = (list..moveNext()).current;
-        expect(large, expectedLarge);
-        var readBack = format.parse(formatted);
-        expect(readBack, 123);
-        var readBackNegative = format.parse(negative);
-        expect(readBackNegative, -12.3);
-        var readBackLarge = format.parse(large);
-        expect(readBackLarge, 1234567890);
-      }
-    });
+    if (locale == list.current) {
+      testAgainstIcu(locale, testFormats, list);
+    }
   }
 
   test('Simple set of numbers', () {
@@ -159,7 +138,7 @@
 
   test('Explicit currency name', () {
     var amount = 1000000.32;
-    var usConvention = new NumberFormat.currencyPattern('en_US', '€');
+    var usConvention = new NumberFormat.currency(locale: 'en_US', symbol: '€');
     var formatted = usConvention.format(amount);
     expect(formatted, '€1,000,000.32');
     var readBack = usConvention.parse(formatted);
@@ -172,7 +151,7 @@
     expect(readBack, amount);
 
     /// Verify we can leave off the currency and it gets filled in.
-    var plainSwiss = new NumberFormat.currencyPattern('de_CH');
+    var plainSwiss = new NumberFormat.currency(locale: 'de_CH');
     formatted = plainSwiss.format(amount);
     expect(formatted, r"CHF" + nbsp + "1'000'000.32");
     readBack = plainSwiss.parse(formatted);
@@ -195,10 +174,125 @@
   });
 
   test('Unparseable', () {
-    var format = new NumberFormat.currencyPattern();
+    var format = new NumberFormat.currency();
     expect(() => format.parse("abcdefg"), throwsFormatException);
     expect(() => format.parse(""), throwsFormatException);
     expect(() => format.parse("1.0zzz"), throwsFormatException);
     expect(() => format.parse("-∞+1"), throwsFormatException);
   });
+
+  var digitsCheck = {
+    0: "@4",
+    1: "@4.3",
+    2: "@4.32",
+    3: "@4.322",
+    4: "@4.3220",
+  };
+
+  test('Decimal digits', () {
+    var amount = 4.3219876;
+    for (var digits in digitsCheck.keys) {
+      var f = new NumberFormat.currency(
+          locale: 'en_US', symbol: '@', decimalDigits: digits);
+      var formatted = f.format(amount);
+      expect(formatted, digitsCheck[digits]);
+    }
+    var defaultFormat = new NumberFormat.currency(locale: 'en_US', symbol: '@');
+    var formatted = defaultFormat.format(amount);
+    expect(formatted, digitsCheck[2]);
+
+    var jpyUs =
+        new NumberFormat.currency(locale: 'en_US', name: 'JPY', symbol: '@');
+    formatted = jpyUs.format(amount);
+    expect(formatted, digitsCheck[0]);
+
+    var jpyJa =
+        new NumberFormat.currency(locale: 'ja', name: 'JPY', symbol: '@');
+    formatted = jpyJa.format(amount);
+    expect(formatted, digitsCheck[0]);
+
+    var jpySimple = new NumberFormat.simpleCurrency(locale: 'ja', name: 'JPY');
+    formatted = jpySimple.format(amount);
+    expect(formatted, "¥4");
+
+    var jpyLower =
+        new NumberFormat.currency(locale: 'en_US', name: 'jpy', symbol: '@');
+    formatted = jpyLower.format(amount);
+    expect(formatted, digitsCheck[0]);
+
+    var tnd = new NumberFormat.currency(name: 'TND', symbol: '@');
+    formatted = tnd.format(amount);
+    expect(formatted, digitsCheck[3]);
+  });
+
+  testSimpleCurrencySymbols();
+}
+
+String stripExtras(String input) {
+  // Some of these results from CLDR have a leading LTR/RTL indicator,
+  // and/or Arabic letter indicator,
+  // which we don't want. We also treat the difference between Unicode
+  // minus sign (2212) and hyphen-minus (45) as not significant.
+  return input
+      .replaceAll("\u200e", "")
+      .replaceAll("\u200f", "")
+      .replaceAll("\u061c", "")
+      .replaceAll("\u2212", "-");
+}
+
+void testAgainstIcu(locale, List<NumberFormat> testFormats, list) {
+  test("Test against ICU data for $locale", () {
+    for (var format in testFormats) {
+      var formatted = format.format(123);
+      var negative = format.format(-12.3);
+      var large = format.format(1234567890);
+      var expected = (list..moveNext()).current;
+      expect(formatted, expected);
+      var expectedNegative = (list..moveNext()).current;
+      expect(stripExtras(negative), stripExtras(expectedNegative));
+      var expectedLarge = (list..moveNext()).current;
+      expect(large, expectedLarge);
+      var readBack = format.parse(formatted);
+      expect(readBack, 123);
+      var readBackNegative = format.parse(negative);
+      expect(readBackNegative, -12.3);
+      var readBackLarge = format.parse(large);
+      expect(readBackLarge, 1234567890);
+    }
+  });
+}
+
+testSimpleCurrencySymbols() {
+  var currencies = ['USD', 'CAD', 'EUR', 'CRC', null];
+  //  Note that these print using the simple symbol as if we were in a
+  // a locale where that currency symbol is well understood. So we
+  // expect Canadian dollars printed as $, even though our locale is
+  // en_US, and this would confuse users.
+  var simple = currencies.map((currency) =>
+      new NumberFormat.simpleCurrency(locale: 'en_US', name: currency));
+  var expectedSimple = [r'$', r'$', '\u20ac', '\u20a1', r'$'];
+  // These will always print as the global name, regardless of locale
+  var global = currencies.map(
+      (currency) => new NumberFormat.currency(locale: 'en_US', name: currency));
+  var expectedGlobal = currencies.map((curr) => curr ?? 'USD').toList();
+
+  testCurrencySymbolsFor(expectedGlobal, global, "global");
+  testCurrencySymbolsFor(expectedSimple, simple, "simple");
+}
+
+testCurrencySymbolsFor(expected, formats, name) {
+  var amount = 1000000.32;
+  new Map.fromIterables(expected, formats)
+      .forEach((expected, NumberFormat format) {
+    test("Test $name ${format.currencyName}", () {
+      // We have to allow for currencies with different fraction digits, e.g. CRC.
+      var maxDigits = format.maximumFractionDigits;
+      var rounded = maxDigits == 0 ? amount.round() : amount;
+      var fractionDigits = (amount - rounded) < 0.00001 ? '.32' : '';
+      var formatted = format.format(rounded);
+      expect(formatted, "${expected}1,000,000$fractionDigits");
+      var parsed = format.parse(formatted);
+      expect(parsed, rounded);
+    });
+  });
 }
diff --git a/packages/intl/test/number_test_data.dart b/packages/intl/test/number_test_data.dart
index 19e4f43..f79f19c 100644
--- a/packages/intl/test/number_test_data.dart
+++ b/packages/intl/test/number_test_data.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Test data for numeric formatting from a large set of locales.
- *
- * DO NOT EDIT. This file is autogenerated from ICU data.
- * File generated from CLDR ver. 25.0
- */
+/// Test data for numeric formatting from a large set of locales.
+///
+/// DO NOT EDIT. This file is autogenerated from ICU data.
+/// File generated from CLDR ver. 30.0.2
 
 library number_test_data;
 
@@ -28,11 +26,11 @@
   r"123,456,789,000%",
   "ar",
   r"١٢٣",
-  r"‏-١٢٫٣",
+  r"؜-١٢٫٣",
   r"١٬٢٣٤٬٥٦٧٬٨٩٠",
-  r"١٢٬٣٠٠٪",
-  r"‏-١٬٢٣٠٪",
-  r"١٢٣٬٤٥٦٬٧٨٩٬٠٠٠٪",
+  r"١٢٬٣٠٠ ٪؜",
+  r"؜-١٬٢٣٠ ٪؜",
+  r"١٢٣٬٤٥٦٬٧٨٩٬٠٠٠ ٪؜",
   "az",
   r"123",
   r"-12,3",
@@ -40,6 +38,13 @@
   r"12.300%",
   r"-1.230%",
   r"123.456.789.000%",
+  "be",
+  r"123",
+  r"-12,3",
+  r"1 234 567 890",
+  r"12 300 %",
+  r"-1 230 %",
+  r"123 456 789 000 %",
   "bg",
   r"123",
   r"-12,3",
@@ -53,14 +58,21 @@
   r"১,২৩,৪৫,৬৭,৮৯০",
   r"১২,৩০০%",
   r"-১,২৩০%",
-  r"১,২৩,৪৫,৬৭,৮৯,০০০%",
+  r"১২৩,৪৫৬,৭৮৯,০০০%",
   "br",
   r"123",
   r"-12,3",
   r"1 234 567 890",
-  r"12 300%",
-  r"-1 230%",
-  r"123 456 789 000%",
+  r"12 300 %",
+  r"-1 230 %",
+  r"123 456 789 000 %",
+  "bs",
+  r"123",
+  r"-12,3",
+  r"1.234.567.890",
+  r"12.300 %",
+  r"-1.230 %",
+  r"123.456.789.000 %",
   "ca",
   r"123",
   r"-12,3",
@@ -106,17 +118,17 @@
   "de_AT",
   r"123",
   r"-12,3",
-  r"1.234.567.890",
-  r"12.300 %",
-  r"-1.230 %",
-  r"123.456.789.000 %",
+  r"1 234 567 890",
+  r"12 300 %",
+  r"-1 230 %",
+  r"123 456 789 000 %",
   "de_CH",
   r"123",
   r"-12.3",
   r"1'234'567'890",
-  r"12'300 %",
-  r"-1'230 %",
-  r"123'456'789'000 %",
+  r"12'300%",
+  r"-1'230%",
+  r"123'456'789'000%",
   "el",
   r"123",
   r"-12,3",
@@ -138,6 +150,13 @@
   r"12,300%",
   r"-1,230%",
   r"123,456,789,000%",
+  "en_CA",
+  r"123",
+  r"-12.3",
+  r"1,234,567,890",
+  r"12,300%",
+  r"-1,230%",
+  r"123,456,789,000%",
   "en_GB",
   r"123",
   r"-12.3",
@@ -184,29 +203,43 @@
   r"123",
   r"-12,3",
   r"1.234.567.890",
-  r"12.300%",
-  r"-1.230%",
-  r"123.456.789.000%",
+  r"12.300 %",
+  r"-1.230 %",
+  r"123.456.789.000 %",
   "es_419",
   r"123",
   r"-12.3",
   r"1,234,567,890",
+  r"12,300 %",
+  r"-1,230 %",
+  r"123,456,789,000 %",
+  "es_ES",
+  r"123",
+  r"-12,3",
+  r"1.234.567.890",
+  r"12.300 %",
+  r"-1.230 %",
+  r"123.456.789.000 %",
+  "es_MX",
+  r"123",
+  r"-12.3",
+  r"1,234,567,890",
   r"12,300%",
   r"-1,230%",
   r"123,456,789,000%",
-  "es_ES",
+  "es_US",
   r"123",
-  r"-12,3",
-  r"1.234.567.890",
-  r"12.300%",
-  r"-1.230%",
-  r"123.456.789.000%",
+  r"-12.3",
+  r"1,234,567,890",
+  r"12,300 %",
+  r"-1,230 %",
+  r"123,456,789,000 %",
   "et",
   r"123",
-  r"-12,3",
+  r"−12,3",
   r"1 234 567 890",
   r"12 300%",
-  r"-1 230%",
+  r"−1 230%",
   r"123 456 789 000%",
   "eu",
   r"123",
@@ -219,9 +252,9 @@
   r"۱۲۳",
   r"‎−۱۲٫۳",
   r"۱٬۲۳۴٬۵۶۷٬۸۹۰",
-  r"۱۲٬۳۰۰٪",
-  r"‎−۱٬۲۳۰٪",
-  r"۱۲۳٬۴۵۶٬۷۸۹٬۰۰۰٪",
+  r"‎٪ ۱۲٬۳۰۰",
+  r"‎٪ ‎−۱٬۲۳۰",
+  r"‎٪ ۱۲۳٬۴۵۶٬۷۸۹٬۰۰۰",
   "fi",
   r"123",
   r"−12,3",
@@ -261,9 +294,9 @@
   r"123",
   r"-12,3",
   r"1.234.567.890",
-  r"12.300%",
-  r"-1.230%",
-  r"123.456.789.000%",
+  r"12.300 %",
+  r"-1.230 %",
+  r"123.456.789.000 %",
   "gsw",
   r"123",
   r"−12.3",
@@ -316,10 +349,10 @@
   "hy",
   r"123",
   r"-12,3",
-  r"1234567890",
-  r"12300%",
-  r"-1230%",
-  r"123456789000%",
+  r"1 234 567 890",
+  r"12 300%",
+  r"-1 230%",
+  r"123 456 789 000%",
   "id",
   r"123",
   r"-12,3",
@@ -445,7 +478,7 @@
   r"1,23,45,67,890",
   r"12,300%",
   r"-1,230%",
-  r"1,23,45,67,89,000%",
+  r"123,456,789,000%",
   "mn",
   r"123",
   r"-12.3",
@@ -456,7 +489,7 @@
   "mr",
   r"१२३",
   r"-१२.३",
-  r"१,२३४,५६७,८९०",
+  r"१,२३,४५,६७,८९०",
   r"१२,३००%",
   r"-१,२३०%",
   r"१२३,४५६,७८९,०००%",
@@ -588,11 +621,11 @@
   r"123 456 789 000 %",
   "sl",
   r"123",
-  r"-12,3",
+  r"–12,3",
   r"1.234.567.890",
-  r"12.300%",
-  r"-1.230%",
-  r"123.456.789.000%",
+  r"12.300 %",
+  r"–1.230 %",
+  r"123.456.789.000 %",
   "sq",
   r"123",
   r"-12,3",
@@ -607,6 +640,13 @@
   r"12.300%",
   r"-1.230%",
   r"123.456.789.000%",
+  "sr_Latn",
+  r"123",
+  r"-12,3",
+  r"1.234.567.890",
+  r"12.300%",
+  r"-1.230%",
+  r"123.456.789.000%",
   "sv",
   r"123",
   r"−12,3",
@@ -631,7 +671,7 @@
   "te",
   r"123",
   r"-12.3",
-  r"1,234,567,890",
+  r"1,23,45,67,890",
   r"12,300%",
   r"-1,230%",
   r"123,456,789,000%",
@@ -669,7 +709,7 @@
   r"1,234,567,890",
   r"12,300%",
   r"‎-1,230%",
-  r"123,456,789,000%",
+  r"1,23,45,67,89,000%",
   "uz",
   r"123",
   r"-12,3",
diff --git a/packages/intl/test/plural_test.dart b/packages/intl/test/plural_test.dart
new file mode 100644
index 0000000..65a5f67
--- /dev/null
+++ b/packages/intl/test/plural_test.dart
@@ -0,0 +1,208 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test plurals without translation.
+///
+/// This exercises the plural selection rules. We aren't worried about the text,
+/// just that it picks the right phrase for the right number.
+
+library plural_test;
+
+import 'package:intl/intl.dart';
+import 'package:test/test.dart';
+
+/// Hard-coded expected values for a Russian plural rule.
+///
+/// Note that the way I'm interpreting this is that if there's a case for zero,
+/// one or two and the number is exactly that, then use that value. Otherwise we
+/// use One for the singular, Few for the genitive singular, and Many for the
+/// genitive plural. Other would be used for fractional values if we supported
+/// those.
+var expectedRu = '''
+0:Zero
+1:One
+2:Few
+3:Few
+4:Few
+5:Many
+6:Many
+7:Many
+8:Many
+9:Many
+10:Many
+11:Many
+12:Many
+13:Many
+14:Many
+15:Many
+16:Many
+17:Many
+18:Many
+19:Many
+20:Many
+21:One
+22:Few
+23:Few
+24:Few
+25:Many
+26:Many
+27:Many
+28:Many
+29:Many
+30:Many
+31:One
+32:Few
+59:Many
+60:Many
+61:One
+62:Few
+63:Few
+64:Few
+65:Many
+66:Many
+67:Many
+68:Many
+69:Many
+70:Many
+71:One
+72:Few
+100:Many
+101:One
+102:Few
+103:Few
+104:Few
+105:Many
+106:Many
+107:Many
+108:Many
+109:Many
+110:Many
+111:Many
+112:Many
+113:Many
+114:Many
+115:Many
+116:Many
+117:Many
+118:Many
+119:Many
+120:Many
+121:One
+122:Few
+129:Many
+130:Many
+131:One
+132:Few
+139:Many
+140:Many
+141:One
+142:Few
+143:Few
+144:Few
+145:Many
+''';
+
+var expectedEn = '''
+0:Zero
+1:One
+2:Other
+3:Other
+4:Other
+5:Other
+6:Other
+7:Other
+8:Other
+9:Other
+10:Other
+11:Other
+12:Other
+13:Other
+14:Other
+15:Other
+16:Other
+17:Other
+18:Other
+19:Other
+20:Other
+21:Other
+22:Other
+145:Other
+''';
+
+var expectedRo = '''
+0:Few
+1:One
+2:Few
+12:Few
+23:Other
+1212:Few
+1223:Other
+''';
+
+var expectedSr = '''
+0:Other
+1:One
+31:One
+3:Few
+33:Few
+5:Other
+10:Other
+35:Other
+37:Other
+40:Other
+2:Few
+20:Other
+21:One
+22:Few
+23:Few
+24:Few
+25:Other
+''';
+
+plural(n, locale) => Intl.plural(n,
+    locale: locale,
+    name: 'plural',
+    desc: 'A simple plural test case',
+    examples: {'n': 1},
+    args: [n],
+    zero: '$n:Zero',
+    one: '$n:One',
+    few: '$n:Few',
+    many: '$n:Many',
+    other: '$n:Other');
+
+pluralNoZero(n, locale) => Intl.plural(n,
+    locale: locale,
+    name: 'plural',
+    desc: 'A simple plural test case',
+    examples: {'n': 1},
+    args: [n],
+    one: '$n:One',
+    few: '$n:Few',
+    many: '$n:Many',
+    other: '$n:Other');
+
+main() {
+  verify(expectedRu, 'ru', plural);
+  verify(expectedRu, 'ru_RU', plural);
+  verify(expectedEn, 'en', plural);
+  verify(expectedRo, 'ro', pluralNoZero);
+  verify(expectedSr, 'sr', pluralNoZero);
+
+  test("Check null howMany", () {
+    expect(plural(0, null), "0:Zero");
+    expect(() => plural(null, null), throwsArgumentError);
+    expect(() => plural(null, "ru"), throwsArgumentError);
+  });
+}
+
+verify(expectedValues, locale, pluralFunction) {
+  var lines = expectedValues.split('\n').where((x) => x.isNotEmpty).toList();
+  for (var i = 0; i < lines.length; i++) {
+    test(lines[i], () {
+      var number = int.parse(lines[i].split(':').first);
+      expect(pluralFunction(number, locale), lines[i]);
+    });
+  }
+}
diff --git a/packages/intl/tool/generate_locale_data_files.dart b/packages/intl/tool/generate_locale_data_files.dart
index e6b49d7..2fde04b 100644
--- a/packages/intl/tool/generate_locale_data_files.dart
+++ b/packages/intl/tool/generate_locale_data_files.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * A utility program to take locale data represented as a Dart map whose keys
- * are locale names and write it into individual JSON files named by locale.
- * This should be run any time the locale data changes.
- *
- * The files are written under "data/dates", in two subdirectories, "symbols"
- * and "patterns". In "data/dates" it will also generate "locale_list.dart",
- * which is sourced by the date_symbol_data... files.
- */
+/// A utility program to take locale data represented as a Dart map whose keys
+/// are locale names and write it into individual JSON files named by locale.
+/// This should be run any time the locale data changes.
+///
+/// The files are written under "data/dates", in two subdirectories, "symbols"
+/// and "patterns". In "data/dates" it will also generate "locale_list.dart",
+/// which is sourced by the date_symbol_data... files.
 
-import '../lib/date_symbol_data_local.dart';
-import '../lib/date_time_patterns.dart';
-import '../lib/intl.dart';
+import 'package:intl/date_symbol_data_local.dart';
+import 'package:intl/date_time_patterns.dart';
+import 'package:intl/intl.dart';
 import 'dart:convert';
 import 'dart:io';
 import '../test/data_directory.dart';
diff --git a/packages/logging/.gitignore b/packages/logging/.gitignore
index 388eff0..aac1f4f 100644
--- a/packages/logging/.gitignore
+++ b/packages/logging/.gitignore
@@ -1,14 +1,4 @@
-# Don’t commit the following directories created by pub.
-.buildlog
-.pub/
-build/
+.packages
+.pub
 packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.js_
-*.js.deps
-*.js.map
-
-# Include when developing application packages.
-pubspec.lock
\ No newline at end of file
+pubspec.lock
diff --git a/packages/logging/CHANGELOG.md b/packages/logging/CHANGELOG.md
index 32204e7..187dc0f 100644
--- a/packages/logging/CHANGELOG.md
+++ b/packages/logging/CHANGELOG.md
@@ -1,6 +1,18 @@
+## 0.11.3+1
+
+* Fixed several documentation comments.
+
+## 0.11.3
+
+* Added optional `LogRecord.object` field.
+
+* `Logger.log` sets `LogRecord.object` if the message is not a string or a
+  function that returns a string. So that a handler can access the original
+  object instead of just its `toString()`.
+
 ## 0.11.2
 
-* Added Logger.detached - a convinience factory to obtain a logger that is not
+* Added Logger.detached - a convenience factory to obtain a logger that is not
   attached to this library's logger hierarchy.
 
 ## 0.11.1+1
diff --git a/packages/logging/lib/logging.dart b/packages/logging/lib/logging.dart
index 493d859..9a7e531 100644
--- a/packages/logging/lib/logging.dart
+++ b/packages/logging/lib/logging.dart
@@ -9,27 +9,27 @@
 import 'dart:async';
 import 'dart:collection';
 
-/**
- * Whether to allow fine-grain logging and configuration of loggers in a
- * hierarchy. When false, all logging is merged in the root logger.
- */
+/// Whether to allow fine-grain logging and configuration of loggers in a
+/// hierarchy.
+///
+/// When false, all logging is merged in the root logger.
 bool hierarchicalLoggingEnabled = false;
 
-/**
- * Automatically record stack traces for any message of this level or above.
- * Because this is expensive, this is off by default.
- */
+/// Automatically record stack traces for any message of this level or above.
+///
+/// Because this is expensive, this is off by default.
 Level recordStackTraceAtLevel = Level.OFF;
 
-/**
- * Level for the root-logger. This will be the level of all loggers if
- * [hierarchicalLoggingEnabled] is false.
- */
+/// Level for the root-logger.
+///
+/// This will be the level of all loggers if [hierarchicalLoggingEnabled] is
+/// false.
 Level _rootLevel = Level.INFO;
 
 /**
- * Use a [Logger] to log debug messages. [Logger]s are named using a
- * hierarchical dot-separated name convention.
+ * Use a [Logger] to log debug messages.
+ *
+ * [Logger]s are named using a hierarchical dot-separated name convention.
  */
 class Logger {
   /** Simple name of this logger. */
@@ -65,7 +65,7 @@
   ///
   /// Returns a new [Logger] instance (unlike `new Logger`, which returns a
   /// [Logger] singleton), which doesn't have any parent or children,
-  /// and it's not a part of the global hierarchial loggers structure.
+  /// and is not a part of the global hierarchical loggers structure.
   ///
   /// It can be useful when you just need a local short-living logger,
   /// which you'd like to be garbage-collected later.
@@ -123,11 +123,13 @@
     }
   }
 
-  /**
-   * Returns an stream of messages added to this [Logger]. You can listen for
-   * messages using the standard stream APIs, for instance:
-   *    logger.onRecord.listen((record) { ... });
-   */
+  /// Returns a stream of messages added to this [Logger].
+  ///
+  /// You can listen for messages using the standard stream APIs, for instance:
+  ///
+  /// ```dart
+  /// logger.onRecord.listen((record) { ... });
+  /// ```
   Stream<LogRecord> get onRecord => _getStream();
 
   void clearListeners() {
@@ -144,29 +146,32 @@
   /** Whether a message for [value]'s level is loggable in this logger. */
   bool isLoggable(Level value) => (value >= level);
 
-  /**
-   * Adds a log record for a [message] at a particular [logLevel] if
-   * `isLoggable(logLevel)` is true.
-   *
-   * Use this method to create log entries for user-defined levels. To record a
-   * message at a predefined level (e.g. [Level.INFO], [Level.WARNING], etc) you
-   * can use their specialized methods instead (e.g. [info], [warning], etc).
-   *
-   * If [message] is a [Function], it will be lazy evaluated. Additionally, if
-   * [message] or its evaluated value is not a [String], then 'toString()' will
-   * be called on it and the result will be logged.
-   *
-   * The log record will contain a field for the zone in which this call was
-   * made.
-   * This can be advantagous if a log listener wants to handle records of
-   * different zones differently (e.g. group log records by http-request if each
-   * http-request handler runs in it's own zone).
-   */
+  /// Adds a log record for a [message] at a particular [logLevel] if
+  /// `isLoggable(logLevel)` is true.
+  ///
+  /// Use this method to create log entries for user-defined levels. To record a
+  /// message at a predefined level (e.g. [Level.INFO], [Level.WARNING], etc)
+  /// you can use their specialized methods instead (e.g. [info], [warning],
+  /// etc).
+  ///
+  /// If [message] is a [Function], it will be lazy evaluated. Additionally, if
+  /// [message] or its evaluated value is not a [String], then 'toString()' will
+  /// be called on the object and the result will be logged. The log record will
+  /// contain a field holding the original object.
+  ///
+  /// The log record will also contain a field for the zone in which this call
+  /// was made. This can be advantageous if a log listener wants to handler
+  /// records of different zones differently (e.g. group log records by HTTP
+  /// request if each HTTP request handler runs in it's own zone).
   void log(Level logLevel, message,
       [Object error, StackTrace stackTrace, Zone zone]) {
+    Object object;
     if (isLoggable(logLevel)) {
       if (message is Function) message = message();
-      if (message is! String) message = message.toString();
+      if (message is! String) {
+        object = message;
+        message = message.toString();
+      }
       if (stackTrace == null && logLevel >= recordStackTraceAtLevel) {
         try {
           throw "autogenerated stack trace for $logLevel $message";
@@ -177,8 +182,8 @@
       }
       if (zone == null) zone = Zone.current;
 
-      var record =
-          new LogRecord(logLevel, message, fullName, error, stackTrace, zone);
+      var record = new LogRecord(
+          logLevel, message, fullName, error, stackTrace, zone, object);
 
       if (hierarchicalLoggingEnabled) {
         var target = this;
@@ -335,6 +340,9 @@
   final Level level;
   final String message;
 
+  /** Non-string message passed to Logger. */
+  final Object object;
+
   /** Logger where this record is stored. */
   final String loggerName;
 
@@ -356,7 +364,7 @@
   final Zone zone;
 
   LogRecord(this.level, this.message, this.loggerName,
-      [this.error, this.stackTrace, this.zone])
+      [this.error, this.stackTrace, this.zone, this.object])
       : time = new DateTime.now(),
         sequenceNumber = LogRecord._nextNumber++;
 
diff --git a/packages/logging/pubspec.yaml b/packages/logging/pubspec.yaml
index 2bbbe94..97eec7a 100644
--- a/packages/logging/pubspec.yaml
+++ b/packages/logging/pubspec.yaml
@@ -1,5 +1,5 @@
 name: logging
-version: 0.11.2
+version: 0.11.3+1
 author: Dart Team <misc@dartlang.org>
 description: >
   Provides APIs for debugging and error logging. This library introduces
diff --git a/packages/logging/test/logging_test.dart b/packages/logging/test/logging_test.dart
index 2f5bf60..b73fdcc 100644
--- a/packages/logging/test/logging_test.dart
+++ b/packages/logging/test/logging_test.dart
@@ -344,16 +344,18 @@
       root.severe('7');
       root.shout('8');
 
-      expect(rootMessages, equals([
-        'FINEST: 1',
-        'FINER: 2',
-        'FINE: 3',
-        'CONFIG: 4',
-        'INFO: 5',
-        'WARNING: 6',
-        'SEVERE: 7',
-        'SHOUT: 8'
-      ]));
+      expect(
+          rootMessages,
+          equals([
+            'FINEST: 1',
+            'FINER: 2',
+            'FINE: 3',
+            'CONFIG: 4',
+            'INFO: 5',
+            'WARNING: 6',
+            'SEVERE: 7',
+            'SHOUT: 8'
+          ]));
     });
 
     test('logging methods store exception', () {
@@ -380,24 +382,26 @@
       root.severe('7', 'g');
       root.shout('8', 'h');
 
-      expect(rootMessages, equals([
-        'FINEST: 1 null',
-        'FINER: 2 null',
-        'FINE: 3 null',
-        'CONFIG: 4 null',
-        'INFO: 5 null',
-        'WARNING: 6 null',
-        'SEVERE: 7 null',
-        'SHOUT: 8 null',
-        'FINEST: 1 a',
-        'FINER: 2 b',
-        'FINE: 3 [c]',
-        'CONFIG: 4 d',
-        'INFO: 5 e',
-        'WARNING: 6 f',
-        'SEVERE: 7 g',
-        'SHOUT: 8 h'
-      ]));
+      expect(
+          rootMessages,
+          equals([
+            'FINEST: 1 null',
+            'FINER: 2 null',
+            'FINE: 3 null',
+            'CONFIG: 4 null',
+            'INFO: 5 null',
+            'WARNING: 6 null',
+            'SEVERE: 7 null',
+            'SHOUT: 8 null',
+            'FINEST: 1 a',
+            'FINER: 2 b',
+            'FINE: 3 [c]',
+            'CONFIG: 4 d',
+            'INFO: 5 e',
+            'WARNING: 6 f',
+            'SEVERE: 7 g',
+            'SHOUT: 8 h'
+          ]));
     });
 
     test('message logging - no hierarchy', () {
@@ -428,18 +432,20 @@
       c.warning('9');
       c.shout('10');
 
-      expect(rootMessages, equals([
-        // 'INFO: 1' is not loggable
-        // 'FINE: 2' is not loggable
-        'SHOUT: 3',
-        // 'INFO: 4' is not loggable
-        'SEVERE: 5',
-        'WARNING: 6',
-        // 'FINE: 7' is not loggable
-        // 'FINE: 8' is not loggable
-        'WARNING: 9',
-        'SHOUT: 10'
-      ]));
+      expect(
+          rootMessages,
+          equals([
+            // 'INFO: 1' is not loggable
+            // 'FINE: 2' is not loggable
+            'SHOUT: 3',
+            // 'INFO: 4' is not loggable
+            'SEVERE: 5',
+            'WARNING: 6',
+            // 'FINE: 7' is not loggable
+            // 'FINE: 8' is not loggable
+            'WARNING: 9',
+            'SHOUT: 10'
+          ]));
 
       // no hierarchy means we all hear the same thing.
       expect(aMessages, equals(rootMessages));
@@ -477,36 +483,42 @@
       c.warning('9');
       c.shout('10');
 
-      expect(rootMessages, equals([
-        'INFO: 1',
-        // 'FINE: 2' is not loggable
-        'SHOUT: 3',
-        // 'INFO: 4' is not loggable
-        'SEVERE: 5',
-        'WARNING: 6',
-        // 'FINE: 7' is not loggable
-        // 'FINE: 8' is not loggable
-        'WARNING: 9',
-        'SHOUT: 10'
-      ]));
+      expect(
+          rootMessages,
+          equals([
+            'INFO: 1',
+            // 'FINE: 2' is not loggable
+            'SHOUT: 3',
+            // 'INFO: 4' is not loggable
+            'SEVERE: 5',
+            'WARNING: 6',
+            // 'FINE: 7' is not loggable
+            // 'FINE: 8' is not loggable
+            'WARNING: 9',
+            'SHOUT: 10'
+          ]));
 
-      expect(aMessages, equals([
-        // 1,2 and 3 are lower in the hierarchy
-        // 'INFO: 4' is not loggable
-        'SEVERE: 5',
-        'WARNING: 6',
-        // 'FINE: 7' is not loggable
-        // 'FINE: 8' is not loggable
-        'WARNING: 9',
-        'SHOUT: 10'
-      ]));
+      expect(
+          aMessages,
+          equals([
+            // 1,2 and 3 are lower in the hierarchy
+            // 'INFO: 4' is not loggable
+            'SEVERE: 5',
+            'WARNING: 6',
+            // 'FINE: 7' is not loggable
+            // 'FINE: 8' is not loggable
+            'WARNING: 9',
+            'SHOUT: 10'
+          ]));
 
-      expect(cMessages, equals([
-        // 1 - 7 are lower in the hierarchy
-        // 'FINE: 8' is not loggable
-        'WARNING: 9',
-        'SHOUT: 10'
-      ]));
+      expect(
+          cMessages,
+          equals([
+            // 1 - 7 are lower in the hierarchy
+            // 'FINE: 8' is not loggable
+            'WARNING: 9',
+            'SHOUT: 10'
+          ]));
     });
 
     test('message logging - lazy functions', () {
@@ -529,17 +541,36 @@
     test('message logging - calls toString', () {
       root.level = Level.INFO;
       var messages = [];
+      var objects = [];
+      var object = new Object();
       root.onRecord.listen((record) {
         messages.add('${record.level}: ${record.message}');
+        objects.add(record.object);
       });
 
       root.info(5);
       root.info(false);
       root.info([1, 2, 3]);
       root.info(() => 10);
+      root.info(object);
 
-      expect(messages,
-          equals(['INFO: 5', 'INFO: false', 'INFO: [1, 2, 3]', 'INFO: 10',]));
+      expect(
+          messages,
+          equals([
+            'INFO: 5',
+            'INFO: false',
+            'INFO: [1, 2, 3]',
+            'INFO: 10',
+            "INFO: Instance of 'Object'"
+          ]));
+
+      expect(objects, [
+        5,
+        false,
+        [1, 2, 3],
+        10,
+        object
+      ]);
     });
   });
 
@@ -579,7 +610,7 @@
       var trace;
       try {
         throw 'trace';
-      } catch(e, t) {
+      } catch (e, t) {
         trace = t;
       }
       var records = new List<LogRecord>();
diff --git a/packages/matcher/.analysis_options b/packages/matcher/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/matcher/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/matcher/.gitignore b/packages/matcher/.gitignore
index 388eff0..7dbf035 100644
--- a/packages/matcher/.gitignore
+++ b/packages/matcher/.gitignore
@@ -3,6 +3,7 @@
 .pub/
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/packages/matcher/.status b/packages/matcher/.status
deleted file mode 100644
index ddb02ed..0000000
--- a/packages/matcher/.status
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Skip non-test files ending with "_test".
-packages/*: Skip
-*/packages/*: Skip
-*/*/packages/*: Skip
-*/*/*/packages/*: Skip
-*/*/*/*packages/*: Skip
-*/*/*/*/*packages/*: Skip
-
-# Only run tests from the build directory, since we don't care about the
-# difference between transformed an untransformed code.
-test/*: Skip
-
-[ $browser ]
-*: RuntimeError # new unittest package does not support browser tests
diff --git a/packages/matcher/.test_config b/packages/matcher/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/packages/matcher/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/packages/matcher/CHANGELOG.md b/packages/matcher/CHANGELOG.md
index 1ccacda..f36f40d 100644
--- a/packages/matcher/CHANGELOG.md
+++ b/packages/matcher/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 0.12.1+1
+
+* Produce a better error message when a `CustomMatcher`'s feature throws.
+
+## 0.12.1
+
+* Add containsAllInOrder matcher for Iterables
+
+## 0.12.0+2
+
+* Fix all strong-mode warnings.
+
 ## 0.12.0+1
 
 * Fix test files to use `test` instead of `unittest` pkg.
@@ -19,6 +31,15 @@
   deprecated, and is no longer necessary since all language implementations now
   support converting the type parameter to a string directly.
 
+## 0.11.4+6
+
+* Fix a bug introduced in 0.11.4+5 in which operator matchers broke when taking
+  lists of matchers.
+
+## 0.11.4+5
+
+* Fix all strong-mode warnings.
+
 ## 0.11.4+4
 
 * Deprecate the name parameter to `isInstanceOf`. All language implementations
diff --git a/packages/matcher/lib/matcher.dart b/packages/matcher/lib/matcher.dart
index c719fb1..b4b9d22 100644
--- a/packages/matcher/lib/matcher.dart
+++ b/packages/matcher/lib/matcher.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Support for specifying test expectations, such as for unit tests.
-library matcher;
-
 export 'src/core_matchers.dart';
 export 'src/description.dart';
 export 'src/error_matchers.dart';
@@ -13,5 +11,6 @@
 export 'src/map_matchers.dart';
 export 'src/numeric_matchers.dart';
 export 'src/operator_matchers.dart';
+export 'src/order_matchers.dart';
 export 'src/string_matchers.dart';
 export 'src/util.dart';
diff --git a/packages/matcher/lib/mirror_matchers.dart b/packages/matcher/lib/mirror_matchers.dart
index d244831..0ce90da 100644
--- a/packages/matcher/lib/mirror_matchers.dart
+++ b/packages/matcher/lib/mirror_matchers.dart
@@ -4,8 +4,6 @@
 
 /// The mirror matchers library provides some additional matchers that
 /// make use of `dart:mirrors`.
-library matcher.mirror_matchers;
-
 import 'dart:mirrors';
 
 import 'matcher.dart';
diff --git a/packages/matcher/lib/src/core_matchers.dart b/packages/matcher/lib/src/core_matchers.dart
index 1b001f9..94f9d7d 100644
--- a/packages/matcher/lib/src/core_matchers.dart
+++ b/packages/matcher/lib/src/core_matchers.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.core_matchers;
+import 'package:stack_trace/stack_trace.dart';
 
 import 'description.dart';
 import 'interfaces.dart';
@@ -123,7 +123,7 @@
 
     var expectedIterator = expected.iterator;
     var actualIterator = actual.iterator;
-    for (var index = 0; ; index++) {
+    for (var index = 0;; index++) {
       // Advance in lockstep.
       var expectedNext = expectedIterator.moveNext();
       var actualNext = actualIterator.moveNext();
@@ -263,7 +263,7 @@
 
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
-    var reason = matchState['reason'];
+    var reason = matchState['reason'] ?? '';
     // If we didn't get a good reason, that would normally be a
     // simple 'is <value>' message. We only add that if the mismatch
     // description is non empty (so we are supplementing the mismatch
@@ -310,11 +310,11 @@
       }
       if (start == minLength) {
         if (escapedValue.length < escapedItem.length) {
-          buff.write(' Both strings start the same, but the given value also'
+          buff.write(' Both strings start the same, but the actual value also'
               ' has the following trailing characters: ');
           _writeTrailing(buff, escapedItem, escapedValue.length);
         } else {
-          buff.write(' Both strings start the same, but the given value is'
+          buff.write(' Both strings start the same, but the actual value is'
               ' missing the following trailing characters: ');
           _writeTrailing(buff, escapedValue, escapedItem.length);
         }
@@ -363,7 +363,7 @@
 }
 
 /// Returns a matcher that matches if an object is an instance
-/// of [type] (or a subtype).
+/// of [T] (or a subtype).
 ///
 /// As types are not first class objects in Dart we can only
 /// approximate this test by using a generic wrapper class.
@@ -530,8 +530,8 @@
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
     if (item is String || item is Iterable || item is Map) {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
+      return super
+          .describeMismatch(item, mismatchDescription, matchState, verbose);
     } else {
       return mismatchDescription.add('is not a string, map or iterable');
     }
@@ -616,9 +616,23 @@
   featureValueOf(actual) => actual;
 
   bool matches(item, Map matchState) {
-    var f = featureValueOf(item);
-    if (_matcher.matches(f, matchState)) return true;
-    addStateInfo(matchState, {'feature': f});
+    try {
+      var f = featureValueOf(item);
+      if (_matcher.matches(f, matchState)) return true;
+      addStateInfo(matchState, {'custom.feature': f});
+    } catch (exception, stack) {
+      addStateInfo(matchState, {
+        'custom.exception': exception.toString(),
+        'custom.stack': new Chain.forTrace(stack)
+            .foldFrames(
+                (frame) =>
+                    frame.package == 'test' ||
+                    frame.package == 'stream_channel' ||
+                    frame.package == 'matcher',
+                terse: true)
+            .toString()
+      });
+    }
     return false;
   }
 
@@ -627,14 +641,25 @@
 
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (matchState['custom.exception'] != null) {
+      mismatchDescription
+          .add('threw ')
+          .addDescriptionOf(matchState['custom.exception'])
+          .add('\n')
+          .add(matchState['custom.stack'].toString());
+      return mismatchDescription;
+    }
+
     mismatchDescription
         .add('has ')
         .add(_featureName)
         .add(' with value ')
-        .addDescriptionOf(matchState['feature']);
+        .addDescriptionOf(matchState['custom.feature']);
     var innerDescription = new StringDescription();
-    _matcher.describeMismatch(
-        matchState['feature'], innerDescription, matchState['state'], verbose);
+
+    _matcher.describeMismatch(matchState['custom.feature'], innerDescription,
+        matchState['state'], verbose);
+
     if (innerDescription.length > 0) {
       mismatchDescription.add(' which ').add(innerDescription.toString());
     }
diff --git a/packages/matcher/lib/src/description.dart b/packages/matcher/lib/src/description.dart
index 1da5a3a..17c5ad4 100644
--- a/packages/matcher/lib/src/description.dart
+++ b/packages/matcher/lib/src/description.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.description;
-
 import 'interfaces.dart';
 import 'pretty_print.dart';
 
diff --git a/packages/matcher/lib/src/error_matchers.dart b/packages/matcher/lib/src/error_matchers.dart
index 821e731..1f37538 100644
--- a/packages/matcher/lib/src/error_matchers.dart
+++ b/packages/matcher/lib/src/error_matchers.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.error_matchers;
-
 import 'core_matchers.dart';
 import 'interfaces.dart';
 
diff --git a/packages/matcher/lib/src/interfaces.dart b/packages/matcher/lib/src/interfaces.dart
index 984d862..1c8091e 100644
--- a/packages/matcher/lib/src/interfaces.dart
+++ b/packages/matcher/lib/src/interfaces.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.interfaces;
-
 // To decouple the reporting of errors, and allow for extensibility of
 // matchers, we make use of some interfaces.
 
@@ -54,7 +52,7 @@
   /// A few matchers make use of the [verbose] flag to provide detailed
   /// information that is not typically included but can be of help in
   /// diagnosing failures, such as stack traces.
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) =>
+  Description describeMismatch(item, Description mismatchDescription,
+          Map matchState, bool verbose) =>
       mismatchDescription;
 }
diff --git a/packages/matcher/lib/src/iterable_matchers.dart b/packages/matcher/lib/src/iterable_matchers.dart
index 7185e92..9159104 100644
--- a/packages/matcher/lib/src/iterable_matchers.dart
+++ b/packages/matcher/lib/src/iterable_matchers.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.iterable_matchers;
-
 import 'core_matchers.dart';
 import 'description.dart';
 import 'interfaces.dart';
@@ -57,8 +55,8 @@
       mismatchDescription.add(' at index $index');
       return mismatchDescription;
     }
-    return super.describeMismatch(
-        item, mismatchDescription, matchState, verbose);
+    return super
+        .describeMismatch(item, mismatchDescription, matchState, verbose);
   }
 }
 
@@ -138,8 +136,8 @@
     if (item is! Iterable) {
       return mismatchDescription.addDescriptionOf(item).add(' not an Iterable');
     } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
+      return super
+          .describeMismatch(item, mismatchDescription, matchState, verbose);
     }
   }
 }
@@ -202,8 +200,8 @@
       .addAll('[', ', ', ']', _expected)
       .add(' unordered');
 
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) =>
+  Description describeMismatch(item, Description mismatchDescription,
+          Map matchState, bool verbose) =>
       mismatchDescription.add(_test(item));
 }
 
@@ -213,8 +211,8 @@
 /// returning whether they match, will be applied to each pair in order.
 /// [description] should be a meaningful name for the comparator.
 Matcher pairwiseCompare(
-    Iterable expected, bool comparator(a, b), String description) =>
-        new _PairwiseCompare(expected, comparator, description);
+        Iterable expected, bool comparator(a, b), String description) =>
+    new _PairwiseCompare(expected, comparator, description);
 
 typedef bool _Comparator(a, b);
 
@@ -233,11 +231,8 @@
     for (var e in _expected) {
       iterator.moveNext();
       if (!_comparator(e, iterator.current)) {
-        addStateInfo(matchState, {
-          'index': i,
-          'expected': e,
-          'actual': iterator.current
-        });
+        addStateInfo(matchState,
+            {'index': i, 'expected': e, 'actual': iterator.current});
         return false;
       }
       i++;
@@ -265,3 +260,47 @@
     }
   }
 }
+
+/// Matches [Iterable]s which contain an element matching every value in
+/// [expected] in the same order, but may contain additional values interleaved
+/// throughout.
+///
+/// For example: `[0, 1, 0, 2, 0]` matches `containsAllInOrder([1, 2])` but not
+/// `containsAllInOrder([2, 1])` or `containsAllInOrder([1, 2, 3])`.
+Matcher containsAllInOrder(Iterable expected) =>
+    new _ContainsAllInOrder(expected);
+
+class _ContainsAllInOrder implements Matcher {
+  final Iterable _expected;
+
+  _ContainsAllInOrder(this._expected);
+
+  String _test(item, Map matchState) {
+    if (item is! Iterable) return 'not an iterable';
+    var matchers = _expected.map(wrapMatcher).toList();
+    var matcherIndex = 0;
+    for (var value in item) {
+      if (matchers[matcherIndex].matches(value, matchState)) matcherIndex++;
+      if (matcherIndex == matchers.length) return null;
+    }
+    return new StringDescription()
+        .add('did not find a value matching ')
+        .addDescriptionOf(matchers[matcherIndex])
+        .add(' following expected prior values')
+        .toString();
+  }
+
+  @override
+  bool matches(item, Map matchState) => _test(item, matchState) == null;
+
+  @override
+  Description describe(Description description) => description
+      .add('contains in order(')
+      .addDescriptionOf(_expected)
+      .add(')');
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription,
+          Map matchState, bool verbose) =>
+      mismatchDescription.add(_test(item, matchState));
+}
diff --git a/packages/matcher/lib/src/map_matchers.dart b/packages/matcher/lib/src/map_matchers.dart
index 8facbf5..a44148f 100644
--- a/packages/matcher/lib/src/map_matchers.dart
+++ b/packages/matcher/lib/src/map_matchers.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.map_matchers;
-
 import 'interfaces.dart';
 import 'util.dart';
 
diff --git a/packages/matcher/lib/src/numeric_matchers.dart b/packages/matcher/lib/src/numeric_matchers.dart
index 770999d..e8651de 100644
--- a/packages/matcher/lib/src/numeric_matchers.dart
+++ b/packages/matcher/lib/src/numeric_matchers.dart
@@ -2,107 +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.
 
-library matcher.numeric_matchers;
-
 import 'interfaces.dart';
 
-/// Returns a matcher which matches if the match argument is greater
-/// than the given [value].
-Matcher greaterThan(value) =>
-    new _OrderingComparison(value, false, false, true, 'a value greater than');
-
-/// Returns a matcher which matches if the match argument is greater
-/// than or equal to the given [value].
-Matcher greaterThanOrEqualTo(value) => new _OrderingComparison(
-    value, true, false, true, 'a value greater than or equal to');
-
-/// Returns a matcher which matches if the match argument is less
-/// than the given [value].
-Matcher lessThan(value) =>
-    new _OrderingComparison(value, false, true, false, 'a value less than');
-
-/// Returns a matcher which matches if the match argument is less
-/// than or equal to the given [value].
-Matcher lessThanOrEqualTo(value) => new _OrderingComparison(
-    value, true, true, false, 'a value less than or equal to');
-
-/// A matcher which matches if the match argument is zero.
-const Matcher isZero =
-    const _OrderingComparison(0, true, false, false, 'a value equal to');
-
-/// A matcher which matches if the match argument is non-zero.
-const Matcher isNonZero =
-    const _OrderingComparison(0, false, true, true, 'a value not equal to');
-
-/// A matcher which matches if the match argument is positive.
-const Matcher isPositive =
-    const _OrderingComparison(0, false, false, true, 'a positive value', false);
-
-/// A matcher which matches if the match argument is zero or negative.
-const Matcher isNonPositive = const _OrderingComparison(
-    0, true, true, false, 'a non-positive value', false);
-
-/// A matcher which matches if the match argument is negative.
-const Matcher isNegative =
-    const _OrderingComparison(0, false, true, false, 'a negative value', false);
-
-/// A matcher which matches if the match argument is zero or positive.
-const Matcher isNonNegative = const _OrderingComparison(
-    0, true, false, true, 'a non-negative value', false);
-
-bool _isNumeric(value) {
-  return value is num;
-}
-
-// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
-// `==` and `<` operators to evaluate the match. Or change the matcher.
-class _OrderingComparison extends Matcher {
-  /// Expected value.
-  final _value;
-  /// What to return if actual == expected
-  final bool _equalValue;
-  /// What to return if actual < expected
-  final bool _lessThanValue;
-  /// What to return if actual > expected
-  final bool _greaterThanValue;
-  /// Textual name of the inequality
-  final String _comparisonDescription;
-  /// Whether to include the expected value in the description
-  final bool _valueInDescription;
-
-  const _OrderingComparison(this._value, this._equalValue, this._lessThanValue,
-      this._greaterThanValue, this._comparisonDescription,
-      [bool valueInDescription = true])
-      : this._valueInDescription = valueInDescription;
-
-  bool matches(item, Map matchState) {
-    if (item == _value) {
-      return _equalValue;
-    } else if (item < _value) {
-      return _lessThanValue;
-    } else {
-      return _greaterThanValue;
-    }
-  }
-
-  Description describe(Description description) {
-    if (_valueInDescription) {
-      return description
-          .add(_comparisonDescription)
-          .add(' ')
-          .addDescriptionOf(_value);
-    } else {
-      return description.add(_comparisonDescription);
-    }
-  }
-
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    mismatchDescription.add('is not ');
-    return describe(mismatchDescription);
-  }
-}
-
 /// Returns a matcher which matches if the match argument is within [delta]
 /// of some [value].
 ///
@@ -116,9 +17,8 @@
   const _IsCloseTo(this._value, this._delta);
 
   bool matches(item, Map matchState) {
-    if (!_isNumeric(item)) {
-      return false;
-    }
+    if (item is! num) return false;
+
     var diff = item - _value;
     if (diff < 0) diff = -diff;
     return (diff <= _delta);
@@ -185,18 +85,18 @@
     return true;
   }
 
-  Description describe(Description description) => description.add(
-      "be in range from "
-      "$_low (${_lowMatchValue ? 'inclusive' : 'exclusive'}) to "
-      "$_high (${_highMatchValue ? 'inclusive' : 'exclusive'})");
+  Description describe(Description description) =>
+      description.add("be in range from "
+          "$_low (${_lowMatchValue ? 'inclusive' : 'exclusive'}) to "
+          "$_high (${_highMatchValue ? 'inclusive' : 'exclusive'})");
 
   Description describeMismatch(
       item, Description mismatchDescription, Map matchState, bool verbose) {
     if (item is! num) {
       return mismatchDescription.addDescriptionOf(item).add(' not numeric');
     } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
+      return super
+          .describeMismatch(item, mismatchDescription, matchState, verbose);
     }
   }
 }
diff --git a/packages/matcher/lib/src/operator_matchers.dart b/packages/matcher/lib/src/operator_matchers.dart
index 6824c5b..5d6baed 100644
--- a/packages/matcher/lib/src/operator_matchers.dart
+++ b/packages/matcher/lib/src/operator_matchers.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.operator_matchers;
-
 import 'interfaces.dart';
 import 'util.dart';
 
@@ -91,7 +89,7 @@
 }
 
 List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
-  Iterable<Matcher> matchers;
+  Iterable args;
   if (arg0 is List) {
     if (arg1 != null ||
         arg2 != null ||
@@ -103,11 +101,10 @@
           ' null.');
     }
 
-    matchers = arg0;
+    args = arg0;
   } else {
-    matchers =
-        [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
+    args = [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
   }
 
-  return matchers.map((e) => wrapMatcher(e)).toList();
+  return args.map((e) => wrapMatcher(e)).toList();
 }
diff --git a/packages/matcher/lib/src/order_matchers.dart b/packages/matcher/lib/src/order_matchers.dart
new file mode 100644
index 0000000..b6079e9
--- /dev/null
+++ b/packages/matcher/lib/src/order_matchers.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is greater
+/// than the given [value].
+Matcher greaterThan(value) =>
+    new _OrderingMatcher(value, false, false, true, 'a value greater than');
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to the given [value].
+Matcher greaterThanOrEqualTo(value) => new _OrderingMatcher(
+    value, true, false, true, 'a value greater than or equal to');
+
+/// Returns a matcher which matches if the match argument is less
+/// than the given [value].
+Matcher lessThan(value) =>
+    new _OrderingMatcher(value, false, true, false, 'a value less than');
+
+/// Returns a matcher which matches if the match argument is less
+/// than or equal to the given [value].
+Matcher lessThanOrEqualTo(value) => new _OrderingMatcher(
+    value, true, true, false, 'a value less than or equal to');
+
+/// A matcher which matches if the match argument is zero.
+const Matcher isZero =
+    const _OrderingMatcher(0, true, false, false, 'a value equal to');
+
+/// A matcher which matches if the match argument is non-zero.
+const Matcher isNonZero =
+    const _OrderingMatcher(0, false, true, true, 'a value not equal to');
+
+/// A matcher which matches if the match argument is positive.
+const Matcher isPositive =
+    const _OrderingMatcher(0, false, false, true, 'a positive value', false);
+
+/// A matcher which matches if the match argument is zero or negative.
+const Matcher isNonPositive =
+    const _OrderingMatcher(0, true, true, false, 'a non-positive value', false);
+
+/// A matcher which matches if the match argument is negative.
+const Matcher isNegative =
+    const _OrderingMatcher(0, false, true, false, 'a negative value', false);
+
+/// A matcher which matches if the match argument is zero or positive.
+const Matcher isNonNegative =
+    const _OrderingMatcher(0, true, false, true, 'a non-negative value', false);
+
+// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
+// `==` and `<` operators to evaluate the match. Or change the matcher.
+class _OrderingMatcher extends Matcher {
+  /// Expected value.
+  final _value;
+
+  /// What to return if actual == expected
+  final bool _equalValue;
+
+  /// What to return if actual < expected
+  final bool _lessThanValue;
+
+  /// What to return if actual > expected
+  final bool _greaterThanValue;
+
+  /// Textual name of the inequality
+  final String _comparisonDescription;
+
+  /// Whether to include the expected value in the description
+  final bool _valueInDescription;
+
+  const _OrderingMatcher(this._value, this._equalValue, this._lessThanValue,
+      this._greaterThanValue, this._comparisonDescription,
+      [bool valueInDescription = true])
+      : this._valueInDescription = valueInDescription;
+
+  bool matches(item, Map matchState) {
+    if (item == _value) {
+      return _equalValue;
+    } else if (item < _value) {
+      return _lessThanValue;
+    } else {
+      return _greaterThanValue;
+    }
+  }
+
+  Description describe(Description description) {
+    if (_valueInDescription) {
+      return description
+          .add(_comparisonDescription)
+          .add(' ')
+          .addDescriptionOf(_value);
+    } else {
+      return description.add(_comparisonDescription);
+    }
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription.add('is not ');
+    return describe(mismatchDescription);
+  }
+}
diff --git a/packages/matcher/lib/src/pretty_print.dart b/packages/matcher/lib/src/pretty_print.dart
index c20102b..826cad0 100644
--- a/packages/matcher/lib/src/pretty_print.dart
+++ b/packages/matcher/lib/src/pretty_print.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.pretty_print;
-
 import 'description.dart';
 import 'interfaces.dart';
 import 'util.dart';
@@ -51,9 +49,13 @@
       }
 
       // Otherwise, print each member on its own line.
-      return "$type[\n" + strings.map((string) {
-        return _indent(indent + 2) + string;
-      }).join(",\n") + "\n" + _indent(indent) + "]";
+      return "$type[\n" +
+          strings.map((string) {
+            return _indent(indent + 2) + string;
+          }).join(",\n") +
+          "\n" +
+          _indent(indent) +
+          "]";
     } else if (object is Map) {
       // Convert the contents of the map to string representations.
       var strings = object.keys.map((key) {
@@ -75,9 +77,13 @@
       }
 
       // Otherwise, print each key/value pair on its own line.
-      return "{\n" + strings.map((string) {
-        return _indent(indent + 2) + string;
-      }).join(",\n") + "\n" + _indent(indent) + "}";
+      return "{\n" +
+          strings.map((string) {
+            return _indent(indent + 2) + string;
+          }).join(",\n") +
+          "\n" +
+          _indent(indent) +
+          "}";
     } else if (object is String) {
       // Escape strings and print each line on its own line.
       var lines = object.split("\n");
diff --git a/packages/matcher/lib/src/string_matchers.dart b/packages/matcher/lib/src/string_matchers.dart
index 4643434..d8bbdb8 100644
--- a/packages/matcher/lib/src/string_matchers.dart
+++ b/packages/matcher/lib/src/string_matchers.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.string_matchers;
-
 import 'interfaces.dart';
 
 /// Returns a matcher which matches if the match argument is a string and
@@ -67,8 +65,8 @@
           .addDescriptionOf(collapseWhitespace(item))
           .add(' with whitespace compressed');
     } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
+      return super
+          .describeMismatch(item, mismatchDescription, matchState, verbose);
     }
   }
 }
@@ -171,8 +169,8 @@
     if (!(item is String)) {
       return mismatchDescription.addDescriptionOf(item).add(' not a string');
     } else {
-      return super.describeMismatch(
-          item, mismatchDescription, matchState, verbose);
+      return super
+          .describeMismatch(item, mismatchDescription, matchState, verbose);
     }
   }
 }
diff --git a/packages/matcher/lib/src/util.dart b/packages/matcher/lib/src/util.dart
index 8706009..112819b 100644
--- a/packages/matcher/lib/src/util.dart
+++ b/packages/matcher/lib/src/util.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.util;
-
 import 'core_matchers.dart';
 import 'interfaces.dart';
 
+typedef bool _Predicate(value);
+
 /// A [Map] between whitespace characters and their escape sequences.
 const _escapeMap = const {
   '\n': r'\n',
@@ -38,7 +38,7 @@
 Matcher wrapMatcher(x) {
   if (x is Matcher) {
     return x;
-  } else if (x is Function) {
+  } else if (x is _Predicate) {
     return predicate(x);
   } else {
     return equals(x);
diff --git a/packages/matcher/pubspec.yaml b/packages/matcher/pubspec.yaml
index ea8f4ab..a274b9d 100644
--- a/packages/matcher/pubspec.yaml
+++ b/packages/matcher/pubspec.yaml
@@ -1,9 +1,12 @@
 name: matcher
-version: 0.12.0+1
+
+version: 0.12.1+1
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: https://github.com/dart-lang/matcher
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.8.0 <2.0.0'
+dependencies:
+  stack_trace: '^1.2.0'
 dev_dependencies:
   test: '>=0.12.0 <0.13.0'
diff --git a/packages/matcher/test/core_matchers_test.dart b/packages/matcher/test/core_matchers_test.dart
index 32e30f0..04cc111 100644
--- a/packages/matcher/test/core_matchers_test.dart
+++ b/packages/matcher/test/core_matchers_test.dart
@@ -2,13 +2,16 @@
 // for 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 matcher.core_matchers_test;
-
 import 'package:matcher/matcher.dart';
 import 'package:test/test.dart' show test, group;
 
 import 'test_utils.dart';
 
+class BadCustomMatcher extends CustomMatcher {
+  BadCustomMatcher() : super("feature", "description", {1: "a"});
+  featureValueOf(actual) => throw new Exception("bang");
+}
+
 void main() {
   test('isTrue', () {
     shouldPass(true, isTrue);
@@ -63,34 +66,18 @@
 
     shouldPass(set2, equals(set1));
     shouldPass(numbers, equals(set1));
-    shouldFail([
-      1,
-      2,
-      3,
-      4,
-      5,
-      6,
-      7,
-      8,
-      9
-    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
-        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
-        r"   Which: does not contain 10"));
-    shouldFail([
-      1,
-      2,
-      3,
-      4,
-      5,
-      6,
-      7,
-      8,
-      9,
-      10,
-      11
-    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
-        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
-        r"   Which: larger than expected"));
+    shouldFail(
+        [1, 2, 3, 4, 5, 6, 7, 8, 9],
+        equals(set1),
+        matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+            r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
+            r"   Which: does not contain 10"));
+    shouldFail(
+        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
+        equals(set1),
+        matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+            r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
+            r"   Which: larger than expected"));
   });
 
   test('anything', () {
@@ -103,10 +90,12 @@
 
   test('returnsNormally', () {
     shouldPass(doesNotThrow, returnsNormally);
-    shouldFail(doesThrow, returnsNormally, matches(r"Expected: return normally"
-        r"  Actual: <Closure(: \(\) => dynamic "
-        r"from Function 'doesThrow': static\.)?>"
-        r"   Which: threw 'X'"));
+    shouldFail(
+        doesThrow,
+        returnsNormally,
+        matches(r"Expected: return normally"
+            r"  Actual: <Closure.*>"
+            r"   Which: threw 'X'"));
   });
 
   test('hasLength', () {
@@ -115,56 +104,107 @@
     shouldPass(a, hasLength(0));
     shouldPass(b, hasLength(0));
     shouldPass('a', hasLength(1));
-    shouldFail(0, hasLength(0),
+    shouldFail(
+        0,
+        hasLength(0),
         "Expected: an object with length of <0> "
         "Actual: <0> "
         "Which: has no length property");
 
     b.add(0);
     shouldPass(b, hasLength(1));
-    shouldFail(b, hasLength(2), "Expected: an object with length of <2> "
+    shouldFail(
+        b,
+        hasLength(2),
+        "Expected: an object with length of <2> "
         "Actual: [0] "
         "Which: has length of <1>");
 
     b.add(0);
-    shouldFail(b, hasLength(1), "Expected: an object with length of <1> "
+    shouldFail(
+        b,
+        hasLength(1),
+        "Expected: an object with length of <1> "
         "Actual: [0, 0] "
         "Which: has length of <2>");
     shouldPass(b, hasLength(2));
   });
 
   test('scalar type mismatch', () {
-    shouldFail('error', equals(5.1), "Expected: <5.1> "
+    shouldFail(
+        'error',
+        equals(5.1),
+        "Expected: <5.1> "
         "Actual: 'error'");
   });
 
   test('nested type mismatch', () {
-    shouldFail(['error'], equals([5.1]), "Expected: [5.1] "
+    shouldFail(
+        ['error'],
+        equals([5.1]),
+        "Expected: [5.1] "
         "Actual: ['error'] "
         "Which: was 'error' instead of <5.1> at location [0]");
   });
 
   test('doubly-nested type mismatch', () {
-    shouldFail([['error']], equals([[5.1]]), "Expected: [[5.1]] "
+    shouldFail(
+        [
+          ['error']
+        ],
+        equals([
+          [5.1]
+        ]),
+        "Expected: [[5.1]] "
         "Actual: [['error']] "
         "Which: was 'error' instead of <5.1> at location [0][0]");
   });
 
   test('doubly nested inequality', () {
-    var actual1 = [['foo', 'bar'], ['foo'], 3, []];
-    var expected1 = [['foo', 'bar'], ['foo'], 4, []];
+    var actual1 = [
+      ['foo', 'bar'],
+      ['foo'],
+      3,
+      []
+    ];
+    var expected1 = [
+      ['foo', 'bar'],
+      ['foo'],
+      4,
+      []
+    ];
     var reason1 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
         "Actual: [['foo', 'bar'], ['foo'], 3, []] "
         "Which: was <3> instead of <4> at location [2]";
 
-    var actual2 = [['foo', 'barry'], ['foo'], 4, []];
-    var expected2 = [['foo', 'bar'], ['foo'], 4, []];
+    var actual2 = [
+      ['foo', 'barry'],
+      ['foo'],
+      4,
+      []
+    ];
+    var expected2 = [
+      ['foo', 'bar'],
+      ['foo'],
+      4,
+      []
+    ];
     var reason2 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
         "Actual: [['foo', 'barry'], ['foo'], 4, []] "
         "Which: was 'barry' instead of 'bar' at location [0][1]";
 
-    var actual3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}];
-    var expected3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}];
+    var actual3 = [
+      ['foo', 'bar'],
+      ['foo'],
+      4,
+      {'foo': 'bar'}
+    ];
+    var expected3 = [
+      ['foo', 'bar'],
+      ['foo'],
+      4,
+      {'foo': 'barry'}
+    ];
     var reason3 = "Expected: [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}] "
         "Actual: [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}] "
         "Which: was 'bar' instead of 'barry' at location [3]['foo']";
@@ -193,10 +233,25 @@
     w.price = 10;
     shouldPass(w, new HasPrice(10));
     shouldPass(w, new HasPrice(greaterThan(0)));
-    shouldFail(w, new HasPrice(greaterThan(10)),
+    shouldFail(
+        w,
+        new HasPrice(greaterThan(10)),
         "Expected: Widget with a price that is a value greater than <10> "
         "Actual: <Instance of 'Widget'> "
         "Which: has price with value <10> which is not "
         "a value greater than <10>");
   });
+
+  test("Custom Matcher Exception", () {
+    shouldFail(
+        "a",
+        new BadCustomMatcher(),
+        allOf([
+          contains("Expected: feature {1: 'a'} "),
+          contains("Actual: 'a' "),
+          contains("Which: threw 'Exception: bang' "),
+          contains("test/core_matchers_test.dart "),
+          contains("package:test ")
+        ]));
+  });
 }
diff --git a/packages/matcher/test/escape_test.dart b/packages/matcher/test/escape_test.dart
index 35a18bc..348afe0 100644
--- a/packages/matcher/test/escape_test.dart
+++ b/packages/matcher/test/escape_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.escape_test;
-
 import 'package:matcher/src/util.dart';
 import 'package:test/test.dart';
 
@@ -20,7 +18,8 @@
     _testEscaping('ASCII control character', '\x11', r'\x11');
     _testEscaping('delete', '\x7F', r'\x7F');
     _testEscaping('escape combos', r'\n', r'\\n');
-    _testEscaping('All characters',
+    _testEscaping(
+        'All characters',
         'A new line\nA charriage return\rA form feed\fA backspace\b'
         'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
         'A delete\x7F',
@@ -42,7 +41,7 @@
     var escaped = escape(source);
     expect(escaped == target, isTrue,
         reason: "Expected escaped value: $target\n"
-        "  Actual escaped value: $escaped");
+            "  Actual escaped value: $escaped");
   });
 }
 
diff --git a/packages/matcher/test/iterable_matchers_test.dart b/packages/matcher/test/iterable_matchers_test.dart
index 54bc2c9..604a1b6 100644
--- a/packages/matcher/test/iterable_matchers_test.dart
+++ b/packages/matcher/test/iterable_matchers_test.dart
@@ -2,10 +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.
 
-library matcher.iterable_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:test/test.dart' show test, group;
+import 'package:test/test.dart';
 
 import 'test_utils.dart';
 
@@ -23,14 +21,19 @@
   test('contains', () {
     var d = [1, 2];
     shouldPass(d, contains(1));
-    shouldFail(d, contains(0), "Expected: contains <0> "
+    shouldFail(
+        d,
+        contains(0),
+        "Expected: contains <0> "
         "Actual: [1, 2]");
   });
 
   test('equals with matcher element', () {
     var d = ['foo', 'bar'];
     shouldPass(d, equals(['foo', startsWith('ba')]));
-    shouldFail(d, equals(['foo', endsWith('ba')]),
+    shouldFail(
+        d,
+        equals(['foo', endsWith('ba')]),
         "Expected: ['foo', <a string ending with 'ba'>] "
         "Actual: ['foo', 'bar'] "
         "Which: does not match a string ending with 'ba' at location [1]");
@@ -45,36 +48,53 @@
   test('everyElement', () {
     var d = [1, 2];
     var e = [1, 1, 1];
-    shouldFail(d, everyElement(1), "Expected: every element(<1>) "
+    shouldFail(
+        d,
+        everyElement(1),
+        "Expected: every element(<1>) "
         "Actual: [1, 2] "
         "Which: has value <2> which doesn't match <1> at index 1");
     shouldPass(e, everyElement(1));
   });
 
   test('nested everyElement', () {
-    var d = [['foo', 'bar'], ['foo'], []];
-    var e = [['foo', 'bar'], ['foo'], 3, []];
+    var d = [
+      ['foo', 'bar'],
+      ['foo'],
+      []
+    ];
+    var e = [
+      ['foo', 'bar'],
+      ['foo'],
+      3,
+      []
+    ];
     shouldPass(d, everyElement(anyOf(isEmpty, contains('foo'))));
-    shouldFail(d, everyElement(everyElement(equals('foo'))),
+    shouldFail(
+        d,
+        everyElement(everyElement(equals('foo'))),
         "Expected: every element(every element('foo')) "
         "Actual: [['foo', 'bar'], ['foo'], []] "
         "Which: has value ['foo', 'bar'] which has value 'bar' "
         "which is different. Expected: foo Actual: bar ^ "
         "Differ at offset 0 at index 1 at index 0");
-    shouldFail(d,
+    shouldFail(
+        d,
         everyElement(allOf(hasLength(greaterThan(0)), contains('foo'))),
         "Expected: every element((an object with length of a value "
         "greater than <0> and contains 'foo')) "
         "Actual: [['foo', 'bar'], ['foo'], []] "
         "Which: has value [] which has length of <0> at index 2");
-    shouldFail(d,
+    shouldFail(
+        d,
         everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
         "Expected: every element((contains 'foo' and "
         "an object with length of a value greater than <0>)) "
         "Actual: [['foo', 'bar'], ['foo'], []] "
         "Which: has value [] which doesn't match (contains 'foo' and "
         "an object with length of a value greater than <0>) at index 2");
-    shouldFail(e,
+    shouldFail(
+        e,
         everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
         "Expected: every element((contains 'foo' and an object with "
         "length of a value greater than <0>)) "
@@ -95,7 +115,10 @@
     shouldPass([null], orderedEquals([null]));
     var d = [1, 2];
     shouldPass(d, orderedEquals([1, 2]));
-    shouldFail(d, orderedEquals([2, 1]), "Expected: equals [2, 1] ordered "
+    shouldFail(
+        d,
+        orderedEquals([2, 1]),
+        "Expected: equals [2, 1] ordered "
         "Actual: [1, 2] "
         "Which: was <1> instead of <2> at location [0]");
   });
@@ -103,14 +126,22 @@
   test('unorderedEquals', () {
     var d = [1, 2];
     shouldPass(d, unorderedEquals([2, 1]));
-    shouldFail(d, unorderedEquals([1]), "Expected: equals [1] unordered "
+    shouldFail(
+        d,
+        unorderedEquals([1]),
+        "Expected: equals [1] unordered "
         "Actual: [1, 2] "
         "Which: has too many elements (2 > 1)");
-    shouldFail(d, unorderedEquals([3, 2, 1]),
+    shouldFail(
+        d,
+        unorderedEquals([3, 2, 1]),
         "Expected: equals [3, 2, 1] unordered "
         "Actual: [1, 2] "
         "Which: has too few elements (2 < 3)");
-    shouldFail(d, unorderedEquals([3, 1]), "Expected: equals [3, 1] unordered "
+    shouldFail(
+        d,
+        unorderedEquals([3, 1]),
+        "Expected: equals [3, 1] unordered "
         "Actual: [1, 2] "
         "Which: has no match for <3> at index 0");
   });
@@ -119,44 +150,94 @@
     var d = [1, 2];
     shouldPass(d, unorderedMatches([2, 1]));
     shouldPass(d, unorderedMatches([greaterThan(1), greaterThan(0)]));
-    shouldFail(d, unorderedMatches([greaterThan(0)]),
+    shouldFail(
+        d,
+        unorderedMatches([greaterThan(0)]),
         "Expected: matches [a value greater than <0>] unordered "
         "Actual: [1, 2] "
         "Which: has too many elements (2 > 1)");
-    shouldFail(d, unorderedMatches([3, 2, 1]),
+    shouldFail(
+        d,
+        unorderedMatches([3, 2, 1]),
         "Expected: matches [<3>, <2>, <1>] unordered "
         "Actual: [1, 2] "
         "Which: has too few elements (2 < 3)");
-    shouldFail(d, unorderedMatches([3, 1]),
+    shouldFail(
+        d,
+        unorderedMatches([3, 1]),
         "Expected: matches [<3>, <1>] unordered "
         "Actual: [1, 2] "
         "Which: has no match for <3> at index 0");
-    shouldFail(d, unorderedMatches([greaterThan(3), greaterThan(0)]),
+    shouldFail(
+        d,
+        unorderedMatches([greaterThan(3), greaterThan(0)]),
         "Expected: matches [a value greater than <3>, a value greater than "
         "<0>] unordered "
         "Actual: [1, 2] "
         "Which: has no match for a value greater than <3> at index 0");
   });
 
+  test('containsAllInOrder', () {
+    var d = [0, 1, 0, 2];
+    shouldPass(d, containsAllInOrder([1, 2]));
+    shouldPass(d, containsAllInOrder([greaterThan(0), greaterThan(1)]));
+    shouldFail(
+        d,
+        containsAllInOrder([2, 1]),
+        "Expected: contains in order([2, 1]) "
+        "Actual: [0, 1, 0, 2] "
+        "Which: did not find a value matching <1> following expected prior "
+        "values");
+    shouldFail(
+        d,
+        containsAllInOrder([greaterThan(1), greaterThan(0)]),
+        "Expected: contains in order([<a value greater than <1>>, "
+        "<a value greater than <0>>]) "
+        "Actual: [0, 1, 0, 2] "
+        "Which: did not find a value matching a value greater than <0> "
+        "following expected prior values");
+    shouldFail(
+        d,
+        containsAllInOrder([1, 2, 3]),
+        "Expected: contains in order([1, 2, 3]) "
+        "Actual: [0, 1, 0, 2] "
+        "Which: did not find a value matching <3> following expected prior "
+        "values");
+    shouldFail(
+        1,
+        containsAllInOrder([1]),
+        "Expected: contains in order([1]) "
+        "Actual: <1> "
+        "Which: not an iterable");
+  });
+
   test('pairwise compare', () {
     var c = [1, 2];
     var d = [1, 2, 3];
     var e = [1, 4, 9];
-    shouldFail('x', pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+    shouldFail(
+        'x',
+        pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
         "Expected: pairwise less than or equal [1, 4, 9] "
         "Actual: 'x' "
         "Which: is not an Iterable");
-    shouldFail(c, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+    shouldFail(
+        c,
+        pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
         "Expected: pairwise less than or equal [1, 4, 9] "
         "Actual: [1, 2] "
         "Which: has length 2 instead of 3");
     shouldPass(d, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"));
-    shouldFail(d, pairwiseCompare(e, (e, a) => a < e, "less than"),
+    shouldFail(
+        d,
+        pairwiseCompare(e, (e, a) => a < e, "less than"),
         "Expected: pairwise less than [1, 4, 9] "
         "Actual: [1, 2, 3] "
         "Which: has <1> which is not less than <1> at index 0");
     shouldPass(d, pairwiseCompare(e, (e, a) => a * a == e, "square root of"));
-    shouldFail(d, pairwiseCompare(e, (e, a) => a + a == e, "double"),
+    shouldFail(
+        d,
+        pairwiseCompare(e, (e, a) => a + a == e, "double"),
         "Expected: pairwise double [1, 4, 9] "
         "Actual: [1, 2, 3] "
         "Which: has <1> which is not double <1> at index 0");
@@ -166,7 +247,10 @@
     var d = new SimpleIterable(0);
     var e = new SimpleIterable(1);
     shouldPass(d, isEmpty);
-    shouldFail(e, isEmpty, "Expected: empty "
+    shouldFail(
+        e,
+        isEmpty,
+        "Expected: empty "
         "Actual: SimpleIterable:[1]");
   });
 
@@ -174,14 +258,20 @@
     var d = new SimpleIterable(0);
     var e = new SimpleIterable(1);
     shouldPass(e, isNotEmpty);
-    shouldFail(d, isNotEmpty, "Expected: non-empty "
+    shouldFail(
+        d,
+        isNotEmpty,
+        "Expected: non-empty "
         "Actual: SimpleIterable:[]");
   });
 
   test('contains', () {
     var d = new SimpleIterable(3);
     shouldPass(d, contains(2));
-    shouldFail(d, contains(5), "Expected: contains <5> "
+    shouldFail(
+        d,
+        contains(5),
+        "Expected: contains <5> "
         "Actual: SimpleIterable:[3, 2, 1]");
   });
 }
diff --git a/packages/matcher/test/mirror_matchers_test.dart b/packages/matcher/test/mirror_matchers_test.dart
index f1781c1..729768e 100644
--- a/packages/matcher/test/mirror_matchers_test.dart
+++ b/packages/matcher/test/mirror_matchers_test.dart
@@ -2,10 +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.
 
-library matcher.mirror_test;
-
 import 'package:matcher/mirror_matchers.dart';
-import 'package:test/test.dart' show test;
+import 'package:test/test.dart';
 
 import 'test_utils.dart';
 
@@ -20,22 +18,31 @@
   test('hasProperty', () {
     var foo = [3];
     shouldPass(foo, hasProperty('length', 1));
-    shouldFail(foo, hasProperty('foo'), 'Expected: has property "foo" '
+    shouldFail(
+        foo,
+        hasProperty('foo'),
+        'Expected: has property "foo" '
         'Actual: [3] '
         'Which: has no property named "foo"');
-    shouldFail(foo, hasProperty('length', 2),
+    shouldFail(
+        foo,
+        hasProperty('length', 2),
         'Expected: has property "length" which matches <2> '
         'Actual: [3] '
         'Which: has property "length" with value <1>');
     var c = new C();
     shouldPass(c, hasProperty('instanceField', 1));
     shouldPass(c, hasProperty('instanceGetter', 2));
-    shouldFail(c, hasProperty('staticField'),
+    shouldFail(
+        c,
+        hasProperty('staticField'),
         'Expected: has property "staticField" '
         'Actual: <Instance of \'C\'> '
         'Which: has a member named "staticField",'
         ' but it is not an instance property');
-    shouldFail(c, hasProperty('staticGetter'),
+    shouldFail(
+        c,
+        hasProperty('staticGetter'),
         'Expected: has property "staticGetter" '
         'Actual: <Instance of \'C\'> '
         'Which: has a member named "staticGetter",'
diff --git a/packages/matcher/test/numeric_matchers_test.dart b/packages/matcher/test/numeric_matchers_test.dart
index d62bad6..9a365d8 100644
--- a/packages/matcher/test/numeric_matchers_test.dart
+++ b/packages/matcher/test/numeric_matchers_test.dart
@@ -2,129 +2,64 @@
 // for 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 matcher.numeric_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:test/test.dart' show test, group;
+import 'package:test/test.dart';
 
 import 'test_utils.dart';
 
 void main() {
-  test('greaterThan', () {
-    shouldPass(10, greaterThan(9));
-    shouldFail(9, greaterThan(10), "Expected: a value greater than <10> "
-        "Actual: <9> "
-        "Which: is not a value greater than <10>");
-  });
-
-  test('greaterThanOrEqualTo', () {
-    shouldPass(10, greaterThanOrEqualTo(10));
-    shouldFail(9, greaterThanOrEqualTo(10),
-        "Expected: a value greater than or equal to <10> "
-        "Actual: <9> "
-        "Which: is not a value greater than or equal to <10>");
-  });
-
-  test('lessThan', () {
-    shouldFail(10, lessThan(9), "Expected: a value less than <9> "
-        "Actual: <10> "
-        "Which: is not a value less than <9>");
-    shouldPass(9, lessThan(10));
-  });
-
-  test('lessThanOrEqualTo', () {
-    shouldPass(10, lessThanOrEqualTo(10));
-    shouldFail(11, lessThanOrEqualTo(10),
-        "Expected: a value less than or equal to <10> "
-        "Actual: <11> "
-        "Which: is not a value less than or equal to <10>");
-  });
-
-  test('isZero', () {
-    shouldPass(0, isZero);
-    shouldFail(1, isZero, "Expected: a value equal to <0> "
-        "Actual: <1> "
-        "Which: is not a value equal to <0>");
-  });
-
-  test('isNonZero', () {
-    shouldFail(0, isNonZero, "Expected: a value not equal to <0> "
-        "Actual: <0> "
-        "Which: is not a value not equal to <0>");
-    shouldPass(1, isNonZero);
-  });
-
-  test('isPositive', () {
-    shouldFail(-1, isPositive, "Expected: a positive value "
-        "Actual: <-1> "
-        "Which: is not a positive value");
-    shouldFail(0, isPositive, "Expected: a positive value "
-        "Actual: <0> "
-        "Which: is not a positive value");
-    shouldPass(1, isPositive);
-  });
-
-  test('isNegative', () {
-    shouldPass(-1, isNegative);
-    shouldFail(0, isNegative, "Expected: a negative value "
-        "Actual: <0> "
-        "Which: is not a negative value");
-  });
-
-  test('isNonPositive', () {
-    shouldPass(-1, isNonPositive);
-    shouldPass(0, isNonPositive);
-    shouldFail(1, isNonPositive, "Expected: a non-positive value "
-        "Actual: <1> "
-        "Which: is not a non-positive value");
-  });
-
-  test('isNonNegative', () {
-    shouldPass(1, isNonNegative);
-    shouldPass(0, isNonNegative);
-    shouldFail(-1, isNonNegative, "Expected: a non-negative value "
-        "Actual: <-1> "
-        "Which: is not a non-negative value");
-  });
-
   test('closeTo', () {
     shouldPass(0, closeTo(0, 1));
     shouldPass(-1, closeTo(0, 1));
     shouldPass(1, closeTo(0, 1));
-    shouldFail(1.001, closeTo(0, 1),
+    shouldFail(
+        1.001,
+        closeTo(0, 1),
         "Expected: a numeric value within <1> of <0> "
         "Actual: <1.001> "
         "Which: differs by <1.001>");
-    shouldFail(-1.001, closeTo(0, 1),
+    shouldFail(
+        -1.001,
+        closeTo(0, 1),
         "Expected: a numeric value within <1> of <0> "
         "Actual: <-1.001> "
         "Which: differs by <1.001>");
   });
 
   test('inInclusiveRange', () {
-    shouldFail(-1, inInclusiveRange(0, 2),
+    shouldFail(
+        -1,
+        inInclusiveRange(0, 2),
         "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
         "Actual: <-1>");
     shouldPass(0, inInclusiveRange(0, 2));
     shouldPass(1, inInclusiveRange(0, 2));
     shouldPass(2, inInclusiveRange(0, 2));
-    shouldFail(3, inInclusiveRange(0, 2),
+    shouldFail(
+        3,
+        inInclusiveRange(0, 2),
         "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
         "Actual: <3>");
   });
 
   test('inExclusiveRange', () {
-    shouldFail(0, inExclusiveRange(0, 2),
+    shouldFail(
+        0,
+        inExclusiveRange(0, 2),
         "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
         "Actual: <0>");
     shouldPass(1, inExclusiveRange(0, 2));
-    shouldFail(2, inExclusiveRange(0, 2),
+    shouldFail(
+        2,
+        inExclusiveRange(0, 2),
         "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
         "Actual: <2>");
   });
 
   test('inOpenClosedRange', () {
-    shouldFail(0, inOpenClosedRange(0, 2),
+    shouldFail(
+        0,
+        inOpenClosedRange(0, 2),
         "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
         "Actual: <0>");
     shouldPass(1, inOpenClosedRange(0, 2));
@@ -134,7 +69,9 @@
   test('inClosedOpenRange', () {
     shouldPass(0, inClosedOpenRange(0, 2));
     shouldPass(1, inClosedOpenRange(0, 2));
-    shouldFail(2, inClosedOpenRange(0, 2),
+    shouldFail(
+        2,
+        inClosedOpenRange(0, 2),
         "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
         "Actual: <2>");
   });
diff --git a/packages/matcher/test/operator_matchers_test.dart b/packages/matcher/test/operator_matchers_test.dart
index 003eb34..20cd631 100644
--- a/packages/matcher/test/operator_matchers_test.dart
+++ b/packages/matcher/test/operator_matchers_test.dart
@@ -2,11 +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.
 
-library matcher.operator_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:test/test.dart'
-    show test, group, expect, throwsArgumentError;
+import 'package:test/test.dart' show test, expect, throwsArgumentError;
 
 import 'test_utils.dart';
 
@@ -26,23 +23,31 @@
   test('allOf', () {
     // with a list
     shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
-    shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
+    shouldFail(
+        -1,
+        allOf([lessThan(10), greaterThan(0)]),
         "Expected: (a value less than <10> and a value greater than <0>) "
         "Actual: <-1> "
         "Which: is not a value greater than <0>");
 
     // with individual items
     shouldPass(1, allOf(lessThan(10), greaterThan(0)));
-    shouldFail(-1, allOf(lessThan(10), greaterThan(0)),
+    shouldFail(
+        -1,
+        allOf(lessThan(10), greaterThan(0)),
         "Expected: (a value less than <10> and a value greater than <0>) "
         "Actual: <-1> "
         "Which: is not a value greater than <0>");
 
     // with maximum items
-    shouldPass(1, allOf(lessThan(10), lessThan(9), lessThan(8),
-        lessThan(7), lessThan(6), lessThan(5), lessThan(4)));
-    shouldFail(4, allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7),
-            lessThan(6), lessThan(5), lessThan(4)),
+    shouldPass(
+        1,
+        allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7), lessThan(6),
+            lessThan(5), lessThan(4)));
+    shouldFail(
+        4,
+        allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7), lessThan(6),
+            lessThan(5), lessThan(4)),
         "Expected: (a value less than <10> and a value less than <9> and a "
         "value less than <8> and a value less than <7> and a value less than "
         "<6> and a value less than <5> and a value less than <4>) "
diff --git a/packages/matcher/test/order_matchers_test.dart b/packages/matcher/test/order_matchers_test.dart
new file mode 100644
index 0000000..ff09b6c
--- /dev/null
+++ b/packages/matcher/test/order_matchers_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  test('greaterThan', () {
+    shouldPass(10, greaterThan(9));
+    shouldFail(
+        9,
+        greaterThan(10),
+        "Expected: a value greater than <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than <10>");
+  });
+
+  test('greaterThanOrEqualTo', () {
+    shouldPass(10, greaterThanOrEqualTo(10));
+    shouldFail(
+        9,
+        greaterThanOrEqualTo(10),
+        "Expected: a value greater than or equal to <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than or equal to <10>");
+  });
+
+  test('lessThan', () {
+    shouldFail(
+        10,
+        lessThan(9),
+        "Expected: a value less than <9> "
+        "Actual: <10> "
+        "Which: is not a value less than <9>");
+    shouldPass(9, lessThan(10));
+  });
+
+  test('lessThanOrEqualTo', () {
+    shouldPass(10, lessThanOrEqualTo(10));
+    shouldFail(
+        11,
+        lessThanOrEqualTo(10),
+        "Expected: a value less than or equal to <10> "
+        "Actual: <11> "
+        "Which: is not a value less than or equal to <10>");
+  });
+
+  test('isZero', () {
+    shouldPass(0, isZero);
+    shouldFail(
+        1,
+        isZero,
+        "Expected: a value equal to <0> "
+        "Actual: <1> "
+        "Which: is not a value equal to <0>");
+  });
+
+  test('isNonZero', () {
+    shouldFail(
+        0,
+        isNonZero,
+        "Expected: a value not equal to <0> "
+        "Actual: <0> "
+        "Which: is not a value not equal to <0>");
+    shouldPass(1, isNonZero);
+  });
+
+  test('isPositive', () {
+    shouldFail(
+        -1,
+        isPositive,
+        "Expected: a positive value "
+        "Actual: <-1> "
+        "Which: is not a positive value");
+    shouldFail(
+        0,
+        isPositive,
+        "Expected: a positive value "
+        "Actual: <0> "
+        "Which: is not a positive value");
+    shouldPass(1, isPositive);
+  });
+
+  test('isNegative', () {
+    shouldPass(-1, isNegative);
+    shouldFail(
+        0,
+        isNegative,
+        "Expected: a negative value "
+        "Actual: <0> "
+        "Which: is not a negative value");
+  });
+
+  test('isNonPositive', () {
+    shouldPass(-1, isNonPositive);
+    shouldPass(0, isNonPositive);
+    shouldFail(
+        1,
+        isNonPositive,
+        "Expected: a non-positive value "
+        "Actual: <1> "
+        "Which: is not a non-positive value");
+  });
+
+  test('isNonNegative', () {
+    shouldPass(1, isNonNegative);
+    shouldPass(0, isNonNegative);
+    shouldFail(
+        -1,
+        isNonNegative,
+        "Expected: a non-negative value "
+        "Actual: <-1> "
+        "Which: is not a non-negative value");
+  });
+}
diff --git a/packages/matcher/test/pretty_print_test.dart b/packages/matcher/test/pretty_print_test.dart
index 1319b9c..c809df0 100644
--- a/packages/matcher/test/pretty_print_test.dart
+++ b/packages/matcher/test/pretty_print_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.pretty_print_test;
-
 import 'dart:collection';
 
 import 'package:matcher/matcher.dart';
@@ -30,7 +28,7 @@
     expect(prettyPrint(12.13), equals('<12.13>'));
     expect(prettyPrint(true), equals('<true>'));
     expect(prettyPrint(null), equals('<null>'));
-    expect(prettyPrint(() => 12), matches(r'<Closure(: \(\) => dynamic)?>'));
+    expect(prettyPrint(() => 12), matches(r'<Closure.*>'));
   });
 
   group('with a string', () {
@@ -39,14 +37,16 @@
     });
 
     test('containing newlines', () {
-      expect(prettyPrint('foo\nbar\nbaz'), equals("'foo\\n'\n"
-          "  'bar\\n'\n"
-          "  'baz'"));
+      expect(
+          prettyPrint('foo\nbar\nbaz'),
+          equals("'foo\\n'\n"
+              "  'bar\\n'\n"
+              "  'baz'"));
     });
 
     test('containing escapable characters', () {
-      expect(
-          prettyPrint("foo\rbar\tbaz'qux\v"), equals(r"'foo\rbar\tbaz\'qux\v'"));
+      expect(prettyPrint("foo\rbar\tbaz'qux\v"),
+          equals(r"'foo\rbar\tbaz\'qux\v'"));
     });
   });
 
@@ -56,13 +56,15 @@
     });
 
     test('containing a multiline string', () {
-      expect(prettyPrint(['foo', 'bar\nbaz\nbip', 'qux']), equals("[\n"
-          "  'foo',\n"
-          "  'bar\\n'\n"
-          "    'baz\\n'\n"
-          "    'bip',\n"
-          "  'qux'\n"
-          "]"));
+      expect(
+          prettyPrint(['foo', 'bar\nbaz\nbip', 'qux']),
+          equals("[\n"
+              "  'foo',\n"
+              "  'bar\\n'\n"
+              "    'baz\\n'\n"
+              "    'bip',\n"
+              "  'qux'\n"
+              "]"));
     });
 
     test('containing a matcher', () {
@@ -76,7 +78,8 @@
     });
 
     test("that's over maxLineLength", () {
-      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 29),
+      expect(
+          prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 29),
           equals("[\n"
               "  0,\n"
               "  1,\n"
@@ -92,23 +95,27 @@
     });
 
     test("factors indentation into maxLineLength", () {
-      expect(prettyPrint(["foo\nbar", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],],
-          maxLineLength: 30), equals("[\n"
-          "  'foo\\n'\n"
-          "    'bar',\n"
-          "  [\n"
-          "    0,\n"
-          "    1,\n"
-          "    2,\n"
-          "    3,\n"
-          "    4,\n"
-          "    5,\n"
-          "    6,\n"
-          "    7,\n"
-          "    8,\n"
-          "    9\n"
-          "  ]\n"
-          "]"));
+      expect(
+          prettyPrint([
+            "foo\nbar",
+            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
+          ], maxLineLength: 30),
+          equals("[\n"
+              "  'foo\\n'\n"
+              "    'bar',\n"
+              "  [\n"
+              "    0,\n"
+              "    1,\n"
+              "    2,\n"
+              "    3,\n"
+              "    4,\n"
+              "    5,\n"
+              "    6,\n"
+              "    7,\n"
+              "    8,\n"
+              "    9\n"
+              "  ]\n"
+              "]"));
     });
 
     test("that's under maxItems", () {
@@ -122,7 +129,7 @@
     });
 
     test("that's recursive", () {
-      var list = [1, 2, 3];
+      var list = <dynamic>[1, 2, 3];
       list.add(list);
       expect(prettyPrint(list), equals("[1, 2, 3, (recursive)]"));
     });
@@ -135,27 +142,33 @@
     });
 
     test('containing a multiline string key', () {
-      expect(prettyPrint({'foo\nbar': 1, 'bar': true}), equals("{\n"
-          "  'foo\\n'\n"
-          "    'bar': 1,\n"
-          "  'bar': true\n"
-          "}"));
+      expect(
+          prettyPrint({'foo\nbar': 1, 'bar': true}),
+          equals("{\n"
+              "  'foo\\n'\n"
+              "    'bar': 1,\n"
+              "  'bar': true\n"
+              "}"));
     });
 
     test('containing a multiline string value', () {
-      expect(prettyPrint({'foo': 'bar\nbaz', 'qux': true}), equals("{\n"
-          "  'foo': 'bar\\n'\n"
-          "    'baz',\n"
-          "  'qux': true\n"
-          "}"));
+      expect(
+          prettyPrint({'foo': 'bar\nbaz', 'qux': true}),
+          equals("{\n"
+              "  'foo': 'bar\\n'\n"
+              "    'baz',\n"
+              "  'qux': true\n"
+              "}"));
     });
 
     test('containing a multiline string key/value pair', () {
-      expect(prettyPrint({'foo\nbar': 'baz\nqux'}), equals("{\n"
-          "  'foo\\n'\n"
-          "    'bar': 'baz\\n'\n"
-          "    'qux'\n"
-          "}"));
+      expect(
+          prettyPrint({'foo\nbar': 'baz\nqux'}),
+          equals("{\n"
+              "  'foo\\n'\n"
+              "    'bar': 'baz\\n'\n"
+              "    'qux'\n"
+              "}"));
     });
 
     test('containing a matcher key', () {
@@ -174,7 +187,8 @@
     });
 
     test("that's over maxLineLength", () {
-      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 31),
+      expect(
+          prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 31),
           equals("{\n"
               "  '0': 1,\n"
               "  '2': 3,\n"
@@ -184,17 +198,21 @@
     });
 
     test("factors indentation into maxLineLength", () {
-      expect(prettyPrint(["foo\nbar", {'0': 1, '2': 3, '4': 5, '6': 7}],
-          maxLineLength: 32), equals("[\n"
-          "  'foo\\n'\n"
-          "    'bar',\n"
-          "  {\n"
-          "    '0': 1,\n"
-          "    '2': 3,\n"
-          "    '4': 5,\n"
-          "    '6': 7\n"
-          "  }\n"
-          "]"));
+      expect(
+          prettyPrint([
+            "foo\nbar",
+            {'0': 1, '2': 3, '4': 5, '6': 7}
+          ], maxLineLength: 32),
+          equals("[\n"
+              "  'foo\\n'\n"
+              "    'bar',\n"
+              "  {\n"
+              "    '0': 1,\n"
+              "    '2': 3,\n"
+              "    '4': 5,\n"
+              "    '6': 7\n"
+              "  }\n"
+              "]"));
     });
 
     test("that's under maxItems", () {
diff --git a/packages/matcher/test/string_matchers_test.dart b/packages/matcher/test/string_matchers_test.dart
index 38fa129..5b5afe4 100644
--- a/packages/matcher/test/string_matchers_test.dart
+++ b/packages/matcher/test/string_matchers_test.dart
@@ -2,10 +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.
 
-library matcher.string_matchers_test;
-
 import 'package:matcher/matcher.dart';
-import 'package:test/test.dart' show test, group, expect;
+import 'package:test/test.dart' show test, expect;
 
 import 'test_utils.dart';
 
@@ -51,7 +49,9 @@
 
   test('equalsIgnoringWhitespace', () {
     shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
-    shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
+    shouldFail(
+        ' helloworld  ',
+        equalsIgnoringWhitespace('hello world'),
         "Expected: 'hello world' ignoring whitespace "
         "Actual: ' helloworld ' "
         "Which: is 'helloworld' with whitespace compressed");
@@ -61,7 +61,9 @@
     shouldPass('hello', startsWith(''));
     shouldPass('hello', startsWith('hell'));
     shouldPass('hello', startsWith('hello'));
-    shouldFail('hello', startsWith('hello '),
+    shouldFail(
+        'hello',
+        startsWith('hello '),
         "Expected: a string starting with 'hello ' "
         "Actual: 'hello'");
   });
@@ -70,7 +72,9 @@
     shouldPass('hello', endsWith(''));
     shouldPass('hello', endsWith('lo'));
     shouldPass('hello', endsWith('hello'));
-    shouldFail('hello', endsWith(' hello'),
+    shouldFail(
+        'hello',
+        endsWith(' hello'),
         "Expected: a string ending with ' hello' "
         "Actual: 'hello'");
   });
@@ -98,7 +102,8 @@
         'goodbye cruel world', stringContainsInOrder(['cruel', 'world']));
     shouldPass('goodbye cruel world',
         stringContainsInOrder(['goodbye', 'cruel', 'world']));
-    shouldFail('goodbye cruel world',
+    shouldFail(
+        'goodbye cruel world',
         stringContainsInOrder(['goo', 'cruel', 'bye']),
         "Expected: a string containing 'goo', 'cruel', 'bye' in order "
         "Actual: 'goodbye cruel world'");
diff --git a/packages/matcher/test/test_utils.dart b/packages/matcher/test/test_utils.dart
index f95c2b9..a0dad48 100644
--- a/packages/matcher/test/test_utils.dart
+++ b/packages/matcher/test/test_utils.dart
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library matcher.test_utils;
-
-import 'dart:collection';
-
 import 'package:test/test.dart';
 
 void shouldFail(value, Matcher matcher, expected) {
@@ -45,25 +41,12 @@
   featureValueOf(actual) => actual.price;
 }
 
-class SimpleIterable extends IterableBase<int> {
+class SimpleIterable extends Iterable<int> {
   final int count;
 
   SimpleIterable(this.count);
 
-  bool contains(int val) => count < val ? false : true;
-
-  bool any(bool f(element)) {
-    for (var i = 0; i <= count; i++) {
-      if (f(i)) return true;
-    }
-    return false;
-  }
-
-  String toString() => "<[$count]>";
-
-  Iterator get iterator {
-    return new _SimpleIterator(count);
-  }
+  Iterator<int> get iterator => new _SimpleIterator(count);
 }
 
 class _SimpleIterator implements Iterator<int> {
diff --git a/packages/meta/.packages b/packages/meta/.packages
new file mode 100644
index 0000000..d979045
--- /dev/null
+++ b/packages/meta/.packages
@@ -0,0 +1,2 @@
+# Generated by pub on 2017-07-19 12:49:39.505373.
+meta:lib/
diff --git a/packages/meta/CHANGELOG.md b/packages/meta/CHANGELOG.md
new file mode 100644
index 0000000..b44eb57
--- /dev/null
+++ b/packages/meta/CHANGELOG.md
@@ -0,0 +1,99 @@
+## 1.1.1
+* Update SDK constraint to be 2.0.0 dev friendly.
+
+## 1.1.0
+* Introduce `@alwaysThrows` to declare that a function always throws
+    (SDK issue [17999](https://github.com/dart-lang/sdk/issues/17999)). This
+    is first available in Dart SDK 1.25.0-dev.1.0.
+
+    ```dart
+    import 'package:meta/meta.dart';
+
+    // Without knowing that [failBigTime] always throws, it looks like this
+    // function might return without returning a bool.
+    bool fn(expected, actual) {
+      if (expected != actual)
+        failBigTime(expected, actual);
+      else
+        return True;
+    }
+
+    @alwaysThrows
+    void failBigTime(expected, actual) {
+      throw new StateError('Expected $expected, but was $actual.');
+    }
+    ```
+
+## 1.0.4
+* Introduce `@virtual` to allow field overrides in strong mode
+    (SDK issue [27384](https://github.com/dart-lang/sdk/issues/27384)).
+
+    ```dart
+    import 'package:meta/meta.dart' show virtual;
+    class Base {
+      @virtual int x;
+    }
+    class Derived extends Base {
+      int x;
+
+      // Expose the hidden storage slot:
+      int get superX => super.x;
+      set superX(int v) { super.x = v; }
+    }
+    ```
+
+## 1.0.3
+* Introduce `@checked` to override a method and tighten a parameter
+    type (SDK issue [25578](https://github.com/dart-lang/sdk/issues/25578)).
+
+    ```dart
+    import 'package:meta/meta.dart' show checked;
+    class View {
+      addChild(View v) {}
+    }
+    class MyView extends View {
+      // this override is legal, it will check at runtime if we actually
+      // got a MyView.
+      addChild(@checked MyView v) {}
+    }
+    main() {
+      dynamic mv = new MyView();
+      mv.addChild(new View()); // runtime error
+    }
+    ```
+
+## 1.0.2
+* Introduce `@visibleForTesting` annotation for declarations that may be referenced only in the library or in a test.
+
+## 1.0.1
+* Updated `@factory` to allow statics and methods returning `null`.
+
+## 1.0.0
+* First stable API release.
+
+## 0.12.2
+* Updated `@protected` to include implemented interfaces (linter#252).
+
+## 0.12.1
+* Fixed markdown in dartdocs.
+
+## 0.12.0
+* Introduce `@optionalTypeArgs` annotation for classes whose type arguments are to be treated as optional.
+
+## 0.11.0
+* Added new `Required` constructor with a means to specify a reason to explain why a parameter is required.
+
+## 0.10.0
+* Introduce `@factory` annotation for methods that must either be abstract or
+must return a newly allocated object.
+* Introduce `@literal` annotation that indicates that any invocation of a
+constructor must use the keyword `const` unless one or more of the
+arguments to the constructor is not a compile-time constant.
+
+## 0.9.0
+* Introduce `@protected` annotation for members that must only be called from
+instance members of subclasses.
+* Introduce `@required` annotation for optional parameters that should be treated
+as required.
+* Introduce `@mustCallSuper` annotation for methods that must be invoked by all
+overriding methods.
diff --git a/packages/when/LICENSE b/packages/meta/LICENSE
old mode 100755
new mode 100644
similarity index 95%
rename from packages/when/LICENSE
rename to packages/meta/LICENSE
index 28f844d..82e9b52
--- a/packages/when/LICENSE
+++ b/packages/meta/LICENSE
@@ -1,24 +1,26 @@
-Copyright 2015, the when project authors. All rights reserved.

-Redistribution and use in source and binary forms, with or without

-modification, are permitted provided that the following conditions are

-met:

-    * Redistributions of source code must retain the above copyright

-      notice, this list of conditions and the following disclaimer.

-    * Redistributions in binary form must reproduce the above

-      copyright notice, this list of conditions and the following

-      disclaimer in the documentation and/or other materials provided

-      with the distribution.

-    * Neither the name of Google Inc. nor the names of its

-      contributors may be used to endorse or promote products derived

-      from this software without specific prior written permission.

-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+Copyright 2016, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/meta/analysis_options.yaml b/packages/meta/analysis_options.yaml
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/meta/analysis_options.yaml
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/meta/lib/meta.dart b/packages/meta/lib/meta.dart
new file mode 100644
index 0000000..8dd0927
--- /dev/null
+++ b/packages/meta/lib/meta.dart
@@ -0,0 +1,270 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Constants for use in metadata annotations.
+///
+/// See also `@deprecated` and `@override` in the `dart:core` library.
+///
+/// Annotations provide semantic information that tools can use to provide a
+/// better user experience. For example, an IDE might not autocomplete the name
+/// of a function that's been marked `@deprecated`, or it might display the
+/// function's name differently.
+///
+/// For information on installing and importing this library, see the
+/// [meta package on pub.dartlang.org] (http://pub.dartlang.org/packages/meta).
+/// For examples of using annotations, see
+/// [Metadata](https://www.dartlang.org/docs/dart-up-and-running/ch02.html#metadata)
+/// in the language tour.
+library meta;
+
+/// Used to annotate a function `f`. Indicates that `f` always throws an
+/// exception. Any functions that override `f`, in class inheritence, are also
+/// expected to conform to this contract.
+///
+/// Tools, such as the analyzer, can use this to understand whether a block of
+/// code "exits". For example:
+///
+/// ```dart
+/// @alwaysThrows toss() { throw 'Thrown'; }
+///
+/// int fn(bool b) {
+///   if (b) {
+///     return 0;
+///   } else {
+///     toss();
+///     print("Hello.");
+///   }
+/// }
+/// ```
+///
+/// Without the annotation on `toss`, it would look as though `fn` doesn't
+/// always return a value. The annotation shows that `fn` does always exit. In
+/// addition, the annotation reveals that any statements following a call to
+/// `toss` (like the `print` call) are dead code.
+///
+/// Tools, such as the analyzer, can also expect this contract to be enforced;
+/// that is, tools may emit warnings if a function with this annotation
+/// _doesn't_ always throw.
+const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
+
+/// Used to annotate a parameter of an instance method that overrides another
+/// method.
+///
+/// Indicates that this parameter may have a tighter type than the parameter on
+/// its superclass. The actual argument will be checked at runtime to ensure it
+/// is a subtype of the overridden parameter type.
+const _Checked checked = const _Checked();
+
+/// Used to annotate a library, or any declaration that is part of the public
+/// interface of a library (such as top-level members, class members, and
+/// function parameters) to indicate that the annotated API is experimental and
+/// may be removed or changed at any-time without updating the version of the
+/// containing package, despite the fact that it would otherwise be a breaking
+/// change.
+///
+/// If the annotation is applied to a library then it is equivalent to applying
+/// the annotation to all of the top-level members of the library. Applying the
+/// annotation to a class does *not* apply the annotation to subclasses, but
+/// does apply the annotation to members of the class.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration that is not part of the
+///   public interface of a library (such as a local variable or a declaration
+///   that is private) or a directive other than the first directive in the
+///   library, or
+/// * the declaration is referenced by a package that has not explicitly
+///   indicated its intention to use experimental APIs (details TBD).
+const _Experimental experimental = const _Experimental();
+
+/// Used to annotate an instance or static method `m`. Indicates that `m` must
+/// either be abstract or must return a newly allocated object or `null`. In
+/// addition, every method that either implements or overrides `m` is implicitly
+/// annotated with this same annotation.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a method, or
+/// * the annotation is associated with a method that has this annotation that
+///   can return anything other than a newly allocated object or `null`.
+const _Factory factory = const _Factory();
+
+/// Used to annotate a class `C`. Indicates that `C` and all subtypes of `C`
+/// must be immutable.
+///
+/// A class is immutable if all of the instance fields of the class, whether
+/// defined directly or inherited, are `final`.
+///
+/// Tools, such as the analyzer, can provide feedback if
+/// * the annotation is associated with anything other than a class, or
+/// * a class that has this annotation or extends, implements or mixes in a
+///   class that has this annotation is not immutable.
+const Immutable immutable = const Immutable();
+
+/// Used to annotate a const constructor `c`. Indicates that any invocation of
+/// the constructor must use the keyword `const` unless one or more of the
+/// arguments to the constructor is not a compile-time constant.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a const constructor,
+///   or
+/// * an invocation of a constructor that has this annotation is not invoked
+///   using the `const` keyword unless one or more of the arguments to the
+///   constructor is not a compile-time constant.
+const _Literal literal = const _Literal();
+
+/// Used to annotate an instance method `m`. Indicates that every invocation of
+/// a method that overrides `m` must also invoke `m`. In addition, every method
+/// that overrides `m` is implicitly annotated with this same annotation.
+///
+/// Note that private methods with this annotation cannot be validly overridden
+/// outside of the library that defines the annotated method.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than an instance method,
+///   or
+/// * a method that overrides a method that has this annotation can return
+///   without invoking the overridden method.
+const _MustCallSuper mustCallSuper = const _MustCallSuper();
+
+/// Used to annotate a class declaration `C`. Indicates that any type arguments
+/// declared on `C` are to be treated as optional.  Tools such as the analyzer
+/// and linter can use this information to suppress warnings that would
+/// otherwise require type arguments to be provided for instances of `C`.
+const _OptionalTypeArgs optionalTypeArgs = const _OptionalTypeArgs();
+
+/// Used to annotate an instance member (method, getter, setter, operator, or
+/// field) `m` in a class `C`. If the annotation is on a field it applies to the
+/// getter, and setter if appropriate, that are induced by the field. Indicates
+/// that `m` should only be invoked from instance methods of `C` or classes that
+/// extend, implement or mix in `C`, either directly or indirectly. Additionally
+/// indicates that `m` should only be invoked on `this`, whether explicitly or
+/// implicitly.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than an instance member,
+///   or
+/// * an invocation of a member that has this annotation is used outside of an
+///   instance member defined on a class that extends or mixes in the class in
+///   which the protected member is defined, or that uses a receiver other than
+///   `this`.
+const _Protected protected = const _Protected();
+
+/// Used to annotate a named parameter `p` in a method or function `f`.
+/// Indicates that every invocation of `f` must include an argument
+/// corresponding to `p`, despite the fact that `p` would otherwise be an
+/// optional parameter.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a named parameter,
+/// * the annotation is associated with a named parameter in a method `m1` that
+///   overrides a method `m0` and `m0` defines a named parameter with the same
+///   name that does not have this annotation, or
+/// * an invocation of a method or function does not include an argument
+///   corresponding to a named parameter that has this annotation.
+const Required required = const Required();
+
+/// Used to annotate a field that is allowed to be overridden in Strong Mode.
+const _Virtual virtual = const _Virtual();
+
+/// Used to annotate an instance member that was made public so that it could be
+/// overridden but that is not intended to be referenced from outside the
+/// defining library.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration other than a public
+///   instance member in a class, or
+/// * the member is referenced outside of the defining library.
+const _VisibleForOverriding visibleForOverriding =
+    const _VisibleForOverriding();
+
+/// Used to annotate a declaration was made public, so that it is more visible
+/// than otherwise necessary, to make code testable.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration not in the `lib` folder
+///   of a package, or
+/// * the declaration is referenced outside of its the defining library or a
+///   library which is in the `test` folder of the defining package.
+const _VisibleForTesting visibleForTesting = const _VisibleForTesting();
+
+/// Used to annotate a class.
+///
+/// See [immutable] for more details.
+class Immutable {
+  /// A human-readable explanation of the reason why the class is immutable.
+  final String reason;
+
+  /// Initialize a newly created instance to have the given [reason].
+  const Immutable([this.reason]);
+}
+
+/// Used to annotate a named parameter `p` in a method or function `f`.
+///
+/// See [required] for more details.
+class Required {
+  /// A human-readable explanation of the reason why the annotated parameter is
+  /// required. For example, the annotation might look like:
+  ///
+  ///     ButtonWidget({
+  ///         Function onHover,
+  ///         @Required('Buttons must do something when pressed')
+  ///         Function onPressed,
+  ///         ...
+  ///     }) ...
+  final String reason;
+
+  /// Initialize a newly created instance to have the given [reason].
+  const Required([this.reason]);
+}
+
+class _AlwaysThrows {
+  const _AlwaysThrows();
+}
+
+class _Checked {
+  const _Checked();
+}
+
+class _Experimental {
+  const _Experimental();
+}
+
+class _Factory {
+  const _Factory();
+}
+
+class _Literal {
+  const _Literal();
+}
+
+class _MustCallSuper {
+  const _MustCallSuper();
+}
+
+class _OptionalTypeArgs {
+  const _OptionalTypeArgs();
+}
+
+class _Protected {
+  const _Protected();
+}
+
+class _Virtual {
+  const _Virtual();
+}
+
+class _VisibleForOverriding {
+  const _VisibleForOverriding();
+}
+
+class _VisibleForTesting {
+  const _VisibleForTesting();
+}
diff --git a/packages/meta/pubspec.yaml b/packages/meta/pubspec.yaml
new file mode 100644
index 0000000..50f7b1b
--- /dev/null
+++ b/packages/meta/pubspec.yaml
@@ -0,0 +1,10 @@
+name: meta
+version: 1.1.1
+author: Dart Team <misc@dartlang.org>
+homepage: http://www.dartlang.org
+description: >
+ This library contains the definitions of annotations that provide additional
+ semantic information about the program being annotated. These annotations are
+ intended to be used by tools to provide a better user experience.
+environment:
+  sdk: '>=1.12.0 <2.0.0-dev.infinity'
diff --git a/packages/observable/.analysis_options b/packages/observable/.analysis_options
new file mode 100644
index 0000000..dbb6342
--- /dev/null
+++ b/packages/observable/.analysis_options
@@ -0,0 +1,49 @@
+analyzer:
+  strong-mode: true
+linter:
+  rules:
+    #- always_declare_return_types
+    #- always_specify_types
+    #- annotate_overrides
+    #- avoid_as
+    - avoid_empty_else
+    - avoid_init_to_null
+    - avoid_return_types_on_setters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    #- close_sinks
+    #- comment_references
+    - constant_identifier_names
+    - control_flow_in_finally
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - hash_and_equals
+    - implementation_imports
+    - iterable_contains_unrelated_type
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - non_constant_identifier_names
+    - one_member_abstracts
+    - only_throw_errors
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_is_not_empty
+    #- public_member_api_docs
+    #- slash_for_doc_comments
+    #- sort_constructors_first
+    #- sort_unnamed_constructors_first
+    - super_goes_last
+    - test_types_in_equals
+    - throw_in_finally
+    #- type_annotate_public_apis
+    - type_init_formals
+    #- unawaited_futures
+    - unnecessary_brace_in_string_interp
+    - unnecessary_getters_setters
+    - unrelated_type_equality_checks
+    - valid_regexps
diff --git a/packages/observable/.gitignore b/packages/observable/.gitignore
new file mode 100644
index 0000000..96bc6bb
--- /dev/null
+++ b/packages/observable/.gitignore
@@ -0,0 +1,8 @@
+# Files and directories created by pub
+.packages
+.pub/
+packages
+pubspec.lock
+
+# Directory created by dartdoc
+doc/api/
diff --git a/packages/observe/AUTHORS b/packages/observable/AUTHORS
similarity index 100%
rename from packages/observe/AUTHORS
rename to packages/observable/AUTHORS
diff --git a/packages/observable/CHANGELOG.md b/packages/observable/CHANGELOG.md
new file mode 100644
index 0000000..aca61a5
--- /dev/null
+++ b/packages/observable/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.14.0+1
+
+* Add a missing dependency on `pkg/meta`.
diff --git a/packages/observable/CONTRIBUTING.md b/packages/observable/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/packages/observable/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/packages/when/LICENSE b/packages/observable/LICENSE
old mode 100755
new mode 100644
similarity index 95%
copy from packages/when/LICENSE
copy to packages/observable/LICENSE
index 28f844d..82e9b52
--- a/packages/when/LICENSE
+++ b/packages/observable/LICENSE
@@ -1,24 +1,26 @@
-Copyright 2015, the when project authors. All rights reserved.

-Redistribution and use in source and binary forms, with or without

-modification, are permitted provided that the following conditions are

-met:

-    * Redistributions of source code must retain the above copyright

-      notice, this list of conditions and the following disclaimer.

-    * Redistributions in binary form must reproduce the above

-      copyright notice, this list of conditions and the following

-      disclaimer in the documentation and/or other materials provided

-      with the distribution.

-    * Neither the name of Google Inc. nor the names of its

-      contributors may be used to endorse or promote products derived

-      from this software without specific prior written permission.

-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+Copyright 2016, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/observe/PATENTS b/packages/observable/PATENTS
similarity index 100%
rename from packages/observe/PATENTS
rename to packages/observable/PATENTS
diff --git a/packages/observable/README.md b/packages/observable/README.md
new file mode 100644
index 0000000..3965a6f
--- /dev/null
+++ b/packages/observable/README.md
@@ -0,0 +1,5 @@
+Support for marking objects as observable, and getting notifications when those
+objects are mutated.
+
+This library is used to observe changes to observable types. It also
+has helpers to make implementing and using observable objects easy.
diff --git a/packages/observable/lib/observable.dart b/packages/observable/lib/observable.dart
new file mode 100644
index 0000000..ce82061
--- /dev/null
+++ b/packages/observable/lib/observable.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library observable;
+
+export 'src/change_record.dart';
+export 'src/list_diff.dart' show ListChangeRecord;
+export 'src/observable.dart';
+export 'src/observable_list.dart';
+export 'src/observable_map.dart';
+export 'src/property_change_record.dart';
+export 'src/to_observable.dart';
diff --git a/packages/observable/lib/src/change_record.dart b/packages/observable/lib/src/change_record.dart
new file mode 100644
index 0000000..b4c4f24
--- /dev/null
+++ b/packages/observable/lib/src/change_record.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library observable.src.change_record;
+
+/// Records a change to an [Observable].
+// TODO(jmesserly): remove this type
+abstract class ChangeRecord {}
diff --git a/packages/observe/lib/src/list_diff.dart b/packages/observable/lib/src/list_diff.dart
similarity index 70%
rename from packages/observe/lib/src/list_diff.dart
rename to packages/observable/lib/src/list_diff.dart
index cbc3f2f..c16a613 100644
--- a/packages/observe/lib/src/list_diff.dart
+++ b/packages/observable/lib/src/list_diff.dart
@@ -1,18 +1,19 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library observe.src.list_diff;
+library observable.src.list_diff;
 
-import 'dart:math' as math;
 import 'dart:collection' show UnmodifiableListView;
+import 'dart:math' as math;
+
 import 'change_record.dart' show ChangeRecord;
 
 /// A summary of an individual change to a [List].
 ///
 /// Each delta represents that at the [index], [removed] sequence of items were
 /// removed, and counting forward from [index], [addedCount] items were added.
-class ListChangeRecord extends ChangeRecord {
+class ListChangeRecord /* TODO(tvolkert): remove */ extends ChangeRecord {
   /// The list that changed.
   final List object;
 
@@ -35,28 +36,27 @@
   // user.
   int _index, _addedCount;
 
-  ListChangeRecord._(this.object, this._index, removed, this._addedCount)
+  ListChangeRecord._(this.object, this._index, List removed, this._addedCount)
       : _removed = removed,
         _unmodifiableRemoved = new UnmodifiableListView(removed);
 
   factory ListChangeRecord(List object, int index,
       {List removed, int addedCount}) {
-
     if (removed == null) removed = [];
     if (addedCount == null) addedCount = 0;
     return new ListChangeRecord._(object, index, removed, addedCount);
   }
 
-  /// Returns true if the provided index was changed by this operation.
-  bool indexChanged(key) {
-    // If key isn't an int, or before the index, then it wasn't changed.
-    if (key is! int || key < index) return false;
+  /// Returns true if the provided [ref] index was changed by this operation.
+  bool indexChanged(int ref) {
+    // If ref is before the index, then it wasn't changed.
+    if (ref < index) return false;
 
     // If this was a shift operation, anything after index is changed.
     if (addedCount != removed.length) return true;
 
     // Otherwise, anything in the update range was changed.
-    return key < index + addedCount;
+    return ref < index + addedCount;
   }
 
   String toString() => '#<ListChangeRecord index: $index, '
@@ -77,28 +77,28 @@
 List<List<int>> _calcEditDistances(List current, int currentStart,
     int currentEnd, List old, int oldStart, int oldEnd) {
   // "Deletion" columns
-  var rowCount = oldEnd - oldStart + 1;
-  var columnCount = currentEnd - currentStart + 1;
-  var distances = new List(rowCount);
+  int rowCount = oldEnd - oldStart + 1;
+  int columnCount = currentEnd - currentStart + 1;
+  List<List<int>> distances = new List<List<int>>(rowCount);
 
   // "Addition" rows. Initialize null column.
-  for (var i = 0; i < rowCount; i++) {
+  for (int i = 0; i < rowCount; i++) {
     distances[i] = new List(columnCount);
     distances[i][0] = i;
   }
 
   // Initialize null row
-  for (var j = 0; j < columnCount; j++) {
+  for (int j = 0; j < columnCount; j++) {
     distances[0][j] = j;
   }
 
-  for (var i = 1; i < rowCount; i++) {
-    for (var j = 1; j < columnCount; j++) {
+  for (int i = 1; i < rowCount; i++) {
+    for (int j = 1; j < columnCount; j++) {
       if (old[oldStart + i - 1] == current[currentStart + j - 1]) {
         distances[i][j] = distances[i - 1][j - 1];
       } else {
-        var north = distances[i - 1][j] + 1;
-        var west = distances[i][j - 1] + 1;
+        int north = distances[i - 1][j] + 1;
+        int west = distances[i][j - 1] + 1;
         distances[i][j] = math.min(north, west);
       }
     }
@@ -107,51 +107,51 @@
   return distances;
 }
 
-const _EDIT_LEAVE = 0;
-const _EDIT_UPDATE = 1;
-const _EDIT_ADD = 2;
-const _EDIT_DELETE = 3;
+const _kEditLeave = 0;
+const _kEditUpdate = 1;
+const _kEditAdd = 2;
+const _kEditDelete = 3;
 
 // This starts at the final weight, and walks "backward" by finding
 // the minimum previous weight recursively until the origin of the weight
 // matrix.
 List<int> _spliceOperationsFromEditDistances(List<List<int>> distances) {
-  var i = distances.length - 1;
-  var j = distances[0].length - 1;
-  var current = distances[i][j];
-  var edits = [];
+  int i = distances.length - 1;
+  int j = distances[0].length - 1;
+  int current = distances[i][j];
+  List<int> edits = <int>[];
   while (i > 0 || j > 0) {
     if (i == 0) {
-      edits.add(_EDIT_ADD);
+      edits.add(_kEditAdd);
       j--;
       continue;
     }
     if (j == 0) {
-      edits.add(_EDIT_DELETE);
+      edits.add(_kEditDelete);
       i--;
       continue;
     }
-    var northWest = distances[i - 1][j - 1];
-    var west = distances[i - 1][j];
-    var north = distances[i][j - 1];
+    int northWest = distances[i - 1][j - 1];
+    int west = distances[i - 1][j];
+    int north = distances[i][j - 1];
 
-    var min = math.min(math.min(west, north), northWest);
+    int min = math.min(math.min(west, north), northWest);
 
     if (min == northWest) {
       if (northWest == current) {
-        edits.add(_EDIT_LEAVE);
+        edits.add(_kEditLeave);
       } else {
-        edits.add(_EDIT_UPDATE);
+        edits.add(_kEditUpdate);
         current = northWest;
       }
       i--;
       j--;
     } else if (min == west) {
-      edits.add(_EDIT_DELETE);
+      edits.add(_kEditDelete);
       i--;
       current = west;
     } else {
-      edits.add(_EDIT_ADD);
+      edits.add(_kEditAdd);
       j--;
       current = north;
     }
@@ -161,7 +161,7 @@
 }
 
 int _sharedPrefix(List arr1, List arr2, int searchLength) {
-  for (var i = 0; i < searchLength; i++) {
+  for (int i = 0; i < searchLength; i++) {
     if (arr1[i] != arr2[i]) {
       return i;
     }
@@ -170,9 +170,9 @@
 }
 
 int _sharedSuffix(List arr1, List arr2, int searchLength) {
-  var index1 = arr1.length;
-  var index2 = arr2.length;
-  var count = 0;
+  int index1 = arr1.length;
+  int index2 = arr2.length;
+  int count = 0;
   while (count < searchLength && arr1[--index1] == arr2[--index2]) {
     count++;
   }
@@ -189,11 +189,10 @@
 ///   p: The length of the old array
 List<ListChangeRecord> calcSplices(List current, int currentStart,
     int currentEnd, List old, int oldStart, int oldEnd) {
+  int prefixCount = 0;
+  int suffixCount = 0;
 
-  var prefixCount = 0;
-  var suffixCount = 0;
-
-  var minLength = math.min(currentEnd - currentStart, oldEnd - oldStart);
+  int minLength = math.min(currentEnd - currentStart, oldEnd - oldStart);
   if (currentStart == 0 && oldStart == 0) {
     prefixCount = _sharedPrefix(current, old, minLength);
   }
@@ -212,27 +211,29 @@
   }
 
   if (currentStart == currentEnd) {
-    var splice = new ListChangeRecord(current, currentStart);
+    ListChangeRecord splice = new ListChangeRecord(current, currentStart);
     while (oldStart < oldEnd) {
       splice._removed.add(old[oldStart++]);
     }
 
-    return [splice ];
-  } else if (oldStart == oldEnd)
-    return [new ListChangeRecord(current, currentStart,
-        addedCount: currentEnd - currentStart)];
+    return [splice];
+  } else if (oldStart == oldEnd) {
+    return [
+      new ListChangeRecord(current, currentStart,
+          addedCount: currentEnd - currentStart)
+    ];
+  }
 
-  var ops = _spliceOperationsFromEditDistances(
-      _calcEditDistances(current, currentStart, currentEnd, old, oldStart,
-          oldEnd));
+  List<int> ops = _spliceOperationsFromEditDistances(_calcEditDistances(
+      current, currentStart, currentEnd, old, oldStart, oldEnd));
 
-  ListChangeRecord splice = null;
-  var splices = <ListChangeRecord>[];
-  var index = currentStart;
-  var oldIndex = oldStart;
-  for (var i = 0; i < ops.length; i++) {
-    switch(ops[i]) {
-      case _EDIT_LEAVE:
+  ListChangeRecord splice;
+  List<ListChangeRecord> splices = <ListChangeRecord>[];
+  int index = currentStart;
+  int oldIndex = oldStart;
+  for (int i = 0; i < ops.length; i++) {
+    switch (ops[i]) {
+      case _kEditLeave:
         if (splice != null) {
           splices.add(splice);
           splice = null;
@@ -241,7 +242,7 @@
         index++;
         oldIndex++;
         break;
-      case _EDIT_UPDATE:
+      case _kEditUpdate:
         if (splice == null) splice = new ListChangeRecord(current, index);
 
         splice._addedCount++;
@@ -250,13 +251,13 @@
         splice._removed.add(old[oldIndex]);
         oldIndex++;
         break;
-      case _EDIT_ADD:
+      case _kEditAdd:
         if (splice == null) splice = new ListChangeRecord(current, index);
 
         splice._addedCount++;
         index++;
         break;
-      case _EDIT_DELETE:
+      case _kEditDelete:
         if (splice == null) splice = new ListChangeRecord(current, index);
 
         splice._removed.add(old[oldIndex]);
@@ -273,25 +274,27 @@
     math.min(end1, end2) - math.max(start1, start2);
 
 void _mergeSplice(List<ListChangeRecord> splices, ListChangeRecord record) {
-  var splice = new ListChangeRecord(record.object, record.index,
+  ListChangeRecord splice = new ListChangeRecord(record.object, record.index,
       removed: record._removed.toList(), addedCount: record.addedCount);
 
-  var inserted = false;
-  var insertionOffset = 0;
+  bool inserted = false;
+  int insertionOffset = 0;
 
   // I think the way this works is:
   // - the loop finds where the merge should happen
   // - it applies the merge in a particular splice
   // - then continues and updates the subsequent splices with any offset diff.
-  for (var i = 0; i < splices.length; i++) {
-    final current = splices[i];
+  for (int i = 0; i < splices.length; i++) {
+    final ListChangeRecord current = splices[i];
     current._index += insertionOffset;
 
     if (inserted) continue;
 
-    var intersectCount = _intersect(
-        splice.index, splice.index + splice.removed.length,
-        current.index, current.index + current.addedCount);
+    int intersectCount = _intersect(
+        splice.index,
+        splice.index + splice.removed.length,
+        current.index,
+        current.index + current.addedCount);
 
     if (intersectCount >= 0) {
       // Merge the two splices
@@ -302,19 +305,19 @@
       insertionOffset -= current.addedCount - current.removed.length;
 
       splice._addedCount += current.addedCount - intersectCount;
-      var deleteCount = splice.removed.length +
-                        current.removed.length - intersectCount;
+      int deleteCount =
+          splice.removed.length + current.removed.length - intersectCount;
 
       if (splice.addedCount == 0 && deleteCount == 0) {
         // merged splice is a noop. discard.
         inserted = true;
       } else {
-        var removed = current._removed;
+        List removed = current._removed;
 
         if (splice.index < current.index) {
           // some prefix of splice.removed is prepended to current.removed.
-          removed.insertAll(0,
-              splice.removed.getRange(0, current.index - splice.index));
+          removed.insertAll(
+              0, splice.removed.getRange(0, current.index - splice.index));
         }
 
         if (splice.index + splice.removed.length >
@@ -339,7 +342,7 @@
       splices.insert(i, splice);
       i++;
 
-      var offset = splice.addedCount - splice.removed.length;
+      int offset = splice.addedCount - splice.removed.length;
       current._index += offset;
       insertionOffset += offset;
     }
@@ -348,11 +351,10 @@
   if (!inserted) splices.add(splice);
 }
 
-List<ListChangeRecord> _createInitialSplices(List<Object> list,
-    List<ListChangeRecord> records) {
-
-  var splices = <ListChangeRecord>[];
-  for (var record in records) {
+List<ListChangeRecord> _createInitialSplices(
+    List<Object> list, List<ListChangeRecord> records) {
+  List<ListChangeRecord> splices = [];
+  for (ListChangeRecord record in records) {
     _mergeSplice(splices, record);
   }
   return splices;
@@ -372,19 +374,23 @@
 /// Here, we inserted some records and then removed some of them.
 /// If someone processed these records naively, they would "play back" the
 /// insert incorrectly, because those items will be shifted.
-List<ListChangeRecord> projectListSplices(List list,
-    List<ListChangeRecord> records) {
+List<ListChangeRecord> projectListSplices(
+    List<Object> list, List<ListChangeRecord> records) {
   if (records.length <= 1) return records;
 
-  var splices = [];
-  for (var splice in _createInitialSplices(list, records)) {
+  List<ListChangeRecord> splices = <ListChangeRecord>[];
+  for (ListChangeRecord splice in _createInitialSplices(list, records)) {
     if (splice.addedCount == 1 && splice.removed.length == 1) {
       if (splice.removed[0] != list[splice.index]) splices.add(splice);
       continue;
     }
 
-    splices.addAll(calcSplices(list, splice.index,
-        splice.index + splice.addedCount, splice._removed, 0,
+    splices.addAll(calcSplices(
+        list,
+        splice.index,
+        splice.index + splice.addedCount,
+        splice._removed,
+        0,
         splice.removed.length));
   }
 
diff --git a/packages/observable/lib/src/observable.dart b/packages/observable/lib/src/observable.dart
new file mode 100644
index 0000000..7d1ec6f
--- /dev/null
+++ b/packages/observable/lib/src/observable.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library observable.src.observable;
+
+import 'dart:async';
+import 'dart:collection' show UnmodifiableListView;
+
+import 'package:meta/meta.dart';
+
+import 'change_record.dart' show ChangeRecord;
+import 'property_change_record.dart' show PropertyChangeRecord;
+
+/// Represents an object with observable properties. This is used by data in
+/// model-view architectures to notify interested parties of [changes] to the
+/// object's properties (fields or getter/setter pairs).
+///
+/// The interface does not require any specific technique to implement
+/// observability. You can implement it in the following ways:
+///
+/// - Deriving from this class via a mixin or base class. When a field,
+///   property, or indexable item is changed, the derived class should call
+///   [notifyPropertyChange]. See that method for an example.
+/// - Implementing this interface and providing your own implementation.
+abstract class Observable {
+  StreamController<List<ChangeRecord>> _changes;
+
+  List<ChangeRecord> _records;
+
+  /// The stream of property change records to this object, delivered
+  /// asynchronously.
+  ///
+  /// [deliverChanges] can be called to force synchronous delivery.
+  Stream<List<ChangeRecord>> get changes {
+    if (_changes == null) {
+      _changes = new StreamController.broadcast(
+          sync: true, onListen: observed, onCancel: unobserved);
+    }
+    return _changes.stream;
+  }
+
+  /// Derived classes may override this method to be called when the [changes]
+  /// are first observed.
+  // TODO(tvolkert): @mustCallSuper (github.com/dart-lang/sdk/issues/27275)
+  @protected
+  void observed() {}
+
+  /// Derived classes may override this method to be called when the [changes]
+  /// are no longer being observed.
+  // TODO(tvolkert): @mustCallSuper (github.com/dart-lang/sdk/issues/27275)
+  @protected
+  void unobserved() {
+    // Free some memory
+    _changes = null;
+  }
+
+  /// True if this object has any observers.
+  bool get hasObservers => _changes != null && _changes.hasListener;
+
+  /// Synchronously deliver pending [changes].
+  ///
+  /// Returns `true` if any records were delivered, otherwise `false`.
+  /// Pending records will be cleared regardless, to keep newly added
+  /// observers from being notified of changes that occurred before
+  /// they started observing.
+  bool deliverChanges() {
+    List<ChangeRecord> records = _records;
+    _records = null;
+    if (hasObservers && records != null) {
+      _changes.add(new UnmodifiableListView<ChangeRecord>(records));
+      return true;
+    }
+    return false;
+  }
+
+  /// Notify that the [field] name of this object has been changed.
+  ///
+  /// The [oldValue] and [newValue] are also recorded. If the two values are
+  /// equal, no change will be recorded.
+  ///
+  /// For convenience this returns [newValue].
+  /*=T*/ notifyPropertyChange/*<T>*/(
+      Symbol field, /*=T*/ oldValue, /*=T*/ newValue) {
+    if (hasObservers && oldValue != newValue) {
+      notifyChange(new PropertyChangeRecord(this, field, oldValue, newValue));
+    }
+    return newValue;
+  }
+
+  /// Notify observers of a change.
+  ///
+  /// This will automatically schedule [deliverChanges].
+  ///
+  /// For most objects [Observable.notifyPropertyChange] is more convenient, but
+  /// collections sometimes deliver other types of changes such as a
+  /// [MapChangeRecord].
+  void notifyChange(ChangeRecord record) {
+    if (!hasObservers) return;
+    if (_records == null) {
+      _records = [];
+      scheduleMicrotask(deliverChanges);
+    }
+    _records.add(record);
+  }
+}
diff --git a/packages/observe/lib/src/observable_list.dart b/packages/observable/lib/src/observable_list.dart
similarity index 76%
rename from packages/observe/lib/src/observable_list.dart
rename to packages/observable/lib/src/observable_list.dart
index 9d09b38..16c49f5 100644
--- a/packages/observe/lib/src/observable_list.dart
+++ b/packages/observable/lib/src/observable_list.dart
@@ -1,21 +1,22 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library observe.src.observable_list;
+library observable.src.observable_list;
 
 import 'dart:async';
 import 'dart:collection' show ListBase, UnmodifiableListView;
-import 'package:observe/observe.dart';
-import 'list_diff.dart' show projectListSplices, calcSplices;
+
+import 'list_diff.dart' show ListChangeRecord, projectListSplices, calcSplices;
+import 'observable.dart' show Observable;
 
 /// Represents an observable list of model values. If any items are added,
 /// removed, or replaced, then observers that are listening to [changes]
 /// will be notified.
-class ObservableList<E> extends ListBase<E> with ChangeNotifier {
+class ObservableList<E> extends ListBase<E> with Observable {
   List<ListChangeRecord> _listRecords;
 
-  StreamController _listChanges;
+  StreamController<List<ListChangeRecord>> _listChanges;
 
   /// The inner [List<E>] with the actual storage.
   final List<E> _list;
@@ -30,6 +31,14 @@
   ObservableList([int length])
       : _list = length != null ? new List<E>(length) : <E>[];
 
+  /// Creates an observable list of the given [length].
+  ///
+  /// This constructor exists to work around an issue in the VM whereby
+  /// classes that derive from [ObservableList] and mixin other classes
+  /// require a default generative constructor in the super class that
+  /// does not take optional arguments.
+  ObservableList.withLength(int length) : this(length);
+
   /// Creates an observable list with the elements of [other]. The order in
   /// the list will be the order provided by the iterator of [other].
   factory ObservableList.from(Iterable<E> other) =>
@@ -58,18 +67,21 @@
   Stream<List<ListChangeRecord>> get listChanges {
     if (_listChanges == null) {
       // TODO(jmesserly): split observed/unobserved notions?
-      _listChanges = new StreamController.broadcast(sync: true,
-          onCancel: () { _listChanges = null; });
+      _listChanges = new StreamController.broadcast(
+        sync: true,
+        onCancel: () {
+          _listChanges = null;
+        },
+      );
     }
     return _listChanges.stream;
   }
 
-  bool get hasListObservers =>
-      _listChanges != null && _listChanges.hasListener;
+  bool get hasListObservers => _listChanges != null && _listChanges.hasListener;
 
-  @reflectable int get length => _list.length;
+  int get length => _list.length;
 
-  @reflectable set length(int value) {
+  set length(int value) {
     int len = _list.length;
     if (len == value) return;
 
@@ -77,30 +89,28 @@
     _notifyChangeLength(len, value);
     if (hasListObservers) {
       if (value < len) {
-        _recordChange(new ListChangeRecord(this, value,
-            removed: _list.getRange(value, len).toList()));
+        _notifyListChange(value, removed: _list.getRange(value, len).toList());
       } else {
-        _recordChange(new ListChangeRecord(this, len, addedCount: value - len));
+        _notifyListChange(len, addedCount: value - len);
       }
     }
 
     _list.length = value;
   }
 
-  @reflectable E operator [](int index) => _list[index];
+  E operator [](int index) => _list[index];
 
-  @reflectable void operator []=(int index, E value) {
-    var oldValue = _list[index];
+  void operator []=(int index, E value) {
+    E oldValue = _list[index];
     if (hasListObservers && oldValue != value) {
-      _recordChange(new ListChangeRecord(this, index, addedCount: 1,
-          removed: [oldValue]));
+      _notifyListChange(index, addedCount: 1, removed: [oldValue]);
     }
     _list[index] = value;
   }
 
   // Forwarders so we can reflect on the properties.
-  @reflectable bool get isEmpty => super.isEmpty;
-  @reflectable bool get isNotEmpty => super.isNotEmpty;
+  bool get isEmpty => super.isEmpty;
+  bool get isNotEmpty => super.isNotEmpty;
 
   // TODO(jmesserly): should we support first/last/single? They're kind of
   // dangerous to use in a path because they throw exceptions. Also we'd need
@@ -113,10 +123,10 @@
     if (iterable is! List && iterable is! Set) {
       iterable = iterable.toList();
     }
-    var len = iterable.length;
-    if (hasListObservers && len > 0) {
-      _recordChange(new ListChangeRecord(this, index, addedCount: len,
-          removed: _list.getRange(index, len).toList()));
+    int length = iterable.length;
+    if (hasListObservers && length > 0) {
+      _notifyListChange(index,
+          addedCount: length, removed: _list.sublist(index, length));
     }
     _list.setAll(index, iterable);
   }
@@ -125,7 +135,7 @@
     int len = _list.length;
     _notifyChangeLength(len, len + 1);
     if (hasListObservers) {
-      _recordChange(new ListChangeRecord(this, len, addedCount: 1));
+      _notifyListChange(len, addedCount: 1);
     }
 
     _list.add(value);
@@ -139,7 +149,7 @@
 
     int added = _list.length - len;
     if (hasListObservers && added > 0) {
-      _recordChange(new ListChangeRecord(this, len, addedCount: added));
+      _notifyListChange(len, addedCount: added);
     }
   }
 
@@ -160,8 +170,7 @@
 
     _notifyChangeLength(len, len - rangeLength);
     if (hasListObservers && rangeLength > 0) {
-      _recordChange(new ListChangeRecord(this, start,
-          removed: _list.getRange(start, end).toList()));
+      _notifyListChange(start, removed: _list.getRange(start, end).toList());
     }
 
     _list.removeRange(start, end);
@@ -188,8 +197,7 @@
     _notifyChangeLength(len, _list.length);
 
     if (hasListObservers && insertionLength > 0) {
-      _recordChange(new ListChangeRecord(this, index,
-          addedCount: insertionLength));
+      _notifyListChange(index, addedCount: insertionLength);
     }
   }
 
@@ -210,12 +218,11 @@
 
     _notifyChangeLength(_list.length - 1, _list.length);
     if (hasListObservers) {
-      _recordChange(new ListChangeRecord(this, index, addedCount: 1));
+      _notifyListChange(index, addedCount: 1);
     }
     _list[index] = element;
   }
 
-
   E removeAt(int index) {
     E result = this[index];
     removeRange(index, index + 1);
@@ -231,14 +238,14 @@
     }
   }
 
-  void _recordChange(ListChangeRecord record) {
+  void _notifyListChange(int index, {List removed, int addedCount}) {
     if (!hasListObservers) return;
-
     if (_listRecords == null) {
       _listRecords = [];
       scheduleMicrotask(deliverListChanges);
     }
-    _listRecords.add(record);
+    _listRecords.add(new ListChangeRecord(this, index,
+        removed: removed, addedCount: addedCount));
   }
 
   void _notifyChangeLength(int oldValue, int newValue) {
@@ -247,10 +254,6 @@
     notifyPropertyChange(#isNotEmpty, oldValue != 0, newValue != 0);
   }
 
-  /// Deprecated. Name had a typo, use [discardListChanges] instead.
-  @deprecated
-  void discardListChages() => discardListChanges();
-
   void discardListChanges() {
     // Leave _listRecords set so we don't schedule another delivery.
     if (_listRecords != null) _listRecords = [];
@@ -258,10 +261,10 @@
 
   bool deliverListChanges() {
     if (_listRecords == null) return false;
-    var records = projectListSplices(this, _listRecords);
+    List<ListChangeRecord> records = projectListSplices(this, _listRecords);
     _listRecords = null;
 
-    if (hasListObservers && !records.isEmpty) {
+    if (hasListObservers && records.isNotEmpty) {
       _listChanges.add(new UnmodifiableListView<ListChangeRecord>(records));
       return true;
     }
@@ -281,23 +284,22 @@
   /// Complexity is `O(l * p)` where `l` is the length of the current list and
   /// `p` is the length of the old list.
   static List<ListChangeRecord> calculateChangeRecords(
-      List<Object> oldValue, List<Object> newValue) =>
+          List<Object> oldValue, List<Object> newValue) =>
       calcSplices(newValue, 0, newValue.length, oldValue, 0, oldValue.length);
 
-  /// Updates the [previous] list using the change [records]. For added items,
+  /// Updates the [previous] list using the [changeRecords]. For added items,
   /// the [current] list is used to find the current value.
   static void applyChangeRecords(List<Object> previous, List<Object> current,
       List<ListChangeRecord> changeRecords) {
-
     if (identical(previous, current)) {
       throw new ArgumentError("can't use same list for previous and current");
     }
 
-    for (var change in changeRecords) {
+    for (ListChangeRecord change in changeRecords) {
       int addEnd = change.index + change.addedCount;
       int removeEnd = change.index + change.removed.length;
 
-      var addedItems = current.getRange(change.index, addEnd);
+      Iterable addedItems = current.getRange(change.index, addEnd);
       previous.replaceRange(change.index, removeEnd, addedItems);
     }
   }
diff --git a/packages/observe/lib/src/observable_map.dart b/packages/observable/lib/src/observable_map.dart
similarity index 81%
rename from packages/observe/lib/src/observable_map.dart
rename to packages/observable/lib/src/observable_map.dart
index b09c468..23a7f11 100644
--- a/packages/observe/lib/src/observable_map.dart
+++ b/packages/observable/lib/src/observable_map.dart
@@ -1,12 +1,14 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library observe.src.observable_map;
+library observable.src.observable_map;
 
 import 'dart:collection';
-import 'package:observe/observe.dart';
 
+import 'change_record.dart' show ChangeRecord;
+import 'observable.dart' show Observable;
+import 'property_change_record.dart' show PropertyChangeRecord;
 
 // TODO(jmesserly): this needs to be faster. We currently require multiple
 // lookups per key to get the old value.
@@ -35,13 +37,18 @@
   final bool isRemove;
 
   MapChangeRecord(this.key, this.oldValue, this.newValue)
-      : isInsert = false, isRemove = false;
+      : isInsert = false,
+        isRemove = false;
 
   MapChangeRecord.insert(this.key, this.newValue)
-      : isInsert = true, isRemove = false, oldValue = null;
+      : isInsert = true,
+        isRemove = false,
+        oldValue = null;
 
   MapChangeRecord.remove(this.key, this.oldValue)
-      : isInsert = false, isRemove = true, newValue = null;
+      : isInsert = false,
+        isRemove = true,
+        newValue = null;
 
   String toString() {
     var kind = isInsert ? 'insert' : isRemove ? 'remove' : 'set';
@@ -52,7 +59,7 @@
 /// Represents an observable map of model values. If any items are added,
 /// removed, or replaced, then observers that are listening to [changes]
 /// will be notified.
-class ObservableMap<K, V> extends ChangeNotifier implements Map<K, V> {
+class ObservableMap<K, V> extends Observable implements Map<K, V> {
   final Map<K, V> _map;
 
   /// Creates an observable map.
@@ -77,7 +84,7 @@
 
   /// Like [ObservableMap.from], but creates an empty map.
   factory ObservableMap.createFromType(Map<K, V> other) {
-    ObservableMap result;
+    ObservableMap<K, V> result;
     if (other is SplayTreeMap) {
       result = new ObservableMap<K, V>.sorted();
     } else if (other is LinkedHashMap) {
@@ -88,23 +95,23 @@
     return result;
   }
 
-  @reflectable Iterable<K> get keys => _map.keys;
+  Iterable<K> get keys => _map.keys;
 
-  @reflectable Iterable<V> get values => _map.values;
+  Iterable<V> get values => _map.values;
 
-  @reflectable int get length =>_map.length;
+  int get length => _map.length;
 
-  @reflectable bool get isEmpty => length == 0;
+  bool get isEmpty => length == 0;
 
-  @reflectable bool get isNotEmpty => !isEmpty;
+  bool get isNotEmpty => !isEmpty;
 
-  @reflectable bool containsValue(Object value) => _map.containsValue(value);
+  bool containsValue(Object value) => _map.containsValue(value);
 
-  @reflectable bool containsKey(Object key) => _map.containsKey(key);
+  bool containsKey(Object key) => _map.containsKey(key);
 
-  @reflectable V operator [](Object key) => _map[key];
+  V operator [](Object key) => _map[key];
 
-  @reflectable void operator []=(K key, V value) {
+  void operator []=(K key, V value) {
     if (!hasObservers) {
       _map[key] = value;
       return;
@@ -126,7 +133,9 @@
   }
 
   void addAll(Map<K, V> other) {
-    other.forEach((K key, V value) { this[key] = value; });
+    other.forEach((K key, V value) {
+      this[key] = value;
+    });
   }
 
   V putIfAbsent(K key, V ifAbsent()) {
@@ -142,7 +151,7 @@
 
   V remove(Object key) {
     int len = _map.length;
-    V result =  _map.remove(key);
+    V result = _map.remove(key);
     if (hasObservers && len != _map.length) {
       notifyChange(new MapChangeRecord.remove(key, result));
       notifyPropertyChange(#length, len, _map.length);
diff --git a/packages/observe/lib/src/change_record.dart b/packages/observable/lib/src/property_change_record.dart
similarity index 65%
rename from packages/observe/lib/src/change_record.dart
rename to packages/observable/lib/src/property_change_record.dart
index 576a173..a09c196 100644
--- a/packages/observe/lib/src/change_record.dart
+++ b/packages/observable/lib/src/property_change_record.dart
@@ -1,20 +1,15 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library observe.src.change_record;
+library observable.src.property_change_record;
 
-import 'package:observe/observe.dart';
+import 'change_record.dart';
 
-
-/// Records a change to an [Observable].
-// TODO(jmesserly): remove this type
-abstract class ChangeRecord {}
-
-/// A change record to a field of an observable object.
+/// A change record to a field of an [Observable] object.
 class PropertyChangeRecord<T> extends ChangeRecord {
   /// The object that changed.
-  final object;
+  final Object object;
 
   /// The name of the property that changed.
   final Symbol name;
diff --git a/packages/observe/lib/src/to_observable.dart b/packages/observable/lib/src/to_observable.dart
similarity index 80%
rename from packages/observe/lib/src/to_observable.dart
rename to packages/observable/lib/src/to_observable.dart
index 931fb04..0a0f316 100644
--- a/packages/observe/lib/src/to_observable.dart
+++ b/packages/observable/lib/src/to_observable.dart
@@ -1,10 +1,12 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library observe.src.to_observable;
+library observable.src.to_observable;
 
-import 'package:observe/observe.dart';
+import 'observable.dart' show Observable;
+import 'observable_list.dart' show ObservableList;
+import 'observable_map.dart' show ObservableMap;
 
 /// Converts the [Iterable] or [Map] to an [ObservableList] or [ObservableMap],
 /// respectively. This is a convenience function to make it easier to convert
@@ -21,17 +23,17 @@
 /// If a conversion is peformed, mutations are only observed to the result of
 /// this function. Changing the original collection will not affect it.
 // TODO(jmesserly): ObservableSet?
-toObservable(value, {bool deep: true}) =>
+toObservable(dynamic value, {bool deep: true}) =>
     deep ? _toObservableDeep(value) : _toObservableShallow(value);
 
-_toObservableShallow(value) {
+dynamic _toObservableShallow(dynamic value) {
   if (value is Observable) return value;
   if (value is Map) return new ObservableMap.from(value);
   if (value is Iterable) return new ObservableList.from(value);
   return value;
 }
 
-_toObservableDeep(value) {
+dynamic _toObservableDeep(dynamic value) {
   if (value is Observable) return value;
   if (value is Map) {
     var result = new ObservableMap.createFromType(value);
diff --git a/packages/observable/pubspec.yaml b/packages/observable/pubspec.yaml
new file mode 100644
index 0000000..b030500
--- /dev/null
+++ b/packages/observable/pubspec.yaml
@@ -0,0 +1,11 @@
+name: observable
+version: 0.14.0+1
+author: Dart Team <misc@dartlang.org>
+description: Support for marking objects as observable
+homepage: https://github.com/dart-lang/observable
+environment:
+  sdk: '>=1.19.0 <2.0.0'
+dependencies:
+  meta: '^1.0.4'
+dev_dependencies:
+  test: '^0.12.0'
diff --git a/packages/observe/test/list_change_test.dart b/packages/observable/test/list_change_test.dart
similarity index 84%
rename from packages/observe/test/list_change_test.dart
rename to packages/observable/test/list_change_test.dart
index 30afb60..b07c0b8 100644
--- a/packages/observe/test/list_change_test.dart
+++ b/packages/observable/test/list_change_test.dart
@@ -1,16 +1,18 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'observe_test_utils.dart';
+
+import 'package:observable/observable.dart';
+import 'package:test/test.dart';
+
+import 'observable_test_utils.dart';
 
 // This file contains code ported from:
 // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
 
-main() => dirtyCheckZone().run(listChangeTests);
+main() => listChangeTests();
 
 // TODO(jmesserly): port or write array fuzzer tests
 listChangeTests() {
@@ -29,7 +31,7 @@
     model.add(0);
 
     var summary;
-    sub = model.listChanges.listen((r) { summary = r; });
+    sub = model.listChanges.listen((r) => summary = r);
 
     model.add(1);
     model.add(2);
@@ -42,35 +44,34 @@
     model = toObservable(['a', 'b', 'c', 'd', 'e']);
 
     var summary;
-    sub = model.listChanges.listen((r) { summary = r; });
+    sub = model.listChanges.listen((r) => summary = r);
 
     model.length = 2;
 
     return new Future(() {
-      expectChanges(summary, [_delta(2, ['c', 'd', 'e'], 0)]);
+      expectChanges(summary, [
+        _delta(2, ['c', 'd', 'e'], 0)
+      ]);
       summary = null;
       model.length = 5;
-
     }).then(newMicrotask).then((_) {
-
       expectChanges(summary, [_delta(2, [], 3)]);
     });
   });
 
   group('List deltas can be applied', () {
-
     applyAndCheckDeltas(model, copy, changes) => changes.then((summary) {
-      // apply deltas to the copy
-      for (var delta in summary) {
-        copy.removeRange(delta.index, delta.index + delta.removed.length);
-        for (int i = delta.addedCount - 1; i >= 0; i--) {
-          copy.insert(delta.index, model[delta.index + i]);
-        }
-      }
+          // apply deltas to the copy
+          for (var delta in summary) {
+            copy.removeRange(delta.index, delta.index + delta.removed.length);
+            for (int i = delta.addedCount - 1; i >= 0; i--) {
+              copy.insert(delta.index, model[delta.index + i]);
+            }
+          }
 
-      // Note: compare strings for easier debugging.
-      expect('$copy', '$model', reason: 'summary $summary');
-    });
+          // Note: compare strings for easier debugging.
+          expect('$copy', '$model', reason: 'summary $summary');
+        });
 
     test('Contained', () {
       var model = toObservable(['a', 'b']);
@@ -204,7 +205,7 @@
       var changes = model.listChanges.first;
 
       model.removeAt(2);
-      model.insertAll(2, ['e', 'f', 'g']);  // a b [e f g] d
+      model.insertAll(2, ['e', 'f', 'g']); // a b [e f g] d
       model[0] = 'h';
       model.removeAt(1);
 
@@ -223,15 +224,14 @@
   });
 
   group('edit distance', () {
-
     assertEditDistance(orig, changes, expectedDist) => changes.then((summary) {
-      var actualDistance = 0;
-      for (var delta in summary) {
-        actualDistance += delta.addedCount + delta.removed.length;
-      }
+          var actualDistance = 0;
+          for (var delta in summary) {
+            actualDistance += delta.addedCount + delta.removed.length;
+          }
 
-      expect(actualDistance, expectedDist);
-    });
+          expect(actualDistance, expectedDist);
+        });
 
     test('add items', () {
       var model = toObservable([]);
diff --git a/packages/observe/test/observable_list_test.dart b/packages/observable/test/observable_list_test.dart
similarity index 78%
rename from packages/observe/test/observable_list_test.dart
rename to packages/observable/test/observable_list_test.dart
index adc6e40..0a29fa3 100644
--- a/packages/observe/test/observable_list_test.dart
+++ b/packages/observable/test/observable_list_test.dart
@@ -1,13 +1,15 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'observe_test_utils.dart';
 
-main() => dirtyCheckZone().run(_runTests);
+import 'package:observable/observable.dart';
+import 'package:test/test.dart';
+
+import 'observable_test_utils.dart';
+
+main() => _runTests();
 
 _runTests() {
   // TODO(jmesserly): need all standard List API tests.
@@ -24,12 +26,11 @@
   }
 
   group('observe length', () {
-
     ObservableList list;
     List<ChangeRecord> changes;
 
     setUp(() {
-      list = toObservable([1, 2, 3]);
+      list = toObservable([1, 2, 3]) as ObservableList;
       changes = null;
       sub = list.changes.listen((records) {
         changes = getPropertyChangeRecords(records, #length);
@@ -46,7 +47,7 @@
       });
     });
 
-    test('removeObject', () {
+    test('removeObject changes length', () {
       list.remove(2);
       expect(list, orderedEquals([1, 3]));
 
@@ -93,9 +94,9 @@
     List<ListChangeRecord> changes;
 
     setUp(() {
-      list = toObservable([1, 2, 3]);
+      list = toObservable([1, 2, 3]) as ObservableList;
       changes = null;
-      sub = list.listChanges.listen((records) {
+      sub = list.listChanges.listen((List<ListChangeRecord> records) {
         changes = getListChangeRecords(records, 1);
       });
     });
@@ -114,7 +115,9 @@
       list[1] = 777;
       expect(list, [1, 777, 3]);
       return new Future(() {
-        expectChanges(changes, [_change(1, addedCount: 1, removed: [2])]);
+        expectChanges(changes, [
+          _change(1, addedCount: 1, removed: [2])
+        ]);
       });
     });
 
@@ -149,7 +152,9 @@
       list.length = 1;
       expect(list, [1]);
       return new Future(() {
-        expectChanges(changes, [_change(1, removed: [2, 3])]);
+        expectChanges(changes, [
+          _change(1, removed: [2, 3])
+        ]);
       });
     });
 
@@ -180,16 +185,15 @@
   });
 
   group('change records', () {
-
     List<ChangeRecord> propRecords;
     List<ListChangeRecord> listRecords;
 
     setUp(() {
-      list = toObservable([1, 2, 3, 1, 3, 4]);
+      list = toObservable([1, 2, 3, 1, 3, 4]) as ObservableList;
       propRecords = null;
       listRecords = null;
-      sub = list.changes.listen((r) { propRecords = r; });
-      sub2 = list.listChanges.listen((r) { listRecords = r; });
+      sub = list.changes.listen((r) => propRecords = r);
+      sub2 = list.listChanges.listen((r) => listRecords = r);
     });
 
     tearDown(sharedTearDown);
@@ -203,7 +207,7 @@
       expect(list.lastIndexOf(1), 3);
       expect(list.last, 4);
       var copy = new List<int>();
-      list.forEach((i) { copy.add(i); });
+      list.forEach((int i) => copy.add(i));
       expect(copy, orderedEquals([1, 2, 3, 1, 3, 4]));
       return new Future(() {
         // no change from read-only operators
@@ -222,7 +226,7 @@
           _lengthChange(6, 7),
           _lengthChange(7, 8),
         ]);
-        expectChanges(listRecords, [ _change(6, addedCount: 2) ]);
+        expectChanges(listRecords, [_change(6, addedCount: 2)]);
       });
     });
 
@@ -232,7 +236,9 @@
 
       return new Future(() {
         expectChanges(propRecords, null);
-        expectChanges(listRecords, [ _change(1, addedCount: 1, removed: [2]) ]);
+        expectChanges(listRecords, [
+          _change(1, addedCount: 1, removed: [2])
+        ]);
       });
     });
 
@@ -242,7 +248,9 @@
 
       return new Future(() {
         expectChanges(propRecords, [_lengthChange(6, 5)]);
-        expectChanges(listRecords, [_change(5, removed: [4])]);
+        expectChanges(listRecords, [
+          _change(5, removed: [4])
+        ]);
       });
     });
 
@@ -252,7 +260,9 @@
 
       return new Future(() {
         expectChanges(propRecords, [_lengthChange(6, 3)]);
-        expectChanges(listRecords, [_change(1, removed: [2, 3, 1])]);
+        expectChanges(listRecords, [
+          _change(1, removed: [2, 3, 1])
+        ]);
       });
     });
 
@@ -273,7 +283,8 @@
       var list = toObservable([3, 1]);
       // Dummy listener to record changes.
       // TODO(jmesserly): should we just record changes always, to support the sync api?
-      sub = list.listChanges.listen((records) => null);
+      sub = list.listChanges.listen((List<ListChangeRecord> records) => null)
+          as StreamSubscription;
       list.sort();
       expect(list.deliverListChanges(), true);
       list.sort();
@@ -281,18 +292,20 @@
       list.sort();
       expect(list.deliverListChanges(), false);
     });
-    
+
     test('clear', () {
       list.clear();
       expect(list, []);
 
       return new Future(() {
         expectChanges(propRecords, [
-            _lengthChange(6, 0),
-            new PropertyChangeRecord(list, #isEmpty, false, true),
-            new PropertyChangeRecord(list, #isNotEmpty, true, false),
+          _lengthChange(6, 0),
+          new PropertyChangeRecord(list, #isEmpty, false, true),
+          new PropertyChangeRecord(list, #isNotEmpty, true, false),
         ]);
-        expectChanges(listRecords, [_change(0, removed: [1, 2, 3, 1, 3, 4])]);
+        expectChanges(listRecords, [
+          _change(0, removed: [1, 2, 3, 1, 3, 4])
+        ]);
       });
     });
   });
@@ -300,9 +313,8 @@
 
 ObservableList list;
 
-_lengthChange(int oldValue, int newValue) =>
+PropertyChangeRecord _lengthChange(int oldValue, int newValue) =>
     new PropertyChangeRecord(list, #length, oldValue, newValue);
 
-_change(index, {removed: const [], addedCount: 0}) => new ListChangeRecord(
-    list, index, removed: removed, addedCount: addedCount);
-
+_change(int index, {List removed: const [], int addedCount: 0}) =>
+    new ListChangeRecord(list, index, removed: removed, addedCount: addedCount);
diff --git a/packages/observe/test/observable_map_test.dart b/packages/observable/test/observable_map_test.dart
similarity index 93%
rename from packages/observe/test/observable_map_test.dart
rename to packages/observable/test/observable_map_test.dart
index ee494c4..a424ce1 100644
--- a/packages/observe/test/observable_map_test.dart
+++ b/packages/observable/test/observable_map_test.dart
@@ -1,13 +1,15 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'observe_test_utils.dart';
 
-main() => dirtyCheckZone().run(_runTests);
+import 'package:observable/observable.dart';
+import 'package:test/test.dart';
+
+import 'observable_test_utils.dart';
+
+main() => _runTests();
 
 _runTests() {
   // TODO(jmesserly): need all standard Map API tests.
@@ -58,7 +60,7 @@
       return new Future(() {
         expectChanges(changes, [
           _lengthChange(map, 3, 2),
-          _lengthChange(map, 2, 1)
+          _lengthChange(map, 2, 1),
         ]);
       });
     });
@@ -89,7 +91,6 @@
   });
 
   group('observe item', () {
-
     ObservableMap map;
     List<ChangeRecord> changes;
 
@@ -97,8 +98,8 @@
       map = toObservable({'a': 1, 'b': 2, 'c': 3});
       changes = null;
       sub = map.changes.listen((records) {
-        changes = records.where((r) => r is MapChangeRecord && r.key == 'b')
-            .toList();
+        changes =
+            records.where((r) => r is MapChangeRecord && r.key == 'b').toList();
       });
     });
 
@@ -140,7 +141,7 @@
       map['c'] = 9000;
       expect(map, {'a': 1, 'b': 2, 'c': 9000});
       return new Future(() {
-      expectChanges(changes, []);
+        expectChanges(changes, []);
       });
     });
 
@@ -151,7 +152,7 @@
       return new Future(() {
         expectChanges(changes, [
           _changeKey('b', 2, 9001),
-          _changeKey('b', 9001, 42)
+          _changeKey('b', 9001, 42),
         ]);
       });
     });
@@ -177,8 +178,10 @@
       map['b'] = 2;
       expect(map, {'a': 1, 'b': 2, 'c': 3});
       return new Future(() {
-        expectChanges(changes,
-            [_removeKey('b', 2), _insertKey('b', 2)]);
+        expectChanges(changes, [
+          _removeKey('b', 2),
+          _insertKey('b', 2),
+        ]);
       });
     });
   });
@@ -261,7 +264,6 @@
     });
   });
 
-
   group('change records', () {
     List<ChangeRecord> records;
     ObservableMap map;
@@ -269,7 +271,7 @@
     setUp(() {
       map = toObservable({'a': 1, 'b': 2});
       records = null;
-      map.changes.first.then((r) { records = r; });
+      map.changes.first.then((r) => records = r);
     });
 
     tearDown(sharedTearDown);
@@ -284,7 +286,7 @@
       expect(map.keys.toList(), ['a', 'b']);
       expect(map.values.toList(), [1, 2]);
       var copy = {};
-      map.forEach((k, v) { copy[k] = v; });
+      map.forEach((k, v) => copy[k] = v);
       expect(copy, {'a': 1, 'b': 2});
       return new Future(() {
         // no change from read-only operators
diff --git a/packages/observable/test/observable_test.dart b/packages/observable/test/observable_test.dart
new file mode 100644
index 0000000..b89d654
--- /dev/null
+++ b/packages/observable/test/observable_test.dart
@@ -0,0 +1,222 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:observable/observable.dart';
+import 'package:test/test.dart';
+
+import 'observable_test_utils.dart';
+
+main() => observableTests();
+
+void observableTests() {
+  // Track the subscriptions so we can clean them up in tearDown.
+  List subs;
+
+  setUp(() {
+    subs = [];
+  });
+
+  tearDown(() {
+    for (var sub in subs) sub.cancel();
+  });
+
+  test('handle future result', () {
+    var callback = expectAsync(() {});
+    return new Future(callback);
+  });
+
+  test('no observers', () {
+    var t = createModel(123);
+    expect(t.value, 123);
+    t.value = 42;
+    expect(t.value, 42);
+    expect(t.hasObservers, false);
+  });
+
+  test('listen adds an observer', () {
+    var t = createModel(123);
+    expect(t.hasObservers, false);
+
+    subs.add(t.changes.listen((n) {}));
+    expect(t.hasObservers, true);
+  });
+
+  test('changes delived async', () {
+    var t = createModel(123);
+    int called = 0;
+
+    subs.add(t.changes.listen(expectAsync((records) {
+      called++;
+      expectPropertyChanges(records, 2);
+    })));
+
+    t.value = 41;
+    t.value = 42;
+    expect(called, 0);
+  });
+
+  test('cause changes in handler', () {
+    var t = createModel(123);
+    int called = 0;
+
+    subs.add(t.changes.listen(expectAsync((records) {
+      called++;
+      expectPropertyChanges(records, 1);
+      if (called == 1) {
+        // Cause another change
+        t.value = 777;
+      }
+    }, count: 2)));
+
+    t.value = 42;
+  });
+
+  test('multiple observers', () {
+    var t = createModel(123);
+
+    verifyRecords(records) {
+      expectPropertyChanges(records, 2);
+    }
+
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
+
+    t.value = 41;
+    t.value = 42;
+  });
+
+  test('async processing model', () {
+    var t = createModel(123);
+    var records = [];
+    subs.add(t.changes.listen((r) {
+      records.addAll(r);
+    }));
+    t.value = 41;
+    t.value = 42;
+    expectChanges(records, [], reason: 'changes delived async');
+
+    return new Future(() {
+      expectPropertyChanges(records, 2);
+      records.clear();
+
+      t.value = 777;
+      expectChanges(records, [], reason: 'changes delived async');
+    }).then(newMicrotask).then((_) {
+      expectPropertyChanges(records, 1);
+    });
+  });
+
+  test('cancel listening', () {
+    var t = createModel(123);
+    var sub;
+    sub = t.changes.listen(expectAsync((records) {
+      expectPropertyChanges(records, 1);
+      sub.cancel();
+      t.value = 777;
+    }));
+    t.value = 42;
+  });
+
+  test('cancel and reobserve', () {
+    var t = createModel(123);
+    var sub;
+    sub = t.changes.listen(expectAsync((records) {
+      expectPropertyChanges(records, 1);
+      sub.cancel();
+
+      scheduleMicrotask(() {
+        subs.add(t.changes.listen(expectAsync((records) {
+          expectPropertyChanges(records, 1);
+        })));
+        t.value = 777;
+      });
+    }));
+    t.value = 42;
+  });
+
+  test('cannot modify changes list', () {
+    var t = createModel(123);
+    var records;
+    subs.add(t.changes.listen((r) {
+      records = r;
+    }));
+    t.value = 42;
+
+    return new Future(() {
+      expectPropertyChanges(records, 1);
+
+      // Verify that mutation operations on the list fail:
+
+      expect(() {
+        records[0] = new PropertyChangeRecord(t, #value, 0, 1);
+      }, throwsUnsupportedError);
+
+      expect(() {
+        records.clear();
+      }, throwsUnsupportedError);
+
+      expect(() {
+        records.length = 0;
+      }, throwsUnsupportedError);
+    });
+  });
+
+  test('notifyChange', () {
+    var t = createModel(123);
+    var records = [];
+    subs.add(t.changes.listen((r) {
+      records.addAll(r);
+    }));
+    t.notifyChange(new PropertyChangeRecord(t, #value, 123, 42));
+
+    return new Future(() {
+      expectPropertyChanges(records, 1);
+      expect(t.value, 123, reason: 'value did not actually change.');
+    });
+  });
+
+  test('notifyPropertyChange', () {
+    var t = createModel(123);
+    var records;
+    subs.add(t.changes.listen((r) {
+      records = r;
+    }));
+    expect(t.notifyPropertyChange(#value, t.value, 42), 42,
+        reason: 'notifyPropertyChange returns newValue');
+
+    return new Future(() {
+      expectPropertyChanges(records, 1);
+      expect(t.value, 123, reason: 'value did not actually change.');
+    });
+  });
+}
+
+expectPropertyChanges(records, int number) {
+  expect(records.length, number, reason: 'expected $number change records');
+  for (var record in records) {
+    expect(record is PropertyChangeRecord, true,
+        reason: 'record should be PropertyChangeRecord');
+    expect((record as PropertyChangeRecord).name, #value,
+        reason: 'record should indicate a change to the "value" property');
+  }
+}
+
+createModel(int number) => new ObservableSubclass(number);
+
+class ObservableSubclass<T> extends Observable {
+  ObservableSubclass([T initialValue]) : _value = initialValue;
+
+  T get value => _value;
+  set value(T newValue) {
+    T oldValue = _value;
+    _value = newValue;
+    notifyPropertyChange(#value, oldValue, newValue);
+  }
+
+  T _value;
+
+  String toString() => '#<$runtimeType value: $value>';
+}
diff --git a/packages/observable/test/observable_test_utils.dart b/packages/observable/test/observable_test_utils.dart
new file mode 100644
index 0000000..91d4d8f
--- /dev/null
+++ b/packages/observable/test/observable_test_utils.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library observable.test.observable_test_utils;
+
+import 'dart:async';
+
+import 'package:observable/observable.dart';
+import 'package:test/test.dart';
+
+/// 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(...)
+///
+/// Uses [mu].
+newMicrotask(_) => new Future.value();
+
+// TODO(jmesserly): use matchers when we have a way to compare ChangeRecords.
+// For now just use the toString.
+void expectChanges(actual, expected, {String reason}) =>
+    expect('$actual', '$expected', reason: reason);
+
+List<ListChangeRecord> getListChangeRecords(
+        List<ListChangeRecord> changes, int index) =>
+    new List.from(changes.where((ListChangeRecord c) => c.indexChanged(index)));
+
+List<PropertyChangeRecord> getPropertyChangeRecords(
+        List<ChangeRecord> changes, Symbol property) =>
+    new List.from(changes.where(
+        (ChangeRecord c) => c is PropertyChangeRecord && c.name == property));
diff --git a/packages/observe/.gitignore b/packages/observe/.gitignore
deleted file mode 100644
index e979170..0000000
--- a/packages/observe/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Don’t commit the following directories created by pub.
-.pub
-build/
-packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.dart.precompiled.js
-*.js_
-*.js.deps
-*.js.map
-*.sw?
-.idea/
-.pub/
-
-# Include when developing application packages.
-pubspec.lock
diff --git a/packages/observe/.status b/packages/observe/.status
deleted file mode 100644
index 89620eb..0000000
--- a/packages/observe/.status
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Don't run any test-like files that show up in packages directories. It
-# shouldn't be necessary to run "pub install" in these packages, but if you do
-# it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
-
-# (dartium, dart, d8, jsshell, etc)
-[ $browser || $compiler == dart2js ]
-test/unique_message_test: Skip
-build/test/unique_message_test: Skip
-test/transformer_test: Skip
-build/test/transformer_test: Skip
-
-[ $ie ]
-test/list_path_observer_test: RuntimeError, Pass # dartbug.com/20849
-
-[ $compiler == dart2js ]
-test/*: Skip  # raw tests only meant to be run in dartium. Other browsers run
-              # the output of pub-build
diff --git a/packages/observe/CHANGELOG.md b/packages/observe/CHANGELOG.md
deleted file mode 100644
index 9b7a559..0000000
--- a/packages/observe/CHANGELOG.md
+++ /dev/null
@@ -1,95 +0,0 @@
-#### 0.13.1+3
-
- * Sorting an already sorted list will no longer yield new change notifications.
-
-#### 0.13.1+2
-
- * Update to analyzer '<0.27.0'
-
-#### 0.13.1+1
-
- * Update to logging `<0.12.0`.
-
-#### 0.13.1
-
- * Update to analyzer `<0.26.0`.
-
-#### 0.13.0+2
-  * Fixed `close` in `PathObserver` so it doesn't leak observers.
-  * Ported the benchmarks from
-    [observe-js](https://github.com/Polymer/observe-js/tree/master/benchmark).
-
-#### 0.13.0+1
-  * Widen the constraint on analyzer.
-
-#### 0.13.0
-  * Don't output log files by default in release mode, and provide option to
-    turn them off entirely.
-  * Changed the api for the ObserveTransformer to use named arguments.
-
-#### 0.12.2+1
-  * Cleanup some method signatures.
-
-#### 0.12.2
-  * Updated to match release 0.5.1
-    [observe-js#d530515](https://github.com/Polymer/observe-js/commit/d530515).
-
-#### 0.12.1+1
-  * Expand stack_trace version constraint.
-
-#### 0.12.1
-  * Upgraded error messages to have a unique and stable identifier.
-
-#### 0.12.0
-  * Old transform.dart file removed. If you weren't use it it, this change is
-    backwards compatible with version 0.11.0.
-
-#### 0.11.0+5
-  * Widen the constraint on analyzer.
-
-#### 0.11.0+4
-  * Raise the lower bound on the source_maps constraint to exclude incompatible
-    versions.
-
-#### 0.11.0+3
-  * Widen the constraint on source_maps.
-
-#### 0.11.0+2
-  * Widen the constraint on barback.
-
-#### 0.11.0+1
-  * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
-    class.
-
-#### 0.11.0
-  * Updated to match [observe-js#e212e74][e212e74] (release 0.3.4), which also
-    matches [observe-js#fa70c37][fa70c37] (release 0.4.2).
-  * ListPathObserver has been deprecated  (it was deleted a while ago in
-    observe-js). We plan to delete it in a future release. You may copy the code
-    if you still need it.
-  * PropertyPath now uses an expression syntax including indexers. For example,
-    you can write `a.b["m"]` instead of `a.b.m`.
-  * **breaking change**: PropertyPath no longer allows numbers as fields, you
-    need to use indexers instead. For example, you now need to write `a[3].d`
-    instead of `a.3.d`.
-  * **breaking change**: PathObserver.value= no longer discards changes (this is
-    in combination with a change in template_binding and polymer to improve
-    interop with JS custom elements).
-
-#### 0.10.0+3
-  * minor changes to documentation, deprecated `discardListChages` in favor of
-    `discardListChanges` (the former had a typo).
-
-#### 0.10.0
-  * package:observe no longer declares @MirrorsUsed. The package uses mirrors
-    for development time, but assumes frameworks (like polymer) and apps that
-    use it directly will either generate code that replaces the use of mirrors,
-    or add the @MirrorsUsed declaration themselves. For convinience, you can
-    import 'package:observe/mirrors_used.dart', and that will add a @MirrorsUsed
-    annotation that preserves properties and classes labeled with @reflectable
-    and properties labeled with @observable.
-  * Updated to match [observe-js#0152d54][0152d54]
-
-[fa70c37]: https://github.com/Polymer/observe-js/blob/fa70c37099026225876f7c7a26bdee7c48129f1c/src/observe.js
-[0152d54]: https://github.com/Polymer/observe-js/blob/0152d542350239563d0f2cad39d22d3254bd6c2a/src/observe.js
-[e212e74]: https://github.com/Polymer/observe-js/blob/e212e7473962067c099a3d1859595c2f8baa36d7/src/observe.js
diff --git a/packages/observe/LICENSE b/packages/observe/LICENSE
deleted file mode 100644
index ee99930..0000000
--- a/packages/observe/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2013, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of Google Inc. nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/observe/README.md b/packages/observe/README.md
deleted file mode 100644
index 82475c8..0000000
--- a/packages/observe/README.md
+++ /dev/null
@@ -1,102 +0,0 @@
-# observe
-
-Support for marking objects as observable, and getting notifications when those
-objects are mutated.
-
-**Warning:** This library is experimental, and APIs are subject to change.
-
-This library is used to observe changes to [Observable][] types. It also
-has helpers to make implementing and using [Observable][] objects easy.
-
-You can provide an observable object in two ways. The simplest way is to
-use dirty checking to discover changes automatically:
-
-```dart
-import 'package:observe/observe.dart';
-import 'package:observe/mirrors_used.dart'; // for smaller code
-
-class Monster extends Unit with Observable {
-  @observable int health = 100;
-
-  void damage(int amount) {
-    print('$this takes $amount damage!');
-    health -= amount;
-  }
-
-  toString() => 'Monster with $health hit points';
-}
-
-main() {
-  var obj = new Monster();
-  obj.changes.listen((records) {
-    print('Changes to $obj were: $records');
-  });
-  // No changes are delivered until we check for them
-  obj.damage(10);
-  obj.damage(20);
-  print('dirty checking!');
-  Observable.dirtyCheck();
-  print('done!');
-}
-```
-
-A more sophisticated approach is to implement the change notification
-manually. This avoids the potentially expensive [Observable.dirtyCheck][]
-operation, but requires more work in the object:
-
-```dart
-import 'package:observe/observe.dart';
-import 'package:observe/mirrors_used.dart'; // for smaller code
-
-class Monster extends Unit with ChangeNotifier {
-  int _health = 100;
-  @reflectable get health => _health;
-  @reflectable set health(val) {
-    _health = notifyPropertyChange(#health, _health, val);
-  }
-
-  void damage(int amount) {
-    print('$this takes $amount damage!');
-    health -= amount;
-  }
-
-  toString() => 'Monster with $health hit points';
-}
-
-main() {
-  var obj = new Monster();
-  obj.changes.listen((records) {
-    print('Changes to $obj were: $records');
-  });
-  // Schedules asynchronous delivery of these changes
-  obj.damage(10);
-  obj.damage(20);
-  print('done!');
-}
-```
-
-**Note**: by default this package uses mirrors to access getters and setters
-marked with `@reflectable`. Dart2js disables tree-shaking if there are any
-uses of mirrors, unless you declare how mirrors are used (via the
-[MirrorsUsed](https://api.dartlang.org/apidocs/channels/stable/#dart-mirrors.MirrorsUsed)
-annotation).
-
-As of version 0.10.0, this package doesn't declare `@MirrorsUsed`. This is
-because we intend to use mirrors for development time, but assume that
-frameworks and apps that use this pacakge will either generate code that
-replaces the use of mirrors, or add the `@MirrorsUsed` declaration
-themselves.  For convenience, you can import
-`package:observe/mirrors_used.dart` as shown on the first example above.
-That will add a `@MirrorsUsed` annotation that preserves properties and
-classes labeled with `@reflectable` and properties labeled with
-`@observable`.
-
-If you are using the `package:observe/mirrors_used.dart` import, you can
-also make use of `@reflectable` on your own classes and dart2js will
-preserve all of its members for reflection.
-
-[Tools](https://www.dartlang.org/polymer-dart/) exist to convert the first
-form into the second form automatically, to get the best of both worlds.
-
-[Observable]: http://www.dartdocs.org/documentation/observe/latest/index.html#observe/observe.Observable
-[Observable.dirtyCheck]: http://www.dartdocs.org/documentation/observe/latest/index.html#observe/observe.Observable@id_dirtyCheck
diff --git a/packages/observe/benchmark/index.dart b/packages/observe/benchmark/index.dart
deleted file mode 100644
index 781e0aa..0000000
--- a/packages/observe/benchmark/index.dart
+++ /dev/null
@@ -1,168 +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 observe.test.benchmark.index;
-
-import 'dart:async';
-import 'dart:html';
-import 'package:benchmark_harness/benchmark_harness.dart';
-import 'package:chart/chart.dart';
-import 'package:observe/mirrors_used.dart'; // Makes output smaller.
-import 'package:smoke/mirrors.dart';
-import 'object_benchmark.dart';
-import 'setup_object_benchmark.dart';
-import 'observable_list_benchmark.dart';
-import 'setup_observable_list_benchmark.dart';
-import 'path_benchmark.dart';
-import 'setup_path_benchmark.dart';
-
-/// Benchmark names to factory functions.
-typedef BenchmarkBase BenchmarkFactory(
-    int objectCount, int mutationCount, String config);
-final Map<String, BenchmarkFactory> benchmarkFactories = {
-  'ObjectBenchmark': (int o, int m, String c) => new ObjectBenchmark(o, m, c),
-  'SetupObjectBenchmark':
-      (int o, int m, String c) => new SetupObjectBenchmark(o, c),
-  'ObservableListBenchmark':
-      (int o, int m, String c) => new ObservableListBenchmark(o, m, c),
-  'SetupObservableListBenchmark':
-      (int o, int m, String c) => new SetupObservableListBenchmark(o, c),
-  'PathBenchmark': (int o, int m, String c) => new PathBenchmark(o, m, c),
-  'SetupPathBenchmark':
-      (int o, int m, String c) => new SetupPathBenchmark(o, c),
-};
-
-/// Benchmark names to possible configs.
-final Map<String, List<String>> benchmarkConfigs = {
-  'ObjectBenchmark': [],
-  'SetupObjectBenchmark': [],
-  'ObservableListBenchmark': ['splice', 'update', 'push/pop', 'shift/unshift'],
-  'SetupObservableListBenchmark': [],
-  'PathBenchmark': ['leaf', 'root'],
-  'SetupPathBenchmark': [],
-};
-
-Iterable<int> objectCounts;
-Iterable<int> mutationCounts;
-
-final ButtonElement goButton = querySelector('#go');
-final InputElement objectCountInput = querySelector('#objectCountInput');
-final InputElement mutationCountInput = querySelector('#mutationCountInput');
-final SpanElement mutationCountWrapper = querySelector('#mutationCountWrapper');
-final SpanElement statusSpan = querySelector('#status');
-final DivElement canvasWrapper = querySelector('#canvasWrapper');
-final SelectElement benchmarkSelect = querySelector('#benchmarkSelect');
-final SelectElement configSelect = querySelector('#configSelect');
-final UListElement legendList = querySelector('#legendList');
-final List<List<String>> colors = [
-  [0, 0, 255],
-  [138, 43, 226],
-  [165, 42, 42],
-  [100, 149, 237],
-  [220, 20, 60],
-  [184, 134, 11]
-].map((rgb) => 'rgba(' + rgb.join(',') + ',.7)').toList();
-
-main() {
-  // TODO(jakemac): Use a transformer to generate the smoke config so we can see
-  // how that affects the benchmark.
-  useMirrors();
-
-  benchmarkSelect.onChange.listen((_) => changeBenchmark());
-  changeBenchmark();
-
-  goButton.onClick.listen((_) async {
-    canvasWrapper.children.clear();
-    goButton.disabled = true;
-    goButton.text = 'Running...';
-    legendList.text = '';
-    objectCounts =
-        objectCountInput.value.split(',').map((val) => int.parse(val));
-
-    if (benchmarkSelect.value.startsWith('Setup')) {
-      mutationCounts = [0];
-    } else {
-      mutationCounts =
-          mutationCountInput.value.split(',').map((val) => int.parse(val));
-    }
-
-    var i = 0;
-    mutationCounts.forEach((count) {
-      var li = document.createElement('li');
-      li.text = '$count mutations.';
-      li.style.color = colors[i % colors.length];
-      legendList.append(li);
-      i++;
-    });
-
-    var results = [];
-    for (int objectCount in objectCounts) {
-      int x = 0;
-      for (int mutationCount in mutationCounts) {
-        statusSpan.text =
-            'Testing: $objectCount objects with $mutationCount mutations';
-        // Let the status text render before running the next benchmark.
-        await new Future(() {});
-        var factory = benchmarkFactories[benchmarkSelect.value];
-        var benchmark = factory(objectCount, mutationCount, configSelect.value);
-        // Divide by 10 because benchmark_harness returns the amount of time it
-        // took to run 10 times, not once :(.
-        var resultMicros = benchmark.measure() / 10;
-
-        if (results.length <= x) results.add([]);
-        results[x].add(resultMicros / 1000);
-        x++;
-      }
-    }
-
-    drawBenchmarks(results);
-  });
-}
-
-void drawBenchmarks(List<List<double>> results) {
-  var datasets = [];
-  for (int i = 0; i < results.length; i++) {
-    datasets.add({
-      'fillColor': 'rgba(255, 255, 255, 0)',
-      'strokeColor': colors[i % colors.length],
-      'pointColor': colors[i % colors.length],
-      'pointStrokeColor': "#fff",
-      'data': results[i],
-    });
-  }
-  var data = {
-    'labels': objectCounts.map((c) => '$c').toList(),
-    'datasets': datasets,
-  };
-
-  new Line(data, {'bezierCurve': false,}).show(canvasWrapper);
-  goButton.disabled = false;
-  goButton.text = 'Run Benchmarks';
-  statusSpan.text = '';
-}
-
-void changeBenchmark() {
-  var configs = benchmarkConfigs[benchmarkSelect.value];
-  configSelect.text = '';
-  configs.forEach((config) {
-    var option = document.createElement('option');
-    option.text = config;
-    configSelect.append(option);
-  });
-
-  document.title = benchmarkSelect.value;
-
-  // Don't show the configSelect if there are no configs.
-  if (configs.isEmpty) {
-    configSelect.style.display = 'none';
-  } else {
-    configSelect.style.display = 'inline';
-  }
-
-  // Don't show the mutation counts box if running a Setup* benchmark.
-  if (benchmarkSelect.value.startsWith('Setup')) {
-    mutationCountWrapper.style.display = 'none';
-  } else {
-    mutationCountWrapper.style.display = 'inline';
-  }
-}
diff --git a/packages/observe/benchmark/index.html b/packages/observe/benchmark/index.html
deleted file mode 100644
index ce2bf9f..0000000
--- a/packages/observe/benchmark/index.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<html>
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<head>
-  <title>Observation Benchmarks</title>
-  <meta charset="utf-8">
-  <style>
-    * {
-      font-family: arial, helvetica, sans-serif;
-      font-weight: 400;
-    }
-    body {
-      margin: 0;
-      padding: 0;
-      background-color: rgba(0, 0, 0, .1);
-    }
-    #canvasWrapper {
-      width: 800px;
-      height: 400px;
-    }
-  </style>
-</head>
-<body>
-<h1>Observation Benchmarks</h1>
-
-<select id="benchmarkSelect">
-  <option>ObjectBenchmark</option>
-  <option>SetupObjectBenchmark</option>
-  <option>ObservableListBenchmark</option>
-  <option>SetupObservableListBenchmark</option>
-  <option>PathBenchmark</option>
-  <option>SetupPathBenchmark</option>
-</select>
-<select id="configSelect">
-</select>
-
-<button id="go">Run Benchmarks</button>
-
-<span>Object Count: </span>
-<input id="objectCountInput" style="width: 200px" value="4000, 8000, 16000, 32000">
-<span id="mutationCountWrapper">
-  <span>Mutation Count: </span>
-  <input id="mutationCountInput" style="width: 200px"
-         value="0, 100, 200, 400, 800, 1600"><br>
-</span>
-<br>
-<span id="status"></span>
-
-<section style="width: 100%">
-  <article>
-    <div style="display:inline-block; padding-bottom: 20px">
-      Times in ms
-    </div>
-    <div id="canvasWrapper" style="display:inline-block">
-    </div>
-    <div style="display:inline-block">
-      <ul id="legendList">
-      </ul>
-    </div>
-  </article>
-</section>
-<h3 style="margin-left: 440px">Object Set Size</h3>
-<script type="application/dart" src="index.dart"></script>
-<script src="packages/browser/dart.js">
-</script>
-</body>
-</html>
diff --git a/packages/observe/benchmark/object_benchmark.dart b/packages/observe/benchmark/object_benchmark.dart
deleted file mode 100644
index 010c1ef..0000000
--- a/packages/observe/benchmark/object_benchmark.dart
+++ /dev/null
@@ -1,28 +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 observe.test.benchmark.object_benchmark;
-
-import 'observation_benchmark_base.dart';
-import 'test_observable.dart';
-
-class ObjectBenchmark extends ObservationBenchmarkBase {
-  ObjectBenchmark(int objectCount, int mutationCount, String config) : super(
-          'ObjectBenchmark:$objectCount:$mutationCount:$config', objectCount,
-          mutationCount, config);
-
-  @override
-  int mutateObject(TestObservable obj) {
-    // Modify the first 5 properties.
-    obj.a++;
-    obj.b++;
-    obj.c++;
-    obj.d++;
-    obj.e++;
-    // Return # of modifications.
-    return 5;
-  }
-
-  @override
-  TestObservable newObject() => new TestObservable();
-}
diff --git a/packages/observe/benchmark/observable_list_benchmark.dart b/packages/observe/benchmark/observable_list_benchmark.dart
deleted file mode 100644
index 21e5655..0000000
--- a/packages/observe/benchmark/observable_list_benchmark.dart
+++ /dev/null
@@ -1,58 +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 observe.test.benchmark.observable_list_benchmark;
-
-import 'package:observe/observe.dart';
-import 'observation_benchmark_base.dart';
-
-class ObservableListBenchmark extends ObservationBenchmarkBase {
-  final int elementCount = 100;
-
-  ObservableListBenchmark(int objectCount, int mutationCount, String config)
-      : super('ObservableListBenchmark:$objectCount:$mutationCount:$config',
-          objectCount, mutationCount, config);
-
-  @override
-  int mutateObject(ObservableList obj) {
-    switch (config) {
-      case 'update':
-        var size = (elementCount / 10).floor();
-        for (var j = 0; j < size; j++) {
-          obj[j * size]++;
-        }
-        return size;
-
-      case 'splice':
-        var size = (elementCount / 5).floor();
-        // No splice equivalent in List, so we hardcode it.
-        var removed = obj.sublist(size, size * 2);
-        obj.removeRange(size, size * 2);
-        obj.insertAll(size * 2, removed);
-        return size * 2;
-
-      case 'push/pop':
-        var val = obj.removeLast();
-        obj.add(val + 1);
-        return 2;
-
-      case 'shift/unshift':
-        var val = obj.removeAt(0);
-        obj.insert(0, val + 1);
-        return 2;
-
-      default:
-        throw new ArgumentError(
-            'Invalid config for ObservableListBenchmark: $config');
-    }
-  }
-
-  @override
-  ObservableList newObject() {
-    var list = new ObservableList();
-    for (int i = 0; i < elementCount; i++) {
-      list.add(i);
-    }
-    return list;
-  }
-}
diff --git a/packages/observe/benchmark/observation_benchmark_base.dart b/packages/observe/benchmark/observation_benchmark_base.dart
deleted file mode 100644
index c087f57..0000000
--- a/packages/observe/benchmark/observation_benchmark_base.dart
+++ /dev/null
@@ -1,117 +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 observe.test.benchmark.observation_benchmark_base;
-
-import 'dart:async';
-import 'dart:html';
-import 'package:observe/observe.dart';
-import 'package:benchmark_harness/benchmark_harness.dart';
-
-abstract class ObservationBenchmarkBase extends BenchmarkBase {
-  /// The number of objects to create and observe.
-  final int objectCount;
-
-  /// The number of mutations to perform.
-  final int mutationCount;
-
-  /// The current configuration.
-  final String config;
-
-  /// The number of pending mutations left to observe.
-  int mutations;
-
-  /// The objects we want to observe.
-  List<Observable> objects;
-
-  /// The change listeners on all of our objects.
-  List observers;
-
-  /// The current object being mutated.
-  int objectIndex;
-
-  ObservationBenchmarkBase(
-      String name, this.objectCount, this.mutationCount, this.config)
-      : super(name);
-
-  /// Subclasses should use this method to perform mutations on an object. The
-  /// return value indicates how many mutations were performed on the object.
-  int mutateObject(obj);
-
-  /// Subclasses should use this method to return an observable object to be
-  /// benchmarked.
-  Observable newObject();
-
-  /// Subclasses should override this to do anything other than a default change
-  /// listener. It must return either a StreamSubscription or a PathObserver.
-  /// If overridden this observer should decrement [mutations] each time a
-  /// change is observed.
-  newObserver(obj) {
-    decrement(_) => mutations--;
-    if (obj is ObservableList) return obj.listChanges.listen(decrement);
-    return obj.changes.listen(decrement);
-  }
-
-  /// Set up each benchmark by creating all the objects and listeners.
-  @override
-  void setup() {
-    mutations = 0;
-
-    objects = [];
-    observers = [];
-    objectIndex = 0;
-
-    while (objects.length < objectCount) {
-      var obj = newObject();
-      objects.add(obj);
-      observers.add(newObserver(obj));
-    }
-  }
-
-  /// Tear down each benchmark and make sure that [mutations] is 0.
-  @override
-  void teardown() {
-    if (mutations != 0) {
-      window.alert('$mutations mutation sets were not observed!');
-    }
-    mutations = 0;
-
-    while (observers.isNotEmpty) {
-      var observer = observers.removeLast();
-      if (observer is StreamSubscription) {
-        observer.cancel();
-      } else if (observer is PathObserver) {
-        observer.close();
-      } else {
-        throw 'Unknown observer type ${observer.runtimeType}. Only '
-            '[PathObserver] and [StreamSubscription] are supported.';
-      }
-    }
-    observers = null;
-
-    bool leakedObservers = false;
-    while (objects.isNotEmpty) {
-      leakedObservers = objects.removeLast().hasObservers || leakedObservers;
-    }
-    if (leakedObservers) window.alert('Observers leaked!');
-    objects = null;
-  }
-
-  /// Run the benchmark
-  @override
-  void run() {
-    var mutationsLeft = mutationCount;
-    while (mutationsLeft > 0) {
-      var obj = objects[objectIndex];
-      mutationsLeft -= mutateObject(obj);
-      this.mutations++;
-      this.objectIndex++;
-      if (this.objectIndex == this.objects.length) {
-        this.objectIndex = 0;
-      }
-      obj.deliverChanges();
-      if (obj is ObservableList) obj.deliverListChanges();
-    }
-    Observable.dirtyCheck();
-  }
-}
diff --git a/packages/observe/benchmark/path_benchmark.dart b/packages/observe/benchmark/path_benchmark.dart
deleted file mode 100644
index 578d096..0000000
--- a/packages/observe/benchmark/path_benchmark.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.
-library observe.test.benchmark.path_benchmark;
-
-import 'package:observe/observe.dart';
-import 'observation_benchmark_base.dart';
-import 'test_path_observable.dart';
-
-class PathBenchmark extends ObservationBenchmarkBase {
-  final PropertyPath path = new PropertyPath('foo.bar.baz');
-
-  PathBenchmark(int objectCount, int mutationCount, String config) : super(
-          'PathBenchmark:$objectCount:$mutationCount:$config', objectCount,
-          mutationCount, config);
-
-  @override
-  int mutateObject(TestPathObservable obj) {
-    switch (config) {
-      case 'leaf':
-        obj.foo.bar.baz += 1;
-        // Make sure [obj.foo.bar] delivers its changes synchronously. The base
-        // class already handles this for [obj].
-        obj.foo.bar.deliverChanges();
-        return 1;
-
-      case 'root':
-        obj.foo = new Foo(obj.foo.bar.baz + 1);
-        return 1;
-
-      default:
-        throw new ArgumentError('Invalid config for PathBenchmark: $config');
-    }
-  }
-
-  @override
-  TestPathObservable newObject() => new TestPathObservable(1);
-
-  @override
-  PathObserver newObserver(TestPathObservable obj) =>
-      new PathObserver(obj, path)..open((_) => mutations--);
-}
diff --git a/packages/observe/benchmark/setup_object_benchmark.dart b/packages/observe/benchmark/setup_object_benchmark.dart
deleted file mode 100644
index 6fda9fc..0000000
--- a/packages/observe/benchmark/setup_object_benchmark.dart
+++ /dev/null
@@ -1,15 +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 observe.test.benchmark.setup_object_benchmark;
-
-import 'setup_observation_benchmark_base.dart';
-import 'test_observable.dart';
-
-class SetupObjectBenchmark extends SetupObservationBenchmarkBase {
-  SetupObjectBenchmark(int objectCount, String config)
-      : super('SetupObjectBenchmark:$objectCount:$config', objectCount, config);
-
-  @override
-  TestObservable newObject() => new TestObservable();
-}
diff --git a/packages/observe/benchmark/setup_observable_list_benchmark.dart b/packages/observe/benchmark/setup_observable_list_benchmark.dart
deleted file mode 100644
index 77f178a..0000000
--- a/packages/observe/benchmark/setup_observable_list_benchmark.dart
+++ /dev/null
@@ -1,26 +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 observe.test.benchmark.setup_observable_list_benchmark;
-
-import 'package:observe/observe.dart';
-import 'setup_observation_benchmark_base.dart';
-
-class SetupObservableListBenchmark extends SetupObservationBenchmarkBase {
-  final int elementCount = 100;
-
-  SetupObservableListBenchmark(int objectCount, String config) : super(
-          'SetupObservableListBenchmark:$objectCount:$config', objectCount,
-          config);
-
-  @override
-  ObservableList newObject() {
-    var list = new ObservableList();
-    for (int i = 0; i < elementCount; i++) {
-      list.add(i);
-    }
-    list.deliverChanges();
-    list.deliverListChanges();
-    return list;
-  }
-}
diff --git a/packages/observe/benchmark/setup_observation_benchmark_base.dart b/packages/observe/benchmark/setup_observation_benchmark_base.dart
deleted file mode 100644
index ef1545c..0000000
--- a/packages/observe/benchmark/setup_observation_benchmark_base.dart
+++ /dev/null
@@ -1,74 +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 observe.test.benchmark.setup_observation_benchmark_base;
-
-import 'dart:async';
-import 'dart:html';
-import 'package:observe/observe.dart';
-import 'package:benchmark_harness/benchmark_harness.dart';
-
-abstract class SetupObservationBenchmarkBase extends BenchmarkBase {
-  /// The number of objects to create and observe.
-  final int objectCount;
-
-  /// The current configuration.
-  final String config;
-
-  /// The objects we want to observe.
-  List<Observable> objects;
-
-  SetupObservationBenchmarkBase(String name, this.objectCount, this.config)
-      : super(name);
-
-  /// Subclasses should use this method to return an observable object to be
-  /// benchmarked.
-  Observable newObject();
-
-  /// Subclasses should override this to do anything other than a default change
-  /// listener. It must return either a StreamSubscription or a PathObserver.
-  newObserver(obj) => obj.changes.listen((_) {});
-
-  /// Set up each benchmark by creating all the objects.
-  @override
-  void setup() {
-    objects = [];
-    while (objects.length < objectCount) {
-      objects.add(newObject());
-    }
-  }
-
-  /// Tear down each the benchmark and remove all listeners.
-  @override
-  void teardown() {
-    while (objects.isNotEmpty) {
-      var obj = objects.removeLast();
-      if (obj.hasObservers || (obj is ObservableList && obj.hasListObservers)) {
-        window.alert('Observers leaked!');
-      }
-    }
-    objects = null;
-  }
-
-  /// Run the benchmark by creating a listener on each object.
-  @override
-  void run() {
-    for (var object in objects) {
-      var observer = newObserver(object);
-
-      // **Note:** This is different than the JS implementation. Since run can
-      // be called an arbitrary number of times between [setup] and [teardown],
-      // we clean up all observers as we go. This means we are measuring both
-      // the setup and teardown of observers, versus the setup only in the
-      // JS benchmark. Not cleaning these up ends up giving `oh snap` errors.
-      if (observer is StreamSubscription) {
-        observer.cancel();
-      } else if (observer is PathObserver) {
-        observer.close();
-      } else {
-        throw 'Unknown observer type ${observer.runtimeType}. Only '
-            '[PathObserver] and [StreamSubscription] are supported.';
-      }
-    }
-  }
-}
diff --git a/packages/observe/benchmark/setup_path_benchmark.dart b/packages/observe/benchmark/setup_path_benchmark.dart
deleted file mode 100644
index e9613fd..0000000
--- a/packages/observe/benchmark/setup_path_benchmark.dart
+++ /dev/null
@@ -1,22 +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 observe.test.benchmark.setup_path_benchmark;
-
-import 'package:observe/observe.dart';
-import 'setup_observation_benchmark_base.dart';
-import 'test_path_observable.dart';
-
-class SetupPathBenchmark extends SetupObservationBenchmarkBase {
-  final PropertyPath path = new PropertyPath('foo.bar.baz');
-
-  SetupPathBenchmark(int objectCount, String config)
-      : super('SetupPathBenchmark:$objectCount:$config', objectCount, config);
-
-  @override
-  TestPathObservable newObject() => new TestPathObservable(1);
-
-  @override
-  PathObserver newObserver(TestPathObservable obj) =>
-      new PathObserver(obj, path)..open(() {});
-}
diff --git a/packages/observe/benchmark/test_observable.dart b/packages/observe/benchmark/test_observable.dart
deleted file mode 100644
index 1183800..0000000
--- a/packages/observe/benchmark/test_observable.dart
+++ /dev/null
@@ -1,24 +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 observe.test.benchmark.test_observable;
-
-import 'package:observe/observe.dart';
-
-class TestObservable extends Observable {
-  @observable int a = 0;
-  @observable int b = 0;
-  @observable int c = 0;
-  @observable int d = 0;
-  @observable int e = 0;
-  @observable int f = 0;
-  @observable int g = 0;
-  @observable int h = 0;
-  @observable int i = 0;
-  @observable int j = 0;
-  @observable int k = 0;
-  @observable int l = 0;
-  @observable int m = 0;
-  @observable int n = 0;
-  @observable int o = 0;
-}
diff --git a/packages/observe/benchmark/test_path_observable.dart b/packages/observe/benchmark/test_path_observable.dart
deleted file mode 100644
index cc1c0c0..0000000
--- a/packages/observe/benchmark/test_path_observable.dart
+++ /dev/null
@@ -1,24 +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 observe.test.benchmark.test_observable;
-
-import 'package:observe/observe.dart';
-
-class Bar extends Observable {
-  @observable int baz;
-
-  Bar(this.baz);
-}
-
-class Foo extends Observable {
-  @observable Bar bar;
-
-  Foo(int value) : bar = new Bar(value);
-}
-
-class TestPathObservable extends Observable {
-  @observable Foo foo;
-
-  TestPathObservable(int value) : foo = new Foo(value);
-}
diff --git a/packages/observe/lib/html.dart b/packages/observe/lib/html.dart
deleted file mode 100644
index 07b4aff..0000000
--- a/packages/observe/lib/html.dart
+++ /dev/null
@@ -1,79 +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.
-
-// TODO(jmesserly): can we handle this more elegantly?
-// In general, it seems like we want a convenient way to take a Stream plus a
-// getter and convert this into an Observable.
-
-/// Helpers for exposing dart:html as observable data.
-library observe.html;
-
-import 'dart:html';
-
-import 'observe.dart';
-
-/// An observable version of [window.location.hash].
-final ObservableLocationHash windowLocation = new ObservableLocationHash._();
-
-class ObservableLocationHash extends ChangeNotifier {
-  Object _currentHash;
-
-  ObservableLocationHash._() {
-    // listen on changes to #hash in the URL
-    // Note: listen on both popState and hashChange, because IE9 doesn't support
-    // history API. See http://dartbug.com/5483
-    // TODO(jmesserly): only listen to these if someone is listening to our
-    // changes.
-    window.onHashChange.listen(_notifyHashChange);
-    window.onPopState.listen(_notifyHashChange);
-
-    _currentHash = hash;
-  }
-
-  @reflectable String get hash => window.location.hash;
-
-  /// Pushes a new URL state, similar to the affect of clicking a link.
-  /// Has no effect if the [value] already equals [window.location.hash].
-  @reflectable void set hash(String value) {
-    if (value == hash) return;
-
-    window.history.pushState(null, '', value);
-    _notifyHashChange(null);
-  }
-
-  void _notifyHashChange(_) {
-    var oldValue = _currentHash;
-    _currentHash = hash;
-    notifyPropertyChange(#hash, oldValue, _currentHash);
-  }
-}
-
-/// *Deprecated* use [CssClassSet.toggle] instead.
-///
-/// Add or remove CSS class [className] based on the [value].
-@deprecated
-void updateCssClass(Element element, String className, bool value) {
-  if (value == true) {
-    element.classes.add(className);
-  } else {
-    element.classes.remove(className);
-  }
-}
-
-/// *Deprecated* use `class="{{ binding }}"` in your HTML instead. It will also
-/// work on a `<polymer-element>`.
-///
-/// Bind a CSS class to the observable [object] and property [path].
-@deprecated
-PathObserver bindCssClass(Element element, String className,
-    Observable object, String path) {
-
-  callback(value) {
-    updateCssClass(element, className, value);
-  }
-
-  var obs = new PathObserver(object, path);
-  callback(obs.open(callback));
-  return obs;
-}
diff --git a/packages/observe/lib/mirrors_used.dart b/packages/observe/lib/mirrors_used.dart
deleted file mode 100644
index b3d3f43..0000000
--- a/packages/observe/lib/mirrors_used.dart
+++ /dev/null
@@ -1,18 +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.
-
-/// An empty library that declares what needs to be retained with [MirrorsUsed]
-/// if you were to use observables together with mirrors. By default this is not
-/// included because frameworks using this package also use code generation to
-/// avoid using mirrors at deploy time.
-library observe.mirrors_used;
-
-// Note: ObservableProperty is in this list only for the unusual use case of
-// invoking dart2js without running this package's transformers. The
-// transformer in `lib/transformer.dart` will replace @observable with the
-// @reflectable annotation.
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
-    override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
-import 'package:observe/observe.dart' show Reflectable, ObservableProperty;
diff --git a/packages/observe/lib/observe.dart b/packages/observe/lib/observe.dart
deleted file mode 100644
index 2f25f1a..0000000
--- a/packages/observe/lib/observe.dart
+++ /dev/null
@@ -1,25 +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 observe;
-
-// This library contains code ported from observe-js:
-// https://github.com/Polymer/observe-js/blob/0152d542350239563d0f2cad39d22d3254bd6c2a/src/observe.js
-// We port what is needed for data bindings. Most of the functionality is
-// ported, except where differences are needed for Dart's Observable type.
-
-export 'src/bindable.dart';
-export 'src/bind_property.dart';
-export 'src/change_notifier.dart';
-export 'src/change_record.dart';
-export 'src/list_path_observer.dart';
-export 'src/list_diff.dart' show ListChangeRecord;
-export 'src/metadata.dart';
-export 'src/observable.dart' hide notifyPropertyChangeHelper;
-export 'src/observable_box.dart';
-export 'src/observable_list.dart';
-export 'src/observable_map.dart';
-export 'src/observer_transform.dart';
-export 'src/path_observer.dart' hide getSegmentsOfPropertyPathForTesting;
-export 'src/to_observable.dart';
diff --git a/packages/observe/lib/src/bind_property.dart b/packages/observe/lib/src/bind_property.dart
deleted file mode 100644
index 21e14f9..0000000
--- a/packages/observe/lib/src/bind_property.dart
+++ /dev/null
@@ -1,39 +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 observe.src.bind_property;
-
-import 'dart:async';
-import 'package:observe/observe.dart';
-
-/// Forwards an observable property from one object to another. For example:
-///
-///     class MyModel extends Observable {
-///       StreamSubscription _sub;
-///       MyOtherModel _otherModel;
-///
-///       MyModel() {
-///         ...
-///         _sub = onPropertyChange(_otherModel, #value,
-///             () => notifyPropertyChange(#prop, oldValue, newValue);
-///       }
-///
-///       String get prop => _otherModel.value;
-///       set prop(String value) { _otherModel.value = value; }
-///     }
-///
-/// See also [notifyPropertyChange].
-// TODO(jmesserly): make this an instance method?
-StreamSubscription onPropertyChange(Observable source, Symbol sourceName,
-    void callback()) {
-  return source.changes.listen((records) {
-    for (var record in records) {
-      if (record is PropertyChangeRecord &&
-          (record as PropertyChangeRecord).name == sourceName) {
-        callback();
-        break;
-      }
-    }
-  });
-}
diff --git a/packages/observe/lib/src/bindable.dart b/packages/observe/lib/src/bindable.dart
deleted file mode 100644
index c3314a2..0000000
--- a/packages/observe/lib/src/bindable.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.
-
-library observe.src.bindable;
-
-/// An object that can be data bound.
-// Normally this is used with 'package:template_binding'.
-// TODO(jmesserly): Node.bind polyfill calls this "observable"
-abstract class Bindable {
-  // Dart note: changed setValue to be "set value" and discardChanges() to
-  // be "get value".
-
-  /// Initiates observation and returns the initial value.
-  /// The callback will be called with the updated [value].
-  ///
-  /// Some subtypes may chose to provide additional arguments, such as
-  /// [PathObserver] providing the old value as the second argument.
-  /// However, they must support callbacks with as few as 0 or 1 argument.
-  /// This can be implemented by performing an "is" type test on the callback.
-  open(callback);
-
-  /// Stops future notifications and frees the reference to the callback passed
-  /// to [open], so its memory can be collected even if this Bindable is alive.
-  void close();
-
-  /// Gets the current value of the bindings.
-  /// Note: once the value of a [Bindable] is fetched, the callback passed to
-  /// [open] should not be called again with this new value.
-  /// In other words, any pending change notifications must be discarded.
-  // TODO(jmesserly): I don't like a getter with side effects. Should we just
-  // rename the getter/setter pair to discardChanges/setValue like they are in
-  // JavaScript?
-  get value;
-
-  /// This can be implemented for two-way bindings. By default does nothing.
-  set value(newValue) {}
-
-  /// Deliver changes. Typically this will perform dirty-checking, if any is
-  /// needed.
-  void deliver() {}
-}
diff --git a/packages/observe/lib/src/change_notifier.dart b/packages/observe/lib/src/change_notifier.dart
deleted file mode 100644
index 7febee5..0000000
--- a/packages/observe/lib/src/change_notifier.dart
+++ /dev/null
@@ -1,81 +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 observe.src.change_notifier;
-
-import 'dart:async';
-import 'dart:collection' show UnmodifiableListView;
-import 'package:observe/observe.dart';
-import 'package:observe/src/observable.dart' show notifyPropertyChangeHelper;
-
-/// Mixin and base class for implementing an [Observable] object that performs
-/// its own change notifications, and does not need to be considered by
-/// [Observable.dirtyCheck].
-///
-/// When a field, property, or indexable item is changed, a derived class should
-/// call [notifyPropertyChange]. See that method for an example.
-abstract class ChangeNotifier implements Observable {
-  StreamController _changes;
-  List<ChangeRecord> _records;
-
-  Stream<List<ChangeRecord>> get changes {
-    if (_changes == null) {
-      _changes = new StreamController.broadcast(sync: true,
-          onListen: observed, onCancel: unobserved);
-    }
-    return _changes.stream;
-  }
-
-  // TODO(jmesserly): should these be public? They're useful lifecycle methods
-  // for subclasses. Ideally they'd be protected.
-  /// Override this method to be called when the [changes] are first observed.
-  void observed() {}
-
-  /// Override this method to be called when the [changes] are no longer being
-  /// observed.
-  void unobserved() {
-    // Free some memory
-    _changes = null;
-  }
-
-  bool deliverChanges() {
-    var records = _records;
-    _records = null;
-    if (hasObservers && records != null) {
-      _changes.add(new UnmodifiableListView<ChangeRecord>(records));
-      return true;
-    }
-    return false;
-  }
-
-  /// True if this object has any observers, and should call
-  /// [notifyPropertyChange] for changes.
-  bool get hasObservers => _changes != null && _changes.hasListener;
-
-  /// Notify that the field [name] of this object has been changed.
-  ///
-  /// The [oldValue] and [newValue] are also recorded. If the two values are
-  /// equal, no change will be recorded.
-  ///
-  /// For convenience this returns [newValue]. This makes it easy to use in a
-  /// setter:
-  ///
-  ///     var _myField;
-  ///     @reflectable get myField => _myField;
-  ///     @reflectable set myField(value) {
-  ///       _myField = notifyPropertyChange(#myField, _myField, value);
-  ///     }
-  notifyPropertyChange(Symbol field, Object oldValue, Object newValue)
-      => notifyPropertyChangeHelper(this, field, oldValue, newValue);
-
-  void notifyChange(ChangeRecord record) {
-    if (!hasObservers) return;
-
-    if (_records == null) {
-      _records = [];
-      scheduleMicrotask(deliverChanges);
-    }
-    _records.add(record);
-  }
-}
diff --git a/packages/observe/lib/src/dirty_check.dart b/packages/observe/lib/src/dirty_check.dart
deleted file mode 100644
index 2084f22..0000000
--- a/packages/observe/lib/src/dirty_check.dart
+++ /dev/null
@@ -1,133 +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.
-
-/// *Warning*: this library is **internal**, and APIs are subject to change.
-///
-/// Tracks observable objects for dirty checking and testing purposes.
-///
-/// It can collect all observed objects, which can be used to trigger
-/// predictable delivery of all pending changes in a test, including objects
-/// allocated internally to another library, such as those in
-/// `package:template_binding`.
-library observe.src.dirty_check;
-
-import 'dart:async';
-import 'package:logging/logging.dart';
-import 'package:observe/observe.dart' show Observable;
-
-/// The number of active observables in the system.
-int get allObservablesCount => _allObservablesCount;
-
-int _allObservablesCount = 0;
-
-List<Observable> _allObservables = null;
-
-bool _delivering = false;
-
-void registerObservable(Observable obj) {
-  if (_allObservables == null) _allObservables = <Observable>[];
-  _allObservables.add(obj);
-  _allObservablesCount++;
-}
-
-/// Synchronously deliver all change records for known observables.
-///
-/// This will execute [Observable.deliverChanges] on objects that inherit from
-/// [Observable].
-// Note: this is called performMicrotaskCheckpoint in change_summary.js.
-void dirtyCheckObservables() {
-  if (_delivering) return;
-  if (_allObservables == null) return;
-
-  _delivering = true;
-
-  int cycles = 0;
-  bool anyChanged = false;
-  List debugLoop = null;
-  do {
-    cycles++;
-    if (cycles == MAX_DIRTY_CHECK_CYCLES) {
-      debugLoop = [];
-    }
-
-    var toCheck = _allObservables;
-    _allObservables = <Observable>[];
-    anyChanged = false;
-
-    for (int i = 0; i < toCheck.length; i++) {
-      final observer = toCheck[i];
-      if (observer.hasObservers) {
-        if (observer.deliverChanges()) {
-          anyChanged = true;
-          if (debugLoop != null) debugLoop.add([i, observer]);
-        }
-        _allObservables.add(observer);
-      }
-    }
-  } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
-
-  if (debugLoop != null && anyChanged) {
-    _logger.warning('Possible loop in Observable.dirtyCheck, stopped '
-        'checking.');
-    for (final info in debugLoop) {
-      _logger.warning('In last iteration Observable changed at index '
-          '${info[0]}, object: ${info[1]}.');
-    }
-  }
-
-  _allObservablesCount = _allObservables.length;
-  _delivering = false;
-}
-
-const MAX_DIRTY_CHECK_CYCLES = 1000;
-
-/// Log for messages produced at runtime by this library. Logging can be
-/// configured by accessing Logger.root from the logging library.
-final Logger _logger = new Logger('Observable.dirtyCheck');
-
-/// Creates a [ZoneSpecification] to set up automatic dirty checking after each
-/// batch of async operations. This ensures that change notifications are always
-/// delivered. Typically used via [dirtyCheckZone].
-ZoneSpecification dirtyCheckZoneSpec() {
-  bool pending = false;
-
-  enqueueDirtyCheck(ZoneDelegate parent, Zone zone) {
-    // Only schedule one dirty check per microtask.
-    if (pending) return;
-
-    pending = true;
-    parent.scheduleMicrotask(zone, () {
-      pending = false;
-      Observable.dirtyCheck();
-    });
-  }
-
-  wrapCallback(Zone self, ZoneDelegate parent, Zone zone, f()) {
-    // TODO(jmesserly): why does this happen?
-    if (f == null) return f;
-    return () {
-      enqueueDirtyCheck(parent, zone);
-      return f();
-    };
-  }
-
-  wrapUnaryCallback(Zone self, ZoneDelegate parent, Zone zone, f(x)) {
-    // TODO(jmesserly): why does this happen?
-    if (f == null) return f;
-    return (x) {
-      enqueueDirtyCheck(parent, zone);
-      return f(x);
-    };
-  }
-
-  return new ZoneSpecification(
-      registerCallback: wrapCallback,
-      registerUnaryCallback: wrapUnaryCallback);
-}
-
-/// Forks a [Zone] off the current one that does dirty-checking automatically
-/// after each batch of async operations. Equivalent to:
-///
-///     Zone.current.fork(specification: dirtyCheckZoneSpec());
-Zone dirtyCheckZone() => Zone.current.fork(specification: dirtyCheckZoneSpec());
diff --git a/packages/observe/lib/src/list_path_observer.dart b/packages/observe/lib/src/list_path_observer.dart
deleted file mode 100644
index 22a8199..0000000
--- a/packages/observe/lib/src/list_path_observer.dart
+++ /dev/null
@@ -1,73 +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 observe.src.list_path_observer;
-
-import 'dart:async';
-import 'package:observe/observe.dart';
-
-// Inspired by ArrayReduction at:
-// https://raw.github.com/rafaelw/ChangeSummary/master/util/array_reduction.js
-// The main difference is we support anything on the rich Dart Iterable API.
-
-/// Observes a path starting from each item in the list.
-@deprecated
-class ListPathObserver<E, P> extends ChangeNotifier {
-  final ObservableList<E> list;
-  final String _itemPath;
-  final List<PathObserver> _observers = <PathObserver>[];
-  StreamSubscription _sub;
-  bool _scheduled = false;
-  Iterable<P> _value;
-
-  ListPathObserver(this.list, String path)
-      : _itemPath = path {
-
-    // TODO(jmesserly): delay observation until we are observed.
-    _sub = list.listChanges.listen((records) {
-      for (var record in records) {
-        _observeItems(record.addedCount - record.removed.length);
-      }
-      _scheduleReduce(null);
-    });
-
-    _observeItems(list.length);
-    _reduce();
-  }
-
-  @reflectable Iterable<P> get value => _value;
-
-  void dispose() {
-    if (_sub != null) _sub.cancel();
-    _observers.forEach((o) => o.close());
-    _observers.clear();
-  }
-
-  void _reduce() {
-    _scheduled = false;
-    var newValue = _observers.map((o) => o.value);
-    _value = notifyPropertyChange(#value, _value, newValue);
-  }
-
-  void _scheduleReduce(_) {
-    if (_scheduled) return;
-    _scheduled = true;
-    scheduleMicrotask(_reduce);
-  }
-
-  void _observeItems(int lengthAdjust) {
-    if (lengthAdjust > 0) {
-      for (int i = 0; i < lengthAdjust; i++) {
-        int len = _observers.length;
-        var pathObs = new PathObserver(list, '[$len].$_itemPath');
-        pathObs.open(_scheduleReduce);
-        _observers.add(pathObs);
-      }
-    } else if (lengthAdjust < 0) {
-      for (int i = 0; i < -lengthAdjust; i++) {
-        _observers.removeLast().close();
-      }
-    }
-  }
-}
diff --git a/packages/observe/lib/src/messages.dart b/packages/observe/lib/src/messages.dart
deleted file mode 100644
index ed12162..0000000
--- a/packages/observe/lib/src/messages.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Contains all warning messages produced by the observe transformer.
-library observe.src.messages;
-
-import 'package:code_transformers/messages/messages.dart';
-
-const NO_OBSERVABLE_ON_LIBRARY = const MessageTemplate(
-    const MessageId('observe', 1),
-    '@observable on a library no longer has any effect. '
-    'Instead, annotate individual fields as @observable.',
-    '`@observable` not supported on libraries',
-    _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE);
-
-const NO_OBSERVABLE_ON_TOP_LEVEL = const MessageTemplate(
-    const MessageId('observe', 2),
-    'Top-level fields can no longer be observable. '
-    'Observable fields must be in observable objects.',
-    '`@observable` not supported on top-level fields',
-    _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE);
-
-const NO_OBSERVABLE_ON_CLASS = const MessageTemplate(
-    const MessageId('observe', 3),
-    '@observable on a class no longer has any effect. '
-    'Instead, annotate individual fields as @observable.',
-    '`@observable` not supported on classes',
-    _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE);
-
-const NO_OBSERVABLE_ON_STATIC_FIELD = const MessageTemplate(
-    const MessageId('observe', 4),
-    'Static fields can no longer be observable. '
-    'Observable fields must be in observable objects.',
-    '`@observable` not supported on static fields',
-    _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE);
-
-const REQUIRE_OBSERVABLE_INTERFACE = const MessageTemplate(
-    const MessageId('observe', 5),
-    'Observable fields must be in observable objects. '
-    'Change this class to extend, mix in, or implement Observable.',
-    '`@observable` field not in an `Observable` class',
-    _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE);
-
-const String _COMMON_MESSAGE_WHERE_TO_USE_OBSERVABLE = '''
-Only instance fields on `Observable` classes can be observable,
-and you must explicitly annotate each observable field as `@observable`.
-
-Support for using the `@observable` annotation in libraries, classes, and
-elsewhere is deprecated.
-''';
diff --git a/packages/observe/lib/src/metadata.dart b/packages/observe/lib/src/metadata.dart
deleted file mode 100644
index f128102..0000000
--- a/packages/observe/lib/src/metadata.dart
+++ /dev/null
@@ -1,52 +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 observe.src.metadata;
-
-/// Use `@observable` to make a field automatically observable, or to indicate
-/// that a property is observable. This only works on classes that extend or
-/// mix in `Observable`.
-const ObservableProperty observable = const ObservableProperty();
-
-/// An annotation that is used to make a property observable.
-/// Normally this is used via the [observable] constant, for example:
-///
-///     class Monster extends Observable {
-///       @observable int health;
-///     }
-///
-// TODO(sigmund): re-add this to the documentation when it's really true:
-//     If needed, you can subclass this to create another annotation that will
-//     also be treated as observable.
-// Note: observable properties imply reflectable.
-class ObservableProperty {
-  const ObservableProperty();
-}
-
-
-/// This can be used to retain any properties that you wish to access with
-/// Dart's mirror system. If you import `package:observe/mirrors_used.dart`, all
-/// classes or members annotated with `@reflectable` wil be preserved by dart2js
-/// during compilation.  This is necessary to make the member visible to
-/// `PathObserver`, or similar systems, once the code is deployed, if you are
-/// not doing a different kind of code-generation for your app. If you are using
-/// polymer, you most likely don't need to use this annotation anymore.
-const Reflectable reflectable = const Reflectable();
-
-/// An annotation that is used to make a type or member reflectable. This makes
-/// it available to `PathObserver` at runtime. For example:
-///
-///     @reflectable
-///     class Monster extends ChangeNotifier {
-///       int _health;
-///       int get health => _health;
-///       ...
-///     }
-///     ...
-///       // This will work even if the code has been tree-shaken/minified:
-///       final monster = new Monster();
-///       new PathObserver(monster, 'health').changes.listen(...);
-class Reflectable {
-  const Reflectable();
-}
diff --git a/packages/observe/lib/src/observable.dart b/packages/observe/lib/src/observable.dart
deleted file mode 100644
index eee62f2..0000000
--- a/packages/observe/lib/src/observable.dart
+++ /dev/null
@@ -1,169 +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 observe.src.observable;
-
-import 'dart:async';
-import 'dart:collection';
-
-import 'package:smoke/smoke.dart' as smoke;
-import 'package:observe/observe.dart';
-
-// Note: this is an internal library so we can import it from tests.
-// TODO(jmesserly): ideally we could import this with a prefix, but it caused
-// strange problems on the VM when I tested out the dirty-checking example
-// above.
-import 'dirty_check.dart';
-
-/// Represents an object with observable properties. This is used by data in
-/// model-view architectures to notify interested parties of [changes] to the
-/// object's properties (fields or getter/setter pairs).
-///
-/// The interface does not require any specific technique to implement
-/// observability. You can implement it in the following ways:
-///
-/// - extend or mixin this class, and let the application call [dirtyCheck]
-///   periodically to check for changes to your object.
-/// - extend or mixin [ChangeNotifier], and implement change notifications
-///   manually by calling [notifyPropertyChange] from your setters.
-/// - implement this interface and provide your own implementation.
-abstract class Observable {
-  /// Performs dirty checking of objects that inherit from [Observable].
-  /// This scans all observed objects using mirrors and determines if any fields
-  /// have changed. If they have, it delivers the changes for the object.
-  static void dirtyCheck() => dirtyCheckObservables();
-
-  StreamController _changes;
-
-  Map<Symbol, Object> _values;
-  List<ChangeRecord> _records;
-
-  /// The stream of change records to this object. Records will be delivered
-  /// asynchronously.
-  ///
-  /// [deliverChanges] can be called to force synchronous delivery.
-  Stream<List<ChangeRecord>> get changes {
-    if (_changes == null) {
-      _changes = new StreamController.broadcast(sync: true,
-          onListen: _observed, onCancel: _unobserved);
-    }
-    return _changes.stream;
-  }
-
-  /// True if this object has any observers, and should call
-  /// [notifyChange] for changes.
-  bool get hasObservers => _changes != null && _changes.hasListener;
-
-  void _observed() {
-    // Register this object for dirty checking purposes.
-    registerObservable(this);
-
-    var values = new Map<Symbol, Object>();
-
-    // Note: we scan for @observable regardless of whether the base type
-    // actually includes this mixin. While perhaps too inclusive, it lets us
-    // avoid complex logic that walks "with" and "implements" clauses.
-    var queryOptions = new smoke.QueryOptions(includeInherited: true,
-        includeProperties: false, withAnnotations: const [ObservableProperty]);
-    for (var decl in smoke.query(this.runtimeType, queryOptions)) {
-      var name = decl.name;
-      // Note: since this is a field, getting the value shouldn't execute
-      // user code, so we don't need to worry about errors.
-      values[name] = smoke.read(this, name);
-    }
-
-    _values = values;
-  }
-
-  /// Release data associated with observation.
-  void _unobserved() {
-    // Note: we don't need to explicitly unregister from the dirty check list.
-    // This will happen automatically at the next call to dirtyCheck.
-    if (_values != null) {
-      _values = null;
-    }
-  }
-
-  /// Synchronously deliver pending [changes]. Returns true if any records were
-  /// delivered, otherwise false.
-  // TODO(jmesserly): this is a bit different from the ES Harmony version, which
-  // allows delivery of changes to a particular observer:
-  // http://wiki.ecmascript.org/doku.php?id=harmony:observe#object.deliverchangerecords
-  //
-  // The rationale for that, and for async delivery in general, is the principal
-  // that you shouldn't run code (observers) when it doesn't expect to be run.
-  // If you do that, you risk violating invariants that the code assumes.
-  //
-  // For this reason, we need to match the ES Harmony version. The way we can do
-  // this in Dart is to add a method on StreamSubscription (possibly by
-  // subclassing Stream* types) that immediately delivers records for only
-  // that subscription. Alternatively, we could consider using something other
-  // than Stream to deliver the multicast change records, and provide an
-  // Observable->Stream adapter.
-  //
-  // Also: we should be delivering changes to the observer (subscription) based
-  // on the birth order of the observer. This is for compatibility with ES
-  // Harmony as well as predictability for app developers.
-  bool deliverChanges() {
-    if (_values == null || !hasObservers) return false;
-
-    // Start with manually notified records (computed properties, etc),
-    // then scan all fields for additional changes.
-    List records = _records;
-    _records = null;
-
-    _values.forEach((name, oldValue) {
-      var newValue = smoke.read(this, name);
-      if (oldValue != newValue) {
-        if (records == null) records = [];
-        records.add(new PropertyChangeRecord(this, name, oldValue, newValue));
-        _values[name] = newValue;
-      }
-    });
-
-    if (records == null) return false;
-
-    _changes.add(new UnmodifiableListView<ChangeRecord>(records));
-    return true;
-  }
-
-  /// Notify that the field [name] of this object has been changed.
-  ///
-  /// The [oldValue] and [newValue] are also recorded. If the two values are
-  /// equal, no change will be recorded.
-  ///
-  /// For convenience this returns [newValue].
-  notifyPropertyChange(Symbol field, Object oldValue, Object newValue)
-      => notifyPropertyChangeHelper(this, field, oldValue, newValue);
-
-  /// Notify observers of a change.
-  ///
-  /// For most objects [Observable.notifyPropertyChange] is more convenient, but
-  /// collections sometimes deliver other types of changes such as a
-  /// [ListChangeRecord].
-  ///
-  /// Notes:
-  /// - This is *not* required for fields if you mixin or extend [Observable],
-  ///   but you can use it for computed properties.
-  /// - Unlike [ChangeNotifier] this will not schedule [deliverChanges]; use
-  ///   [Observable.dirtyCheck] instead.
-  void notifyChange(ChangeRecord record) {
-    if (!hasObservers) return;
-
-    if (_records == null) _records = [];
-    _records.add(record);
-  }
-}
-
-// TODO(jmesserly): remove the instance method and make this top-level method
-// public instead?
-// NOTE: this is not exported publically.
-notifyPropertyChangeHelper(Observable obj, Symbol field, Object oldValue,
-    Object newValue) {
-
-  if (obj.hasObservers && oldValue != newValue) {
-    obj.notifyChange(new PropertyChangeRecord(obj, field, oldValue, newValue));
-  }
-  return newValue;
-}
diff --git a/packages/observe/lib/src/observable_box.dart b/packages/observe/lib/src/observable_box.dart
deleted file mode 100644
index dfaf7ff..0000000
--- a/packages/observe/lib/src/observable_box.dart
+++ /dev/null
@@ -1,27 +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 observe.src.observable_box;
-
-import 'package:observe/observe.dart';
-
-// TODO(jmesserly): should the property name be configurable?
-// That would be more convenient.
-/// An observable box that holds a value. Use this if you want to store a single
-/// value. For other cases, it is better to use [ObservableList],
-/// [ObservableMap], or a custom [Observable] implementation based on
-/// [Observable]. The property name for changes is "value".
-class ObservableBox<T> extends ChangeNotifier {
-  T _value;
-
-  ObservableBox([T initialValue]) : _value = initialValue;
-
-  @reflectable T get value => _value;
-
-  @reflectable void set value(T newValue) {
-    _value = notifyPropertyChange(#value, _value, newValue);
-  }
-
-  String toString() => '#<$runtimeType value: $value>';
-}
diff --git a/packages/observe/lib/src/observer_transform.dart b/packages/observe/lib/src/observer_transform.dart
deleted file mode 100644
index 7fab555..0000000
--- a/packages/observe/lib/src/observer_transform.dart
+++ /dev/null
@@ -1,85 +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 observe.src.observer_transform;
-
-import 'package:observe/observe.dart';
-
-/// ObserverTransform is used to dynamically transform observed value(s).
-///
-///    var obj = new ObservableBox(10);
-///    var observer = new PathObserver(obj, 'value');
-///    var transform = new ObserverTransform(observer,
-///        (x) => x * 2, setValue: (x) => x ~/ 2);
-///
-///    // Open returns the current value of 20.
-///    transform.open((newValue) => print('new: $newValue'));
-///
-///    obj.value = 20; // prints 'new: 40' async
-///    new Future(() {
-///      transform.value = 4; // obj.value will be 2
-///    });
-///
-/// ObserverTransform can also be used to reduce a set of observed values to a
-/// single value:
-///
-///    var obj = new ObservableMap.from({'a': 1, 'b': 2, 'c': 3});
-///    var observer = new CompoundObserver()
-///      ..addPath(obj, 'a')
-///      ..addPath(obj, 'b')
-///      ..addPath(obj, 'c');
-///
-///    var transform = new ObserverTransform(observer,
-///        (values) => values.fold(0, (x, y) => x + y));
-///
-///    // Open returns the current value of 6.
-///    transform.open((newValue) => print('new: $newValue'));
-///
-///    obj['a'] = 2;
-///    obj['c'] = 10; // will print 'new 14' asynchronously
-///
-class ObserverTransform extends Bindable {
-  Bindable _bindable;
-  Function _getTransformer, _setTransformer;
-  Function _notifyCallback;
-  var _value;
-
-  ObserverTransform(Bindable bindable, computeValue(value), {setValue(value)})
-      : _bindable = bindable,
-        _getTransformer = computeValue,
-        _setTransformer = setValue;
-
-  open(callback) {
-    _notifyCallback = callback;
-    _value = _getTransformer(_bindable.open(_observedCallback));
-    return _value;
-  }
-
-  _observedCallback(newValue) {
-    final value = _getTransformer(newValue);
-    if (value == _value) return null;
-    _value = value;
-    return _notifyCallback(value);
-  }
-
-  void close() {
-    if (_bindable != null) _bindable.close();
-    _bindable = null;
-    _getTransformer = null;
-    _setTransformer = null;
-    _notifyCallback = null;
-    _value = null;
-  }
-
-  get value => _value = _getTransformer(_bindable.value);
-
-  set value(newValue) {
-    if (_setTransformer != null) {
-      newValue = _setTransformer(newValue);
-    }
-    _bindable.value = newValue;
-  }
-
-  deliver() => _bindable.deliver();
-}
diff --git a/packages/observe/lib/src/path_observer.dart b/packages/observe/lib/src/path_observer.dart
deleted file mode 100644
index 76eb9ef..0000000
--- a/packages/observe/lib/src/path_observer.dart
+++ /dev/null
@@ -1,929 +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 observe.src.path_observer;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:math' show min;
-
-import 'package:logging/logging.dart' show Logger, Level;
-import 'package:observe/observe.dart';
-import 'package:smoke/smoke.dart' as smoke;
-
-import 'package:utf/utf.dart' show stringToCodepoints;
-
-/// A data-bound path starting from a view-model or model object, for example
-/// `foo.bar.baz`.
-///
-/// When [open] is called, this will observe changes to the object and any
-/// intermediate object along the path, and send updated values accordingly.
-/// When [close] is called it will stop observing the objects.
-///
-/// This class is used to implement `Node.bind` and similar functionality in
-/// the [template_binding](pub.dartlang.org/packages/template_binding) package.
-class PathObserver extends _Observer implements Bindable {
-  PropertyPath _path;
-  Object _object;
-  _ObservedSet _directObserver;
-
-  /// Observes [path] on [object] for changes. This returns an object
-  /// that can be used to get the changes and get/set the value at this path.
-  ///
-  /// The path can be a [PropertyPath], or a [String] used to construct it.
-  ///
-  /// See [open] and [value].
-  PathObserver(Object object, [path])
-      : _object = object,
-        _path = new PropertyPath(path);
-
-  PropertyPath get path => _path;
-
-  /// Sets the value at this path.
-  void set value(newValue) {
-    if (_path != null) _path.setValueFrom(_object, newValue);
-  }
-
-  int get _reportArgumentCount => 2;
-
-  /// Initiates observation and returns the initial value.
-  /// The callback will be passed the updated [value], and may optionally be
-  /// declared to take a second argument, which will contain the previous value.
-  open(callback) => super.open(callback);
-
-  void _connect() {
-    _directObserver = new _ObservedSet(this, _object);
-    _check(skipChanges: true);
-  }
-
-  void _disconnect() {
-    _value = null;
-    if (_directObserver != null) {
-      _directObserver.close(this);
-      _directObserver = null;
-    }
-    // Dart note: the JS impl does not do this, but it seems consistent with
-    // CompoundObserver. After closing the PathObserver can't be reopened.
-    _path = null;
-    _object = null;
-  }
-
-  void _iterateObjects(void observe(obj, prop)) {
-    _path._iterateObjects(_object, observe);
-  }
-
-  bool _check({bool skipChanges: false}) {
-    var oldValue = _value;
-    _value = _path.getValueFrom(_object);
-    if (skipChanges || _value == oldValue) return false;
-
-    _report(_value, oldValue, this);
-    return true;
-  }
-}
-
-/// A dot-delimieted property path such as "foo.bar" or "foo.10.bar".
-///
-/// The path specifies how to get a particular value from an object graph, where
-/// the graph can include arrays and maps. Each segment of the path describes
-/// how to take a single step in the object graph. Properties like 'foo' or
-/// 'bar' are read as properties on objects, or as keys if the object is a [Map]
-/// or a [Indexable], while integer values are read as indexes in a [List].
-// TODO(jmesserly): consider specialized subclasses for:
-// * empty path
-// * "value"
-// * single token in path, e.g. "foo"
-class PropertyPath {
-  /// The segments of the path.
-  final List<Object> _segments;
-
-  /// Creates a new [PropertyPath]. These can be stored to avoid excessive
-  /// parsing of path strings.
-  ///
-  /// The provided [path] should be a String or a List. If it is a list it
-  /// should contain only Symbols and integers. This can be used to avoid
-  /// parsing.
-  ///
-  /// Note that this constructor will canonicalize identical paths in some cases
-  /// to save memory, but this is not guaranteed. Use [==] for comparions
-  /// purposes instead of [identical].
-  // Dart note: this is ported from `function getPath`.
-  factory PropertyPath([path]) {
-    if (path is PropertyPath) return path;
-    if (path == null || (path is List && path.isEmpty)) path = '';
-
-    if (path is List) {
-      var copy = new List.from(path, growable: false);
-      for (var segment in copy) {
-        // Dart note: unlike Javascript, we don't support arbitraty objects that
-        // can be converted to a String.
-        // TODO(sigmund): consider whether we should support that here. It might
-        // be easier to add support for that if we switch first to use strings
-        // for everything instead of symbols.
-        if (segment is! int && segment is! String && segment is! Symbol) {
-          throw new ArgumentError(
-              'List must contain only ints, Strings, and Symbols');
-        }
-      }
-      return new PropertyPath._(copy);
-    }
-
-    var pathObj = _pathCache[path];
-    if (pathObj != null) return pathObj;
-
-
-    final segments = new _PathParser().parse(path);
-    if (segments == null) return _InvalidPropertyPath._instance;
-
-    // TODO(jmesserly): we could use an UnmodifiableListView here, but that adds
-    // memory overhead.
-    pathObj = new PropertyPath._(segments.toList(growable: false));
-    if (_pathCache.length >= _pathCacheLimit) {
-      _pathCache.remove(_pathCache.keys.first);
-    }
-    _pathCache[path] = pathObj;
-    return pathObj;
-  }
-
-  PropertyPath._(this._segments);
-
-  int get length => _segments.length;
-  bool get isEmpty => _segments.isEmpty;
-  bool get isValid => true;
-
-  String toString() {
-    if (!isValid) return '<invalid path>';
-    var sb = new StringBuffer();
-    bool first = true;
-    for (var key in _segments) {
-      if (key is Symbol) {
-        if (!first) sb.write('.');
-        sb.write(smoke.symbolToName(key));
-      } else {
-        _formatAccessor(sb, key);
-      }
-      first = false;
-    }
-    return sb.toString();
-  }
-
-  _formatAccessor(StringBuffer sb, Object key) {
-    if (key is int) {
-      sb.write('[$key]');
-    } else {
-      sb.write('["${key.toString().replaceAll('"', '\\"')}"]');
-    }
-  }
-
-  bool operator ==(other) {
-    if (identical(this, other)) return true;
-    if (other is! PropertyPath) return false;
-    if (isValid != other.isValid) return false;
-
-    int len = _segments.length;
-    if (len != other._segments.length) return false;
-    for (int i = 0; i < len; i++) {
-      if (_segments[i] != other._segments[i]) return false;
-    }
-    return true;
-  }
-
-  /// This is the [Jenkins hash function][1] but using masking to keep
-  /// values in SMI range.
-  /// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
-  // TODO(jmesserly): should reuse this instead, see
-  // https://code.google.com/p/dart/issues/detail?id=11617
-  int get hashCode {
-    int hash = 0;
-    for (int i = 0, len = _segments.length; i < len; i++) {
-      hash = 0x1fffffff & (hash + _segments[i].hashCode);
-      hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-      hash = hash ^ (hash >> 6);
-    }
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
-    hash = hash ^ (hash >> 11);
-    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-  }
-
-  /// Returns the current value of the path from the provided [obj]ect.
-  getValueFrom(Object obj) {
-    if (!isValid) return null;
-    for (var segment in _segments) {
-      if (obj == null) return null;
-      obj = _getObjectProperty(obj, segment);
-    }
-    return obj;
-  }
-
-  /// Attempts to set the [value] of the path from the provided [obj]ect.
-  /// Returns true if and only if the path was reachable and set.
-  bool setValueFrom(Object obj, Object value) {
-    var end = _segments.length - 1;
-    if (end < 0) return false;
-    for (int i = 0; i < end; i++) {
-      if (obj == null) return false;
-      obj = _getObjectProperty(obj, _segments[i]);
-    }
-    return _setObjectProperty(obj, _segments[end], value);
-  }
-
-  void _iterateObjects(Object obj, void observe(obj, prop)) {
-    if (!isValid || isEmpty) return;
-
-    int i = 0, last = _segments.length - 1;
-    while (obj != null) {
-      // _segments[i] is passed to indicate that we are only observing that
-      // property of obj. See observe declaration in _ObservedSet.
-      observe(obj, _segments[i]);
-
-      if (i >= last) break;
-      obj = _getObjectProperty(obj, _segments[i++]);
-    }
-  }
-
-  // Dart note: it doesn't make sense to have compiledGetValueFromFn in Dart.
-}
-
-
-/// Visible only for testing:
-getSegmentsOfPropertyPathForTesting(p) => p._segments;
-
-class _InvalidPropertyPath extends PropertyPath {
-  static final _instance = new _InvalidPropertyPath();
-
-  bool get isValid => false;
-  _InvalidPropertyPath() : super._([]);
-}
-
-bool _changeRecordMatches(record, key) {
-  if (record is PropertyChangeRecord) {
-    return (record as PropertyChangeRecord).name == key;
-  }
-  if (record is MapChangeRecord) {
-    if (key is Symbol) key = smoke.symbolToName(key);
-    return (record as MapChangeRecord).key == key;
-  }
-  return false;
-}
-
-/// Properties in [Map] that need to be read as properties and not as keys in
-/// the map. We exclude methods ('containsValue', 'containsKey', 'putIfAbsent',
-/// 'addAll', 'remove', 'clear', 'forEach') because there is no use in reading
-/// them as part of path-observer segments.
-const _MAP_PROPERTIES = const [#keys, #values, #length, #isEmpty, #isNotEmpty];
-
-_getObjectProperty(object, property) {
-  if (object == null) return null;
-
-  if (property is int) {
-    if (object is List && property >= 0 && property < object.length) {
-      return object[property];
-    }
-  } else if (property is String) {
-    return object[property];
-  } else if (property is Symbol) {
-    // Support indexer if available, e.g. Maps or polymer_expressions Scope.
-    // This is the default syntax used by polymer/nodebind and
-    // polymer/observe-js PathObserver.
-    // TODO(sigmund): should we also support using checking dynamically for
-    // whether the type practically implements the indexer API
-    // (smoke.hasInstanceMethod(type, const Symbol('[]')))?
-    if (object is Indexable || object is Map && !_MAP_PROPERTIES.contains(property)) {
-      return object[smoke.symbolToName(property)];
-    }
-    try {
-      return smoke.read(object, property);
-    } on NoSuchMethodError catch (e) {
-      // Rethrow, unless the type implements noSuchMethod, in which case we
-      // interpret the exception as a signal that the method was not found.
-      // Dart note: getting invalid properties is an error, unlike in JS where
-      // it returns undefined.
-      if (!smoke.hasNoSuchMethod(object.runtimeType)) rethrow;
-    }
-  }
-
-  if (_logger.isLoggable(Level.FINER)) {
-    _logger.finer("can't get $property in $object");
-  }
-  return null;
-}
-
-bool _setObjectProperty(object, property, value) {
-  if (object == null) return false;
-
-  if (property is int) {
-    if (object is List && property >= 0 && property < object.length) {
-      object[property] = value;
-      return true;
-    }
-  } else if (property is Symbol) {
-    // Support indexer if available, e.g. Maps or polymer_expressions Scope.
-    if (object is Indexable || object is Map && !_MAP_PROPERTIES.contains(property)) {
-      object[smoke.symbolToName(property)] = value;
-      return true;
-    }
-    try {
-      smoke.write(object, property, value);
-      return true;
-    } on NoSuchMethodError catch (e, s) {
-      if (!smoke.hasNoSuchMethod(object.runtimeType)) rethrow;
-    }
-  }
-
-  if (_logger.isLoggable(Level.FINER)) {
-    _logger.finer("can't set $property in $object");
-  }
-  return false;
-}
-
-// From: https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
-
-final _identRegExp = () {
-  const identStart = '[\$_a-zA-Z]';
-  const identPart = '[\$_a-zA-Z0-9]';
-  return new RegExp('^$identStart+$identPart*\$');
-}();
-
-_isIdent(s) => _identRegExp.hasMatch(s);
-
-// Dart note: refactored to convert to codepoints once and operate on codepoints
-// rather than characters.
-class _PathParser {
-  List keys = [];
-  int index = -1;
-  String key;
-
-  final Map<String, List<String>> _pathStateMachine = {
-    'beforePath': {
-      'ws': ['beforePath'],
-      'ident': ['inIdent', 'append'],
-      '[': ['beforeElement'],
-      'eof': ['afterPath']
-    },
-
-    'inPath': {
-      'ws': ['inPath'],
-      '.': ['beforeIdent'],
-      '[': ['beforeElement'],
-      'eof': ['afterPath']
-    },
-
-    'beforeIdent': {
-      'ws': ['beforeIdent'],
-      'ident': ['inIdent', 'append']
-    },
-
-    'inIdent': {
-      'ident': ['inIdent', 'append'],
-      '0': ['inIdent', 'append'],
-      'number': ['inIdent', 'append'],
-      'ws': ['inPath', 'push'],
-      '.': ['beforeIdent', 'push'],
-      '[': ['beforeElement', 'push'],
-      'eof': ['afterPath', 'push']
-    },
-
-    'beforeElement': {
-      'ws': ['beforeElement'],
-      '0': ['afterZero', 'append'],
-      'number': ['inIndex', 'append'],
-      "'": ['inSingleQuote', 'append', ''],
-      '"': ['inDoubleQuote', 'append', '']
-    },
-
-    'afterZero': {
-      'ws': ['afterElement', 'push'],
-      ']': ['inPath', 'push']
-    },
-
-    'inIndex': {
-      '0': ['inIndex', 'append'],
-      'number': ['inIndex', 'append'],
-      'ws': ['afterElement'],
-      ']': ['inPath', 'push']
-    },
-
-    'inSingleQuote': {
-      "'": ['afterElement'],
-      'eof': ['error'],
-      'else': ['inSingleQuote', 'append']
-    },
-
-    'inDoubleQuote': {
-      '"': ['afterElement'],
-      'eof': ['error'],
-      'else': ['inDoubleQuote', 'append']
-    },
-
-    'afterElement': {
-      'ws': ['afterElement'],
-      ']': ['inPath', 'push']
-    }
-  };
-
-  /// From getPathCharType: determines the type of a given [code]point.
-  String _getPathCharType(code) {
-    if (code == null) return 'eof';
-    switch(code) {
-      case 0x5B: // [
-      case 0x5D: // ]
-      case 0x2E: // .
-      case 0x22: // "
-      case 0x27: // '
-      case 0x30: // 0
-        return _char(code);
-
-      case 0x5F: // _
-      case 0x24: // $
-        return 'ident';
-
-      case 0x20: // Space
-      case 0x09: // Tab
-      case 0x0A: // Newline
-      case 0x0D: // Return
-      case 0xA0:  // No-break space
-      case 0xFEFF:  // Byte Order Mark
-      case 0x2028:  // Line Separator
-      case 0x2029:  // Paragraph Separator
-        return 'ws';
-    }
-
-    // a-z, A-Z
-    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
-      return 'ident';
-
-    // 1-9
-    if (0x31 <= code && code <= 0x39)
-      return 'number';
-
-    return 'else';
-  }
-
-  static String _char(int codepoint) => new String.fromCharCodes([codepoint]);
-
-  void push() {
-    if (key == null) return;
-
-    // Dart note: we store the keys with different types, rather than
-    // parsing/converting things later in toString.
-    if (_isIdent(key)) {
-      keys.add(smoke.nameToSymbol(key));
-    } else {
-      var index = int.parse(key, radix: 10, onError: (_) => null);
-      keys.add(index != null ? index : key);
-    }
-    key = null;
-  }
-
-  void append(newChar) {
-    key = (key == null) ? newChar : '$key$newChar';
-  }
-
-  bool _maybeUnescapeQuote(String mode, codePoints) {
-    if (index >= codePoints.length) return false;
-    var nextChar = _char(codePoints[index + 1]);
-    if ((mode == 'inSingleQuote' && nextChar == "'") ||
-        (mode == 'inDoubleQuote' && nextChar == '"')) {
-      index++;
-      append(nextChar);
-      return true;
-    }
-    return false;
-  }
-
-  /// Returns the parsed keys, or null if there was a parse error.
-  List<String> parse(String path) {
-    var codePoints = stringToCodepoints(path);
-    var mode = 'beforePath';
-
-    while (mode != null) {
-      index++;
-      var c = index >= codePoints.length ? null : codePoints[index];
-
-      if (c != null &&
-          _char(c) == '\\' && _maybeUnescapeQuote(mode, codePoints)) continue;
-
-      var type = _getPathCharType(c);
-      if (mode == 'error') return null;
-
-      var typeMap = _pathStateMachine[mode];
-      var transition = typeMap[type];
-      if (transition == null) transition = typeMap['else'];
-      if (transition == null) return null; // parse error;
-
-      mode = transition[0];
-      var actionName = transition.length > 1 ? transition[1] : null;
-      if (actionName == 'push' && key != null) push();
-      if (actionName == 'append') {
-        var newChar = transition.length > 2 && transition[2] != null
-            ? transition[2] : _char(c);
-        append(newChar);
-      }
-
-      if (mode == 'afterPath') return keys;
-    }
-    return null; // parse error
-  }
-}
-
-final Logger _logger = new Logger('observe.PathObserver');
-
-
-/// This is a simple cache. It's like LRU but we don't update an item on a
-/// cache hit, because that would require allocation. Better to let it expire
-/// and reallocate the PropertyPath.
-// TODO(jmesserly): this optimization is from observe-js, how valuable is it in
-// practice?
-final _pathCache = new LinkedHashMap<String, PropertyPath>();
-
-/// The size of a path like "foo.bar" is approximately 160 bytes, so this
-/// reserves ~16Kb of memory for recently used paths. Since paths are frequently
-/// reused, the theory is that this ends up being a good tradeoff in practice.
-// (Note: the 160 byte estimate is from Dart VM 1.0.0.10_r30798 on x64 without
-// using UnmodifiableListView in PropertyPath)
-const int _pathCacheLimit = 100;
-
-/// [CompoundObserver] is a [Bindable] object which knows how to listen to
-/// multiple values (registered via [addPath] or [addObserver]) and invoke a
-/// callback when one or more of the values have changed.
-///
-///    var obj = new ObservableMap.from({'a': 1, 'b': 2});
-///    var otherObj = new ObservableMap.from({'c': 3});
-///
-///    var observer = new CompoundObserver()
-///      ..addPath(obj, 'a');
-///      ..addObserver(new PathObserver(obj, 'b'));
-///      ..addPath(otherObj, 'c');
-///      ..open((values) {
-///        for (int i = 0; i < values.length; i++) {
-///          print('The value at index $i is now ${values[i]}');
-///        }
-///      });
-///
-///   obj['a'] = 10; // print will be triggered async
-///
-class CompoundObserver extends _Observer implements Bindable {
-  _ObservedSet _directObserver;
-  bool _reportChangesOnOpen;
-  List _observed = [];
-
-  CompoundObserver([this._reportChangesOnOpen = false]) {
-    _value = [];
-  }
-
-  int get _reportArgumentCount => 3;
-
-  /// Initiates observation and returns the initial value.
-  /// The callback will be passed the updated [value], and may optionally be
-  /// declared to take a second argument, which will contain the previous value.
-  ///
-  /// Implementation note: a third argument can also be declared, which will
-  /// receive a list of objects and paths, such that `list[2 * i]` will access
-  /// the object and `list[2 * i + 1]` will access the path, where `i` is the
-  /// order of the [addPath] call. This parameter is only used by
-  /// `package:polymer` as a performance optimization, and should not be relied
-  /// on in new code.
-  open(callback) => super.open(callback);
-
-  void _connect() {
-    for (var i = 0; i < _observed.length; i += 2) {
-      var object = _observed[i];
-      if (!identical(object, _observerSentinel)) {
-        _directObserver = new _ObservedSet(this, object);
-        break;
-      }
-    }
-
-    _check(skipChanges: !_reportChangesOnOpen);
-  }
-
-  void _disconnect() {
-    for (var i = 0; i < _observed.length; i += 2) {
-      if (identical(_observed[i], _observerSentinel)) {
-        _observed[i + 1].close();
-      }
-    }
-
-    _observed = null;
-    _value = null;
-
-    if (_directObserver != null) {
-      _directObserver.close(this);
-      _directObserver = null;
-    }
-  }
-
-  /// Adds a dependency on the property [path] accessed from [object].
-  /// [path] can be a [PropertyPath] or a [String]. If it is omitted an empty
-  /// path will be used.
-  void addPath(Object object, [path]) {
-    if (_isOpen || _isClosed) {
-      throw new StateError('Cannot add paths once started.');
-    }
-
-    path = new PropertyPath(path);
-    _observed..add(object)..add(path);
-    if (!_reportChangesOnOpen) return;
-    _value.add(path.getValueFrom(object));
-  }
-
-  void addObserver(Bindable observer) {
-    if (_isOpen || _isClosed) {
-      throw new StateError('Cannot add observers once started.');
-    }
-
-    _observed..add(_observerSentinel)..add(observer);
-    if (!_reportChangesOnOpen) return;
-    _value.add(observer.open((_) => deliver()));
-  }
-
-  void _iterateObjects(void observe(obj, prop)) {
-    for (var i = 0; i < _observed.length; i += 2) {
-      var object = _observed[i];
-      if (!identical(object, _observerSentinel)) {
-        (_observed[i + 1] as PropertyPath)._iterateObjects(object, observe);
-      }
-    }
-  }
-
-  bool _check({bool skipChanges: false}) {
-    bool changed = false;
-    _value.length = _observed.length ~/ 2;
-    var oldValues = null;
-    for (var i = 0; i < _observed.length; i += 2) {
-      var object = _observed[i];
-      var path = _observed[i + 1];
-      var value;
-      if (identical(object, _observerSentinel)) {
-        var observable = path as Bindable;
-        value = _state == _Observer._UNOPENED ?
-            observable.open((_) => this.deliver()) :
-            observable.value;
-      } else {
-        value = (path as PropertyPath).getValueFrom(object);
-      }
-
-      if (skipChanges) {
-        _value[i ~/ 2] = value;
-        continue;
-      }
-
-      if (value == _value[i ~/ 2]) continue;
-
-      // don't allocate this unless necessary.
-      if (_notifyArgumentCount >= 2) {
-        if (oldValues == null) oldValues = new Map();
-        oldValues[i ~/ 2] = _value[i ~/ 2];
-      }
-
-      changed = true;
-      _value[i ~/ 2] = value;
-    }
-
-    if (!changed) return false;
-
-    // TODO(rafaelw): Having _observed as the third callback arg here is
-    // pretty lame API. Fix.
-    _report(_value, oldValues, _observed);
-    return true;
-  }
-}
-
-/// An object accepted by [PropertyPath] where properties are read and written
-/// as indexing operations, just like a [Map].
-abstract class Indexable<K, V> {
-  V operator [](K key);
-  operator []=(K key, V value);
-}
-
-const _observerSentinel = const _ObserverSentinel();
-class _ObserverSentinel { const _ObserverSentinel(); }
-
-// Visible for testing
-get observerSentinelForTesting => _observerSentinel;
-
-// A base class for the shared API implemented by PathObserver and
-// CompoundObserver and used in _ObservedSet.
-abstract class _Observer extends Bindable {
-  Function _notifyCallback;
-  int _notifyArgumentCount;
-  var _value;
-
-  // abstract members
-  void _iterateObjects(void observe(obj, prop));
-  void _connect();
-  void _disconnect();
-  bool _check({bool skipChanges: false});
-
-  static int _UNOPENED = 0;
-  static int _OPENED = 1;
-  static int _CLOSED = 2;
-  int _state = _UNOPENED;
-  bool get _isOpen => _state == _OPENED;
-  bool get _isClosed => _state == _CLOSED;
-
-  /// The number of arguments the subclass will pass to [_report].
-  int get _reportArgumentCount;
-
-  open(callback) {
-    if (_isOpen || _isClosed) {
-      throw new StateError('Observer has already been opened.');
-    }
-
-    if (smoke.minArgs(callback) > _reportArgumentCount) {
-      throw new ArgumentError('callback should take $_reportArgumentCount or '
-          'fewer arguments');
-    }
-
-    _notifyCallback = callback;
-    _notifyArgumentCount = min(_reportArgumentCount, smoke.maxArgs(callback));
-
-    _connect();
-    _state = _OPENED;
-    return _value;
-  }
-
-  get value => _discardChanges();
-
-  void close() {
-    if (!_isOpen) return;
-
-    _disconnect();
-    _value = null;
-    _notifyCallback = null;
-    _state = _CLOSED;
-  }
-
-  _discardChanges() {
-    _check(skipChanges: true);
-    return _value;
-  }
-
-  void deliver() {
-    if (_isOpen) _dirtyCheck();
-  }
-
-  bool _dirtyCheck() {
-    var cycles = 0;
-    while (cycles < _MAX_DIRTY_CHECK_CYCLES && _check()) {
-      cycles++;
-    }
-    return cycles > 0;
-  }
-
-  void _report(newValue, oldValue, [extraArg]) {
-    try {
-      switch (_notifyArgumentCount) {
-        case 0: _notifyCallback(); break;
-        case 1: _notifyCallback(newValue); break;
-        case 2: _notifyCallback(newValue, oldValue); break;
-        case 3: _notifyCallback(newValue, oldValue, extraArg); break;
-      }
-    } catch (e, s) {
-      // Deliver errors async, so if a single callback fails it doesn't prevent
-      // other things from working.
-      new Completer().completeError(e, s);
-    }
-  }
-}
-
-/// The observedSet abstraction is a perf optimization which reduces the total
-/// number of Object.observe observations of a set of objects. The idea is that
-/// groups of Observers will have some object dependencies in common and this
-/// observed set ensures that each object in the transitive closure of
-/// dependencies is only observed once. The observedSet acts as a write barrier
-/// such that whenever any change comes through, all Observers are checked for
-/// changed values.
-///
-/// Note that this optimization is explicitly moving work from setup-time to
-/// change-time.
-///
-/// TODO(rafaelw): Implement "garbage collection". In order to move work off
-/// the critical path, when Observers are closed, their observed objects are
-/// not Object.unobserve(d). As a result, it's possible that if the observedSet
-/// is kept open, but some Observers have been closed, it could cause "leaks"
-/// (prevent otherwise collectable objects from being collected). At some
-/// point, we should implement incremental "gc" which keeps a list of
-/// observedSets which may need clean-up and does small amounts of cleanup on a
-/// timeout until all is clean.
-class _ObservedSet {
-  /// To prevent sequential [PathObserver]s and [CompoundObserver]s from
-  /// observing the same object, we check if they are observing the same root
-  /// as the most recently created observer, and if so merge it into the
-  /// existing _ObservedSet.
-  ///
-  /// See <https://github.com/Polymer/observe-js/commit/f0990b1> and
-  /// <https://codereview.appspot.com/46780044/>.
-  static _ObservedSet _lastSet;
-
-  /// The root object for a [PathObserver]. For a [CompoundObserver], the root
-  /// object of the first path observed. This is used by the constructor to
-  /// reuse an [_ObservedSet] that starts from the same object.
-  Object _rootObject;
-
-  /// Subset of properties in [_rootObject] that we care about.
-  Set _rootObjectProperties;
-
-  /// Observers associated with this root object, in birth order.
-  final List<_Observer> _observers = [];
-
-  // Dart note: the JS implementation is O(N^2) because Array.indexOf is used
-  // for lookup in this array. We use HashMap to avoid this problem. It
-  // also gives us a nice way of tracking the StreamSubscription.
-  Map<Object, StreamSubscription> _objects;
-
-  factory _ObservedSet(_Observer observer, Object rootObject) {
-    if (_lastSet == null || !identical(_lastSet._rootObject, rootObject)) {
-      _lastSet = new _ObservedSet._(rootObject);
-    }
-    _lastSet.open(observer, rootObject);
-    return _lastSet;
-  }
-
-  _ObservedSet._(rootObject)
-      : _rootObject = rootObject,
-        _rootObjectProperties = rootObject == null ? null : new Set();
-
-  void open(_Observer obs, Object rootObject) {
-    if (_rootObject == null) {
-      _rootObject = rootObject;
-      _rootObjectProperties = new Set();
-    }
-
-    _observers.add(obs);
-    obs._iterateObjects(observe);
-  }
-
-  void close(_Observer obs) {
-    _observers.remove(obs);
-    if (_observers.isNotEmpty) return;
-
-    if (_objects != null) {
-      for (var sub in _objects.values) sub.cancel();
-      _objects = null;
-    }
-    _rootObject = null;
-    _rootObjectProperties = null;
-    if (identical(_lastSet, this)) _lastSet = null;
-  }
-
-  /// Observe now takes a second argument to indicate which property of an
-  /// object is being observed, so we don't trigger change notifications on
-  /// changes to unrelated properties.
-  void observe(Object obj, Object prop) {
-    if (identical(obj, _rootObject)) _rootObjectProperties.add(prop);
-    if (obj is ObservableList) _observeStream(obj.listChanges);
-    if (obj is Observable) _observeStream(obj.changes);
-  }
-
-  void _observeStream(Stream stream) {
-    // TODO(jmesserly): we hash on streams as we have two separate change
-    // streams for ObservableList. Not sure if that is the design we will use
-    // going forward.
-
-    if (_objects == null) _objects = new HashMap();
-    if (!_objects.containsKey(stream)) {
-      _objects[stream] = stream.listen(_callback);
-    }
-  }
-
-  /// Whether we can ignore all change events in [records]. This is true if all
-  /// records are for properties in the [_rootObject] and we are not observing
-  /// any of those properties. Changes on objects other than [_rootObject], or
-  /// changes for properties in [_rootObjectProperties] can't be ignored.
-  // Dart note: renamed from `allRootObjNonObservedProps` in the JS code.
-  bool _canIgnoreRecords(List<ChangeRecord> records) {
-    for (var rec in records) {
-      if (rec is PropertyChangeRecord) {
-        if (!identical(rec.object, _rootObject) ||
-            _rootObjectProperties.contains(rec.name)) {
-          return false;
-        }
-      } else if (rec is ListChangeRecord) {
-        if (!identical(rec.object, _rootObject) ||
-            _rootObjectProperties.contains(rec.index)) {
-          return false;
-        }
-      } else {
-        // TODO(sigmund): consider adding object to MapChangeRecord, and make
-        // this more precise.
-        return false;
-      }
-    }
-    return true;
-  }
-
-  void _callback(records) {
-    if (_canIgnoreRecords(records)) return;
-    for (var observer in _observers.toList(growable: false)) {
-      if (observer._isOpen) observer._iterateObjects(observe);
-    }
-
-    for (var observer in _observers.toList(growable: false)) {
-      if (observer._isOpen) observer._check();
-    }
-  }
-}
-
-const int _MAX_DIRTY_CHECK_CYCLES = 1000;
diff --git a/packages/observe/lib/transformer.dart b/packages/observe/lib/transformer.dart
deleted file mode 100644
index ce43956..0000000
--- a/packages/observe/lib/transformer.dart
+++ /dev/null
@@ -1,416 +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.
-
-/// Code transform for @observable. The core transformation is relatively
-/// straightforward, and essentially like an editor refactoring.
-library observe.transformer;
-
-import 'dart:async';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/scanner.dart';
-import 'package:barback/barback.dart';
-import 'package:code_transformers/messages/build_logger.dart';
-import 'package:source_maps/refactor.dart';
-import 'package:source_span/source_span.dart';
-
-import 'src/messages.dart';
-
-/// A [Transformer] that replaces observables based on dirty-checking with an
-/// implementation based on change notifications.
-///
-/// The transformation adds hooks for field setters and notifies the observation
-/// system of the change.
-class ObservableTransformer extends Transformer {
-  final bool releaseMode;
-  final bool injectBuildLogsInOutput;
-  final List<String> _files;
-  ObservableTransformer(
-      {List<String> files, bool releaseMode, bool injectBuildLogsInOutput})
-      : _files = files,
-        releaseMode = releaseMode == true,
-        injectBuildLogsInOutput = injectBuildLogsInOutput == null
-            ? releaseMode != true
-            : injectBuildLogsInOutput;
-  ObservableTransformer.asPlugin(BarbackSettings settings)
-      : _files = _readFiles(settings.configuration['files']),
-        releaseMode = settings.mode == BarbackMode.RELEASE,
-        injectBuildLogsInOutput = settings.mode != BarbackMode.RELEASE;
-
-  static List<String> _readFiles(value) {
-    if (value == null) return null;
-    var files = [];
-    bool error;
-    if (value is List) {
-      files = value;
-      error = value.any((e) => e is! String);
-    } else if (value is String) {
-      files = [value];
-      error = false;
-    } else {
-      error = true;
-    }
-    if (error) print('Invalid value for "files" in the observe transformer.');
-    return files;
-  }
-
-  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
-  // is dropped.
-  Future<bool> isPrimary(idOrAsset) {
-    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
-    return new Future.value(id.extension == '.dart' &&
-        (_files == null || _files.contains(id.path)));
-  }
-
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((content) {
-      // Do a quick string check to determine if this is this file even
-      // plausibly might need to be transformed. If not, we can avoid an
-      // expensive parse.
-      if (!observableMatcher.hasMatch(content)) return null;
-
-      var id = transform.primaryInput.id;
-      // TODO(sigmund): improve how we compute this url
-      var url = id.path.startsWith('lib/')
-          ? 'package:${id.package}/${id.path.substring(4)}'
-          : id.path;
-      var sourceFile = new SourceFile(content, url: url);
-      var logger = new BuildLogger(transform,
-          convertErrorsToWarnings: !releaseMode,
-          detailsUri: 'http://goo.gl/5HPeuP');
-      var transaction = _transformCompilationUnit(content, sourceFile, logger);
-      if (!transaction.hasEdits) {
-        transform.addOutput(transform.primaryInput);
-      } else {
-        var printer = transaction.commit();
-        // TODO(sigmund): emit source maps when barback supports it (see
-        // dartbug.com/12340)
-        printer.build(url);
-        transform.addOutput(new Asset.fromString(id, printer.text));
-      }
-
-      if (injectBuildLogsInOutput) return logger.writeOutput();
-    });
-  }
-}
-
-TextEditTransaction _transformCompilationUnit(
-    String inputCode, SourceFile sourceFile, BuildLogger logger) {
-  var unit = parseCompilationUnit(inputCode, suppressErrors: true);
-  var code = new TextEditTransaction(inputCode, sourceFile);
-  for (var directive in unit.directives) {
-    if (directive is LibraryDirective && _hasObservable(directive)) {
-      logger.warning(NO_OBSERVABLE_ON_LIBRARY,
-          span: _getSpan(sourceFile, directive));
-      break;
-    }
-  }
-
-  for (var declaration in unit.declarations) {
-    if (declaration is ClassDeclaration) {
-      _transformClass(declaration, code, sourceFile, logger);
-    } else if (declaration is TopLevelVariableDeclaration) {
-      if (_hasObservable(declaration)) {
-        logger.warning(NO_OBSERVABLE_ON_TOP_LEVEL,
-            span: _getSpan(sourceFile, declaration));
-      }
-    }
-  }
-  return code;
-}
-
-_getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
-
-/// True if the node has the `@observable` or `@published` annotation.
-// TODO(jmesserly): it is not good to be hard coding Polymer support here.
-bool _hasObservable(AnnotatedNode node) =>
-    node.metadata.any(_isObservableAnnotation);
-
-// TODO(jmesserly): this isn't correct if the annotation has been imported
-// with a prefix, or cases like that. We should technically be resolving, but
-// that is expensive in analyzer, so it isn't feasible yet.
-bool _isObservableAnnotation(Annotation node) =>
-    _isAnnotationContant(node, 'observable') ||
-        _isAnnotationContant(node, 'published') ||
-        _isAnnotationType(node, 'ObservableProperty') ||
-        _isAnnotationType(node, 'PublishedProperty');
-
-bool _isAnnotationContant(Annotation m, String name) =>
-    m.name.name == name && m.constructorName == null && m.arguments == null;
-
-bool _isAnnotationType(Annotation m, String name) => m.name.name == name;
-
-void _transformClass(ClassDeclaration cls, TextEditTransaction code,
-    SourceFile file, BuildLogger logger) {
-  if (_hasObservable(cls)) {
-    logger.warning(NO_OBSERVABLE_ON_CLASS, span: _getSpan(file, cls));
-  }
-
-  // We'd like to track whether observable was declared explicitly, otherwise
-  // report a warning later below. Because we don't have type analysis (only
-  // syntactic understanding of the code), we only report warnings that are
-  // known to be true.
-  var explicitObservable = false;
-  var implicitObservable = false;
-  if (cls.extendsClause != null) {
-    var id = _getSimpleIdentifier(cls.extendsClause.superclass.name);
-    if (id.name == 'Observable') {
-      code.edit(id.offset, id.end, 'ChangeNotifier');
-      explicitObservable = true;
-    } else if (id.name == 'ChangeNotifier') {
-      explicitObservable = true;
-    } else if (id.name != 'HtmlElement' &&
-        id.name != 'CustomElement' &&
-        id.name != 'Object') {
-      // TODO(sigmund): this is conservative, consider using type-resolution to
-      // improve this check.
-      implicitObservable = true;
-    }
-  }
-
-  if (cls.withClause != null) {
-    for (var type in cls.withClause.mixinTypes) {
-      var id = _getSimpleIdentifier(type.name);
-      if (id.name == 'Observable') {
-        code.edit(id.offset, id.end, 'ChangeNotifier');
-        explicitObservable = true;
-        break;
-      } else if (id.name == 'ChangeNotifier') {
-        explicitObservable = true;
-        break;
-      } else {
-        // TODO(sigmund): this is conservative, consider using type-resolution
-        // to improve this check.
-        implicitObservable = true;
-      }
-    }
-  }
-
-  if (cls.implementsClause != null) {
-    // TODO(sigmund): consider adding type-resolution to give a more precise
-    // answer.
-    implicitObservable = true;
-  }
-
-  var declaresObservable = explicitObservable || implicitObservable;
-
-  // Track fields that were transformed.
-  var instanceFields = new Set<String>();
-
-  for (var member in cls.members) {
-    if (member is FieldDeclaration) {
-      if (member.isStatic) {
-        if (_hasObservable(member)) {
-          logger.warning(NO_OBSERVABLE_ON_STATIC_FIELD,
-              span: _getSpan(file, member));
-        }
-        continue;
-      }
-      if (_hasObservable(member)) {
-        if (!declaresObservable) {
-          logger.warning(REQUIRE_OBSERVABLE_INTERFACE,
-              span: _getSpan(file, member));
-        }
-        _transformFields(file, member, code, logger);
-
-        var names = member.fields.variables.map((v) => v.name.name);
-
-        if (!_isReadOnly(member.fields)) instanceFields.addAll(names);
-      }
-    }
-  }
-
-  // If nothing was @observable, bail.
-  if (instanceFields.length == 0) return;
-
-  if (!explicitObservable) _mixinObservable(cls, code);
-
-  // Fix initializers, because they aren't allowed to call the setter.
-  for (var member in cls.members) {
-    if (member is ConstructorDeclaration) {
-      _fixConstructor(member, code, instanceFields);
-    }
-  }
-}
-
-/// Adds "with ChangeNotifier" and associated implementation.
-void _mixinObservable(ClassDeclaration cls, TextEditTransaction code) {
-  // Note: we need to be careful to put the with clause after extends, but
-  // before implements clause.
-  if (cls.withClause != null) {
-    var pos = cls.withClause.end;
-    code.edit(pos, pos, ', ChangeNotifier');
-  } else if (cls.extendsClause != null) {
-    var pos = cls.extendsClause.end;
-    code.edit(pos, pos, ' with ChangeNotifier ');
-  } else {
-    var params = cls.typeParameters;
-    var pos = params != null ? params.end : cls.name.end;
-    code.edit(pos, pos, ' extends ChangeNotifier ');
-  }
-}
-
-SimpleIdentifier _getSimpleIdentifier(Identifier id) =>
-    id is PrefixedIdentifier ? id.identifier : id;
-
-bool _hasKeyword(Token token, Keyword keyword) =>
-    token is KeywordToken && token.keyword == keyword;
-
-String _getOriginalCode(TextEditTransaction code, AstNode node) =>
-    code.original.substring(node.offset, node.end);
-
-void _fixConstructor(ConstructorDeclaration ctor, TextEditTransaction code,
-    Set<String> changedFields) {
-
-  // Fix normal initializers
-  for (var initializer in ctor.initializers) {
-    if (initializer is ConstructorFieldInitializer) {
-      var field = initializer.fieldName;
-      if (changedFields.contains(field.name)) {
-        code.edit(field.offset, field.end, '__\$${field.name}');
-      }
-    }
-  }
-
-  // Fix "this." initializer in parameter list. These are tricky:
-  // we need to preserve the name and add an initializer.
-  // Preserving the name is important for named args, and for dartdoc.
-  // BEFORE: Foo(this.bar, this.baz) { ... }
-  // AFTER:  Foo(bar, baz) : __$bar = bar, __$baz = baz { ... }
-
-  var thisInit = [];
-  for (var param in ctor.parameters.parameters) {
-    if (param is DefaultFormalParameter) {
-      param = param.parameter;
-    }
-    if (param is FieldFormalParameter) {
-      var name = param.identifier.name;
-      if (changedFields.contains(name)) {
-        thisInit.add(name);
-        // Remove "this." but keep everything else.
-        code.edit(param.thisToken.offset, param.period.end, '');
-      }
-    }
-  }
-
-  if (thisInit.length == 0) return;
-
-  // TODO(jmesserly): smarter formatting with indent, etc.
-  var inserted = thisInit.map((i) => '__\$$i = $i').join(', ');
-
-  int offset;
-  if (ctor.separator != null) {
-    offset = ctor.separator.end;
-    inserted = ' $inserted,';
-  } else {
-    offset = ctor.parameters.end;
-    inserted = ' : $inserted';
-  }
-
-  code.edit(offset, offset, inserted);
-}
-
-bool _isReadOnly(VariableDeclarationList fields) {
-  return _hasKeyword(fields.keyword, Keyword.CONST) ||
-      _hasKeyword(fields.keyword, Keyword.FINAL);
-}
-
-void _transformFields(SourceFile file, FieldDeclaration member,
-    TextEditTransaction code, BuildLogger logger) {
-  final fields = member.fields;
-  if (_isReadOnly(fields)) return;
-
-  // Private fields aren't supported:
-  for (var field in fields.variables) {
-    final name = field.name.name;
-    if (Identifier.isPrivateName(name)) {
-      logger.warning('Cannot make private field $name observable.',
-          span: _getSpan(file, field));
-      return;
-    }
-  }
-
-  // Unfortunately "var" doesn't work in all positions where type annotations
-  // are allowed, such as "var get name". So we use "dynamic" instead.
-  var type = 'dynamic';
-  if (fields.type != null) {
-    type = _getOriginalCode(code, fields.type);
-  } else if (_hasKeyword(fields.keyword, Keyword.VAR)) {
-    // Replace 'var' with 'dynamic'
-    code.edit(fields.keyword.offset, fields.keyword.end, type);
-  }
-
-  // Note: the replacements here are a bit subtle. It needs to support multiple
-  // fields declared via the same @observable, as well as preserving newlines.
-  // (Preserving newlines is important because it allows the generated code to
-  // be debugged without needing a source map.)
-  //
-  // For example:
-  //
-  //     @observable
-  //     @otherMetaData
-  //         Foo
-  //             foo = 1, bar = 2,
-  //             baz;
-  //
-  // Will be transformed into something like:
-  //
-  //     @reflectable @observable
-  //     @OtherMetaData()
-  //         Foo
-  //             get foo => __foo; Foo __foo = 1; @reflectable set foo ...; ...
-  //             @observable @OtherMetaData() Foo get baz => __baz; Foo baz; ...
-  //
-  // Metadata is moved to the getter.
-
-  String metadata = '';
-  if (fields.variables.length > 1) {
-    metadata = member.metadata.map((m) => _getOriginalCode(code, m)).join(' ');
-    metadata = '@reflectable $metadata';
-  }
-
-  for (int i = 0; i < fields.variables.length; i++) {
-    final field = fields.variables[i];
-    final name = field.name.name;
-
-    var beforeInit = 'get $name => __\$$name; $type __\$$name';
-
-    // The first field is expanded differently from subsequent fields, because
-    // we can reuse the metadata and type annotation.
-    if (i == 0) {
-      final begin = member.metadata.first.offset;
-      code.edit(begin, begin, '@reflectable ');
-    } else {
-      beforeInit = '$metadata $type $beforeInit';
-    }
-
-    code.edit(field.name.offset, field.name.end, beforeInit);
-
-    // Replace comma with semicolon
-    final end = _findFieldSeperator(field.endToken.next);
-    if (end.type == TokenType.COMMA) code.edit(end.offset, end.end, ';');
-
-    code.edit(end.end, end.end, ' @reflectable set $name($type value) { '
-        '__\$$name = notifyPropertyChange(#$name, __\$$name, value); }');
-  }
-}
-
-Token _findFieldSeperator(Token token) {
-  while (token != null) {
-    if (token.type == TokenType.COMMA || token.type == TokenType.SEMICOLON) {
-      break;
-    }
-    token = token.next;
-  }
-  return token;
-}
-
-// TODO(sigmund): remove hard coded Polymer support (@published). The proper way
-// to do this would be to switch to use the analyzer to resolve whether
-// annotations are subtypes of ObservableProperty.
-final observableMatcher =
-    new RegExp("@(published|observable|PublishedProperty|ObservableProperty)");
diff --git a/packages/observe/pubspec.yaml b/packages/observe/pubspec.yaml
deleted file mode 100644
index 29829e2..0000000
--- a/packages/observe/pubspec.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: observe
-version: 0.13.1+3
-author: Polymer.dart Authors <web-ui-dev@dartlang.org>
-description: >
-  Observable properties and objects for use in template_binding.
-  Template Binding extends HTML and the DOM APIs to support a sensible
-  separation between the UI (DOM) of a document or application and its
-  underlying data (model). Updates to the model are reflected in the DOM and
-  user input into the DOM is immediately assigned to the model.
-homepage: https://www.dartlang.org/polymer-dart/
-dependencies:
-  analyzer: '>=0.15.6 <0.27.0'
-  barback: '>=0.14.2 <0.16.0'
-  logging: '>=0.9.0 <0.12.0'
-  path: '>=0.9.0 <2.0.0'
-  smoke: '>=0.1.0 <0.4.0'
-  source_maps: '>=0.9.4 <0.11.0'
-  source_span: '>=1.0.0 <2.0.0'
-  utf: '>=0.9.0 <0.10.0'
-  code_transformers: '>=0.2.3 <0.3.0'
-dev_dependencies:
-  benchmark_harness: '>=1.0.0 <2.0.0'
-  browser: any
-  chart: '>=1.0.8 <2.0.0'
-  unittest: '>=0.10.0 <0.12.0'
-  stack_trace: '>=0.9.1 <2.0.0'
-environment:
-  sdk: '>=1.2.0 <2.0.0'
-transformers:
-- observe:
-    files:
-      - benchmark/test_observable.dart
-      - benchmark/test_path_observable.dart
diff --git a/packages/observe/test/list_path_observer_test.dart b/packages/observe/test/list_path_observer_test.dart
deleted file mode 100644
index eddaf8c..0000000
--- a/packages/observe/test/list_path_observer_test.dart
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'observe_test_utils.dart';
-
-import 'package:observe/mirrors_used.dart'; // make test smaller.
-import 'package:smoke/mirrors.dart';
-
-main() {
-  useMirrors();
-  dirtyCheckZone().run(_runTests);
-}
-
-_runTests() {
-  var list;
-  var obs;
-  var o1, o2, o3;
-  var sub;
-  int changes;
-
-  setUp(() {
-    list = toObservable([
-      o1 = new TestModel()..a = (new TestModel()..b = 1),
-      o2 = new TestModel()..a = (new TestModel()..b = 2),
-      o3 = new TestModel()..a = (new TestModel()..b = 3)]);
-    obs = new ListPathObserver(list, 'a.b');
-    changes = 0;
-    sub = obs.changes.listen((e) { changes++; });
-  });
-
-  tearDown(() {
-    sub.cancel();
-    list = obs = o1 = o2 = o3 = null;
-  });
-
-  test('list path observer noticed length changes', () {
-    expect(o2.a.b, 2);
-    expect(list[1].a.b, 2);
-    return _nextMicrotask(null).then((_) {
-      expect(changes, 0);
-      list.removeAt(1);
-    }).then(_nextMicrotask).then((_) {
-      expect(changes, 1);
-      expect(list[1].a.b, 3);
-    });
-  });
-
-  test('list path observer delivers deep change', () {
-    expect(o2.a.b, 2);
-    expect(list[1].a.b, 2);
-    int changes = 0;
-    obs.changes.listen((e) { changes++; });
-    return _nextMicrotask(null).then((_) {
-      expect(changes, 0);
-      o2.a.b = 4;
-    }).then(_nextMicrotask).then((_) {
-      expect(changes, 1);
-      expect(list[1].a.b, 4);
-      o1.a = new TestModel()..b = 5;
-    }).then(_nextMicrotask).then((_) {
-      expect(changes, 2);
-      expect(list[0].a.b, 5);
-    });
-  });
-}
-
-_nextMicrotask(_) => new Future(() {});
-
-@reflectable
-class TestModel extends ChangeNotifier {
-  var _a, _b;
-  TestModel();
-
-  get a => _a;
-  void set a(newValue) { _a = notifyPropertyChange(#a, _a, newValue); }
-
-  get b => _b;
-  void set b(newValue) { _b = notifyPropertyChange(#b, _b, newValue); }
-}
diff --git a/packages/observe/test/observe_test.dart b/packages/observe/test/observe_test.dart
deleted file mode 100644
index 1f40953..0000000
--- a/packages/observe/test/observe_test.dart
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:logging/logging.dart';
-import 'package:observe/observe.dart';
-import 'package:observe/src/dirty_check.dart' as dirty_check;
-import 'package:unittest/unittest.dart';
-import 'observe_test_utils.dart';
-
-import 'package:observe/mirrors_used.dart'; // make test smaller.
-import 'package:smoke/mirrors.dart';
-
-main() {
-  useMirrors();
-  dirtyCheckZone().run(_tests);
-}
-
-void _tests() {
-  // Note: to test the basic Observable system, we use ObservableBox due to its
-  // simplicity. We also test a variant that is based on dirty-checking.
-
-  test('no observers at the start', () {
-    expect(dirty_check.allObservablesCount, 0);
-  });
-
-  group('WatcherModel', () => _observeTests((x) => new WatcherModel(x)));
-
-  group('ObservableBox', () => _observeTests((x) => new ObservableBox(x)));
-
-  group('ModelSubclass', () => _observeTests((x) => new ModelSubclass(x)));
-
-  group('dirtyCheck loops can be debugged', () {
-    var messages;
-    var subscription;
-    setUp(() {
-      messages = [];
-      subscription = Logger.root.onRecord.listen((record) {
-        messages.add(record.message);
-      });
-    });
-
-    tearDown(() {
-      subscription.cancel();
-    });
-
-    test('logs debug information', () {
-      var maxNumIterations = dirty_check.MAX_DIRTY_CHECK_CYCLES;
-
-      var x = new WatcherModel(0);
-      var sub = x.changes.listen(expectAsync((_) { x.value++; },
-          count: maxNumIterations));
-      x.value = 1;
-      Observable.dirtyCheck();
-      expect(x.value, maxNumIterations + 1);
-      expect(messages.length, 2);
-
-      expect(messages[0], contains('Possible loop'));
-      expect(messages[1], contains('index 0'));
-      expect(messages[1], contains('object: $x'));
-
-      sub.cancel();
-    });
-  });
-}
-
-void _observeTests(createModel(x)) {
-  final watch = createModel(null) is! ChangeNotifier;
-
-  // Track the subscriptions so we can clean them up in tearDown.
-  List subs;
-
-  int initialObservers;
-  setUp(() {
-    initialObservers = dirty_check.allObservablesCount;
-    subs = [];
-
-    if (watch) scheduleMicrotask(Observable.dirtyCheck);
-  });
-
-  tearDown(() {
-    for (var sub in subs) sub.cancel();
-    return new Future(() {
-      expect(dirty_check.allObservablesCount, initialObservers,
-          reason: 'Observable object leaked');
-    });
-  });
-
-  test('handle future result', () {
-    var callback = expectAsync((){});
-    return new Future(callback);
-  });
-
-  test('no observers', () {
-    var t = createModel(123);
-    expect(t.value, 123);
-    t.value = 42;
-    expect(t.value, 42);
-    expect(t.hasObservers, false);
-  });
-
-  test('listen adds an observer', () {
-    var t = createModel(123);
-    expect(t.hasObservers, false);
-
-    subs.add(t.changes.listen((n) {}));
-    expect(t.hasObservers, true);
-  });
-
-  test('changes delived async', () {
-    var t = createModel(123);
-    int called = 0;
-
-    subs.add(t.changes.listen(expectAsync((records) {
-      called++;
-      expectPropertyChanges(records, watch ? 1 : 2);
-    })));
-
-    t.value = 41;
-    t.value = 42;
-    expect(called, 0);
-  });
-
-  test('cause changes in handler', () {
-    var t = createModel(123);
-    int called = 0;
-
-    subs.add(t.changes.listen(expectAsync((records) {
-      called++;
-      expectPropertyChanges(records, 1);
-      if (called == 1) {
-        // Cause another change
-        t.value = 777;
-      }
-    }, count: 2)));
-
-    t.value = 42;
-  });
-
-  test('multiple observers', () {
-    var t = createModel(123);
-
-    verifyRecords(records) {
-      expectPropertyChanges(records, watch ? 1 : 2);
-    };
-
-    subs.add(t.changes.listen(expectAsync(verifyRecords)));
-    subs.add(t.changes.listen(expectAsync(verifyRecords)));
-
-    t.value = 41;
-    t.value = 42;
-  });
-
-  test('async processing model', () {
-    var t = createModel(123);
-    var records = [];
-    subs.add(t.changes.listen((r) { records.addAll(r); }));
-    t.value = 41;
-    t.value = 42;
-    expectChanges(records, [], reason: 'changes delived async');
-
-    return new Future(() {
-      expectPropertyChanges(records, watch ? 1 : 2);
-      records.clear();
-
-      t.value = 777;
-      expectChanges(records, [], reason: 'changes delived async');
-
-    }).then(newMicrotask).then((_) {
-      expectPropertyChanges(records, 1);
-
-      // Has no effect if there are no changes
-      Observable.dirtyCheck();
-      expectPropertyChanges(records, 1);
-    });
-  });
-
-  test('cancel listening', () {
-    var t = createModel(123);
-    var sub;
-    sub = t.changes.listen(expectAsync((records) {
-      expectPropertyChanges(records, 1);
-      sub.cancel();
-      t.value = 777;
-      scheduleMicrotask(Observable.dirtyCheck);
-    }));
-    t.value = 42;
-  });
-
-  test('cancel and reobserve', () {
-    var t = createModel(123);
-    var sub;
-    sub = t.changes.listen(expectAsync((records) {
-      expectPropertyChanges(records, 1);
-      sub.cancel();
-
-      scheduleMicrotask(expectAsync(() {
-        subs.add(t.changes.listen(expectAsync((records) {
-          expectPropertyChanges(records, 1);
-        })));
-        t.value = 777;
-        scheduleMicrotask(Observable.dirtyCheck);
-      }));
-    }));
-    t.value = 42;
-  });
-
-  test('cannot modify changes list', () {
-    var t = createModel(123);
-    var records = null;
-    subs.add(t.changes.listen((r) { records = r; }));
-    t.value = 42;
-
-    return new Future(() {
-      expectPropertyChanges(records, 1);
-
-      // Verify that mutation operations on the list fail:
-
-      expect(() {
-        records[0] = new PropertyChangeRecord(t, #value, 0, 1);
-      }, throwsUnsupportedError);
-
-      expect(() { records.clear(); }, throwsUnsupportedError);
-
-      expect(() { records.length = 0; }, throwsUnsupportedError);
-    });
-  });
-
-  test('notifyChange', () {
-    var t = createModel(123);
-    var records = [];
-    subs.add(t.changes.listen((r) { records.addAll(r); }));
-    t.notifyChange(new PropertyChangeRecord(t, #value, 123, 42));
-
-    return new Future(() {
-      expectPropertyChanges(records, 1);
-      expect(t.value, 123, reason: 'value did not actually change.');
-    });
-  });
-
-  test('notifyPropertyChange', () {
-    var t = createModel(123);
-    var records = null;
-    subs.add(t.changes.listen((r) { records = r; }));
-    expect(t.notifyPropertyChange(#value, t.value, 42), 42,
-        reason: 'notifyPropertyChange returns newValue');
-
-    return new Future(() {
-      expectPropertyChanges(records, 1);
-      expect(t.value, 123, reason: 'value did not actually change.');
-    });
-  });
-}
-
-expectPropertyChanges(records, int number) {
-  expect(records.length, number, reason: 'expected $number change records');
-  for (var record in records) {
-    expect(record is PropertyChangeRecord, true, reason:
-        'record should be PropertyChangeRecord');
-    expect((record as PropertyChangeRecord).name, #value, reason:
-        'record should indicate a change to the "value" property');
-  }
-}
-
-// A test model based on dirty checking.
-class WatcherModel<T> extends Observable {
-  @observable T value;
-
-  WatcherModel([T initialValue]) : value = initialValue;
-
-  String toString() => '#<$runtimeType value: $value>';
-}
-
-class ModelSubclass<T> extends WatcherModel<T> {
-  ModelSubclass([T initialValue]) : super(initialValue);
-}
diff --git a/packages/observe/test/observe_test_utils.dart b/packages/observe/test/observe_test_utils.dart
deleted file mode 100644
index 07f4488..0000000
--- a/packages/observe/test/observe_test_utils.dart
+++ /dev/null
@@ -1,28 +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 observe.test.observe_test_utils;
-
-import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:observe/mirrors_used.dart'; // to make tests smaller
-import 'package:unittest/unittest.dart';
-export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
-
-/// 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(...)
-newMicrotask(_) => new Future.value();
-
-// TODO(jmesserly): use matchers when we have a way to compare ChangeRecords.
-// For now just use the toString.
-expectChanges(actual, expected, {reason}) =>
-    expect('$actual', '$expected', reason: reason);
-
-List getListChangeRecords(List changes, int index) => changes
-    .where((c) => c.indexChanged(index)).toList();
-
-List getPropertyChangeRecords(List changes, Symbol property) => changes
-    .where((c) => c is PropertyChangeRecord && c.name == property).toList();
diff --git a/packages/observe/test/path_observer_test.dart b/packages/observe/test/path_observer_test.dart
deleted file mode 100644
index d1ad547..0000000
--- a/packages/observe/test/path_observer_test.dart
+++ /dev/null
@@ -1,751 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'package:observe/src/path_observer.dart'
-    show getSegmentsOfPropertyPathForTesting,
-         observerSentinelForTesting;
-
-import 'observe_test_utils.dart';
-
-import 'package:observe/mirrors_used.dart'; // make test smaller.
-import 'package:smoke/mirrors.dart';
-
-// This file contains code ported from:
-// https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
-// Dart note: getting invalid properties is an error, unlike in JS where it
-// returns undefined. This difference comes up where we check for _throwsNSM in
-// the tests below.
-main() => dirtyCheckZone().run(() {
-  useMirrors();
-
-  group('PathObserver', observePathTests);
-
-  group('PropertyPath', () {
-    test('toString length', () {
-      expectPath(p, str, len, [keys]) {
-        var path = new PropertyPath(p);
-        expect(path.toString(), str);
-        expect(path.length, len, reason: 'expected path length $len for $path');
-        if (keys == null) {
-          expect(path.isValid, isFalse);
-        } else {
-          expect(path.isValid, isTrue);
-          expect(getSegmentsOfPropertyPathForTesting(path), keys);
-        }
-      }
-
-      expectPath('/foo', '<invalid path>', 0);
-      expectPath('1.abc', '<invalid path>', 0);
-      expectPath('abc', 'abc', 1, [#abc]);
-      expectPath('a.b.c', 'a.b.c', 3, [#a, #b, #c]);
-      expectPath('a.b.c ', 'a.b.c', 3, [#a, #b, #c]);
-      expectPath(' a.b.c', 'a.b.c', 3, [#a, #b, #c]);
-      expectPath('  a.b.c   ', 'a.b.c', 3, [#a, #b, #c]);
-      expectPath('[1].abc', '[1].abc', 2, [1, #abc]);
-      expectPath([#qux], 'qux', 1, [#qux]);
-      expectPath([1, #foo, #bar], '[1].foo.bar', 3, [1, #foo, #bar]);
-      expectPath([1, #foo, 'bar'], '[1].foo["bar"]', 3, [1, #foo, 'bar']);
-
-      // From test.js: "path validity" test:
-
-      expectPath('', '', 0, []);
-      expectPath(' ', '', 0, []);
-      expectPath(null, '', 0, []);
-      expectPath('a', 'a', 1, [#a]);
-      expectPath('a.b', 'a.b', 2, [#a, #b]);
-      expectPath('a. b', 'a.b', 2, [#a, #b]);
-      expectPath('a .b', 'a.b', 2, [#a, #b]);
-      expectPath('a . b', 'a.b', 2, [#a, #b]);
-      expectPath(' a . b ', 'a.b', 2, [#a, #b]);
-      expectPath('a[0]', 'a[0]', 2, [#a, 0]);
-      expectPath('a [0]', 'a[0]', 2, [#a, 0]);
-      expectPath('a[0][1]', 'a[0][1]', 3, [#a, 0, 1]);
-      expectPath('a [ 0 ] [ 1 ] ', 'a[0][1]', 3, [#a, 0, 1]);
-      expectPath('[1234567890] ', '[1234567890]', 1, [1234567890]);
-      expectPath(' [1234567890] ', '[1234567890]', 1, [1234567890]);
-      expectPath('opt0', 'opt0', 1, [#opt0]);
-      // Dart note: Modified to avoid a private Dart symbol:
-      expectPath(r'$foo.$bar.baz_', r'$foo.$bar.baz_', 3,
-          [#$foo, #$bar, #baz_]);
-      // Dart note: this test is different because we treat ["baz"] always as a
-      // indexing operation.
-      expectPath('foo["baz"]', 'foo.baz', 2, [#foo, #baz]);
-      expectPath('foo["b\\"az"]', 'foo["b\\"az"]', 2, [#foo, 'b"az']);
-      expectPath("foo['b\\'az']", 'foo["b\'az"]', 2, [#foo, "b'az"]);
-      expectPath([#a, #b], 'a.b', 2, [#a, #b]);
-      expectPath([], '', 0, []);
-
-      expectPath('.', '<invalid path>', 0);
-      expectPath(' . ', '<invalid path>', 0);
-      expectPath('..', '<invalid path>', 0);
-      expectPath('a[4', '<invalid path>', 0);
-      expectPath('a.b.', '<invalid path>', 0);
-      expectPath('a,b', '<invalid path>', 0);
-      expectPath('a["foo]', '<invalid path>', 0);
-      expectPath('[0x04]', '<invalid path>', 0);
-      expectPath('[0foo]', '<invalid path>', 0);
-      expectPath('[foo-bar]', '<invalid path>', 0);
-      expectPath('foo-bar', '<invalid path>', 0);
-      expectPath('42', '<invalid path>', 0);
-      expectPath('a[04]', '<invalid path>', 0);
-      expectPath(' a [ 04 ]', '<invalid path>', 0);
-      expectPath('  42   ', '<invalid path>', 0);
-      expectPath('foo["bar]', '<invalid path>', 0);
-      expectPath("foo['bar]", '<invalid path>', 0);
-    });
-
-    test('objects with toString are not supported', () {
-      // Dart note: this was intentionally not ported. See path_observer.dart.
-      expect(() => new PropertyPath([new Foo('a'), new Foo('b')]), throws);
-    });
-
-    test('invalid path returns null value', () {
-      var path = new PropertyPath('a b');
-      expect(path.isValid, isFalse);
-      expect(path.getValueFrom({'a': {'b': 2}}), isNull);
-    });
-
-
-    test('caching and ==', () {
-      var start = new PropertyPath('abc[0]');
-      for (int i = 1; i <= 100; i++) {
-        expect(identical(new PropertyPath('abc[0]'), start), true,
-          reason: 'should return identical path');
-
-        var p = new PropertyPath('abc[$i]');
-        expect(identical(p, start), false,
-            reason: 'different paths should not be merged');
-      }
-      var end = new PropertyPath('abc[0]');
-      expect(identical(end, start), false,
-          reason: 'first entry expired');
-      expect(end, start, reason: 'different instances are equal');
-    });
-
-    test('hashCode equal', () {
-      var a = new PropertyPath([#foo, 2, #bar]);
-      var b = new PropertyPath('foo[2].bar');
-      expect(identical(a, b), false, reason: 'only strings cached');
-      expect(a, b, reason: 'same paths are equal');
-      expect(a.hashCode, b.hashCode, reason: 'equal hashCodes');
-    });
-
-    test('hashCode not equal', () {
-      expect(2.hashCode, isNot(3.hashCode),
-          reason: 'test depends on 2 and 3 having different hashcodes');
-
-      var a = new PropertyPath([2]);
-      var b = new PropertyPath([3]);
-      expect(a, isNot(b), reason: 'different paths');
-      expect(a.hashCode, isNot(b.hashCode), reason: 'different hashCodes');
-    });
-  });
-
-  group('CompoundObserver', compoundObserverTests);
-});
-
-observePathTests() {
-  test('Degenerate Values', () {
-    expect(new PathObserver(null, '').value, null);
-    expect(new PathObserver(123, '').value, 123);
-    expect(() => new PathObserver(123, 'foo.bar.baz').value, _throwsNSM('foo'));
-
-    // shouldn't throw:
-    new PathObserver(123, '')..open((_) {})..close();
-    new PropertyPath('').setValueFrom(null, null);
-    new PropertyPath('').setValueFrom(123, 42);
-    expect(() => new PropertyPath('foo.bar.baz').setValueFrom(123, 42),
-        _throwsNSM('foo'));
-    var foo = {};
-    expect(new PathObserver(foo, '').value, foo);
-
-    foo = new Object();
-    expect(new PathObserver(foo, '').value, foo);
-
-    expect(new PathObserver(foo, 'a/3!').value, null);
-  });
-
-  test('get value at path ObservableBox', () {
-    var obj = new ObservableBox(new ObservableBox(new ObservableBox(1)));
-
-    expect(new PathObserver(obj, '').value, obj);
-    expect(new PathObserver(obj, 'value').value, obj.value);
-    expect(new PathObserver(obj, 'value.value').value, obj.value.value);
-    expect(new PathObserver(obj, 'value.value.value').value, 1);
-
-    obj.value.value.value = 2;
-    expect(new PathObserver(obj, 'value.value.value').value, 2);
-
-    obj.value.value = new ObservableBox(3);
-    expect(new PathObserver(obj, 'value.value.value').value, 3);
-
-    obj.value = new ObservableBox(4);
-    expect(() => new PathObserver(obj, 'value.value.value').value,
-        _throwsNSM('value'));
-    expect(new PathObserver(obj, 'value.value').value, 4);
-  });
-
-
-  test('get value at path ObservableMap', () {
-    var obj = toObservable({'a': {'b': {'c': 1}}});
-
-    expect(new PathObserver(obj, '').value, obj);
-    expect(new PathObserver(obj, 'a').value, obj['a']);
-    expect(new PathObserver(obj, 'a.b').value, obj['a']['b']);
-    expect(new PathObserver(obj, 'a.b.c').value, 1);
-
-    obj['a']['b']['c'] = 2;
-    expect(new PathObserver(obj, 'a.b.c').value, 2);
-
-    obj['a']['b'] = toObservable({'c': 3});
-    expect(new PathObserver(obj, 'a.b.c').value, 3);
-
-    obj['a'] = toObservable({'b': 4});
-    expect(() => new PathObserver(obj, 'a.b.c').value, _throwsNSM('c'));
-    expect(new PathObserver(obj, 'a.b').value, 4);
-  });
-
-  test('set value at path', () {
-    var obj = toObservable({});
-    new PropertyPath('foo').setValueFrom(obj, 3);
-    expect(obj['foo'], 3);
-
-    var bar = toObservable({ 'baz': 3 });
-    new PropertyPath('bar').setValueFrom(obj, bar);
-    expect(obj['bar'], bar);
-
-    expect(() => new PropertyPath('bar.baz.bat').setValueFrom(obj, 'not here'),
-        _throwsNSM('bat='));
-    expect(() => new PathObserver(obj, 'bar.baz.bat').value, _throwsNSM('bat'));
-  });
-
-  test('set value back to same', () {
-    var obj = toObservable({});
-    var path = new PathObserver(obj, 'foo');
-    var values = [];
-    path.open((x) {
-      expect(x, path.value, reason: 'callback should get current value');
-      values.add(x);
-    });
-
-    path.value = 3;
-    expect(obj['foo'], 3);
-    expect(path.value, 3);
-
-    new PropertyPath('foo').setValueFrom(obj, 2);
-    return new Future(() {
-      expect(path.value, 2);
-      expect(new PathObserver(obj, 'foo').value, 2);
-
-      new PropertyPath('foo').setValueFrom(obj, 3);
-    }).then(newMicrotask).then((_) {
-      expect(path.value, 3);
-
-    }).then(newMicrotask).then((_) {
-      expect(values, [2, 3]);
-    });
-  });
-
-  test('Observe and Unobserve - Paths', () {
-    var arr = toObservable({});
-
-    arr['foo'] = 'bar';
-    var fooValues = [];
-    var fooPath = new PathObserver(arr, 'foo');
-    fooPath.open(fooValues.add);
-    arr['foo'] = 'baz';
-    arr['bat'] = 'bag';
-    var batValues = [];
-    var batPath = new PathObserver(arr, 'bat');
-    batPath.open(batValues.add);
-
-    return new Future(() {
-      expect(fooValues, ['baz']);
-      expect(batValues, []);
-
-      arr['foo'] = 'bar';
-      fooPath.close();
-      arr['bat'] = 'boo';
-      batPath.close();
-      arr['bat'] = 'boot';
-
-    }).then(newMicrotask).then((_) {
-      expect(fooValues, ['baz']);
-      expect(batValues, []);
-    });
-  });
-
-  test('Path Value With Indices', () {
-    var model = toObservable([]);
-    var path = new PathObserver(model, '[0]');
-    path.open(expectAsync((x) {
-      expect(path.value, 123);
-      expect(x, 123);
-    }));
-    model.add(123);
-  });
-
-  group('ObservableList', () {
-    test('isNotEmpty', () {
-      var model = new ObservableList();
-      var path = new PathObserver(model, 'isNotEmpty');
-      expect(path.value, false);
-
-      path.open(expectAsync((_) {
-        expect(path.value, true);
-      }));
-      model.add(123);
-    });
-
-    test('isEmpty', () {
-      var model = new ObservableList();
-      var path = new PathObserver(model, 'isEmpty');
-      expect(path.value, true);
-
-      path.open(expectAsync((_) {
-        expect(path.value, false);
-      }));
-      model.add(123);
-    });
-  });
-
-  for (var createModel in [() => new TestModel(), () => new WatcherModel()]) {
-    test('Path Observation - ${createModel().runtimeType}', () {
-      var model = createModel()..a =
-          (createModel()..b = (createModel()..c = 'hello, world'));
-
-      var path = new PathObserver(model, 'a.b.c');
-      var lastValue = null;
-      var errorSeen = false;
-      runZoned(() {
-        path.open((x) { lastValue = x; });
-      }, onError: (e) {
-        expect(e, _isNoSuchMethodOf('c'));
-        errorSeen = true;
-      });
-
-      model.a.b.c = 'hello, mom';
-
-      expect(lastValue, null);
-      return new Future(() {
-        expect(lastValue, 'hello, mom');
-
-        model.a.b = createModel()..c = 'hello, dad';
-      }).then(newMicrotask).then((_) {
-        expect(lastValue, 'hello, dad');
-
-        model.a = createModel()..b =
-            (createModel()..c = 'hello, you');
-      }).then(newMicrotask).then((_) {
-        expect(lastValue, 'hello, you');
-
-        model.a.b = 1;
-        expect(errorSeen, isFalse);
-      }).then(newMicrotask).then((_) {
-        expect(errorSeen, isTrue);
-        expect(lastValue, 'hello, you');
-
-        // Stop observing
-        path.close();
-
-        model.a.b = createModel()..c = 'hello, back again -- but not observing';
-      }).then(newMicrotask).then((_) {
-        expect(lastValue, 'hello, you');
-
-        // Resume observing
-        new PathObserver(model, 'a.b.c').open((x) { lastValue = x; });
-
-        model.a.b.c = 'hello. Back for reals';
-      }).then(newMicrotask).then((_) {
-        expect(lastValue, 'hello. Back for reals');
-      });
-    });
-  }
-
-  test('observe map', () {
-    var model = toObservable({'a': 1});
-    var path = new PathObserver(model, 'a');
-
-    var values = [path.value];
-    path.open(values.add);
-    expect(values, [1]);
-
-    model['a'] = 2;
-    return new Future(() {
-      expect(values, [1, 2]);
-
-      path.close();
-      model['a'] = 3;
-    }).then(newMicrotask).then((_) {
-      expect(values, [1, 2]);
-    });
-  });
-
-  test('errors thrown from getter/setter', () {
-    var model = new ObjectWithErrors();
-    var observer = new PathObserver(model, 'foo');
-
-    expect(() => observer.value, _throwsNSM('bar'));
-    expect(model.getFooCalled, 1);
-
-    expect(() { observer.value = 123; }, _throwsNSM('bar='));
-    expect(model.setFooCalled, [123]);
-  });
-
-  test('object with noSuchMethod', () {
-    var model = new NoSuchMethodModel();
-    var observer = new PathObserver(model, 'foo');
-
-    expect(observer.value, 42);
-    observer.value = 'hi';
-    expect(model._foo, 'hi');
-    expect(observer.value, 'hi');
-
-    expect(model.log, [#foo, const Symbol('foo='), #foo]);
-
-    // These shouldn't throw
-    observer = new PathObserver(model, 'bar');
-    expect(observer.value, null, reason: 'path not found');
-    observer.value = 42;
-    expect(observer.value, null, reason: 'path not found');
-  });
-
-  test('object with indexer', () {
-    var model = new IndexerModel();
-    var observer = new PathObserver(model, 'foo');
-
-    expect(observer.value, 42);
-    expect(model.log, ['[] foo']);
-    model.log.clear();
-
-    observer.value = 'hi';
-    expect(model.log, ['[]= foo hi']);
-    expect(model._foo, 'hi');
-
-    expect(observer.value, 'hi');
-
-    // These shouldn't throw
-    model.log.clear();
-    observer = new PathObserver(model, 'bar');
-    expect(observer.value, null, reason: 'path not found');
-    expect(model.log, ['[] bar']);
-    model.log.clear();
-
-    observer.value = 42;
-    expect(model.log, ['[]= bar 42']);
-    model.log.clear();
-  });
-
-  test('regression for TemplateBinding#161', () {
-    var model = toObservable({'obj': toObservable({'bar': false})});
-    var ob1 = new PathObserver(model, 'obj.bar');
-    var called = false;
-    ob1.open(() { called = true; });
-
-    var obj2 = new PathObserver(model, 'obj');
-    obj2.open(() { model['obj']['bar'] = true; });
-
-    model['obj'] = toObservable({ 'obj': 'obj' });
-
-    return new Future(() {})
-        .then((_) => expect(called, true));
-  });
-}
-
-compoundObserverTests() {
-  var model;
-  var observer;
-  bool called;
-  var newValues;
-  var oldValues;
-  var observed;
-
-  setUp(() {
-    model = new TestModel(1, 2, 3);
-    called = false;
-  });
-
-  callback(a, b, c) {
-    called = true;
-    newValues = a;
-    oldValues = b;
-    observed = c;
-  }
-
-  reset() {
-    called = false;
-    newValues = null;
-    oldValues = null;
-    observed = null;
-  }
-
-  expectNoChanges() {
-    observer.deliver();
-    expect(called, isFalse);
-    expect(newValues, isNull);
-    expect(oldValues, isNull);
-    expect(observed, isNull);
-  }
-
-  expectCompoundPathChanges(expectedNewValues,
-      expectedOldValues, expectedObserved, {deliver: true}) {
-    if (deliver) observer.deliver();
-    expect(called, isTrue);
-
-    expect(newValues, expectedNewValues);
-    var oldValuesAsMap = {};
-    for (int i = 0; i < expectedOldValues.length; i++) {
-      if (expectedOldValues[i] != null) {
-        oldValuesAsMap[i] = expectedOldValues[i];
-      }
-    }
-    expect(oldValues, oldValuesAsMap);
-    expect(observed, expectedObserved);
-
-    reset();
-  }
-
-  tearDown(() {
-    observer.close();
-    reset();
-  });
-
-  _path(s) => new PropertyPath(s);
-
-  test('simple', () {
-    observer = new CompoundObserver();
-    observer.addPath(model, 'a');
-    observer.addPath(model, 'b');
-    observer.addPath(model, _path('c'));
-    observer.open(callback);
-    expectNoChanges();
-
-    var expectedObs = [model, _path('a'), model, _path('b'), model, _path('c')];
-    model.a = -10;
-    model.b = 20;
-    model.c = 30;
-    expectCompoundPathChanges([-10, 20, 30], [1, 2, 3], expectedObs);
-
-    model.a = 'a';
-    model.c = 'c';
-    expectCompoundPathChanges(['a', 20, 'c'], [-10, null, 30], expectedObs);
-
-    model.a = 2;
-    model.b = 3;
-    model.c = 4;
-    expectCompoundPathChanges([2, 3, 4], ['a', 20, 'c'], expectedObs);
-
-    model.a = 'z';
-    model.b = 'y';
-    model.c = 'x';
-    expect(observer.value, ['z', 'y', 'x']);
-    expectNoChanges();
-
-    expect(model.a, 'z');
-    expect(model.b, 'y');
-    expect(model.c, 'x');
-    expectNoChanges();
-  });
-
-  test('reportChangesOnOpen', () {
-    observer = new CompoundObserver(true);
-    observer.addPath(model, 'a');
-    observer.addPath(model, 'b');
-    observer.addPath(model, _path('c'));
-
-    model.a = -10;
-    model.b = 20;
-    observer.open(callback);
-    var expectedObs = [model, _path('a'), model, _path('b'), model, _path('c')];
-    expectCompoundPathChanges([-10, 20, 3], [1, 2, null], expectedObs,
-        deliver: false);
-  });
-
-  test('All Observers', () {
-    observer = new CompoundObserver();
-    var pathObserver1 = new PathObserver(model, 'a');
-    var pathObserver2 = new PathObserver(model, 'b');
-    var pathObserver3 = new PathObserver(model, _path('c'));
-
-    observer.addObserver(pathObserver1);
-    observer.addObserver(pathObserver2);
-    observer.addObserver(pathObserver3);
-    observer.open(callback);
-
-    var expectedObs = [observerSentinelForTesting, pathObserver1,
-        observerSentinelForTesting, pathObserver2,
-        observerSentinelForTesting, pathObserver3];
-    model.a = -10;
-    model.b = 20;
-    model.c = 30;
-    expectCompoundPathChanges([-10, 20, 30], [1, 2, 3], expectedObs);
-
-    model.a = 'a';
-    model.c = 'c';
-    expectCompoundPathChanges(['a', 20, 'c'], [-10, null, 30], expectedObs);
-  });
-
-  test('Degenerate Values', () {
-    observer = new CompoundObserver();
-    observer.addPath(model, '.'); // invalid path
-    observer.addPath('obj-value', ''); // empty path
-    // Dart note: we don't port these two tests because in Dart we produce
-    // exceptions for these invalid paths.
-    // observer.addPath(model, 'foo'); // unreachable
-    // observer.addPath(3, 'bar'); // non-object with non-empty path
-    var values = observer.open(callback);
-    expect(values.length, 2);
-    expect(values[0], null);
-    expect(values[1], 'obj-value');
-    observer.close();
-  });
-
-  test('Heterogeneous', () {
-    model.c = null;
-    var otherModel = new TestModel(null, null, 3);
-
-    twice(value) => value * 2;
-    half(value) => value ~/ 2;
-
-    var compound = new CompoundObserver();
-    compound.addPath(model, 'a');
-    compound.addObserver(new ObserverTransform(new PathObserver(model, 'b'),
-                                               twice, setValue: half));
-    compound.addObserver(new PathObserver(otherModel, 'c'));
-
-    combine(values) => values[0] + values[1] + values[2];
-    observer = new ObserverTransform(compound, combine);
-
-    var newValue;
-    transformCallback(v) {
-      newValue = v;
-      called = true;
-    }
-    expect(observer.open(transformCallback), 8);
-
-    model.a = 2;
-    model.b = 4;
-    observer.deliver();
-    expect(called, isTrue);
-    expect(newValue, 13);
-    called = false;
-
-    model.b = 10;
-    otherModel.c = 5;
-    observer.deliver();
-    expect(called, isTrue);
-    expect(newValue, 27);
-    called = false;
-
-    model.a = 20;
-    model.b = 1;
-    otherModel.c = 5;
-    observer.deliver();
-    expect(called, isFalse);
-    expect(newValue, 27);
-  });
-}
-
-/// A matcher that checks that a closure throws a NoSuchMethodError matching the
-/// given [name].
-_throwsNSM(String name) => throwsA(_isNoSuchMethodOf(name));
-
-/// A matcher that checkes whether an exception is a NoSuchMethodError matching
-/// the given [name].
-_isNoSuchMethodOf(String name) => predicate((e) =>
-    e is NoSuchMethodError &&
-    // Dart2js and VM error messages are a bit different, but they both contain
-    // the name.
-    ('$e'.contains("'$name'") || // VM error
-     '$e'.contains('\'Symbol("$name")\''))); // dart2js error
-
-class ObjectWithErrors {
-  int getFooCalled = 0;
-  List setFooCalled = [];
-  @reflectable get foo {
-    getFooCalled++;
-    (this as dynamic).bar;
-  }
-  @reflectable set foo(value) {
-    setFooCalled.add(value);
-    (this as dynamic).bar = value;
-  }
-}
-
-class NoSuchMethodModel {
-  var _foo = 42;
-  List log = [];
-
-  // TODO(ahe): Remove @reflectable from here (once either of
-  // http://dartbug.com/15408 or http://dartbug.com/15409 are fixed).
-  @reflectable noSuchMethod(Invocation invocation) {
-    final name = invocation.memberName;
-    log.add(name);
-    if (name == #foo && invocation.isGetter) return _foo;
-    if (name == const Symbol('foo=')) {
-      _foo = invocation.positionalArguments[0];
-      return null;
-    }
-    return super.noSuchMethod(invocation);
-  }
-}
-
-class IndexerModel implements Indexable<String, dynamic> {
-  var _foo = 42;
-  List log = [];
-
-  operator [](index) {
-    log.add('[] $index');
-    if (index == 'foo') return _foo;
-  }
-
-  operator []=(index, value) {
-    log.add('[]= $index $value');
-    if (index == 'foo') _foo = value;
-  }
-}
-
-@reflectable
-class TestModel extends ChangeNotifier {
-  var _a, _b, _c;
-
-  TestModel([this._a, this._b, this._c]);
-
-  get a => _a;
-
-  void set a(newValue) {
-    _a = notifyPropertyChange(#a, _a, newValue);
-  }
-
-  get b => _b;
-
-  void set b(newValue) {
-    _b = notifyPropertyChange(#b, _b, newValue);
-  }
-
-  get c => _c;
-
-  void set c(newValue) {
-    _c = notifyPropertyChange(#c, _c, newValue);
-  }
-}
-
-class WatcherModel extends Observable {
-  // TODO(jmesserly): dart2js does not let these be on the same line:
-  // @observable var a, b, c;
-  @observable var a;
-  @observable var b;
-  @observable var c;
-
-  WatcherModel();
-}
-
-class Foo {
-  var value;
-  Foo(this.value);
-  String toString() => 'Foo$value';
-}
diff --git a/packages/observe/test/transformer_test.dart b/packages/observe/test/transformer_test.dart
deleted file mode 100644
index 305e956..0000000
--- a/packages/observe/test/transformer_test.dart
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'package:barback/barback.dart';
-import 'package:observe/transformer.dart';
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
-import 'package:stack_trace/stack_trace.dart';
-
-main() {
-  useCompactVMConfiguration();
-
-  group('replaces Observable for ChangeNotifier', () {
-    _testClause('extends Observable', 'extends ChangeNotifier');
-    _testClause('extends Base with Observable',
-        'extends Base with ChangeNotifier');
-    _testClause('extends Base<T> with Observable',
-        'extends Base<T> with ChangeNotifier');
-    _testClause('extends Base with Mixin, Observable',
-        'extends Base with Mixin, ChangeNotifier');
-    _testClause('extends Base with Observable, Mixin',
-        'extends Base with ChangeNotifier, Mixin');
-    _testClause('extends Base with Mixin<T>, Observable',
-        'extends Base with Mixin<T>, ChangeNotifier');
-    _testClause('extends Base with Mixin, Observable, Mixin2',
-        'extends Base with Mixin, ChangeNotifier, Mixin2');
-    _testClause('extends Observable implements Interface',
-        'extends ChangeNotifier implements Interface');
-    _testClause('extends Observable implements Interface<T>',
-        'extends ChangeNotifier implements Interface<T>');
-    _testClause('extends Base with Observable implements Interface',
-        'extends Base with ChangeNotifier implements Interface');
-    _testClause(
-        'extends Base with Mixin, Observable implements I1, I2',
-        'extends Base with Mixin, ChangeNotifier implements I1, I2');
-  });
-
-  group('adds "with ChangeNotifier" given', () {
-    _testClause('', 'extends ChangeNotifier');
-    _testClause('extends Base', 'extends Base with ChangeNotifier');
-    _testClause('extends Base<T>', 'extends Base<T> with ChangeNotifier');
-    _testClause('extends Base with Mixin',
-        'extends Base with Mixin, ChangeNotifier');
-    _testClause('extends Base with Mixin<T>',
-        'extends Base with Mixin<T>, ChangeNotifier');
-    _testClause('extends Base with Mixin, Mixin2',
-        'extends Base with Mixin, Mixin2, ChangeNotifier');
-    _testClause('implements Interface',
-        'extends ChangeNotifier implements Interface');
-    _testClause('implements Interface<T>',
-        'extends ChangeNotifier implements Interface<T>');
-    _testClause('extends Base implements Interface',
-        'extends Base with ChangeNotifier implements Interface');
-    _testClause('extends Base with Mixin implements I1, I2',
-        'extends Base with Mixin, ChangeNotifier implements I1, I2');
-  });
-
-  group('fixes contructor calls ', () {
-    _testInitializers('this.a', '(a) : __\$a = a');
-    _testInitializers('{this.a}', '({a}) : __\$a = a');
-    _testInitializers('[this.a]', '([a]) : __\$a = a');
-    _testInitializers('this.a, this.b', '(a, b) : __\$a = a, __\$b = b');
-    _testInitializers('{this.a, this.b}', '({a, b}) : __\$a = a, __\$b = b');
-    _testInitializers('[this.a, this.b]', '([a, b]) : __\$a = a, __\$b = b');
-    _testInitializers('this.a, [this.b]', '(a, [b]) : __\$a = a, __\$b = b');
-    _testInitializers('this.a, {this.b}', '(a, {b}) : __\$a = a, __\$b = b');
-  });
-
-  var annotations =  ['observable', 'published',
-      'ObservableProperty()', 'PublishedProperty(reflect: true)'];
-  for (var annotation in annotations) {
-    group('@$annotation full text', () {
-      test('with changes', () {
-        return _transform(_sampleObservable(annotation)).then(
-            (out) => expect(out, _sampleObservableOutput(annotation)));
-      });
-
-      test('complex with changes', () {
-        return _transform(_complexObservable(annotation)).then(
-            (out) => expect(out, _complexObservableOutput(annotation)));
-      });
-
-      test('no changes', () {
-        var input = 'class A {/*@$annotation annotation to trigger transform */;}';
-        return _transform(input).then((output) => expect(output, input));
-      });
-    });
-  }
-}
-
-_testClause(String clauses, String expected) {
-  test(clauses, () {
-    var className = 'MyClass';
-    if (clauses.contains('<T>')) className += '<T>';
-    var code = '''
-      class $className $clauses {
-        @observable var field;
-      }''';
-
-    return _transform(code).then((output) {
-      var classPos = output.indexOf(className) + className.length;
-      var actualClauses = output.substring(classPos,
-        output.indexOf('{')).trim().replaceAll('  ', ' ');
-      expect(actualClauses, expected);
-    });
-  });
-}
-
-_testInitializers(String args, String expected) {
-  test(args, () {
-    var constructor = 'MyClass(';
-    var code = '''
-        class MyClass {
-          @observable var a;
-          @observable var b;
-          MyClass($args);
-        }''';
-
-    return _transform(code).then((output) {
-      var begin = output.indexOf(constructor) + constructor.length - 1;
-      var end = output.indexOf(';', begin);
-      if (end == -1) end = output.length;
-      var init = output.substring(begin, end).trim().replaceAll('  ', ' ');
-      expect(init, expected);
-    });
-  });
-}
-
-/// Helper that applies the transform by creating mock assets.
-Future<String> _transform(String code) {
-  return Chain.capture(() {
-    var id = new AssetId('foo', 'a/b/c.dart');
-    var asset = new Asset.fromString(id, code);
-    var transformer = new ObservableTransformer();
-    return transformer.isPrimary(asset).then((isPrimary) {
-      expect(isPrimary, isTrue);
-      var transform = new _MockTransform(asset);
-      return transformer.apply(transform).then((_) {
-        expect(transform.outs, hasLength(2));
-        expect(transform.outs[0].id, id);
-        expect(transform.outs[1].id, id.addExtension('._buildLogs.1'));
-        return transform.outs.first.readAsString();
-      });
-    });
-  });
-}
-
-class _MockTransform implements Transform {
-  bool shouldConsumePrimary = false;
-  List<Asset> outs = [];
-  Asset _asset;
-  TransformLogger logger = new TransformLogger(_mockLogFn);
-  Asset get primaryInput => _asset;
-
-  _MockTransform(this._asset);
-  Future<Asset> getInput(AssetId id) {
-    if (id == primaryInput.id) return new Future.value(primaryInput);
-    fail('_MockTransform fail');
-  }
-
-  void addOutput(Asset output) {
-    outs.add(output);
-  }
-
-  void consumePrimary() {
-    shouldConsumePrimary = true;
-  }
-
-  readInput(id) => throw new UnimplementedError();
-  readInputAsString(id, {encoding}) => throw new UnimplementedError();
-  hasInput(id) =>
-      new Future.value(id == _asset.id || outs.any((a) => a.id == id));
-
-  static void _mockLogFn(AssetId asset, LogLevel level, String message,
-                         span) {
-    // Do nothing.
-  }
-}
-
-String _sampleObservable(String annotation) => '''
-library A_foo;
-import 'package:observe/observe.dart';
-
-class A extends Observable {
-  @$annotation int foo;
-  A(this.foo);
-}
-''';
-
-String _sampleObservableOutput(String annotation) =>
-    "library A_foo;\n"
-    "import 'package:observe/observe.dart';\n\n"
-    "class A extends ChangeNotifier {\n"
-    "  @reflectable @$annotation int get foo => __\$foo; int __\$foo; "
-      "${_makeSetter('int', 'foo')}\n"
-    "  A(foo) : __\$foo = foo;\n"
-    "}\n";
-
-_makeSetter(type, name) => '@reflectable set $name($type value) { '
-    '__\$$name = notifyPropertyChange(#$name, __\$$name, value); }';
-
-String _complexObservable(String annotation) => '''
-class Foo extends Observable {
-  @$annotation
-  @otherMetadata
-      Foo
-          foo/*D*/= 1, bar =/*A*/2/*B*/,
-          quux/*C*/;
-
-  @$annotation var baz;
-}
-''';
-
-String _complexObservableOutput(String meta) =>
-    "class Foo extends ChangeNotifier {\n"
-    "  @reflectable @$meta\n"
-    "  @otherMetadata\n"
-    "      Foo\n"
-    "          get foo => __\$foo; Foo __\$foo/*D*/= 1; "
-        "${_makeSetter('Foo', 'foo')} "
-        "@reflectable @$meta @otherMetadata Foo get bar => __\$bar; "
-        "Foo __\$bar =/*A*/2/*B*/; ${_makeSetter('Foo', 'bar')}\n"
-    "          @reflectable @$meta @otherMetadata Foo get quux => __\$quux; "
-        "Foo __\$quux/*C*/; ${_makeSetter('Foo', 'quux')}\n\n"
-    "  @reflectable @$meta dynamic get baz => __\$baz; dynamic __\$baz; "
-        "${_makeSetter('dynamic', 'baz')}\n"
-    "}\n";
diff --git a/packages/observe/test/unique_message_test.dart b/packages/observe/test/unique_message_test.dart
deleted file mode 100644
index 54fb5a4..0000000
--- a/packages/observe/test/unique_message_test.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests for some of the utility helper functions used by the compiler.
-library polymer.test.build.messages_test;
-
-import 'dart:mirrors';
-
-import 'package:unittest/unittest.dart';
-import 'package:code_transformers/messages/messages.dart' show Message;
-
-import 'package:observe/src/messages.dart' as p1;
-
-/// [p1] is accessed via mirrors, this comment prevents the analyzer from
-/// complaining about it.
-main() {
-  test('each message id is unique', () {
-    var seen = {};
-    int total = 0;
-    var mirrors = currentMirrorSystem();
-    var lib = mirrors.findLibrary(#observe.src.messages);
-    expect(lib, isNotNull);
-    lib.declarations.forEach((symbol, decl) {
-      if (decl is! VariableMirror) return;
-      var field = lib.getField(symbol).reflectee;
-      var name = MirrorSystem.getName(symbol);
-      if (field is! Message) return;
-      var id = field.id;
-      expect(seen.containsKey(id), isFalse, reason: 'Duplicate id `$id`. '
-          'Currently set for both `$name` and `${seen[id]}`.');
-      seen[id] = name;
-      total++;
-    });
-    expect(seen.length, total);
-  });
-}
diff --git a/packages/package_config/.analysis_options b/packages/package_config/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/package_config/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/package_config/.atom/launches/all.yaml b/packages/package_config/.atom/launches/all.yaml
new file mode 100644
index 0000000..75b96c6
--- /dev/null
+++ b/packages/package_config/.atom/launches/all.yaml
@@ -0,0 +1,13 @@
+# Cli launch configuration for test/all.dart.
+type: cli
+path: test/all.dart
+
+cli:
+  # Additional args for the application.
+  args:
+  # The working directory to use for the launch.
+  cwd:
+  # Enable or disable checked mode.
+  checked: true
+  # Enable or disable debugging.
+  debug: true
diff --git a/packages/package_config/.atom/launches/discovery_test.yaml b/packages/package_config/.atom/launches/discovery_test.yaml
new file mode 100644
index 0000000..b908dde
--- /dev/null
+++ b/packages/package_config/.atom/launches/discovery_test.yaml
@@ -0,0 +1,13 @@
+# Cli launch configuration for test/discovery_test.dart.
+type: cli
+path: test/discovery_test.dart
+
+cli:
+  # Additional args for the application.
+  args:
+  # The working directory to use for the launch.
+  cwd:
+  # Enable or disable checked mode.
+  checked: true
+  # Enable or disable debugging.
+  debug: true
diff --git a/packages/package_config/.gitignore b/packages/package_config/.gitignore
index b46f3df..aac1f4f 100644
--- a/packages/package_config/.gitignore
+++ b/packages/package_config/.gitignore
@@ -1,8 +1,4 @@
-.idea
+.packages
 .pub
 packages
-build
-.project
-.settings
 pubspec.lock
-.packages
diff --git a/packages/package_config/.idea/.name b/packages/package_config/.idea/.name
new file mode 100644
index 0000000..d85b2e8
--- /dev/null
+++ b/packages/package_config/.idea/.name
@@ -0,0 +1 @@
+package_config
\ No newline at end of file
diff --git a/packages/package_config/.idea/compiler.xml b/packages/package_config/.idea/compiler.xml
new file mode 100644
index 0000000..96cc43e
--- /dev/null
+++ b/packages/package_config/.idea/compiler.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="!?*.java" />
+      <entry name="!?*.form" />
+      <entry name="!?*.class" />
+      <entry name="!?*.groovy" />
+      <entry name="!?*.scala" />
+      <entry name="!?*.flex" />
+      <entry name="!?*.kt" />
+      <entry name="!?*.clj" />
+      <entry name="!?*.aj" />
+    </wildcardResourcePatterns>
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="false">
+        <processorPath useClasspath="true" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
\ No newline at end of file
diff --git a/packages/package_config/.idea/copyright/profiles_settings.xml b/packages/package_config/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/packages/package_config/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+<component name="CopyrightManager">
+  <settings default="" />
+</component>
\ No newline at end of file
diff --git a/packages/package_config/.idea/misc.xml b/packages/package_config/.idea/misc.xml
new file mode 100644
index 0000000..7e63416
--- /dev/null
+++ b/packages/package_config/.idea/misc.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+    <OptionsSetting value="true" id="Add" />
+    <OptionsSetting value="true" id="Remove" />
+    <OptionsSetting value="true" id="Checkout" />
+    <OptionsSetting value="true" id="Update" />
+    <OptionsSetting value="true" id="Status" />
+    <OptionsSetting value="true" id="Edit" />
+    <ConfirmationsSetting value="0" id="Add" />
+    <ConfirmationsSetting value="0" id="Remove" />
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="true" assert-keyword="true" jdk-15="true" />
+</project>
\ No newline at end of file
diff --git a/packages/package_config/.idea/modules.xml b/packages/package_config/.idea/modules.xml
new file mode 100644
index 0000000..82992d3
--- /dev/null
+++ b/packages/package_config/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/package_config.iml" filepath="$PROJECT_DIR$/.idea/package_config.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/packages/package_config/.idea/package_config.iml b/packages/package_config/.idea/package_config.iml
new file mode 100644
index 0000000..767a029
--- /dev/null
+++ b/packages/package_config/.idea/package_config.iml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.pub" />
+      <excludeFolder url="file://$MODULE_DIR$/packages/package_config" />
+      <excludeFolder url="file://$MODULE_DIR$/test/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/tool/packages" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Dart SDK" level="application" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/packages/package_config/.idea/uiDesigner.xml b/packages/package_config/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/packages/package_config/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/packages/package_config/.idea/vcs.xml b/packages/package_config/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/packages/package_config/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/packages/package_config/.idea/workspace.xml b/packages/package_config/.idea/workspace.xml
new file mode 100644
index 0000000..0e83d8b
--- /dev/null
+++ b/packages/package_config/.idea/workspace.xml
@@ -0,0 +1,1201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="0def9c26-00db-410a-a7c2-ef1b36bc2a80" name="Default" comment="" />
+    <ignored path="package_config.iws" />
+    <ignored path=".idea/workspace.xml" />
+    <ignored path=".idea/dataSources.local.xml" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value="" />
+  </component>
+  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
+  <component name="FavoritesManager">
+    <favorites_list name="package_config" />
+  </component>
+  <component name="FileEditorManager">
+    <splitter split-orientation="horizontal" split-proportion="0.5">
+      <split-first>
+        <leaf>
+          <file leaf-file-name=".travis.yml" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/.travis.yml">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="1" column="9" selection-start-line="1" selection-start-column="9" selection-end-line="1" selection-end-column="9" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="travis.sh" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/tool/travis.sh">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="15" column="18" selection-start-line="15" selection-start-column="18" selection-end-line="15" selection-end-column="18" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="AUTHORS" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/AUTHORS">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+              <provider editor-type-id="MarkdownPreviewEditor">
+                <state />
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="CONTRIBUTING.md" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+              <provider editor-type-id="MarkdownPreviewEditor">
+                <state />
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="LICENSE" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/LICENSE">
+              <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+                <state />
+              </provider>
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="all.dart" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/test/all.dart">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+                  <folding>
+                    <element signature="e#0#295#0" expanded="true" />
+                  </folding>
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="true">
+            <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.65217394">
+                  <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="packagemap.dart" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="159" column="11" selection-start-line="159" selection-start-column="11" selection-end-line="159" selection-end-column="11" />
+                  <folding>
+                    <element signature="e#0#7210#0" expanded="true" />
+                  </folding>
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="uri.dart" pinned="false" current-in-tab="false">
+            <entry file="file:///Applications/Tools/eclipse/dart-sdk/lib/core/uri.dart">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.0">
+                  <caret line="9" column="16" selection-start-line="9" selection-start-column="16" selection-end-line="9" selection-end-column="16" />
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+        </leaf>
+      </split-first>
+      <split-second>
+        <leaf>
+          <file leaf-file-name="README.md" pinned="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/README.md">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="-7.2413793">
+                  <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+                  <folding />
+                </state>
+              </provider>
+              <provider editor-type-id="MarkdownPreviewEditor">
+                <state />
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="test_packagemap.dart" pinned="false" current-in-tab="true">
+            <entry file="file://$PROJECT_DIR$/test/test_packagemap.dart">
+              <provider selected="true" editor-type-id="text-editor">
+                <state vertical-scroll-proportion="0.98571426">
+                  <caret line="75" column="62" selection-start-line="75" selection-start-column="62" selection-end-line="75" selection-end-column="62" />
+                  <folding>
+                    <element signature="e#0#5702#0" expanded="true" />
+                    <element signature="e#236#284#0" expanded="true" />
+                  </folding>
+                </state>
+              </provider>
+            </entry>
+          </file>
+        </leaf>
+      </split-second>
+    </splitter>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+    <option name="RECENT_BRANCH_BY_REPOSITORY">
+      <map>
+        <entry key="$PROJECT_DIR$" value="master" />
+      </map>
+    </option>
+  </component>
+  <component name="GradleLocalSettings">
+    <option name="externalProjectsViewState">
+      <projects_view />
+    </option>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/README.md" />
+        <option value="$PROJECT_DIR$/todo.txt" />
+        <option value="$PROJECT_DIR$/test/all_test.dart" />
+        <option value="$PROJECT_DIR$/packagemap.dart" />
+        <option value="$PROJECT_DIR$/tool/travis.sh" />
+        <option value="$PROJECT_DIR$/test/test_all.dart" />
+        <option value="$PROJECT_DIR$/test/test_loader.dart" />
+        <option value="$PROJECT_DIR$/test/all.dart" />
+        <option value="$PROJECT_DIR$/test/test_packagemap.dart" />
+        <option value="$PROJECT_DIR$/.travis.yml" />
+        <option value="$PROJECT_DIR$/lib/packagemap.dart" />
+        <option value="$PROJECT_DIR$/pubspec.yaml" />
+      </list>
+    </option>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+  </component>
+  <component name="NamedScopeManager">
+    <order />
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="y" value="23" />
+    <option name="width" value="1440" />
+    <option name="height" value="873" />
+  </component>
+  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+    <OptionsSetting value="true" id="Add" />
+    <OptionsSetting value="true" id="Remove" />
+    <OptionsSetting value="true" id="Checkout" />
+    <OptionsSetting value="true" id="Update" />
+    <OptionsSetting value="true" id="Status" />
+    <OptionsSetting value="true" id="Edit" />
+    <ConfirmationsSetting value="0" id="Add" />
+    <ConfirmationsSetting value="0" id="Remove" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+    </navigator>
+    <panes>
+      <pane id="PackagesPane" />
+      <pane id="Scope" />
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="tool" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="test" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="package_config" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lib" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="Scratches" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="recentsLimit" value="5" />
+    <property name="FullScreen" value="false" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$" />
+      <recent name="$PROJECT_DIR$/tool" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/lib" />
+    </key>
+  </component>
+  <component name="RunManager" selected="Dart Command Line App.all.dart">
+    <configuration default="false" name="all.dart" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" temporary="true" nameIsGenerated="true">
+      <option name="filePath" value="$PROJECT_DIR$/test/all.dart" />
+      <option name="workingDirectory" value="$PROJECT_DIR$" />
+      <method />
+    </configuration>
+    <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
+      <module name="" />
+      <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
+      <option name="PROGRAM_PARAMETERS" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android Application">
+      <module name="" />
+      <option name="ACTIVITY_CLASS" value="" />
+      <option name="MODE" value="default_activity" />
+      <option name="DEPLOY" value="true" />
+      <option name="ARTIFACT_NAME" value="" />
+      <option name="TARGET_SELECTION_MODE" value="EMULATOR" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="USE_COMMAND_LINE" value="true" />
+      <option name="COMMAND_LINE" value="" />
+      <option name="WIPE_USER_DATA" value="false" />
+      <option name="DISABLE_BOOT_ANIMATION" value="false" />
+      <option name="NETWORK_SPEED" value="full" />
+      <option name="NETWORK_LATENCY" value="none" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" />
+      <option name="FILTER_LOGCAT_AUTOMATICALLY" value="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
+      <module name="" />
+      <option name="TESTING_TYPE" value="0" />
+      <option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="CLASS_NAME" value="" />
+      <option name="PACKAGE_NAME" value="" />
+      <option name="TARGET_SELECTION_MODE" value="EMULATOR" />
+      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
+      <option name="PREFERRED_AVD" value="" />
+      <option name="USE_COMMAND_LINE" value="true" />
+      <option name="COMMAND_LINE" value="" />
+      <option name="WIPE_USER_DATA" value="false" />
+      <option name="DISABLE_BOOT_ANIMATION" value="false" />
+      <option name="NETWORK_SPEED" value="full" />
+      <option name="NETWORK_LATENCY" value="none" />
+      <option name="CLEAR_LOGCAT" value="false" />
+      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" />
+      <option name="FILTER_LOGCAT_AUTOMATICALLY" value="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="Applet" factoryName="Applet">
+      <module />
+      <option name="WIDTH" value="400" />
+      <option name="HEIGHT" value="300" />
+      <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+      <method />
+    </configuration>
+    <configuration default="true" type="Application" factoryName="Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="CucumberJavaRunConfigurationType" factoryName="Cucumber java">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <option name="myFilePath" />
+      <option name="GLUE" />
+      <option name="myNameFilter" />
+      <option name="myGeneratedName" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="VM_PARAMETERS" />
+      <option name="PROGRAM_PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="ENABLE_SWING_INSPECTOR" value="false" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application">
+      <method />
+    </configuration>
+    <configuration default="true" type="DartUnitRunConfigurationType" factoryName="DartUnit">
+      <method />
+    </configuration>
+    <configuration default="true" type="FlashRunConfigurationType" factoryName="Flash App">
+      <option name="BCName" value="" />
+      <option name="IOSSimulatorSdkPath" value="" />
+      <option name="adlOptions" value="" />
+      <option name="airProgramParameters" value="" />
+      <option name="appDescriptorForEmulator" value="Android" />
+      <option name="debugTransport" value="USB" />
+      <option name="debuggerSdkRaw" value="BC SDK" />
+      <option name="emulator" value="NexusOne" />
+      <option name="emulatorAdlOptions" value="" />
+      <option name="fastPackaging" value="true" />
+      <option name="fullScreenHeight" value="0" />
+      <option name="fullScreenWidth" value="0" />
+      <option name="launchUrl" value="false" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/Applications/Flash Player Debugger.app" />
+        </LauncherParameters>
+      </option>
+      <option name="mobileRunTarget" value="Emulator" />
+      <option name="moduleName" value="" />
+      <option name="overriddenMainClass" value="" />
+      <option name="overriddenOutputFileName" value="" />
+      <option name="overrideMainClass" value="false" />
+      <option name="runTrusted" value="true" />
+      <option name="screenDpi" value="0" />
+      <option name="screenHeight" value="0" />
+      <option name="screenWidth" value="0" />
+      <option name="url" value="http://" />
+      <option name="usbDebugPort" value="7936" />
+      <method />
+    </configuration>
+    <configuration default="true" type="FlexUnitRunConfigurationType" factoryName="FlexUnit" appDescriptorForEmulator="Android" class_name="" emulatorAdlOptions="" method_name="" package_name="" scope="Class">
+      <option name="BCName" value="" />
+      <option name="launcherParameters">
+        <LauncherParameters>
+          <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" />
+          <option name="launcherType" value="OSDefault" />
+          <option name="newPlayerInstance" value="false" />
+          <option name="playerPath" value="/Applications/Flash Player Debugger.app" />
+        </LauncherParameters>
+      </option>
+      <option name="moduleName" value="" />
+      <option name="trusted" value="true" />
+      <method />
+    </configuration>
+    <configuration default="true" type="GradleRunConfiguration" factoryName="Gradle">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list />
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
+    <configuration default="true" type="GrailsRunConfigurationType" factoryName="Grails">
+      <module name="" />
+      <setting name="vmparams" value="" />
+      <setting name="cmdLine" value="run-app" />
+      <setting name="depsClasspath" value="false" />
+      <setting name="passParentEnv" value="true" />
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <setting name="launchBrowser" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="JUnit" factoryName="JUnit">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <envs />
+      <patterns />
+      <method />
+    </configuration>
+    <configuration default="true" type="JarApplication" factoryName="JAR Application">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
+      <method />
+    </configuration>
+    <configuration default="true" type="Remote" factoryName="Remote">
+      <option name="USE_SOCKET_TRANSPORT" value="true" />
+      <option name="SERVER_MODE" value="false" />
+      <option name="SHMEM_ADDRESS" value="javadebug" />
+      <option name="HOST" value="localhost" />
+      <option name="PORT" value="5005" />
+      <method />
+    </configuration>
+    <configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="TestNG" factoryName="TestNG">
+      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+      <module name="" />
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
+      <option name="SUITE_NAME" />
+      <option name="PACKAGE_NAME" />
+      <option name="MAIN_CLASS_NAME" />
+      <option name="METHOD_NAME" />
+      <option name="GROUP_NAME" />
+      <option name="TEST_OBJECT" value="CLASS" />
+      <option name="VM_PARAMETERS" value="-ea" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="OUTPUT_DIRECTORY" />
+      <option name="ANNOTATION_TYPE" />
+      <option name="ENV_VARIABLES" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <option name="USE_DEFAULT_REPORTERS" value="false" />
+      <option name="PROPERTIES_FILE" />
+      <envs />
+      <properties />
+      <listeners />
+      <method />
+    </configuration>
+    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
+      <node-options />
+      <gulpfile />
+      <tasks />
+      <arguments />
+      <pass-parent-envs>true</pass-parent-envs>
+      <envs />
+      <method />
+    </configuration>
+    <configuration default="true" type="osgi.bnd.run" factoryName="Run Launcher">
+      <method />
+    </configuration>
+    <configuration default="true" type="osgi.bnd.run" factoryName="Test Launcher (JUnit)">
+      <method />
+    </configuration>
+    <list size="1">
+      <item index="0" class="java.lang.String" itemvalue="Dart Command Line App.all.dart" />
+    </list>
+    <recent_temporary>
+      <list size="1">
+        <item index="0" class="java.lang.String" itemvalue="Dart Command Line App.all.dart" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false" />
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="0def9c26-00db-410a-a7c2-ef1b36bc2a80" name="Default" comment="" />
+      <created>1431547036572</created>
+      <option name="number" value="Default" />
+      <updated>1431547036572</updated>
+      <workItem from="1431547039245" duration="3402000" />
+      <workItem from="1431551394878" duration="154000" />
+      <workItem from="1431551636018" duration="161000" />
+      <workItem from="1431551932622" duration="3000" />
+      <workItem from="1431551939423" duration="10107000" />
+    </task>
+    <task id="LOCAL-00001" summary="Initial template commit.">
+      <created>1431549509036</created>
+      <option name="number" value="00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1431549509036</updated>
+    </task>
+    <task id="LOCAL-00002" summary="Initial parser port.">
+      <created>1431552323782</created>
+      <option name="number" value="00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1431552323782</updated>
+    </task>
+    <task id="LOCAL-00003" summary="Parser fixes.">
+      <created>1431553456048</created>
+      <option name="number" value="00003" />
+      <option name="project" value="LOCAL" />
+      <updated>1431553456048</updated>
+    </task>
+    <task id="LOCAL-00004" summary="Backed out path normalization.">
+      <created>1431554254787</created>
+      <option name="number" value="00004" />
+      <option name="project" value="LOCAL" />
+      <updated>1431554254787</updated>
+    </task>
+    <task id="LOCAL-00005" summary="Backed out path normalization.">
+      <created>1431554342372</created>
+      <option name="number" value="00005" />
+      <option name="project" value="LOCAL" />
+      <updated>1431554342372</updated>
+    </task>
+    <task id="LOCAL-00006" summary="Fixed path normalization.">
+      <created>1431624402951</created>
+      <option name="number" value="00006" />
+      <option name="project" value="LOCAL" />
+      <updated>1431624402951</updated>
+    </task>
+    <task id="LOCAL-00007" summary="Fixed path normalization.">
+      <created>1431626795454</created>
+      <option name="number" value="00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1431626795454</updated>
+    </task>
+    <task id="LOCAL-00008" summary="SDK constraint bump to pickup Uri.normalizePath().">
+      <created>1431642367123</created>
+      <option name="number" value="00008" />
+      <option name="project" value="LOCAL" />
+      <updated>1431642367123</updated>
+    </task>
+    <option name="localTasksCounter" value="9" />
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="13827000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="0" y="23" width="1440" height="873" extended-state="0" />
+    <editor active="true" />
+    <layout>
+      <window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.6169154" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19722222" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.28989363" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+    </layout>
+  </component>
+  <component name="UnknownFeatures">
+    <option featureType="com.intellij.fileTypeFactory" implementationName="*.sh" />
+  </component>
+  <component name="Vcs.Log.UiProperties">
+    <option name="RECENTLY_FILTERED_USER_GROUPS">
+      <collection />
+    </option>
+    <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
+      <collection />
+    </option>
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="Initial template commit." />
+    <MESSAGE value="Initial parser port." />
+    <MESSAGE value="Parser fixes." />
+    <MESSAGE value="Backed out path normalization." />
+    <MESSAGE value="Fixed path normalization." />
+    <MESSAGE value="SDK constraint bump to pickup Uri.normalizePath()." />
+    <option name="LAST_COMMIT_MESSAGE" value="SDK constraint bump to pickup Uri.normalizePath()." />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager />
+    <watches-manager />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+        <state />
+      </provider>
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/all.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#295#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="36" column="23" selection-start-line="36" selection-start-column="23" selection-end-line="36" selection-end-column="23" />
+          <folding>
+            <element signature="e#0#7210#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.travis.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/tool/travis.sh">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="21" selection-start-line="11" selection-start-column="21" selection-end-line="11" selection-end-column="21" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/AUTHORS">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/all.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#295#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="36" column="23" selection-start-line="36" selection-start-column="23" selection-end-line="36" selection-end-column="23" />
+          <folding>
+            <element signature="e#0#7210#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.travis.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/tool/travis.sh">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="21" selection-start-line="11" selection-start-column="21" selection-end-line="11" selection-end-column="21" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/AUTHORS">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/all.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#295#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="36" column="23" selection-start-line="36" selection-start-column="23" selection-end-line="36" selection-end-column="23" />
+          <folding>
+            <element signature="e#0#7210#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.travis.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/tool/travis.sh">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="21" selection-start-line="11" selection-start-column="21" selection-end-line="11" selection-end-column="21" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/AUTHORS">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/all.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#295#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="4" column="34" selection-start-line="4" selection-start-column="34" selection-end-line="4" selection-end-column="34" />
+          <folding>
+            <element signature="e#0#7210#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="-7.2413793">
+          <caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/AUTHORS">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CONTRIBUTING.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="MarkdownPreviewEditor">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.lock">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+      <provider editor-type-id="com.intellij.database.editor.CsvTableFileEditorProvider">
+        <state />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.gitignore">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/all.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#295#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/tool/travis.sh">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="15" column="18" selection-start-line="15" selection-start-column="18" selection-end-line="15" selection-end-column="18" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/test_packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.98571426">
+          <caret line="75" column="62" selection-start-line="75" selection-start-column="62" selection-end-line="75" selection-end-column="62" />
+          <folding>
+            <element signature="e#0#5702#0" expanded="true" />
+            <element signature="e#236#284#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/.travis.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="1" column="9" selection-start-line="1" selection-start-column="9" selection-end-line="1" selection-end-column="9" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/packagemap.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="159" column="11" selection-start-line="159" selection-start-column="11" selection-end-line="159" selection-end-column="11" />
+          <folding>
+            <element signature="e#0#7210#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///Applications/Tools/eclipse/dart-sdk/lib/core/uri.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="9" column="16" selection-start-line="9" selection-start-column="16" selection-end-line="9" selection-end-column="16" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.65217394">
+          <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>
\ No newline at end of file
diff --git a/packages/usage/.project b/packages/package_config/.project
similarity index 90%
rename from packages/usage/.project
rename to packages/package_config/.project
index 5e76d1e..301f045 100644
--- a/packages/usage/.project
+++ b/packages/package_config/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>usage</name>
+	<name>package_config</name>
 	<comment></comment>
 	<projects>
 	</projects>
@@ -16,7 +16,7 @@
 	</natures>
 	<filteredResources>
 		<filter>
-			<id>1418770673943</id>
+			<id>1432756565262</id>
 			<name></name>
 			<type>30</type>
 			<matcher>
diff --git a/packages/package_config/.settings/com.google.dart.tools.core.prefs b/packages/package_config/.settings/com.google.dart.tools.core.prefs
new file mode 100644
index 0000000..3962d7a
--- /dev/null
+++ b/packages/package_config/.settings/com.google.dart.tools.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+projectVmPackageRoot=
diff --git a/packages/package_config/.settings/org.eclipse.core.resources.prefs b/packages/package_config/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/packages/package_config/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/packages/package_config/CHANGELOG.md b/packages/package_config/CHANGELOG.md
index f4e355e..b7b441e 100644
--- a/packages/package_config/CHANGELOG.md
+++ b/packages/package_config/CHANGELOG.md
@@ -1,16 +1,19 @@
-# Changelog
+## 0.1.5
 
-## 0.1.3-dev
+- `FilePackagesDirectoryPackages.getBase(..)` performance improvements.
 
-- Invalid test cleanup (to keepup with changes in `Uri`).
+## 0.1.4
+
+- Strong mode fixes.
+
+## 0.1.3
+
+- Invalid test cleanup (to keep up with changes in `Uri`).
 
 ## 0.1.1
 
 - Syntax updates.
 
-
 ## 0.1.0
 
 - Initial implementation.
-
-
diff --git a/packages/package_config/README.md b/packages/package_config/README.md
index 9a0995d..0463719 100644
--- a/packages/package_config/README.md
+++ b/packages/package_config/README.md
@@ -4,7 +4,7 @@
 in this [DEP](https://github.com/lrhn/dep-pkgspec/blob/master/DEP-pkgspec.md), 
 under review [here] (https://github.com/dart-lang/dart_enhancement_proposals/issues/5).
 
-[![Build Status](https://travis-ci.org/dart-lang/package_config.svg?branch=master)](https://travis-ci.org/dart-lang/package_config) [![pub package](http://img.shields.io/pub/v/package_config.svg)](https://pub.dartlang.org/packages/package_config) 
+[![Build Status](https://travis-ci.org/dart-lang/package_config.svg?branch=master)](https://travis-ci.org/dart-lang/package_config) [![pub package](https://img.shields.io/pub/v/package_config.svg)](https://pub.dartlang.org/packages/package_config) 
 
 ## Features and bugs
 
diff --git a/packages/package_config/codereview.settings b/packages/package_config/codereview.settings
new file mode 100644
index 0000000..1099f05
--- /dev/null
+++ b/packages/package_config/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/package_config/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/packages/package_config/lib/discovery.dart b/packages/package_config/lib/discovery.dart
index 8e42af7..4c09eec 100644
--- a/packages/package_config/lib/discovery.dart
+++ b/packages/package_config/lib/discovery.dart
@@ -28,22 +28,21 @@
 /// resolution file, for example one specified using a `--packages`
 /// command-line parameter.
 Future<Packages> loadPackagesFile(Uri packagesFile,
-                                  {Future<List<int>> loader(Uri uri)}) {
+    {Future<List<int>> loader(Uri uri)}) async {
   Packages parseBytes(List<int> bytes) {
     Map<String, Uri> packageMap = pkgfile.parse(bytes, packagesFile);
     return new MapPackages(packageMap);
   }
   if (packagesFile.scheme == "file") {
     File file = new File.fromUri(packagesFile);
-    return file.readAsBytes().then(parseBytes);
+    return parseBytes(await file.readAsBytes());
   }
   if (loader == null) {
-    return _httpGet(packagesFile).then(parseBytes);
+    return parseBytes(await _httpGet(packagesFile));
   }
-  return loader(packagesFile).then(parseBytes);
+  return parseBytes(await loader(packagesFile));
 }
 
-
 /// Create a [Packages] object for a package directory.
 ///
 /// The [packagesDir] URI should refer to a directory.
@@ -63,7 +62,6 @@
   return new NonFilePackagesDirectoryPackages(packagesDir);
 }
 
-
 /// Discover the package configuration for a Dart script.
 ///
 /// The [baseUri] points to either the Dart script or its directory.
@@ -93,7 +91,7 @@
 /// The content should be a UTF-8 encoded `.packages` file, and must return an
 /// error future if loading fails for any reason.
 Future<Packages> findPackages(Uri baseUri,
-                              {Future<List<int>> loader(Uri unsupportedUri)}) {
+    {Future<List<int>> loader(Uri unsupportedUri)}) {
   if (baseUri.scheme == "file") {
     return new Future<Packages>.sync(() => findPackagesFromFile(baseUri));
   } else if (loader != null) {
@@ -191,17 +189,19 @@
 /// of the requested `.packages` file as bytes, which will be assumed to be
 /// UTF-8 encoded.
 Future<Packages> findPackagesFromNonFile(Uri nonFileUri,
-                                         {Future<List<int>> loader(Uri name)}) {
+    {Future<List<int>> loader(Uri name)}) async {
   if (loader == null) loader = _httpGet;
   Uri packagesFileUri = nonFileUri.resolve(".packages");
-  return loader(packagesFileUri).then((List<int> fileBytes) {
+
+  try {
+    List<int> fileBytes = await loader(packagesFileUri);
     Map<String, Uri> map = pkgfile.parse(fileBytes, packagesFileUri);
     return new MapPackages(map);
-  }, onError: (_) {
+  } catch (_) {
     // Didn't manage to load ".packages". Assume a "packages/" directory.
     Uri packagesDirectoryUri = nonFileUri.resolve("packages/");
     return new NonFilePackagesDirectoryPackages(packagesDirectoryUri);
-  });
+  }
 }
 
 /// Fetches a file over http.
diff --git a/packages/package_config/lib/discovery_analysis.dart b/packages/package_config/lib/discovery_analysis.dart
index af4df07..058330b 100644
--- a/packages/package_config/lib/discovery_analysis.dart
+++ b/packages/package_config/lib/discovery_analysis.dart
@@ -41,7 +41,7 @@
   /// Look up the [PackageContext] that applies to a specific directory.
   ///
   /// The directory must be inside [directory].
-  PackageContext operator[](Directory directory);
+  PackageContext operator [](Directory directory);
 
   /// A map from directory to package resolver.
   ///
@@ -57,14 +57,14 @@
   /// directory of `directory`. If there is, its corresponding `Packages` object
   /// should be provided as `root`.
   static PackageContext findAll(Directory directory,
-                                {Packages root: Packages.noPackages}) {
+      {Packages root: Packages.noPackages}) {
     if (!directory.existsSync()) {
       throw new ArgumentError("Directory not found: $directory");
     }
-    List contexts = [];
+    var contexts = <PackageContext>[];
     void findRoots(Directory directory) {
       Packages packages;
-      List oldContexts;
+      List<PackageContext> oldContexts;
       File packagesFile = new File(path.join(directory.path, ".packages"));
       if (packagesFile.existsSync()) {
         packages = _loadPackagesFile(packagesFile);
@@ -93,8 +93,7 @@
     }
     findRoots(directory);
     // If the root is not itself context root, add a the wrapper context.
-    if (contexts.length == 1 &&
-        contexts[0].directory == directory) {
+    if (contexts.length == 1 && contexts[0].directory == directory) {
       return contexts[0];
     }
     return new _PackageContext(directory, root, contexts);
@@ -120,7 +119,7 @@
     return result;
   }
 
-  PackageContext operator[](Directory directory) {
+  PackageContext operator [](Directory directory) {
     String path = directory.path;
     if (!path.startsWith(this.directory.path)) {
       throw new ArgumentError("Not inside $path: $directory");
diff --git a/packages/package_config/lib/packages.dart b/packages/package_config/lib/packages.dart
index dbaa06d..890f448 100644
--- a/packages/package_config/lib/packages.dart
+++ b/packages/package_config/lib/packages.dart
@@ -17,7 +17,6 @@
 /// One such case is if the packages are resolved relative to a
 /// `packages/` directory available over HTTP.
 abstract class Packages {
-
   /// A [Packages] resolver containing no packages.
   ///
   /// This constant object is returned by [find] above if no
diff --git a/packages/package_config/lib/packages_file.dart b/packages/package_config/lib/packages_file.dart
index f30781d..93ccd3c 100644
--- a/packages/package_config/lib/packages_file.dart
+++ b/packages/package_config/lib/packages_file.dart
@@ -84,7 +84,7 @@
 /// All the keys of [packageMapping] must be valid package names,
 /// and the values must be URIs that do not have the `package:` scheme.
 void write(StringSink output, Map<String, Uri> packageMapping,
-           {Uri baseUri, String comment}) {
+    {Uri baseUri, String comment}) {
   if (baseUri != null && !baseUri.isAbsolute) {
     throw new ArgumentError.value(baseUri, "baseUri", "Must be absolute");
   }
diff --git a/packages/package_config/lib/src/packages_impl.dart b/packages/package_config/lib/src/packages_impl.dart
index e85f755..fa9115f 100644
--- a/packages/package_config/lib/src/packages_impl.dart
+++ b/packages/package_config/lib/src/packages_impl.dart
@@ -18,13 +18,13 @@
   Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
     String packageName = checkValidPackageUri(packageUri);
     if (notFound != null) return notFound(packageUri);
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  'No package named "$packageName"');
+    throw new ArgumentError.value(
+        packageUri, "packageUri", 'No package named "$packageName"');
   }
 
   Iterable<String> get packages => new Iterable<String>.generate(0);
 
-  Map<String, Uri> asMap() => const<String,Uri>{};
+  Map<String, Uri> asMap() => const <String, Uri>{};
 }
 
 /// Base class for [Packages] implementations.
@@ -38,8 +38,8 @@
     Uri packageBase = getBase(packageName);
     if (packageBase == null) {
       if (notFound != null) return notFound(packageUri);
-      throw new ArgumentError.value(packageUri, "packageUri",
-                                    'No package named "$packageName"');
+      throw new ArgumentError.value(
+          packageUri, "packageUri", 'No package named "$packageName"');
     }
     String packagePath = packageUri.path.substring(packageName.length + 1);
     return packageBase.resolve(packagePath);
diff --git a/packages/package_config/lib/src/packages_io_impl.dart b/packages/package_config/lib/src/packages_io_impl.dart
index 21b61fd..0e94746 100644
--- a/packages/package_config/lib/src/packages_io_impl.dart
+++ b/packages/package_config/lib/src/packages_io_impl.dart
@@ -14,15 +14,21 @@
 /// A [Packages] implementation based on a local directory.
 class FilePackagesDirectoryPackages extends PackagesBase {
   final Directory _packageDir;
+  final Map<String, Uri> _packageToBaseUriMap = <String, Uri>{};
+
   FilePackagesDirectoryPackages(this._packageDir);
 
-  Uri getBase(String packageName) =>
-    new Uri.file(path.join(_packageDir.path, packageName, '.'));
+  Uri getBase(String packageName) {
+    return _packageToBaseUriMap.putIfAbsent(packageName, () {
+      return new Uri.file(path.join(_packageDir.path, packageName, '.'));
+    });
+  }
 
   Iterable<String> _listPackageNames() {
-    return _packageDir.listSync()
-    .where((e) => e is Directory)
-    .map((e) => path.basename(e.path));
+    return _packageDir
+        .listSync()
+        .where((e) => e is Directory)
+        .map((e) => path.basename(e.path));
   }
 
   Iterable<String> get packages => _listPackageNames();
diff --git a/packages/package_config/lib/src/util.dart b/packages/package_config/lib/src/util.dart
index badf640..f1e1afd 100644
--- a/packages/package_config/lib/src/util.dart
+++ b/packages/package_config/lib/src/util.dart
@@ -43,29 +43,29 @@
 /// Validate that a Uri is a valid package:URI.
 String checkValidPackageUri(Uri packageUri) {
   if (packageUri.scheme != "package") {
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  "Not a package: URI");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Not a package: URI");
   }
   if (packageUri.hasAuthority) {
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  "Package URIs must not have a host part");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Package URIs must not have a host part");
   }
   if (packageUri.hasQuery) {
     // A query makes no sense if resolved to a file: URI.
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  "Package URIs must not have a query part");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Package URIs must not have a query part");
   }
   if (packageUri.hasFragment) {
     // We could leave the fragment after the URL when resolving,
     // but it would be odd if "package:foo/foo.dart#1" and
     // "package:foo/foo.dart#2" were considered different libraries.
     // Keep the syntax open in case we ever get multiple libraries in one file.
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  "Package URIs must not have a fragment part");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Package URIs must not have a fragment part");
   }
   if (packageUri.path.startsWith('/')) {
-    throw new ArgumentError.value(packageUri, "packageUri",
-                                  "Package URIs must not start with a '/'");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Package URIs must not start with a '/'");
   }
   int firstSlash = packageUri.path.indexOf('/');
   if (firstSlash == -1) {
@@ -76,8 +76,8 @@
   int badIndex = _findInvalidCharacter(packageName);
   if (badIndex >= 0) {
     if (packageName.isEmpty) {
-      throw new ArgumentError.value(packageUri, "packageUri",
-          "Package names mus be non-empty");
+      throw new ArgumentError.value(
+          packageUri, "packageUri", "Package names mus be non-empty");
     }
     if (badIndex == packageName.length) {
       throw new ArgumentError.value(packageUri, "packageUri",
@@ -90,8 +90,8 @@
       // Printable character.
       badChar = "'${packageName[badIndex]}' ($badChar)";
     }
-    throw new ArgumentError.value(packageUri, "packageUri",
-        "Package names must not contain $badChar");
+    throw new ArgumentError.value(
+        packageUri, "packageUri", "Package names must not contain $badChar");
   }
   return packageName;
 }
diff --git a/packages/package_config/package_config.iml b/packages/package_config/package_config.iml
new file mode 100644
index 0000000..983f684
--- /dev/null
+++ b/packages/package_config/package_config.iml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.pub" />
+      <excludeFolder url="file://$MODULE_DIR$/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/tool/packages" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Dart SDK" level="application" />
+    <orderEntry type="library" name="Dart Packages" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/packages/package_config/pubspec.yaml b/packages/package_config/pubspec.yaml
index f2c4e06..3d9bd45 100644
--- a/packages/package_config/pubspec.yaml
+++ b/packages/package_config/pubspec.yaml
@@ -1,5 +1,5 @@
 name: package_config
-version: 0.1.3
+version: 0.1.5
 description: Support for working with Package Resolution config files.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/package_config
diff --git a/packages/package_config/test/discovery_analysis_test.dart b/packages/package_config/test/discovery_analysis_test.dart
index f33a4a8..0a28767 100644
--- a/packages/package_config/test/discovery_analysis_test.dart
+++ b/packages/package_config/test/discovery_analysis_test.dart
@@ -13,12 +13,14 @@
 import "package:test/test.dart";
 
 main() {
-  fileTest("basic",
-           {".packages": packagesFile,
-            "foo": {".packages": packagesFile},
-            "bar": {"packages": {"foo": {}, "bar":{}, "baz": {}}},
-            "baz": {}},
-           (Directory directory) {
+  fileTest("basic", {
+    ".packages": packagesFile,
+    "foo": {".packages": packagesFile},
+    "bar": {
+      "packages": {"foo": {}, "bar": {}, "baz": {}}
+    },
+    "baz": {}
+  }, (Directory directory) {
     var dirUri = new Uri.directory(directory.path);
     PackageContext ctx = PackageContext.findAll(directory);
     PackageContext root = ctx[directory];
@@ -32,13 +34,13 @@
     PackageContext bar = ctx[sub(directory, "bar")];
     validatePackagesDir(bar.packages, dirUri.resolve("bar/"));
     PackageContext barbar = ctx[sub(barDir, "bar")];
-    expect(barbar, same(bar));  // inherited.
+    expect(barbar, same(bar)); // inherited.
     PackageContext baz = ctx[sub(directory, "baz")];
-    expect(baz, same(root));  // inherited.
+    expect(baz, same(root)); // inherited.
 
     var map = ctx.asMap();
     expect(map.keys.map((dir) => dir.path),
-           unorderedEquals([directory.path, fooDir.path, barDir.path]));
+        unorderedEquals([directory.path, fooDir.path, barDir.path]));
   });
 }
 
@@ -56,11 +58,11 @@
 void validatePackagesFile(Packages resolver, Uri location) {
   expect(resolver, isNotNull);
   expect(resolver.resolve(pkg("foo", "bar/baz")),
-         equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
+      equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
   expect(resolver.resolve(pkg("bar", "baz/qux")),
-         equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
+      equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
   expect(resolver.resolve(pkg("baz", "qux/foo")),
-         equals(location.resolve("packages/baz/qux/foo")));
+      equals(location.resolve("packages/baz/qux/foo")));
   expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
 }
 
@@ -68,11 +70,11 @@
   // Expect three packages: foo, bar and baz
   expect(resolver, isNotNull);
   expect(resolver.resolve(pkg("foo", "bar/baz")),
-         equals(location.resolve("packages/foo/bar/baz")));
+      equals(location.resolve("packages/foo/bar/baz")));
   expect(resolver.resolve(pkg("bar", "baz/qux")),
-         equals(location.resolve("packages/bar/baz/qux")));
+      equals(location.resolve("packages/bar/baz/qux")));
   expect(resolver.resolve(pkg("baz", "qux/foo")),
-         equals(location.resolve("packages/baz/qux/foo")));
+      equals(location.resolve("packages/baz/qux/foo")));
   if (location.scheme == "file") {
     expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
   } else {
@@ -95,9 +97,8 @@
 /// Description is a map, each key is a file entry. If the value is a map,
 /// it's a sub-dir, otherwise it's a file and the value is the content
 /// as a string.
-void fileTest(String name,
-              Map description,
-              Future fileTest(Directory directory)) {
+void fileTest(
+    String name, Map description, Future fileTest(Directory directory)) {
   group("file-test", () {
     Directory tempDir = Directory.systemTemp.createTempSync("file-test");
     setUp(() {
diff --git a/packages/package_config/test/discovery_test.dart b/packages/package_config/test/discovery_test.dart
index 4f780c2..8807ac4 100644
--- a/packages/package_config/test/discovery_test.dart
+++ b/packages/package_config/test/discovery_test.dart
@@ -21,11 +21,11 @@
 void validatePackagesFile(Packages resolver, Uri location) {
   expect(resolver, isNotNull);
   expect(resolver.resolve(pkg("foo", "bar/baz")),
-         equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
+      equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
   expect(resolver.resolve(pkg("bar", "baz/qux")),
-         equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
+      equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
   expect(resolver.resolve(pkg("baz", "qux/foo")),
-         equals(location.resolve("packages/baz/qux/foo")));
+      equals(location.resolve("packages/baz/qux/foo")));
   expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
 }
 
@@ -33,11 +33,11 @@
   // Expect three packages: foo, bar and baz
   expect(resolver, isNotNull);
   expect(resolver.resolve(pkg("foo", "bar/baz")),
-         equals(location.resolve("packages/foo/bar/baz")));
+      equals(location.resolve("packages/foo/bar/baz")));
   expect(resolver.resolve(pkg("bar", "baz/qux")),
-         equals(location.resolve("packages/bar/baz/qux")));
+      equals(location.resolve("packages/bar/baz/qux")));
   expect(resolver.resolve(pkg("baz", "qux/foo")),
-         equals(location.resolve("packages/baz/qux/foo")));
+      equals(location.resolve("packages/baz/qux/foo")));
   if (location.scheme == "file") {
     expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
   } else {
@@ -45,7 +45,6 @@
   }
 }
 
-
 Uri pkg(String packageName, String packagePath) {
   var path;
   if (packagePath.startsWith('/')) {
@@ -57,11 +56,11 @@
 }
 
 main() {
-  generalTest(".packages",
-              {".packages": packagesFile,
-               "script.dart": "main(){}",
-               "packages": {"shouldNotBeFound": {}}},
-              (Uri location) async {
+  generalTest(".packages", {
+    ".packages": packagesFile,
+    "script.dart": "main(){}",
+    "packages": {"shouldNotBeFound": {}}
+  }, (Uri location) async {
     Packages resolver;
     resolver = await findPackages(location);
     validatePackagesFile(resolver, location);
@@ -76,36 +75,36 @@
     validatePackagesFile(resolver, location);
   });
 
-  generalTest("packages/",
-              {"packages": { "foo": {}, "bar": {}, "baz": {}},
-               "script.dart": "main(){}"},
-              (Uri location) async {
+  generalTest("packages/", {
+    "packages": {"foo": {}, "bar": {}, "baz": {}},
+    "script.dart": "main(){}"
+  }, (Uri location) async {
     Packages resolver;
     bool isFile = (location.scheme == "file");
     resolver = await findPackages(location);
     validatePackagesDir(resolver, location);
     resolver = await findPackages(location.resolve("script.dart"));
     validatePackagesDir(resolver, location);
-    var specificDiscovery = isFile
-        ? findPackagesFromFile
-        : findPackagesFromNonFile;
+    var specificDiscovery =
+        isFile ? findPackagesFromFile : findPackagesFromNonFile;
     resolver = await specificDiscovery(location);
     validatePackagesDir(resolver, location);
     resolver = await specificDiscovery(location.resolve("script.dart"));
     validatePackagesDir(resolver, location);
   });
 
-  generalTest("underscore packages",
-              {"packages": {"_foo": {}}},
-              (Uri location) async {
+  generalTest("underscore packages", {
+    "packages": {"_foo": {}}
+  }, (Uri location) async {
     Packages resolver = await findPackages(location);
     expect(resolver.resolve(pkg("_foo", "foo.dart")),
-           equals(location.resolve("packages/_foo/foo.dart")));
+        equals(location.resolve("packages/_foo/foo.dart")));
   });
 
-  fileTest(".packages recursive",
-           {".packages": packagesFile, "subdir": {"script.dart": "main(){}"}},
-           (Uri location) async {
+  fileTest(".packages recursive", {
+    ".packages": packagesFile,
+    "subdir": {"script.dart": "main(){}"}
+  }, (Uri location) async {
     Packages resolver;
     resolver = await findPackages(location.resolve("subdir/"));
     validatePackagesFile(resolver, location);
@@ -118,9 +117,10 @@
     validatePackagesFile(resolver, location);
   });
 
-  httpTest(".packages not recursive",
-           {".packages": packagesFile, "subdir": {"script.dart": "main(){}"}},
-           (Uri location) async {
+  httpTest(".packages not recursive", {
+    ".packages": packagesFile,
+    "subdir": {"script.dart": "main(){}"}
+  }, (Uri location) async {
     Packages resolver;
     var subdir = location.resolve("subdir/");
     resolver = await findPackages(subdir);
@@ -133,9 +133,7 @@
     validatePackagesDir(resolver, subdir);
   });
 
-  fileTest("no packages",
-          {"script.dart": "main(){}"},
-          (Uri location) async {
+  fileTest("no packages", {"script.dart": "main(){}"}, (Uri location) async {
     // A file: location with no .packages or packages returns
     // Packages.noPackages.
     Packages resolver;
@@ -149,9 +147,7 @@
     expect(resolver, same(Packages.noPackages));
   });
 
-  httpTest("no packages",
-           {"script.dart": "main(){}"},
-           (Uri location) async {
+  httpTest("no packages", {"script.dart": "main(){}"}, (Uri location) async {
     // A non-file: location with no .packages or packages/:
     // Assumes a packages dir exists, and resolves relative to that.
     Packages resolver;
@@ -167,7 +163,7 @@
 
   test(".packages w/ loader", () async {
     Uri location = Uri.parse("krutch://example.com/path/");
-    Future loader(Uri file) async {
+    Future<List<int>> loader(Uri file) async {
       if (file.path.endsWith(".packages")) {
         return packagesFile.codeUnits;
       }
@@ -178,19 +174,19 @@
     Packages resolver;
     resolver = await findPackages(location, loader: loader);
     validatePackagesFile(resolver, location);
-    resolver = await findPackages(location.resolve("script.dart"),
-                                  loader: loader);
+    resolver =
+        await findPackages(location.resolve("script.dart"), loader: loader);
     validatePackagesFile(resolver, location);
     resolver = await findPackagesFromNonFile(location, loader: loader);
     validatePackagesFile(resolver, location);
     resolver = await findPackagesFromNonFile(location.resolve("script.dart"),
-                                             loader: loader);
+        loader: loader);
     validatePackagesFile(resolver, location);
   });
 
   test("no packages w/ loader", () async {
     Uri location = Uri.parse("krutch://example.com/path/");
-    Future loader(Uri file) async {
+    Future<List<int>> loader(Uri file) async {
       throw "not found";
     }
     // A non-file: location with no .packages or packages/:
@@ -198,59 +194,55 @@
     Packages resolver;
     resolver = await findPackages(location, loader: loader);
     validatePackagesDir(resolver, location);
-    resolver = await findPackages(location.resolve("script.dart"),
-                                  loader: loader);
+    resolver =
+        await findPackages(location.resolve("script.dart"), loader: loader);
     validatePackagesDir(resolver, location);
     resolver = await findPackagesFromNonFile(location, loader: loader);
     validatePackagesDir(resolver, location);
     resolver = await findPackagesFromNonFile(location.resolve("script.dart"),
-                                             loader:loader);
+        loader: loader);
     validatePackagesDir(resolver, location);
   });
 
-  generalTest("loadPackagesFile",
-              {".packages": packagesFile},
-              (Uri directory) async {
+  generalTest("loadPackagesFile", {".packages": packagesFile},
+      (Uri directory) async {
     Uri file = directory.resolve(".packages");
     Packages resolver = await loadPackagesFile(file);
     validatePackagesFile(resolver, file);
   });
 
-  generalTest("loadPackagesFile non-default name",
-              {"pheldagriff": packagesFile},
-              (Uri directory) async {
+  generalTest(
+      "loadPackagesFile non-default name", {"pheldagriff": packagesFile},
+      (Uri directory) async {
     Uri file = directory.resolve("pheldagriff");
     Packages resolver = await loadPackagesFile(file);
     validatePackagesFile(resolver, file);
   });
 
   test("loadPackagesFile w/ loader", () async {
-    loader(Uri uri) async => packagesFile.codeUnits;
+    Future<List<int>> loader(Uri uri) async => packagesFile.codeUnits;
     Uri file = Uri.parse("krutz://example.com/.packages");
     Packages resolver = await loadPackagesFile(file, loader: loader);
     validatePackagesFile(resolver, file);
   });
 
-  generalTest("loadPackagesFile not found",
-               {},
-               (Uri directory) async {
+  generalTest("loadPackagesFile not found", {}, (Uri directory) async {
     Uri file = directory.resolve(".packages");
     expect(loadPackagesFile(file), throws);
   });
 
-  generalTest("loadPackagesFile syntax error",
-               {".packages": "syntax error"},
-               (Uri directory) async {
+  generalTest("loadPackagesFile syntax error", {".packages": "syntax error"},
+      (Uri directory) async {
     Uri file = directory.resolve(".packages");
     expect(loadPackagesFile(file), throws);
   });
 
-  generalTest("getPackagesDir",
-              {"packages": {"foo": {}, "bar": {}, "baz": {}}},
-              (Uri directory) async {
+  generalTest("getPackagesDir", {
+    "packages": {"foo": {}, "bar": {}, "baz": {}}
+  }, (Uri directory) async {
     Uri packages = directory.resolve("packages/");
     Packages resolver = getPackagesDirectory(packages);
-    Uri resolved = resolver.resolve(pkg("foo","flip/flop"));
+    Uri resolved = resolver.resolve(pkg("foo", "flip/flop"));
     expect(resolved, packages.resolve("foo/flip/flop"));
   });
 }
@@ -260,9 +252,7 @@
 /// Description is a map, each key is a file entry. If the value is a map,
 /// it's a sub-dir, otherwise it's a file and the value is the content
 /// as a string.
-void fileTest(String name,
-              Map description,
-              Future fileTest(Uri directory)) {
+void fileTest(String name, Map description, Future fileTest(Uri directory)) {
   group("file-test", () {
     Directory tempDir = Directory.systemTemp.createTempSync("file-test");
     setUp(() {
@@ -285,31 +275,27 @@
     var serverSub;
     var uri;
     setUp(() {
-      return HttpServer
-        .bind(InternetAddress.LOOPBACK_IP_V4, 0)
-        .then((server) {
-          uri = new Uri(scheme: "http",
-                        host: "127.0.0.1",
-                        port: server.port,
-                        path: "/");
-          serverSub = server.listen((HttpRequest request) {
-            // No error handling.
-            var path = request.uri.path;
-            if (path.startsWith('/')) path = path.substring(1);
-            if (path.endsWith('/')) path = path.substring(0, path.length - 1);
-            var parts = path.split('/');
-            var fileOrDir = description;
-            for (int i = 0; i < parts.length; i++) {
-              fileOrDir = fileOrDir[parts[i]];
-              if (fileOrDir == null) {
-                request.response.statusCode = 404;
-                request.response.close();
-              }
+      return HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+        uri = new Uri(
+            scheme: "http", host: "127.0.0.1", port: server.port, path: "/");
+        serverSub = server.listen((HttpRequest request) {
+          // No error handling.
+          var path = request.uri.path;
+          if (path.startsWith('/')) path = path.substring(1);
+          if (path.endsWith('/')) path = path.substring(0, path.length - 1);
+          var parts = path.split('/');
+          var fileOrDir = description;
+          for (int i = 0; i < parts.length; i++) {
+            fileOrDir = fileOrDir[parts[i]];
+            if (fileOrDir == null) {
+              request.response.statusCode = 404;
+              request.response.close();
             }
-            request.response.write(fileOrDir);
-            request.response.close();
-          });
+          }
+          request.response.write(fileOrDir);
+          request.response.close();
         });
+      });
     });
     tearDown(() => serverSub.cancel());
     test(name, () => httpTest(uri));
diff --git a/packages/package_config/test/parse_test.dart b/packages/package_config/test/parse_test.dart
index 8ed5c2e..7a2fce7 100644
--- a/packages/package_config/test/parse_test.dart
+++ b/packages/package_config/test/parse_test.dart
@@ -73,8 +73,7 @@
 
   test("multiple", () {
     var packages = doParse(multiRelativeSample, base);
-    expect(
-        packages.packages.toList()..sort(), equals(["bar", "foo"]));
+    expect(packages.packages.toList()..sort(), equals(["bar", "foo"]));
     expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
         equals(base.resolve("../test/").resolve("bar/baz.dart")));
     expect(packages.resolve(Uri.parse("package:bar/foo/baz.dart")),
@@ -135,33 +134,32 @@
 }
 
 // Valid samples.
-var emptySample                   = "";
-var commentOnlySample             = "# comment only\n";
-var emptyLinesSample              = "\n\n\r\n";
-var singleRelativeSample          = "foo:../test/\n";
-var singleRelativeSampleNoSlash   = "foo:../test\n";
+var emptySample = "";
+var commentOnlySample = "# comment only\n";
+var emptyLinesSample = "\n\n\r\n";
+var singleRelativeSample = "foo:../test/\n";
+var singleRelativeSampleNoSlash = "foo:../test\n";
 var singleRelativeSampleNoNewline = "foo:../test/";
-var singleAbsoluteSample          = "foo:http://example.com/some/where/\n";
-var singleEmptyPathSample         = "foo:\n";
-var singleAbsolutePathSample      = "foo:/test/\n";
-var multiRelativeSample           = "foo:../test/\nbar:../test2/\n";
+var singleAbsoluteSample = "foo:http://example.com/some/where/\n";
+var singleEmptyPathSample = "foo:\n";
+var singleAbsolutePathSample = "foo:/test/\n";
+var multiRelativeSample = "foo:../test/\nbar:../test2/\n";
 // All valid path segment characters in an URI.
-var allValidChars =
-    r"!$&'()*+,-.0123456789;="
+var allValidChars = r"!$&'()*+,-.0123456789;="
     r"@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
 
 var allValidCharsSample = "${allValidChars}:../test/\n";
 
 // Invalid samples.
 var invalid = [
-  ":baz.dart",  // empty.
-  "foobar=baz.dart",  // no colon (but an equals, which is not the same)
-  ".:../test/",  // dot segment
-  "..:../test/",  // dot-dot segment
-  "...:../test/",  // dot-dot-dot segment
-  "foo/bar:../test/",  // slash in name
-  "/foo:../test/",  // slash at start of name
-  "?:../test/",  // invalid characters.
-  "[:../test/",  // invalid characters.
-  "x#:../test/",  // invalid characters.
+  ":baz.dart", // empty.
+  "foobar=baz.dart", // no colon (but an equals, which is not the same)
+  ".:../test/", // dot segment
+  "..:../test/", // dot-dot segment
+  "...:../test/", // dot-dot-dot segment
+  "foo/bar:../test/", // slash in name
+  "/foo:../test/", // slash at start of name
+  "?:../test/", // invalid characters.
+  "[:../test/", // invalid characters.
+  "x#:../test/", // invalid characters.
 ];
diff --git a/packages/package_config/test/parse_write_test.dart b/packages/package_config/test/parse_write_test.dart
index 6a185db..4302187 100644
--- a/packages/package_config/test/parse_write_test.dart
+++ b/packages/package_config/test/parse_write_test.dart
@@ -52,12 +52,17 @@
       roundTripTest("http directory", {"foo": httpDir});
       roundTripTest("other scheme directory", {"foo": otherDir});
       roundTripTest("multiple same-type directories",
-                    {"foo": lowerDir, "bar": higherDir, "baz": parallelDir});
+          {"foo": lowerDir, "bar": higherDir, "baz": parallelDir});
       roundTripTest("multiple scheme directories",
-                    {"foo": fileDir, "bar": httpDir, "baz": otherDir});
-      roundTripTest("multiple scheme directories and mutliple same type",
-                    {"foo": fileDir, "bar": httpDir, "baz": otherDir,
-                     "qux": lowerDir, "hip": higherDir, "dep": parallelDir});
+          {"foo": fileDir, "bar": httpDir, "baz": otherDir});
+      roundTripTest("multiple scheme directories and mutliple same type", {
+        "foo": fileDir,
+        "bar": httpDir,
+        "baz": otherDir,
+        "qux": lowerDir,
+        "hip": higherDir,
+        "dep": parallelDir
+      });
     });
   }
 
@@ -76,7 +81,7 @@
   });
 }
 
-String writeToString(Map map, {Uri baseUri, String comment}) {
+String writeToString(Map<String, Uri> map, {Uri baseUri, String comment}) {
   var buffer = new StringBuffer();
   write(buffer, map, baseUri: baseUri, comment: comment);
   return buffer.toString();
diff --git a/packages/path/.analysis_options b/packages/path/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/path/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/path/CHANGELOG.md b/packages/path/CHANGELOG.md
index 44090f6..b29d2ab 100644
--- a/packages/path/CHANGELOG.md
+++ b/packages/path/CHANGELOG.md
@@ -1,3 +1,30 @@
+## 1.4.2
+
+* Treat `package:` URLs as absolute.
+
+* Normalize `c:\foo\.` to `c:\foo`.
+
+## 1.4.1
+
+* Root-relative URLs like `/foo` are now resolved relative to the drive letter
+  for `file` URLs that begin with a Windows-style drive letter. This matches the
+  [WHATWG URL specification][].
+
+[WHATWG URL specification]: https://url.spec.whatwg.org/#file-slash-state
+
+* When a root-relative URLs like `/foo` is converted to a Windows path using
+  `fromUrl()`, it is now resolved relative to the drive letter. This matches
+  IE's behavior.
+
+## 1.4.0
+
+* Add `equals()`, `hash()` and `canonicalize()` top-level functions and
+  `Context` methods. These make it easier to treat paths as map keys.
+
+* Properly compare Windows paths case-insensitively.
+
+* Further improve the performance of `isWithin()`.
+
 ## 1.3.9
 
 * Further improve the performance of `isWithin()` when paths contain `/.`
diff --git a/packages/path/README.md b/packages/path/README.md
index 5a172cd..5803470 100644
--- a/packages/path/README.md
+++ b/packages/path/README.md
@@ -41,13 +41,34 @@
 This will join "directory" and "file.txt" using the Windows path separator,
 even when the program is run on a POSIX machine.
 
+## Stability
+
+The `path` package is used by many Dart packages, and as such it strives for a
+very high degree of stability. For the same reason, though, releasing a new
+major version would probably cause a lot of versioning pain, so some flexibility
+is necessary.
+
+We try to guarantee that **operations with valid inputs and correct output will
+not change**. Operations where one or more inputs are invalid according to the
+semantics of the corresponding platform may produce different output over time.
+Operations for which `path` produces incorrect output will also change so that
+we can fix bugs.
+
+Also, the `path` package's URL handling is based on [the WHATWG URL spec][].
+This is a living standard, and some parts of it haven't yet been entirely
+solidified by vendor support. The `path` package reserves the right to change
+its URL behavior if the underlying specification changes, although if the change
+is big enough to break many valid uses we may elect to treat it as a breaking
+change anyway.
+
+[the WHATWG URL spec]: https://url.spec.whatwg.org/
+
 ## FAQ
 
 ### Where can I use this?
 
-Pathos runs on the Dart VM and in the browser under both dart2js and Dartium.
-Under dart2js, it currently returns "." as the current working directory, while
-under Dartium it returns the current URL.
+The `path` package runs on the Dart VM and in the browser under both dart2js and
+Dartium. On the browser, `window.location.href` is used as the current path.
 
 ### Why doesn't this make paths first-class objects?
 
diff --git a/packages/path/benchmark/benchmark.dart b/packages/path/benchmark/benchmark.dart
index 4285e65..183b921 100644
--- a/packages/path/benchmark/benchmark.dart
+++ b/packages/path/benchmark/benchmark.dart
@@ -2,64 +2,59 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import '../lib/path.dart' as path;
+import 'package:path/path.dart' as p;
 
-void runBenchmark(String name, Function func, List files) {
-  // Warmup.
-  for (int i = 0; i < 10000; i++) {
-    for (var p in files) {
-      func(p);
-    }
-  }
-  var count = 100000;
-  var sw = new Stopwatch()..start();
-  for (int i = 0; i < count; i++) {
-    for (var p in files) {
-      func(p);
-    }
-  }
-  print("$name: ${count / sw.elapsedMicroseconds} iter/us (${sw.elapsed})");
-}
+/// Some hopefully real-world representative platform-independent paths.
+const genericPaths = const [
+  '.',
+  '..',
+  'out/ReleaseIA32/packages',
+  'lib',
+  'lib/src/',
+  'lib/src/style/url.dart',
+  'test/./not/.././normalized',
+  'benchmark/really/long/path/with/many/components.dart',
+];
 
-void runBenchmarkTwoArgs(String name, Function func, List files) {
-  // Warmup.
-  for (int i = 0; i < 1000; i++) {
-    for (var file1 in files) {
-      for (var file2 in files) {
-        func(file1, file2);
-      }
-    }
-  }
+/// Some platform-specific paths.
+final platformPaths = {
+  p.Style.posix: [
+    '/',
+    '/home/user/dart/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart',
+  ],
+  p.Style.url: ['https://example.server.org/443643002/path?top=yes#fragment',],
+  p.Style.windows: [
+    r'C:\User\me\',
+    r'\\server\share\my\folders\some\file.data',
+  ],
+};
 
-  var count = 10000;
-  var sw = new Stopwatch()..start();
-  for (int i = 0; i < count; i++) {
-    for (var file1 in files) {
-      for (var file2 in files) {
-        func(file1, file2);
-      }
-    }
-  }
-  print("$name: ${count / sw.elapsedMicroseconds} iter/us (${sw.elapsed})");
-}
+/// The command line arguments passed to this script.
+List<String> arguments;
 
-main(args) {
-  for (var style in [path.Style.posix, path.Style.url, path.Style.windows]) {
-    var context = new path.Context(style: style);
-    var files = COMMON_PATHS.toList()..addAll(STYLE_PATHS[style]);
+void main(List<String> args) {
+  arguments = args;
 
-    benchmark(name, func) {
-      name = style.name + '-' + name;
-      if (args.isEmpty || args.any((arg) => name.contains(arg))) {
-        runBenchmark(name, func, files);
-      }
+  for (var style in [p.Style.posix, p.Style.url, p.Style.windows]) {
+    var context = new p.Context(style: style);
+    var files = genericPaths.toList()..addAll(platformPaths[style]);
+
+    benchmark(name, function) {
+      runBenchmark("${style.name}-$name", 100000, () {
+        for (var file in files) {
+          function(file);
+        }
+      });
     }
 
-    benchmarkTwoArgs(name, func) {
-      name = style.name + '-' + name + '-two';
-      if (args.isEmpty || args.any((arg) => name.contains(arg))) {
-        runBenchmarkTwoArgs(name, func, files);
-      }
+    benchmarkPairs(name, function) {
+      runBenchmark("${style.name}-$name", 1000, () {
+        for (var file1 in files) {
+          for (var file2 in files) {
+            function(file1, file2);
+          }
+        }
+      });
     }
 
     benchmark('absolute', context.absolute);
@@ -73,28 +68,37 @@
     benchmark('isRootRelative', context.isRootRelative);
     benchmark('normalize', context.normalize);
     benchmark('relative', context.relative);
-    benchmarkTwoArgs('relative', context.relative);
+    benchmarkPairs('relative from', (file, from) {
+      try {
+        return context.relative(file, from: from);
+      } on p.PathException {
+        // Do nothing.
+      }
+    });
     benchmark('toUri', context.toUri);
     benchmark('prettyUri', context.prettyUri);
-    benchmarkTwoArgs('isWithin', context.isWithin);
+    benchmarkPairs('isWithin', context.isWithin);
   }
 
-  if (args.isEmpty || args.any((arg) => arg == 'current')) {
-    runBenchmark('current', (_) => path.current, [null]);
-  }
+  runBenchmark('current', 100000, () => p.current);
 }
 
-const COMMON_PATHS = const ['.', '..', 'out/ReleaseIA32/packages'];
+void runBenchmark(String name, int count, Function function) {
+  // If names are passed on the command-line, they select which benchmarks are
+  // run.
+  if (arguments.isNotEmpty && !arguments.contains(name)) return;
 
-final STYLE_PATHS = {
-  path.Style.posix: [
-    '/home/user/dart/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart',
-  ],
-  path.Style.url: [
-    'https://example.server.org/443643002/path?top=yes#fragment',
-  ],
-  path.Style.windows: [
-    r'C:\User\me\',
-    r'\\server\share\my\folders\some\file.data',
-  ],
-};
+  // Warmup.
+  for (var i = 0; i < 10000; i++) {
+    function();
+  }
+
+  var stopwatch = new Stopwatch()..start();
+  for (var i = 0; i < count; i++) {
+    function();
+  }
+
+  var rate =
+      (count / stopwatch.elapsedMicroseconds).toStringAsFixed(5).padLeft(9);
+  print("${name.padLeft(32)}: $rate iter/us (${stopwatch.elapsed})");
+}
diff --git a/packages/path/lib/path.dart b/packages/path/lib/path.dart
index 93fe67e..deb1b53 100644
--- a/packages/path/lib/path.dart
+++ b/packages/path/lib/path.dart
@@ -44,8 +44,6 @@
 ///
 /// This will join "directory" and "file.txt" using the Windows path separator,
 /// even when the program is run on a POSIX machine.
-library path;
-
 import 'src/context.dart';
 import 'src/style.dart';
 
@@ -60,6 +58,9 @@
 final Context windows = new Context(style: Style.windows);
 
 /// A default context for manipulating URLs.
+///
+/// URL path equality is undefined for paths that differ only in their
+/// percent-encoding or only in the case of their host segment.
 final Context url = new Context(style: Style.url);
 
 /// The system path context.
@@ -283,9 +284,27 @@
 ///       // -> ['http://dartlang.org', 'path', 'to', 'foo']
 List<String> split(String path) => context.split(path);
 
+/// Canonicalizes [path].
+///
+/// This is guaranteed to return the same path for two different input paths
+/// if and only if both input paths point to the same location. Unlike
+/// [normalize], it returns absolute paths when possible and canonicalizes
+/// ASCII case on Windows.
+///
+/// Note that this does not resolve symlinks.
+///
+/// If you want a map that uses path keys, it's probably more efficient to
+/// pass [equals] and [hash] to [new HashMap] than it is to canonicalize every
+/// key.
+String canonicalize(String path) => context.canonicalize(path);
+
 /// Normalizes [path], simplifying it by handling `..`, and `.`, and
 /// removing redundant path separators whenever possible.
 ///
+/// Note that this is *not* guaranteed to return the same result for two
+/// equivalent input paths. For that, see [canonicalize]. Or, if you're using
+/// paths as map keys, pass [equals] and [hash] to [new HashMap].
+///
 ///     path.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
 String normalize(String path) => context.normalize(path);
 
@@ -326,6 +345,20 @@
 ///     path.isWithin('/root/path', '/root/path') // -> false
 bool isWithin(String parent, String child) => context.isWithin(parent, child);
 
+/// Returns `true` if [path1] points to the same location as [path2], and
+/// `false` otherwise.
+///
+/// The [hash] function returns a hash code that matches these equality
+/// semantics.
+bool equals(String path1, String path2) => context.equals(path1, path2);
+
+/// Returns a hash code for [path] such that, if [equals] returns `true` for two
+/// paths, their hash codes are the same.
+///
+/// Note that the same path may have different hash codes on different platforms
+/// or with different [current] directories.
+int hash(String path) => context.hash(path);
+
 /// Removes a trailing extension from the last part of [path].
 ///
 ///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
diff --git a/packages/path/lib/src/characters.dart b/packages/path/lib/src/characters.dart
index ff196a6..7dddb2f 100644
--- a/packages/path/lib/src/characters.dart
+++ b/packages/path/lib/src/characters.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// This library contains character-code definitions.
-library path.characters;
-
 const PLUS = 0x2b;
 const MINUS = 0x2d;
 const PERIOD = 0x2e;
diff --git a/packages/path/lib/src/context.dart b/packages/path/lib/src/context.dart
index d10a29f..a00ca29 100644
--- a/packages/path/lib/src/context.dart
+++ b/packages/path/lib/src/context.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.context;
+import 'dart:math' as math;
 
 import 'characters.dart' as chars;
 import 'internal_style.dart';
@@ -245,7 +245,9 @@
         // If the new part is root-relative, it preserves the previous root but
         // replaces the path after it.
         var parsed = _parse(part);
-        parsed.root = this.rootPrefix(buffer.toString());
+        var path = buffer.toString();
+        parsed.root = path.substring(
+            0, style.rootLength(path, withDrive: true));
         if (style.needsSeparator(parsed.root)) {
           parsed.separators[0] = style.separator;
         }
@@ -300,9 +302,34 @@
     return parsed.parts;
   }
 
+  /// Canonicalizes [path].
+  ///
+  /// This is guaranteed to return the same path for two different input paths
+  /// if and only if both input paths point to the same location. Unlike
+  /// [normalize], it returns absolute paths when possible and canonicalizes
+  /// ASCII case on Windows.
+  ///
+  /// Note that this does not resolve symlinks.
+  ///
+  /// If you want a map that uses path keys, it's probably more efficient to
+  /// pass [equals] and [hash] to [new HashMap] than it is to canonicalize every
+  /// key.
+  String canonicalize(String path) {
+    path = absolute(path);
+    if (style != Style.windows && !_needsNormalization(path)) return path;
+
+    var parsed = _parse(path);
+    parsed.normalize(canonicalize: true);
+    return parsed.toString();
+  }
+
   /// Normalizes [path], simplifying it by handling `..`, and `.`, and
   /// removing redundant path separators whenever possible.
   ///
+  /// Note that this is *not* guaranteed to return the same result for two
+  /// equivalent input paths. For that, see [canonicalize]. Or, if you're using
+  /// paths as map keys, pass [equals] and [hash] to [new HashMap].
+  ///
   ///     context.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
   String normalize(String path) {
     if (!_needsNormalization(path)) return path;
@@ -370,7 +397,7 @@
     // Single dots and double dots are normalized to directory traversals.
     if (previous == chars.PERIOD &&
         (previousPrevious == null ||
-         previousPrevious == chars.SLASH ||
+         style.isSeparator(previousPrevious) ||
          previousPrevious == chars.PERIOD)) {
       return true;
     }
@@ -446,15 +473,14 @@
     // calculation of relative paths, even if a path has not been normalized.
     if (fromParsed.root != pathParsed.root &&
         ((fromParsed.root == null || pathParsed.root == null) ||
-            fromParsed.root.toLowerCase().replaceAll('/', '\\') !=
-                pathParsed.root.toLowerCase().replaceAll('/', '\\'))) {
+            !style.pathsEqual(fromParsed.root, pathParsed.root))) {
       return pathParsed.toString();
     }
 
     // Strip off their common prefix.
     while (fromParsed.parts.length > 0 &&
         pathParsed.parts.length > 0 &&
-        fromParsed.parts[0] == pathParsed.parts[0]) {
+        style.pathsEqual(fromParsed.parts[0], pathParsed.parts[0])) {
       fromParsed.parts.removeAt(0);
       fromParsed.separators.removeAt(1);
       pathParsed.parts.removeAt(0);
@@ -499,7 +525,22 @@
   ///     path.isWithin('/root/path', '/root/path/a'); // -> true
   ///     path.isWithin('/root/path', '/root/other'); // -> false
   ///     path.isWithin('/root/path', '/root/path'); // -> false
-  bool isWithin(String parent, String child) {
+  bool isWithin(String parent, String child) =>
+      _isWithinOrEquals(parent, child) == _PathRelation.within;
+
+  /// Returns `true` if [path1] points to the same location as [path2], and
+  /// `false` otherwise.
+  ///
+  /// The [hash] function returns a hash code that matches these equality
+  /// semantics.
+  bool equals(String path1, String path2) =>
+      _isWithinOrEquals(path1, path2) == _PathRelation.equal;
+
+  /// Compares two paths and returns an enum value indicating their relationship
+  /// to one another.
+  ///
+  /// This never returns [_PathRelation.inconclusive].
+  _PathRelation _isWithinOrEquals(String parent, String child) {
     // Make both paths the same level of relative. We're only able to do the
     // quick comparison if both paths are in the same format, and making a path
     // absolute is faster than making it relative.
@@ -522,8 +563,8 @@
       }
     }
 
-    var fastResult = _isWithinFast(parent, child);
-    if (fastResult != null) return fastResult;
+    var result = _isWithinOrEqualsFast(parent, child);
+    if (result != _PathRelation.inconclusive) return result;
 
     var relative;
     try {
@@ -531,18 +572,22 @@
     } on PathException catch (_) {
       // If no relative path from [parent] to [child] is found, [child]
       // definitely isn't a child of [parent].
-      return false;
+      return _PathRelation.different;
     }
 
-    var parts = this.split(relative);
-    return this.isRelative(relative) &&
-        parts.first != '..' &&
-        parts.first != '.';
+    if (!this.isRelative(relative)) return _PathRelation.different;
+    if (relative == '.') return _PathRelation.equal;
+    if (relative == '..') return _PathRelation.different;
+    return (relative.length >= 3 &&
+            relative.startsWith('..') &&
+             style.isSeparator(relative.codeUnitAt(2)))
+        ? _PathRelation.different
+        : _PathRelation.within;
   }
 
-  /// An optimized implementation of [isWithin] that doesn't handle a few
-  /// complex cases.
-  bool _isWithinFast(String parent, String child) {
+  /// An optimized implementation of [_isWithinOrEquals] that doesn't handle a
+  /// few complex cases.
+  _PathRelation _isWithinOrEqualsFast(String parent, String child) {
     // Normally we just bail when we see "." path components, but we can handle
     // a single dot easily enough.
     if (parent == '.') parent = '';
@@ -556,26 +601,17 @@
     //
     //     isWithin("C:/bar", "//foo/bar/baz") //=> false
     //     isWithin("http://example.com/", "http://google.com/bar") //=> false
-    if (parentRootLength != childRootLength) return false;
-
-    var parentCodeUnits = parent.codeUnits;
-    var childCodeUnits = child.codeUnits;
+    if (parentRootLength != childRootLength) return _PathRelation.different;
 
     // Make sure that the roots are textually the same as well.
     //
     //     isWithin("C:/bar", "D:/bar/baz") //=> false
     //     isWithin("http://example.com/", "http://example.org/bar") //=> false
     for (var i = 0; i < parentRootLength; i++) {
-      var parentCodeUnit = parentCodeUnits[i];
-      var childCodeUnit = childCodeUnits[i];
-      if (parentCodeUnit == childCodeUnit) continue;
-
-      // If both code units are separators, that's fine too.
-      //
-      //     isWithin("C:/", r"C:\foo") //=> true
-      if (!style.isSeparator(parentCodeUnit) ||
-          !style.isSeparator(childCodeUnit)) {
-        return false;
+      var parentCodeUnit = parent.codeUnitAt(i);
+      var childCodeUnit = child.codeUnitAt(i);
+      if (!style.codeUnitsEqual(parentCodeUnit, childCodeUnit)) {
+        return _PathRelation.different;
       }
     }
 
@@ -584,23 +620,20 @@
     // comparing relative paths.
     var lastCodeUnit = chars.SLASH;
 
+    /// The index of the last separator in [parent].
+    int lastParentSeparator;
+
     // Iterate through both paths as long as they're semantically identical.
     var parentIndex = parentRootLength;
     var childIndex = childRootLength;
     while (parentIndex < parent.length && childIndex < child.length) {
-      var parentCodeUnit = parentCodeUnits[parentIndex];
-      var childCodeUnit = childCodeUnits[childIndex];
-      if (parentCodeUnit == childCodeUnit) {
-        lastCodeUnit = parentCodeUnit;
-        parentIndex++;
-        childIndex++;
-        continue;
-      }
+      var parentCodeUnit = parent.codeUnitAt(parentIndex);
+      var childCodeUnit = child.codeUnitAt(childIndex);
+      if (style.codeUnitsEqual(parentCodeUnit, childCodeUnit)) {
+        if (style.isSeparator(parentCodeUnit)) {
+          lastParentSeparator = parentIndex;
+        }
 
-      // Different separators are considered identical.
-      var parentIsSeparator = style.isSeparator(parentCodeUnit);
-      var childIsSeparator = style.isSeparator(childCodeUnit);
-      if (parentIsSeparator && childIsSeparator) {
         lastCodeUnit = parentCodeUnit;
         parentIndex++;
         childIndex++;
@@ -608,43 +641,45 @@
       }
 
       // Ignore multiple separators in a row.
-      if (parentIsSeparator && style.isSeparator(lastCodeUnit)) {
+      if (style.isSeparator(parentCodeUnit) &&
+          style.isSeparator(lastCodeUnit)) {
+        lastParentSeparator = parentIndex;
         parentIndex++;
         continue;
-      } else if (childIsSeparator && style.isSeparator(lastCodeUnit)) {
+      } else if (style.isSeparator(childCodeUnit) &&
+          style.isSeparator(lastCodeUnit)) {
         childIndex++;
         continue;
       }
 
-      if (parentCodeUnit == chars.PERIOD) {
-        // If a dot comes after a separator, it may be a directory traversal
-        // operator. To check that, we need to know if it's followed by either
-        // "/" or "./". Otherwise, it's just a normal non-matching character.
-        //
-        //     isWithin("foo/./bar", "foo/bar/baz") //=> true
-        //     isWithin("foo/bar/../baz", "foo/bar/.foo") //=> false
-        if (style.isSeparator(lastCodeUnit)) {
+      // If a dot comes after a separator, it may be a directory traversal
+      // operator. To check that, we need to know if it's followed by either
+      // "/" or "./". Otherwise, it's just a normal non-matching character.
+      //
+      //     isWithin("foo/./bar", "foo/bar/baz") //=> true
+      //     isWithin("foo/bar/../baz", "foo/bar/.foo") //=> false
+      if (parentCodeUnit == chars.PERIOD && style.isSeparator(lastCodeUnit)) {
+        parentIndex++;
+
+        // We've hit "/." at the end of the parent path, which we can ignore,
+        // since the paths were equivalent up to this point.
+        if (parentIndex == parent.length) break;
+        parentCodeUnit = parent.codeUnitAt(parentIndex);
+
+        // We've hit "/./", which we can ignore.
+        if (style.isSeparator(parentCodeUnit)) {
+          lastParentSeparator = parentIndex;
           parentIndex++;
+          continue;
+        }
 
-          // We've hit "/." at the end of the parent path, which we can ignore,
-          // since the paths were equivalent up to this point.
-          if (parentIndex == parent.length) break;
-          parentCodeUnit = parentCodeUnits[parentIndex];
-
-          // We've hit "/./", which we can ignore.
-          if (style.isSeparator(parentCodeUnit)) {
-            parentIndex++;
-            continue;
-          }
-
-          // We've hit "/..", which may be a directory traversal operator that
-          // we can't handle on the fast track.
-          if (parentCodeUnit == chars.PERIOD) {
-            parentIndex++;
-            if (parentIndex == parent.length ||
-                style.isSeparator(parentCodeUnits[parentIndex])) {
-              return null;
-            }
+        // We've hit "/..", which may be a directory traversal operator that
+        // we can't handle on the fast track.
+        if (parentCodeUnit == chars.PERIOD) {
+          parentIndex++;
+          if (parentIndex == parent.length ||
+              style.isSeparator(parent.codeUnitAt(parentIndex))) {
+            return _PathRelation.inconclusive;
           }
         }
 
@@ -654,23 +689,21 @@
 
       // This is the same logic as above, but for the child path instead of the
       // parent.
-      if (childCodeUnit == chars.PERIOD) {
-        if (style.isSeparator(lastCodeUnit)) {
+      if (childCodeUnit == chars.PERIOD && style.isSeparator(lastCodeUnit)) {
+        childIndex++;
+        if (childIndex == child.length) break;
+        childCodeUnit = child.codeUnitAt(childIndex);
+
+        if (style.isSeparator(childCodeUnit)) {
           childIndex++;
-          if (childIndex == child.length) break;
-          childCodeUnit = childCodeUnits[childIndex];
+          continue;
+        }
 
-          if (style.isSeparator(childCodeUnit)) {
-            childIndex++;
-            continue;
-          }
-
-          if (childCodeUnit == chars.PERIOD) {
-            childIndex++;
-            if (childIndex == child.length ||
-                style.isSeparator(childCodeUnits[childIndex])) {
-              return null;
-            }
+        if (childCodeUnit == chars.PERIOD) {
+          childIndex++;
+          if (childIndex == child.length ||
+              style.isSeparator(child.codeUnitAt(childIndex))) {
+            return _PathRelation.inconclusive;
           }
         }
       }
@@ -679,12 +712,17 @@
       // As long as the remainders of the two paths don't have any unresolved
       // ".." components, we can be confident that [child] is not within
       // [parent].
-      var childDirection = _pathDirection(childCodeUnits, childIndex);
-      if (childDirection != _PathDirection.belowRoot) return null;
-      var parentDirection = _pathDirection(parentCodeUnits, parentIndex);
-      if (parentDirection != _PathDirection.belowRoot) return null;
+      var childDirection = _pathDirection(child, childIndex);
+      if (childDirection != _PathDirection.belowRoot) {
+        return _PathRelation.inconclusive;
+      }
 
-      return false;
+      var parentDirection = _pathDirection(parent, parentIndex);
+      if (parentDirection != _PathDirection.belowRoot) {
+        return _PathRelation.inconclusive;
+      }
+
+      return _PathRelation.different;
     }
 
     // If the child is shorter than the parent, it's probably not within the
@@ -694,21 +732,34 @@
     //     isWithin("foo/bar/baz", "foo/bar") //=> false
     //     isWithin("foo/bar/baz/../..", "foo/bar") //=> true
     if (childIndex == child.length) {
-      var direction = _pathDirection(parentCodeUnits, parentIndex);
-      return direction == _PathDirection.aboveRoot ? null : false;
+      if (parentIndex == parent.length ||
+          style.isSeparator(parent.codeUnitAt(parentIndex))) {
+        lastParentSeparator = parentIndex;
+      } else {
+        lastParentSeparator ??= math.max(0, parentRootLength - 1);
+      }
+
+      var direction = _pathDirection(parent,
+          lastParentSeparator ?? parentRootLength - 1);
+      if (direction == _PathDirection.atRoot) return _PathRelation.equal;
+      return direction == _PathDirection.aboveRoot
+          ? _PathRelation.inconclusive
+          : _PathRelation.different;
     }
 
     // We've reached the end of the parent path, which means it's time to make a
     // decision. Before we do, though, we'll check the rest of the child to see
     // what that tells us.
-    var direction = _pathDirection(childCodeUnits, childIndex);
+    var direction = _pathDirection(child, childIndex);
 
     // If there are no more components in the child, then it's the same as
-    // the parent, not within it.
+    // the parent.
     //
     //     isWithin("foo/bar", "foo/bar") //=> false
     //     isWithin("foo/bar", "foo/bar//") //=> false
-    if (direction == _PathDirection.atRoot) return false;
+    //     equals("foo/bar", "foo/bar") //=> true
+    //     equals("foo/bar", "foo/bar//") //=> true
+    if (direction == _PathDirection.atRoot) return _PathRelation.equal;
 
     // If there are unresolved ".." components in the child, no decision we make
     // will be valid. We'll abort and do the slow check instead.
@@ -716,7 +767,9 @@
     //     isWithin("foo/bar", "foo/bar/..") //=> false
     //     isWithin("foo/bar", "foo/bar/baz/bang/../../..") //=> false
     //     isWithin("foo/bar", "foo/bar/baz/bang/../../../bar/baz") //=> true
-    if (direction == _PathDirection.aboveRoot) return null;
+    if (direction == _PathDirection.aboveRoot) {
+      return _PathRelation.inconclusive;
+    }
 
     // The child is within the parent if and only if we're on a separator
     // boundary.
@@ -724,12 +777,14 @@
     //     isWithin("foo/bar", "foo/bar/baz") //=> true
     //     isWithin("foo/bar/", "foo/bar/baz") //=> true
     //     isWithin("foo/bar", "foo/barbaz") //=> false
-    return style.isSeparator(childCodeUnits[childIndex]) ||
-        style.isSeparator(lastCodeUnit);
+    return (style.isSeparator(child.codeUnitAt(childIndex)) ||
+            style.isSeparator(lastCodeUnit))
+        ? _PathRelation.within
+        : _PathRelation.different;
   }
 
   // Returns a [_PathDirection] describing the path represented by [codeUnits]
-  // after [index].
+  // starting at [index].
   //
   // This ignores leading separators.
   //
@@ -741,31 +796,31 @@
   //     pathDirection("foo/../baz") //=> reaches root
   //     pathDirection("foo/../..") //=> above root
   //     pathDirection("foo/../../foo/bar/baz") //=> above root
-  _PathDirection _pathDirection(List<int> codeUnits, int index) {
+  _PathDirection _pathDirection(String path, int index) {
     var depth = 0;
     var reachedRoot = false;
     var i = index;
-    while (i < codeUnits.length) {
+    while (i < path.length) {
       // Ignore initial separators or doubled separators.
-      while (i < codeUnits.length && style.isSeparator(codeUnits[i])) {
+      while (i < path.length && style.isSeparator(path.codeUnitAt(i))) {
         i++;
       }
 
       // If we're at the end, stop.
-      if (i == codeUnits.length) break;
+      if (i == path.length) break;
 
       // Move through the path component to the next separator.
       var start = i;
-      while (i < codeUnits.length && !style.isSeparator(codeUnits[i])) {
+      while (i < path.length && !style.isSeparator(path.codeUnitAt(i))) {
         i++;
       }
 
       // See if the path component is ".", "..", or a name.
-      if (i - start == 1 && codeUnits[start] == chars.PERIOD) {
+      if (i - start == 1 && path.codeUnitAt(start) == chars.PERIOD) {
         // Don't change the depth.
       } else if (i - start == 2 &&
-          codeUnits[start] == chars.PERIOD &&
-          codeUnits[start + 1] == chars.PERIOD) {
+          path.codeUnitAt(start) == chars.PERIOD &&
+          path.codeUnitAt(start + 1) == chars.PERIOD) {
         // ".." backs out a directory.
         depth--;
 
@@ -781,7 +836,7 @@
       }
 
       // If we're at the end, stop.
-      if (i == codeUnits.length) break;
+      if (i == path.length) break;
 
       // Move past the separator.
       i++;
@@ -793,6 +848,80 @@
     return _PathDirection.belowRoot;
   }
 
+  /// Returns a hash code for [path] that matches the semantics of [equals].
+  ///
+  /// Note that the same path may have different hash codes in different
+  /// [Context]s.
+  int hash(String path) {
+    // Make [path] absolute to ensure that equivalent relative and absolute
+    // paths have the same hash code.
+    path = absolute(path);
+
+    var result = _hashFast(path);
+    if (result != null) return result;
+
+    var parsed = _parse(path);
+    parsed.normalize();
+    return _hashFast(parsed.toString());
+  }
+
+  /// An optimized implementation of [hash] that doesn't handle internal `..`
+  /// components.
+  ///
+  /// This will handle `..` components that appear at the beginning of the path.
+  int _hashFast(String path) {
+    var hash = 4603;
+    var beginning = true;
+    var wasSeparator = true;
+    for (var i = 0; i < path.length; i++) {
+      var codeUnit = style.canonicalizeCodeUnit(path.codeUnitAt(i));
+
+      // Take advantage of the fact that collisions are allowed to ignore
+      // separators entirely. This lets us avoid worrying about cases like
+      // multiple trailing slashes.
+      if (style.isSeparator(codeUnit)) {
+        wasSeparator = true;
+        continue;
+      }
+
+      if (codeUnit == chars.PERIOD && wasSeparator) {
+        // If a dot comes after a separator, it may be a directory traversal
+        // operator. To check that, we need to know if it's followed by either
+        // "/" or "./". Otherwise, it's just a normal character.
+        //
+        //     hash("foo/./bar") == hash("foo/bar")
+
+        // We've hit "/." at the end of the path, which we can ignore.
+        if (i + 1 == path.length) break;
+
+        var next = path.codeUnitAt(i + 1);
+
+        // We can just ignore "/./", since they don't affect the semantics of
+        // the path.
+        if (style.isSeparator(next)) continue;
+
+        // If the path ends with "/.." or contains "/../", we need to
+        // canonicalize it before we can hash it. We make an exception for ".."s
+        // at the beginning of the path, since those may appear even in a
+        // canonicalized path.
+        if (!beginning &&
+            next == chars.PERIOD &&
+            (i + 2 == path.length ||
+             style.isSeparator(path.codeUnitAt(i + 2)))) {
+          return null;
+        }
+      }
+
+      // Make sure [hash] stays under 32 bits even after multiplication.
+      hash &= 0x3FFFFFF;
+      hash *= 33;
+      hash ^= codeUnit;
+      wasSeparator = false;
+      beginning = false;
+    }
+    return hash;
+  }
+
   /// Removes a trailing extension from the last part of [path].
   ///
   ///     context.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
@@ -952,3 +1081,32 @@
 
   String toString() => name;
 }
+
+/// An enum of possible return values for [Context._isWithinOrEquals].
+class _PathRelation {
+  /// The first path is a proper parent of the second.
+  ///
+  /// For example, `foo` is a proper parent of `foo/bar`, but not of `foo`.
+  static const within = const _PathRelation("within");
+
+  /// The two paths are equivalent.
+  ///
+  /// For example, `foo//bar` is equivalent to `foo/bar`.
+  static const equal = const _PathRelation("equal");
+
+  /// The first path is neither a parent of nor equal to the second.
+  static const different = const _PathRelation("different");
+
+  /// We couldn't quickly determine any information about the paths'
+  /// relationship to each other.
+  ///
+  /// Only returned by [Context._isWithinOrEqualsFast].
+  static const inconclusive = const _PathRelation("inconclusive");
+
+  final String name;
+
+  const _PathRelation(this.name);
+
+  String toString() => name;
+}
+
diff --git a/packages/path/lib/src/internal_style.dart b/packages/path/lib/src/internal_style.dart
index 549f95b..21897d6 100644
--- a/packages/path/lib/src/internal_style.dart
+++ b/packages/path/lib/src/internal_style.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.internal_style;
-
 import 'context.dart';
 import 'style.dart';
 
@@ -35,10 +33,11 @@
 
   /// Returns the number of characters of the root part.
   ///
-  /// Returns 0 if the path is relative.
+  /// Returns 0 if the path is relative and 1 if the path is root-relative.
   ///
-  /// If the path is root-relative, the root length is 1.
-  int rootLength(String path);
+  /// If [withDrive] is `true`, this should include the drive letter for `file:`
+  /// URLs. Non-URL styles may ignore the parameter.
+  int rootLength(String path, {bool withDrive: false});
 
   /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
   /// returns `null`.
@@ -68,4 +67,18 @@
 
   /// Returns the URI that represents [path], which is assumed to be absolute.
   Uri absolutePathToUri(String path);
+
+  /// Returns whether [codeUnit1] and [codeUnit2] are considered equivalent for
+  /// this style.
+  bool codeUnitsEqual(int codeUnit1, int codeUnit2) => codeUnit1 == codeUnit2;
+
+  /// Returns whether [path1] and [path2] are equivalent.
+  ///
+  /// This only needs to handle character-by-character comparison; it can assume
+  /// the paths are normalized and contain no `..` components.
+  bool pathsEqual(String path1, String path2) => path1 == path2;
+
+  int canonicalizeCodeUnit(int codeUnit) => codeUnit;
+
+  String canonicalizePart(String part) => part;
 }
diff --git a/packages/path/lib/src/parsed_path.dart b/packages/path/lib/src/parsed_path.dart
index d37e2d3..619ffbf 100644
--- a/packages/path/lib/src/parsed_path.dart
+++ b/packages/path/lib/src/parsed_path.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.parsed_path;
-
 import 'internal_style.dart';
 import 'style.dart';
 
@@ -99,7 +97,7 @@
     if (separators.length > 0) separators[separators.length - 1] = '';
   }
 
-  void normalize() {
+  void normalize({bool canonicalize: false}) {
     // Handle '.', '..', and empty parts.
     var leadingDoubles = 0;
     var newParts = <String>[];
@@ -115,7 +113,7 @@
           leadingDoubles++;
         }
       } else {
-        newParts.add(part);
+        newParts.add(canonicalize ? style.canonicalizePart(part) : part);
       }
     }
 
@@ -141,6 +139,7 @@
 
     // Normalize the Windows root if needed.
     if (root != null && style == Style.windows) {
+      if (canonicalize) root = root.toLowerCase();
       root = root.replaceAll('/', '\\');
     }
     removeTrailingSeparators();
diff --git a/packages/path/lib/src/path_exception.dart b/packages/path/lib/src/path_exception.dart
index 49bd268..55f5be3 100644
--- a/packages/path/lib/src/path_exception.dart
+++ b/packages/path/lib/src/path_exception.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.path_exception;
-
 /// An exception class that's thrown when a path operation is unable to be
 /// computed accurately.
 class PathException implements Exception {
diff --git a/packages/path/lib/src/style.dart b/packages/path/lib/src/style.dart
index e0e0e01..342a102 100644
--- a/packages/path/lib/src/style.dart
+++ b/packages/path/lib/src/style.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.style;
-
 import 'context.dart';
 import 'style/posix.dart';
 import 'style/url.dart';
diff --git a/packages/path/lib/src/style/posix.dart b/packages/path/lib/src/style/posix.dart
index 74aeb4c..5044d43 100644
--- a/packages/path/lib/src/style/posix.dart
+++ b/packages/path/lib/src/style/posix.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.style.posix;
-
 import '../characters.dart' as chars;
 import '../parsed_path.dart';
 import '../internal_style.dart';
@@ -30,7 +28,7 @@
   bool needsSeparator(String path) =>
       path.isNotEmpty && !isSeparator(path.codeUnitAt(path.length - 1));
 
-  int rootLength(String path) {
+  int rootLength(String path, {bool withDrive: false}) {
     if (path.isNotEmpty && isSeparator(path.codeUnitAt(0))) return 1;
     return 0;
   }
diff --git a/packages/path/lib/src/style/url.dart b/packages/path/lib/src/style/url.dart
index 255f22a..2e29aa7 100644
--- a/packages/path/lib/src/style/url.dart
+++ b/packages/path/lib/src/style/url.dart
@@ -2,10 +2,9 @@
 // for 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 path.style.url;
-
 import '../characters.dart' as chars;
 import '../internal_style.dart';
+import '../utils.dart';
 
 /// The style for URL paths.
 class UrlStyle extends InternalStyle {
@@ -38,16 +37,33 @@
     return path.endsWith("://") && rootLength(path) == path.length;
   }
 
-  int rootLength(String path) {
+  int rootLength(String path, {bool withDrive: false}) {
     if (path.isEmpty) return 0;
     if (isSeparator(path.codeUnitAt(0))) return 1;
+
+    for (var i = 0; i < path.length; i++) {
+      var codeUnit = path.codeUnitAt(i);
+      if (isSeparator(codeUnit)) return 0;
+      if (codeUnit == chars.COLON) {
+        if (i == 0) return 0;
+
+        // The root part is up until the next '/', or the full path. Skip ':'
+        // (and '//' if it exists) and search for '/' after that.
+        if (path.startsWith('//', i + 1)) i += 3;
+        var index = path.indexOf('/', i);
+        if (index <= 0) return path.length;
+
+        // file: URLs sometimes consider Windows drive letters part of the root.
+        // See https://url.spec.whatwg.org/#file-slash-state.
+        if (!withDrive || path.length < index + 3) return index;
+        if (!path.startsWith('file://')) return index;
+        if (!isDriveLetter(path, index + 1)) return index;
+        return path.length == index + 3 ? index + 3 : index + 4;
+      }
+    }
+
     var index = path.indexOf("/");
     if (index > 0 && path.startsWith('://', index - 1)) {
-      // The root part is up until the next '/', or the full path. Skip
-      // '://' and search for '/' after that.
-      index = path.indexOf('/', index + 2);
-      if (index > 0) return index;
-      return path.length;
     }
     return 0;
   }
diff --git a/packages/path/lib/src/style/windows.dart b/packages/path/lib/src/style/windows.dart
index f38efa5..31114db 100644
--- a/packages/path/lib/src/style/windows.dart
+++ b/packages/path/lib/src/style/windows.dart
@@ -2,13 +2,15 @@
 // for 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 path.style.windows;
-
 import '../characters.dart' as chars;
 import '../internal_style.dart';
 import '../parsed_path.dart';
 import '../utils.dart';
 
+// `0b100000` can be bitwise-ORed with uppercase ASCII letters to get their
+// lowercase equivalents.
+const _asciiCaseBit = 0x20;
+
 /// The style for Windows paths.
 class WindowsStyle extends InternalStyle {
   WindowsStyle();
@@ -34,7 +36,7 @@
     return !isSeparator(path.codeUnitAt(path.length - 1));
   }
 
-  int rootLength(String path) {
+  int rootLength(String path, {bool withDrive: false}) {
     if (path.isEmpty) return 0;
     if (path.codeUnitAt(0) == chars.SLASH) return 1;
     if (path.codeUnitAt(0) == chars.BACKSLASH) {
@@ -76,8 +78,13 @@
     var path = uri.path;
     if (uri.host == '') {
       // Drive-letter paths look like "file:///C:/path/to/file". The
-      // replaceFirst removes the extra initial slash.
-      if (path.startsWith('/')) path = path.replaceFirst("/", "");
+      // replaceFirst removes the extra initial slash. Otherwise, leave the
+      // slash to match IE's interpretation of "/foo" as a root-relative path.
+      if (path.length >= 3 &&
+          path.startsWith('/') &&
+          isDriveLetter(path, 1)) {
+        path = path.replaceFirst("/", "");
+      }
     } else {
       // Network paths look like "file://hostname/path/to/file".
       path = '\\\\${uri.host}$path';
@@ -122,4 +129,40 @@
       return new Uri(scheme: 'file', pathSegments: parsed.parts);
     }
   }
+
+  bool codeUnitsEqual(int codeUnit1, int codeUnit2) {
+    if (codeUnit1 == codeUnit2) return true;
+
+    /// Forward slashes and backslashes are equivalent on Windows.
+    if (codeUnit1 == chars.SLASH) return codeUnit2 == chars.BACKSLASH;
+    if (codeUnit1 == chars.BACKSLASH) return codeUnit2 == chars.SLASH;
+
+    // If this check fails, the code units are definitely different. If it
+    // succeeds *and* either codeUnit is an ASCII letter, they're equivalent.
+    if (codeUnit1 ^ codeUnit2 != _asciiCaseBit) return false;
+
+    // Now we just need to verify that one of the code units is an ASCII letter.
+    var upperCase1 = codeUnit1 | _asciiCaseBit;
+    return upperCase1 >= chars.LOWER_A && upperCase1 <= chars.LOWER_Z;
+  }
+
+  bool pathsEqual(String path1, String path2) {
+    if (identical(path1, path2)) return true;
+    if (path1.length != path2.length) return false;
+    for (var i = 0; i < path1.length; i++) {
+      if (!codeUnitsEqual(path1.codeUnitAt(i), path2.codeUnitAt(i))) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  int canonicalizeCodeUnit(int codeUnit) {
+    if (codeUnit == chars.SLASH) return chars.BACKSLASH;
+    if (codeUnit < chars.UPPER_A) return codeUnit;
+    if (codeUnit > chars.UPPER_Z) return codeUnit;
+    return codeUnit | _asciiCaseBit;
+  }
+
+  String canonicalizePart(String part) => part.toLowerCase();
 }
diff --git a/packages/path/lib/src/utils.dart b/packages/path/lib/src/utils.dart
index e320749..3d71e56 100644
--- a/packages/path/lib/src/utils.dart
+++ b/packages/path/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.utils;
-
 import 'characters.dart' as chars;
 
 /// Returns whether [char] is the code for an ASCII letter (uppercase or
@@ -14,3 +12,13 @@
 
 /// Returns whether [char] is the code for an ASCII digit.
 bool isNumeric(int char) => char >= chars.ZERO && char <= chars.NINE;
+
+/// Returns whether [path] has a URL-formatted Windows drive letter beginning at
+/// [index].
+bool isDriveLetter(String path, int index) {
+  if (path.length < index + 2) return false;
+  if (!isAlphabetic(path.codeUnitAt(index))) return false;
+  if (path.codeUnitAt(index + 1) != chars.COLON) return false;
+  if (path.length == index + 2) return true;
+  return path.codeUnitAt(index + 2) == chars.SLASH;
+}
diff --git a/packages/path/pubspec.yaml b/packages/path/pubspec.yaml
index fb21d20..2c90e1c 100644
--- a/packages/path/pubspec.yaml
+++ b/packages/path/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 1.3.9
+version: 1.4.2
 author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
diff --git a/packages/path/test/posix_test.dart b/packages/path/test/posix_test.dart
index afd6b94..4549ebd 100644
--- a/packages/path/test/posix_test.dart
+++ b/packages/path/test/posix_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.test.posix_test;
-
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
@@ -319,6 +317,12 @@
       expect(context.normalize(r'a/b\'), r'a/b\');
       expect(context.normalize('a/b///'), 'a/b');
     });
+
+    test('when canonicalizing', () {
+      expect(context.canonicalize('.'), '/root/path');
+      expect(context.canonicalize('foo/bar'), '/root/path/foo/bar');
+      expect(context.canonicalize('FoO'), '/root/path/FoO');
+    });
   });
 
   group('relative', () {
@@ -350,6 +354,11 @@
         expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
       });
 
+      test('is case-sensitive', () {
+        expect(context.relative('/RoOt'), '../../RoOt');
+        expect(context.relative('/rOoT/pAtH/a'), '../../rOoT/pAtH/a');
+      });
+
       // Regression
       test('from root-only path', () {
         expect(context.relative('/', from: '/'), '.');
@@ -442,6 +451,44 @@
     });
   });
 
+  group('equals and hash', () {
+    test('simple cases', () {
+      expectEquals(context, 'foo/bar', 'foo/bar');
+      expectNotEquals(context, 'foo/bar', 'foo/bar/baz');
+      expectNotEquals(context, 'foo/bar', 'foo');
+      expectNotEquals(context, 'foo/bar', 'foo/baz');
+      expectEquals(context, 'foo/bar', '../path/foo/bar');
+      expectEquals(context, '/', '/');
+      expectEquals(context, '/', '../..');
+      expectEquals(context, 'baz', '/root/path/baz');
+    });
+
+    test('complex cases', () {
+      expectEquals(context, 'foo/./bar', 'foo/bar');
+      expectEquals(context, 'foo//bar', 'foo/bar');
+      expectEquals(context, 'foo/qux/../bar', 'foo/bar');
+      expectNotEquals(context, 'foo/qux/../bar', 'foo/qux');
+      expectNotEquals(context, 'foo/bar', 'foo/bar/baz/../..');
+      expectEquals(context, 'foo/bar', 'foo/bar///');
+      expectEquals(context, 'foo/.bar', 'foo/.bar');
+      expectNotEquals(context, 'foo/./bar', 'foo/.bar');
+      expectEquals(context, 'foo/..bar', 'foo/..bar');
+      expectNotEquals(context, 'foo/../bar', 'foo/..bar');
+      expectEquals(context, 'foo/bar', 'foo/bar/baz/..');
+      expectNotEquals(context, 'FoO/bAr', 'foo/bar');
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
+      expectEquals(r, 'a/b', 'a/b');
+      expectNotEquals(r, '.', 'foo/bar');
+      expectNotEquals(r, '.', '../a/b');
+      expectEquals(r, '.', '../bar');
+      expectEquals(r, '/baz/bang', '/baz/bang');
+      expectNotEquals(r, 'baz/bang', '/baz/bang');
+    });
+  });
+
   group('absolute', () {
     test('allows up to seven parts', () {
       expect(context.absolute('a'), '/root/path/a');
diff --git a/packages/path/test/url_test.dart b/packages/path/test/url_test.dart
index c81893a..b8f4e0f 100644
--- a/packages/path/test/url_test.dart
+++ b/packages/path/test/url_test.dart
@@ -5,6 +5,8 @@
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
+import 'utils.dart';
+
 main() {
   var context = new path.Context(
       style: path.Style.url, current: 'http://dartlang.org/root/path');
@@ -38,6 +40,8 @@
     expect(context.rootPrefix('file://'), 'file://');
     expect(context.rootPrefix('/'), '/');
     expect(context.rootPrefix('foo/bar://'), '');
+    expect(context.rootPrefix('package:foo/bar.dart'), 'package:foo');
+    expect(context.rootPrefix('foo/bar:baz/qux'), '');
   });
 
   test('dirname', () {
@@ -134,8 +138,10 @@
     expect(context.isAbsolute('~'), false);
     expect(context.isAbsolute('.'), false);
     expect(context.isAbsolute('../a'), false);
-    expect(context.isAbsolute('C:/a'), false);
-    expect(context.isAbsolute(r'C:\a'), false);
+    expect(context.isAbsolute('C:/a'), true);
+    expect(context.isAbsolute(r'C:\a'), true);
+    expect(context.isAbsolute('package:foo/bar.dart'), true);
+    expect(context.isAbsolute('foo/bar:baz/qux'), false);
     expect(context.isAbsolute(r'\\a'), false);
   });
 
@@ -157,8 +163,10 @@
     expect(context.isRelative('~'), true);
     expect(context.isRelative('.'), true);
     expect(context.isRelative('../a'), true);
-    expect(context.isRelative('C:/a'), true);
-    expect(context.isRelative(r'C:\a'), true);
+    expect(context.isRelative('C:/a'), false);
+    expect(context.isRelative(r'C:\a'), false);
+    expect(context.isRelative(r'package:foo/bar.dart'), false);
+    expect(context.isRelative('foo/bar:baz/qux'), true);
     expect(context.isRelative(r'\\a'), true);
   });
 
@@ -182,6 +190,8 @@
     expect(context.isRootRelative('../a'), false);
     expect(context.isRootRelative('C:/a'), false);
     expect(context.isRootRelative(r'C:\a'), false);
+    expect(context.isRootRelative(r'package:foo/bar.dart'), false);
+    expect(context.isRootRelative('foo/bar:baz/qux'), false);
     expect(context.isRootRelative(r'\\a'), false);
   });
 
@@ -214,7 +224,9 @@
               'a', 'http://google.com/b', 'http://dartlang.org/c', 'd'),
           'http://dartlang.org/c/d');
       expect(context.join('a', '/b', '/c', 'd'), '/c/d');
-      expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'c:\b/c/d');
+      expect(context.join('a', 'package:foo/bar', 'c', 'd'),
+          r'package:foo/bar/c/d');
       expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
     });
 
@@ -223,6 +235,8 @@
           'http://dartlang.org/b/c');
       expect(context.join('file://', 'a', '/b', 'c'), 'file:///b/c');
       expect(context.join('file://', 'a', '/b', 'c', '/d'), 'file:///d');
+      expect(context.join('package:foo/bar.dart', '/baz.dart'),
+          'package:foo/baz.dart');
     });
 
     test('ignores trailing nulls', () {
@@ -243,13 +257,33 @@
       expect(() => context.join(null, 'a'), throwsArgumentError);
     });
 
-    test('Join does not modify internal ., .., or trailing separators', () {
+    test('does not modify internal ., .., or trailing separators', () {
       expect(context.join('a/', 'b/c/'), 'a/b/c/');
       expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'),
           'a/b/./c/..//d/.././..//e/f//');
       expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
       expect(context.join('a', 'b${context.separator}'), 'a/b/');
     });
+
+    test('treats drive letters as part of the root for file: URLs', () {
+      expect(context.join('file:///c:/foo/bar', '/baz/qux'),
+          'file:///c:/baz/qux');
+      expect(context.join('file:///D:/foo/bar', '/baz/qux'),
+          'file:///D:/baz/qux');
+      expect(context.join('file:///c:/', '/baz/qux'), 'file:///c:/baz/qux');
+      expect(context.join('file:///c:', '/baz/qux'), 'file:///c:/baz/qux');
+      expect(context.join('file://host/c:/foo/bar', '/baz/qux'),
+          'file://host/c:/baz/qux');
+    });
+
+    test('treats drive letters as normal components for non-file: URLs', () {
+      expect(context.join('http://foo.com/c:/foo/bar', '/baz/qux'),
+          'http://foo.com/baz/qux');
+      expect(context.join('misfile:///c:/foo/bar', '/baz/qux'),
+          'misfile:///baz/qux');
+      expect(context.join('filer:///c:/foo/bar', '/baz/qux'),
+          'filer:///baz/qux');
+    });
   });
 
   group('joinAll', () {
@@ -272,7 +306,9 @@
         'd'
       ]), 'http://dartlang.org/c/d');
       expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d');
-      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'c:\b/c/d');
+      expect(context.joinAll(['a', 'package:foo/bar', 'c', 'd']),
+          r'package:foo/bar/c/d');
       expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
     });
 
@@ -383,8 +419,9 @@
           'http://dartlang.org/a');
       expect(context.normalize('file:///../../../a'), 'file:///a');
       expect(context.normalize('/../../../a'), '/a');
-      expect(context.normalize('c:/..'), '.');
-      expect(context.normalize('A:/../../..'), '../..');
+      expect(context.normalize('c:/..'), 'c:');
+      expect(context.normalize('package:foo/..'), 'package:foo');
+      expect(context.normalize('A:/../../..'), 'A:');
       expect(context.normalize('a/..'), '.');
       expect(context.normalize('a/b/..'), 'a');
       expect(context.normalize('a/../b'), 'b');
@@ -408,7 +445,8 @@
       expect(context.normalize('a/..'), '.');
       expect(context.normalize('../a'), '../a');
       expect(context.normalize('/../a'), '/a');
-      expect(context.normalize('c:/../a'), 'a');
+      expect(context.normalize('c:/../a'), 'c:/a');
+      expect(context.normalize('package:foo/../a'), 'package:foo/a');
       expect(context.normalize('/../a'), '/a');
       expect(context.normalize('a/b/..'), 'a');
       expect(context.normalize('../a/b/..'), '../a');
@@ -427,6 +465,16 @@
       expect(context.normalize(r'a/b\'), r'a/b\');
       expect(context.normalize('a/b///'), 'a/b');
     });
+
+    test('when canonicalizing', () {
+      expect(context.canonicalize('.'), 'http://dartlang.org/root/path');
+      expect(context.canonicalize('foo/bar'),
+          'http://dartlang.org/root/path/foo/bar');
+      expect(context.canonicalize('FoO'), 'http://dartlang.org/root/path/FoO');
+      expect(context.canonicalize('/foo'), 'http://dartlang.org/foo');
+      expect(context.canonicalize('http://google.com/foo'),
+          'http://google.com/foo');
+    });
   });
 
   group('relative', () {
@@ -479,6 +527,15 @@
         expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
       });
 
+      test('is case-sensitive', () {
+        expect(context.relative('HtTp://dartlang.org/root'),
+            'HtTp://dartlang.org/root');
+        expect(context.relative('http://DaRtLaNg.OrG/root'),
+            'http://DaRtLaNg.OrG/root');
+        expect(context.relative('/RoOt'), '../../RoOt');
+        expect(context.relative('/rOoT/pAtH/a'), '../../rOoT/pAtH/a');
+      });
+
       // Regression
       test('from root-only path', () {
         expect(context.relative('http://dartlang.org',
@@ -665,6 +722,52 @@
     });
   });
 
+  group('equals and hash', () {
+    test('simple cases', () {
+      expectEquals(context, 'foo/bar', 'foo/bar');
+      expectNotEquals(context, 'foo/bar', 'foo/bar/baz');
+      expectNotEquals(context, 'foo/bar', 'foo');
+      expectNotEquals(context, 'foo/bar', 'foo/baz');
+      expectEquals(context, 'foo/bar', '../path/foo/bar');
+      expectEquals(context, 'http://google.com', 'http://google.com');
+      expectEquals(context, 'http://dartlang.org', '../..');
+      expectEquals(context, 'baz', '/root/path/baz');
+    });
+
+    test('complex cases', () {
+      expectEquals(context, 'foo/./bar', 'foo/bar');
+      expectEquals(context, 'foo//bar', 'foo/bar');
+      expectEquals(context, 'foo/qux/../bar', 'foo/bar');
+      expectNotEquals(context, 'foo/qux/../bar', 'foo/qux');
+      expectNotEquals(context, 'foo/bar', 'foo/bar/baz/../..');
+      expectEquals(context, 'foo/bar', 'foo/bar///');
+      expectEquals(context, 'foo/.bar', 'foo/.bar');
+      expectNotEquals(context, 'foo/./bar', 'foo/.bar');
+      expectEquals(context, 'foo/..bar', 'foo/..bar');
+      expectNotEquals(context, 'foo/../bar', 'foo/..bar');
+      expectEquals(context, 'foo/bar', 'foo/bar/baz/..');
+      expectNotEquals(context, 'FoO/bAr', 'foo/bar');
+      expectEquals(context, 'http://google.com', 'http://google.com/');
+      expectEquals(context, 'http://dartlang.org/root', '..');
+    });
+
+    test('with root-relative paths', () {
+      expectEquals(context, '/foo', 'http://dartlang.org/foo');
+      expectNotEquals(context, '/foo', 'http://google.com/foo');
+      expectEquals(context, '/root/path/foo/bar', 'foo/bar');
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
+      expectEquals(r, 'a/b', 'a/b');
+      expectNotEquals(r, '.', 'foo/bar');
+      expectNotEquals(r, '.', '../a/b');
+      expectEquals(r, '.', '../bar');
+      expectEquals(r, '/baz/bang', '/baz/bang');
+      expectNotEquals(r, 'baz/bang', '/baz/bang');
+    });
+  });
+
   group('absolute', () {
     test('allows up to seven parts', () {
       expect(context.absolute('a'), 'http://dartlang.org/root/path/a');
@@ -691,8 +794,7 @@
     test('ignores parts before an absolute path', () {
       expect(context.absolute('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d');
       expect(context.absolute('a', '/b', 'file:///c', 'd'), 'file:///c/d');
-      expect(context.absolute('a', r'c:\b', 'c', 'd'),
-          r'http://dartlang.org/root/path/a/c:\b/c/d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'), r'c:\b/c/d');
       expect(context.absolute('a', r'\\b', 'c', 'd'),
           r'http://dartlang.org/root/path/a/\\b/c/d');
     });
diff --git a/packages/path/test/utils.dart b/packages/path/test/utils.dart
index 7d917a0..5e22ce1 100644
--- a/packages/path/test/utils.dart
+++ b/packages/path/test/utils.dart
@@ -2,10 +2,31 @@
 // for 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 path.test.utils;
-
 import "package:test/test.dart";
-import "package:path/path.dart" as path;
+import "package:path/path.dart" as p;
 
 /// A matcher for a closure that throws a [path.PathException].
-final throwsPathException = throwsA(new isInstanceOf<path.PathException>());
+final throwsPathException = throwsA(new isInstanceOf<p.PathException>());
+
+void expectEquals(p.Context context, String path1, String path2) {
+  expect(context.equals(path1, path2), isTrue,
+      reason: 'Expected "$path1" to equal "$path2".');
+  expect(context.equals(path2, path1), isTrue,
+      reason: 'Expected "$path2" to equal "$path1".');
+  expect(context.hash(path1), equals(context.hash(path2)),
+      reason: 'Expected "$path1" to hash the same as "$path2".');
+}
+
+void expectNotEquals(p.Context context, String path1, String path2,
+    {bool allowSameHash: false}) {
+  expect(context.equals(path1, path2), isFalse,
+      reason: 'Expected "$path1" not to equal "$path2".');
+  expect(context.equals(path2, path1), isFalse,
+      reason: 'Expected "$path2" not to equal "$path1".');
+
+  // Hash collisions are allowed, but the test author should be explicitly aware
+  // when they occur.
+  if (allowSameHash) return;
+  expect(context.hash(path1), isNot(equals(context.hash(path2))),
+      reason: 'Expected "$path1" not to hash the same as "$path2".');
+}
diff --git a/packages/path/test/windows_test.dart b/packages/path/test/windows_test.dart
index 717043d..364db34 100644
--- a/packages/path/test/windows_test.dart
+++ b/packages/path/test/windows_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library path.test.windows_test;
-
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
@@ -332,6 +330,7 @@
     test('eliminates "." parts', () {
       expect(context.normalize(r'.\'), '.');
       expect(context.normalize(r'c:\.'), r'c:\');
+      expect(context.normalize(r'c:\foo\.'), r'c:\foo');
       expect(context.normalize(r'B:\.\'), r'B:\');
       expect(context.normalize(r'\\server\share\.'), r'\\server\share');
       expect(context.normalize(r'.\.'), '.');
@@ -353,6 +352,7 @@
       expect(
           context.normalize(r'\\server\share\..\../..\a'), r'\\server\share\a');
       expect(context.normalize(r'c:\..'), r'c:\');
+      expect(context.normalize(r'c:\foo\..'), r'c:\');
       expect(context.normalize(r'A:/..\..\..'), r'A:\');
       expect(context.normalize(r'b:\..\..\..\a'), r'b:\a');
       expect(context.normalize(r'b:\r\..\..\..\a\c\.\..'), r'b:\a');
@@ -380,6 +380,14 @@
     test('normalizes separators', () {
       expect(context.normalize(r'a/b\c'), r'a\b\c');
     });
+
+    test('when canonicalizing', () {
+      expect(context.canonicalize('.'), r'c:\root\path');
+      expect(context.canonicalize('foo/bar'), r'c:\root\path\foo\bar');
+      expect(context.canonicalize('FoO'), r'c:\root\path\foo');
+      expect(context.canonicalize('/foo'), r'c:\foo');
+      expect(context.canonicalize('D:/foo'), r'd:\foo');
+    });
   });
 
   group('relative', () {
@@ -427,6 +435,12 @@
         expect(context.relative(r'a\.\b\..\c.txt'), r'a\c.txt');
       });
 
+      test('is case-insensitive', () {
+        expect(context.relative(r'c:\'), r'..\..');
+        expect(context.relative(r'c:\RoOt'), r'..');
+        expect(context.relative(r'c:\rOoT\pAtH\a'), r'a');
+      });
+
       // Regression
       test('from root-only path', () {
         expect(context.relative(r'C:\', from: r'C:\'), '.');
@@ -569,6 +583,59 @@
       expect(r.isWithin(r'C:\', r'C:\baz\bang'), isTrue);
       expect(r.isWithin('.', r'C:\baz\bang'), isFalse);
     });
+
+    test('is case-insensitive', () {
+      expect(context.isWithin(r'FoO', r'fOo\bar'), isTrue);
+      expect(context.isWithin(r'C:\', r'c:\foo'), isTrue);
+      expect(context.isWithin(r'fOo\qux\..\BaR', r'FoO\bAr\baz'), isTrue);
+    });
+  });
+
+  group('equals and hash', () {
+    test('simple cases', () {
+      expectEquals(context, r'foo\bar', r'foo\bar');
+      expectNotEquals(context, r'foo\bar', r'foo\bar\baz');
+      expectNotEquals(context, r'foo\bar', r'foo');
+      expectNotEquals(context, r'foo\bar', r'foo\baz');
+      expectEquals(context, r'foo\bar', r'..\path\foo\bar');
+      expectEquals(context, r'D:\', r'D:\');
+      expectEquals(context, r'C:\', r'..\..');
+      expectEquals(context, r'baz', r'C:\root\path\baz');
+    });
+
+    test('complex cases', () {
+      expectEquals(context, r'foo\.\bar', r'foo\bar');
+      expectEquals(context, r'foo\\bar', r'foo\bar');
+      expectEquals(context, r'foo\qux\..\bar', r'foo\bar');
+      expectNotEquals(context, r'foo\qux\..\bar', r'foo\qux');
+      expectNotEquals(context, r'foo\bar', r'foo\bar\baz\..\..');
+      expectEquals(context, r'foo\bar', r'foo\bar\\\');
+      expectEquals(context, r'foo\.bar', r'foo\.bar');
+      expectNotEquals(context, r'foo\.\bar', r'foo\.bar');
+      expectEquals(context, r'foo\..bar', r'foo\..bar');
+      expectNotEquals(context, r'foo\..\bar', r'foo\..bar');
+      expectEquals(context, r'foo\bar', r'foo\bar\baz\..');
+      expectEquals(context, r'FoO\bAr', r'foo\bar');
+      expectEquals(context, r'foo/\bar', r'foo\/bar');
+      expectEquals(context, r'c:\', r'C:\');
+      expectEquals(context, r'C:\root', r'..');
+    });
+
+    test('with root-relative paths', () {
+      expectEquals(context, r'\foo', r'C:\foo');
+      expectNotEquals(context, r'\foo', 'http://google.com/foo');
+      expectEquals(context, r'C:\root\path\foo\bar', r'foo\bar');
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'foo\bar');
+      expectEquals(r, r'a\b', r'a\b');
+      expectNotEquals(r, '.', r'foo\bar');
+      expectNotEquals(r, '.', r'..\a\b');
+      expectEquals(r, '.', r'..\bar');
+      expectEquals(r, r'C:\baz\bang', r'C:\baz\bang');
+      expectNotEquals(r, r'baz\bang', r'C:\baz\bang');
+    });
   });
 
   group('absolute', () {
@@ -639,6 +706,7 @@
           r'\\server\share\path\to\foo#bar');
       expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
           r'_{_}_`_^_ _"_%_');
+      expect(context.fromUri(Uri.parse('/foo')), r'\foo');
       expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
           throwsArgumentError);
     });
diff --git a/packages/petitparser/.gitignore b/packages/petitparser/.gitignore
deleted file mode 100644
index 1a07c1b..0000000
--- a/packages/petitparser/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.iml
-.DS_Store
-.idea/
-.packages
-.pub
-packages
-pubspec.lock
diff --git a/packages/petitparser/.travis.yml b/packages/petitparser/.travis.yml
deleted file mode 100644
index e142d6a..0000000
--- a/packages/petitparser/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: dart
-sudo: false
-dart:
-  - stable
-  - dev
-script:
-  - ./tool/travis.sh
diff --git a/packages/petitparser/AUTHORS b/packages/petitparser/AUTHORS
deleted file mode 100644
index 7dcee9d..0000000
--- a/packages/petitparser/AUTHORS
+++ /dev/null
@@ -1 +0,0 @@
-Lukas Renggli (http://www.lukas-renggli.ch)
\ No newline at end of file
diff --git a/packages/petitparser/LICENSE b/packages/petitparser/LICENSE
deleted file mode 100644
index 136d8f1..0000000
--- a/packages/petitparser/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License
-
-Copyright (c) 2006-2015 Lukas Renggli.
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/packages/petitparser/README.md b/packages/petitparser/README.md
deleted file mode 100644
index 922f766..0000000
--- a/packages/petitparser/README.md
+++ /dev/null
@@ -1,210 +0,0 @@
-PetitParser for Dart
-====================
-
-[![Pub Package](https://img.shields.io/pub/v/petitparser.svg)](https://pub.dartlang.org/packages/petitparser)
-[![Build Status](https://travis-ci.org/petitparser/dart-petitparser.svg)](https://travis-ci.org/petitparser/dart-petitparser)
-[![Coverage Status](https://coveralls.io/repos/petitparser/dart-petitparser/badge.svg)](https://coveralls.io/r/petitparser/dart-petitparser)
-[![Github Issues](http://githubbadges.herokuapp.com/petitparser/dart-petitparser/issues.svg)](https://github.com/petitparser/dart-petitparser/issues)
-[![Gitter chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/petitparser/dart-petitparser)
-
-Grammars for programming languages are traditionally specified statically. They are hard to compose and reuse due to ambiguities that inevitably arise. PetitParser combines ideas from scannnerless parsing, parser combinators, parsing expression grammars and packrat parsers to model grammars and parsers as objects that can be reconfigured dynamically.
-
-This library is open source, stable and well tested. Development happens on [GitHub](https://github.com/petitparser/dart-petitparser). Feel free to report issues or create a pull-request there. General questions are best asked on [StackOverflow](http://stackoverflow.com/questions/tagged/petitparser+dart).
-
-Up-to-date [class documentation](http://www.dartdocs.org/documentation/petitparser/latest/index.html) is created with every release.
-
-
-Tutorial
---------
-
-### Writing a Simple Grammar
-
-Writing grammars with PetitParser is simple as writing Dart code. For example, to write a grammar that can parse identifiers that start with a letter followed by zero or more letter or digits is defined as follows:
-
-```dart
-Parser id = letter() & (letter() | digit()).star();
-```
-
-If you look at the object `id` in the debugger, you'll notice that the code above builds a tree of parser objects:
-
-- Sequence: This parser accepts a sequence of parsers.
-  - Predicate: This parser accepts a single letter.
-  - Repeater: This parser accepts zero or more times another parser.
-    - Choice: This parser accepts a single word character.
-      - Predicate: This parser accepts a single letter.
-      - Predicate: This parser accepts a single digit.
-
-The operators `&` and `|` are overloaded and create a sequence and a choice parser respectively. In some contexts it might be more convenient to use chained function calls:
-
-```dart
-Parser id = letter().seq(letter().or(digit()).star());
-```
-
-### Parsing Some Input
-
-To actually parse a `String` (or `List`) we can use the method `Parser.parse`:
-
-```dart
-Result id1 = id.parse('yeah');
-Result id2 = id.parse('f12');
-```
-
-The method `Parser.parse` returns a parse `Result`, which is either an instance of `Success` or `Failure`. In both examples above we are successful and can retrieve the parse result using `Success.value`:
-
-```dart
-print(id1.value);                   // ['y', ['e', 'a', 'h']]
-print(id2.value);                   // ['f', ['1', '2']]
-```
-
-While it seems odd to get these nested arrays with characters as a return value, this is the default decomposition of the input into a parse tree. We'll see in a while how that can be customized.
-
-If we try to parse something invalid we get an instance of `Failure` as an answer and we can retrieve a descriptive error message using `Failure.message`:
-
-```dart
-Result id3 = id.parse('123');
-print(id3.message);                 // 'letter expected'
-print(id3.position);                // 0
-```
-
-Trying to retrieve the parse result by calling `Failure.value` would throw the exception `ParserError`. `Context.isSuccess` and `Context.isFailure` can be used to decide if the parse was successful.
-
-If you are only interested if a given string matches or not you can use the helper method `Parser.accept`:
-
-```dart
-print(id.accept('foo'));            // true
-print(id.accept('123'));            // false
-```
-
-### Different Kinds of Parsers
-
-PetitParser provide a large set of ready-made parser that you can compose to consume and transform arbitrarily complex languages. The terminal parsers are the most simple ones. We've already seen a few of those:
-
-- `char('a')` parses the character *a*.
-- `string('abc')` parses the string *abc*.
-- `any()` parses any character.
-- `digit()` parses any digit from *0* to *9*.
-- `letter()` parses any letter from *a* to *z* and *A* to *Z*.
-- `word()` parses any letter or digit.
-
-So instead of using the letter and digit predicate, we could have written our identifier parser like this:
-
-```dart
-var id = letter() & word().star();
-```
-
-The next set of parsers are used to combine other parsers together:
-
-- `p1 & p2` and `p1.seq(p2)` parse *p1* followed by *p2* (sequence).
-- `p1 | p2` and `p1.or(p2)` parse *p1*, if that doesn't work parse *p2* (ordered choice).
-- `p.star()` parses *p* zero or more times.
-- `p.plus()` parses *p* one or more times.
-- `p.optional()` parses *p*, if possible.
-- `p.and()` parses *p*, but does not consume its input.
-- `p.not()` parses *p* and succeed when p fails, but does not consume its input.
-- `p.end()` parses *p* and succeed at the end of the input.
-
-To attach an action or transformation to a parser we can use the following methods:
-
-- `p.map((value) => ...)` performs the transformation given the function.
-- `p.pick(n)` returns the *n*-th element of the list *p* returns.
-- `p.flatten()` creates a string from the result of *p*.
-- `p.token()` creates a token from the result of *p*.
-- `p.trim()` trims whitespaces before and after *p*.
-
-To return a string of the parsed identifier, we can modify our parser like this:
-
-```dart
-var id = letter().seq(word().star()).flatten();
-```
-
-To conveniently find all matches in a given input string you can use `Parser.matchesSkipping`:
-
-```dart
-var matches = id.matchesSkipping('foo 123 bar4');
-print(matches);                     // ['foo', 'bar4']
-```
-
-These are the basic elements to build parsers. There are a few more well documented and tested factory methods in the `Parser` class. If you want browse their documentation and tests.
-
-### Writing a More Complicated Grammar
-
-Now we are able to write a more complicated grammar for evaluating simple
-arithmetic expressions. Within a file we start with the grammar for a
-number (actually an integer):
-
-```dart
-var number = digit().plus().flatten().trim().map(int.parse);
-```
-
-Then we define the productions for addition and multiplication in order of precedence. Note that we instantiate the productions with undefined parsers upfront, because they recursively refer to each other. Later on we can resolve this recursion by setting their reference:
-
-```dart
-var term = undefined();
-var prod = undefined();
-var prim = undefined();
-
-term.set(prod.seq(char('+').trim()).seq(term).map((values) {
-  return values[0] + values[2];
-}).or(prod));
-prod.set(prim.seq(char('*').trim()).seq(prod).map((values) {
-  return values[0] * values[2];
-}).or(prim));
-prim.set(char('(').trim().seq(term).seq(char(')'.trim())).map((values) {
-  return values[1];
-}).or(number));
-```
-
-To make sure that our parser consumes all input we wrap it with the `end()` parser into the start production:
-
-```dart
-var start = term.end();
-```
-
-That's it, now we can test our parser and evaluator:
-
-```dart
-print(start.parse('1 + 2 * 3').value);        // 7
-print(start.parse('(1 + 2) * 3').value);      // 9
-```
-
-As an exercise we could extend the parser to also accept negative numbers and floating point numbers, not only integers. Furthermore it would be useful to support subtraction and division as well. All these features can be added with a few lines of PetitParser code.
-
-
-Misc
-----
-
-### Examples
-
-The package comes with a large collections of grammars and language experiments ready to explore:
-
-- `lib/dart.dart` contains an experimental Dart grammar.
-- `lib/json.dart` contains a complete JSON grammar and parser.
-- `lib/lisp.dart` contains a complete Lisp grammar, parser and evaluator:
-- `example/lisphell` contains a command line lisp interpreter.
-  - `example/lispweb` contains a web based lisp interpreter.
-  - `lib/smalltalk.dart` contains a complete Smalltalk grammar.
-
-Furthermore, there are various open source projects using PetitParser:
-
-- [Badger](https://github.com/badger-lang/badger) is an experimental programming language.
-- [dart-xml](https://github.com/renggli/dart-xml) is a lightweight library for parsing, traversing, and querying XML documents.
-- [InQlik](https://github.com/inqlik/inqlik_cli) is a parser for QlikView load script files.
-- [intl](https://github.com/dart-lang/intl) provides internationalization and localization support to Dart.
-- [PowerConfig](https://github.com/kaendfinger/powerconfig.dart) is a power config implementation.
-- [RythmDart](https://github.com/freewind/RythmDart) is a rich featured, high performance template engine.
-- [SharkDart](https://github.com/freewind/SharkDart) is a small template engine.
-
-### History
-
-PetitParser was originally implemented in [Smalltalk](http://scg.unibe.ch/research/helvetia/petitparser). Later on, as a mean to learn these languages, I reimplemented PetitParser in [Java](https://github.com/petitparser/java-petitparser) and [Dart](https://github.com/petitparser/dart-petitparser). The implementations are very similar in their API and the supported features. If possible, the implementations adopt best practises of the target language.
-
-### Ports
-
-- [Java](https://github.com/petitparser/java-petitparser)
-- [PHP](https://github.com/mindplay-dk/petitparserphp)
-- [Smalltalk](http://scg.unibe.ch/research/helvetia/petitparser)
-- [TypeScript](https://github.com/mindplay-dk/petitparser-ts)
-
-### License
-
-The MIT License, see [LICENSE](https://raw.githubusercontent.com/petitparser/dart-petitparser/master/LICENSE).
diff --git a/packages/petitparser/example/lispshell/lispshell.dart b/packages/petitparser/example/lispshell/lispshell.dart
deleted file mode 100644
index 9ef6e51..0000000
--- a/packages/petitparser/example/lispshell/lispshell.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-library petitparser.example.lispshell;
-
-import 'dart:io';
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:petitparser/petitparser.dart';
-import 'package:petitparser/lisp.dart';
-
-/// Read, evaluate, print loop.
-void evalInteractive(Parser parser, Environment env, Stream<String> input,
-    IOSink output, IOSink error) {
-  output.write('>> ');
-  input.listen((String line) {
-    try {
-      output.writeln('=> ${evalString(parser, env, line)}');
-    } on ParserError catch (exception) {
-      error.writeln('Parser error: ' + exception.toString());
-    } on Error catch (exception) {
-      error.writeln(exception.toString());
-    }
-    output.write('>> ');
-  });
-}
-
-/// Entry point for the command line interpreter.
-void main(List<String> arguments) {
-
-  // default options
-  var standardLibrary = true;
-  var interactiveMode = false;
-  var files = new List();
-
-  // parse arguments
-  for (var option in arguments) {
-    if (option.startsWith('-') && files.isEmpty) {
-      if (option == '-n') {
-        standardLibrary = false;
-      } else if (option == '-i') {
-        interactiveMode = true;
-      } else if (option == '-?') {
-        print('${Platform.executable} lisp.dart -n -i [files]');
-        print(' -i enforces the interactive mode');
-        print(' -n does not load the standard library');
-        exit(0);
-      } else {
-        print('Unknown option: $option');
-        exit(1);
-      }
-    } else {
-      var file = new File(option);
-      if (file.existsSync()) {
-        files.add(file);
-      } else {
-        print('File not found: $option');
-        exit(2);
-      }
-    }
-  }
-
-  // evaluation context
-  var environment = Natives.import(new Environment());
-
-  // add additional primitives
-  environment.define(new Name('exit'), (env, args) => exit(args == null ? 0 : args.head));
-  environment.define(new Name('sleep'), (env, args) => sleep(new Duration(milliseconds: args.head)));
-
-  // process standard library
-  if (standardLibrary) {
-    environment = Standard.import(environment.create());
-  }
-
-  // create empty context
-  environment = environment.create();
-
-  // process files given as argument
-  files.forEach((file) {
-    evalString(lispParser, environment, file.readAsStringSync());
-  });
-
-  // process console input
-  if (interactiveMode || files.isEmpty) {
-    var input = stdin
-        .transform(SYSTEM_ENCODING.decoder)
-        .transform(new LineSplitter());
-    evalInteractive(lispParser, environment, input, stdout, stderr);
-  }
-}
diff --git a/packages/petitparser/example/lispweb/lispweb.css b/packages/petitparser/example/lispweb/lispweb.css
deleted file mode 100644
index aa7fc97..0000000
--- a/packages/petitparser/example/lispweb/lispweb.css
+++ /dev/null
@@ -1,103 +0,0 @@
-/* HTML5 Boilerplate  */
-
-article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
-audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
-audio:not([controls]) { display: none; }
-[hidden] { display: none; }
-
-html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
-html, button, input, select, textarea { font-family: sans-serif; color: #222; }
-body { margin: 0; font-size: 1em; line-height: 1.4; }
-
-::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
-::selection { background: #fe57a1; color: #fff; text-shadow: none; }
-
-a { color: #00e; }
-a:visited { color: #551a8b; }
-a:hover { color: #06e; }
-a:focus { outline: thin dotted; }
-a:hover, a:active { outline: 0; }
-abbr[title] { border-bottom: 1px dotted; }
-b, strong { font-weight: bold; }
-blockquote { margin: 1em 40px; }
-dfn { font-style: italic; }
-hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
-ins { background: #ff9; color: #000; text-decoration: none; }
-mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
-pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
-pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
-
-q { quotes: none; }
-q:before, q:after { content: ""; content: none; }
-small { font-size: 85%; }
-sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
-sup { top: -0.5em; }
-sub { bottom: -0.25em; }
-
-ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
-dd { margin: 0 0 0 40px; }
-nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
-
-img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
-svg:not(:root) { overflow: hidden; }
-figure { margin: 0; }
-
-form { margin: 0; }
-fieldset { border: 0; margin: 0; padding: 0; }
-
-label { cursor: pointer; }
-legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; }
-button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
-button, input { line-height: normal; }
-button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; }
-button[disabled], input[disabled] { cursor: default; }
-input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; }
-input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
-input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }
-button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
-textarea { overflow: auto; vertical-align: top; resize: vertical; }
-input:valid, textarea:valid {  }
-input:invalid, textarea:invalid { background-color: #f0dddd; }
-
-table { border-collapse: collapse; border-spacing: 0; }
-td { vertical-align: top; }
-
-.chromeframe { margin: 0.2em 0; background: #ccc; color: black; padding: 0.2em 0; }
-
-
-
-
-
-
-
-
-
-@media only screen and (min-width: 35em) {
-  
-
-}
-
-.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; *line-height: 0; }
-.ir br { display: none; }
-.hidden { display: none !important; visibility: hidden; }
-.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
-.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
-.invisible { visibility: hidden; }
-.clearfix:before, .clearfix:after { content: ""; display: table; }
-.clearfix:after { clear: both; }
-.clearfix { *zoom: 1; }
-
-@media print {
-  * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } 
-  a, a:visited { text-decoration: underline; }
-  a[href]:after { content: " (" attr(href) ")"; }
-  abbr[title]:after { content: " (" attr(title) ")"; }
-  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } 
-  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
-  thead { display: table-header-group; } 
-  tr, img { page-break-inside: avoid; }
-  img { max-width: 100% !important; }
-  @page { margin: 0.5cm; }
-  p, h2, h3 { orphans: 3; widows: 3; }
-  h2, h3 { page-break-after: avoid; }
-}
diff --git a/packages/petitparser/example/lispweb/lispweb.dart b/packages/petitparser/example/lispweb/lispweb.dart
deleted file mode 100644
index 32e25ab..0000000
--- a/packages/petitparser/example/lispweb/lispweb.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-library petitparser.example.lispweb;
-
-import 'dart:html';
-import 'package:petitparser/lisp.dart';
-
-void inspector(Element element, Environment environment) {
-  var result = '';
-  while (environment != null) {
-    result = '$result<ul>';
-    for (var symbol in environment.keys) {
-      result = '$result<li><b>$symbol</b>: ${environment[symbol]}</li>';
-    }
-    result = '$result</ul>';
-    result = '$result<hr/>';
-    environment = environment.owner;
-  }
-  element.innerHtml = result;
-}
-
-void main() {
-  var root = new Environment();
-  var native = Natives.import(root);
-  var standard = Standard.import(native.create());
-  var environment = standard.create();
-
-  var input = querySelector('#input') as TextAreaElement;
-  var output = querySelector('#output') as TextAreaElement;
-
-  querySelector('#evaluate').onClick.listen((event) {
-    var result = evalString(lispParser, environment, input.value);
-    output.value = result.toString();
-    inspector(querySelector('#inspector'), environment);
-  });
-  inspector(querySelector('#inspector'), environment);
-}
diff --git a/packages/petitparser/example/lispweb/lispweb.html b/packages/petitparser/example/lispweb/lispweb.html
deleted file mode 100644
index 37ae798..0000000
--- a/packages/petitparser/example/lispweb/lispweb.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>Lisp</title>
-    <link rel="stylesheet" type="text/css" href="lispweb.css" />
-    <style>
-      body { margin: 1em; }
-      textarea { display: block; width: 100%; height: 200px; margin: 1em 0; }
-    </style>
-  </head>
-  <body>
-    <h1>Lisp Interpreter</h1>
-    <textarea id="input"></textarea>
-    <input type="submit" id="evaluate" value="Evaluate" />
-    <textarea id="output"></textarea>
-    <p id="inspector"></p>
-    <script type="application/dart" src="lispweb.dart"></script>
-    <script type="application/javascript" src="packages/browser/dart.js"></script>
-  </body>
-</html>
diff --git a/packages/petitparser/lib/beta.dart b/packages/petitparser/lib/beta.dart
deleted file mode 100644
index a3de094..0000000
--- a/packages/petitparser/lib/beta.dart
+++ /dev/null
@@ -1,4 +0,0 @@
-/// This package contains a experimental features of PetitParser. The code here
-/// might be removed or changed in incompatible ways without keeping backward
-/// compatibility.
-library petitparser.beta;
diff --git a/packages/petitparser/lib/dart.dart b/packages/petitparser/lib/dart.dart
deleted file mode 100644
index b339041..0000000
--- a/packages/petitparser/lib/dart.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-/// This package contains the grammar of the Dart programming language.
-///
-/// The grammar is adapted from [https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/language/grammar/Dart.g].
-/// Unfortunately, it is unable to parse all valid Dart programs yet.
-library petitparser.dart;
-
-import 'petitparser.dart';
-
-part 'src/dart/grammar.dart';
diff --git a/packages/petitparser/lib/debug.dart b/packages/petitparser/lib/debug.dart
deleted file mode 100644
index 5c40cfa..0000000
--- a/packages/petitparser/lib/debug.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-/// This package contains some simple debugging tools.
-library petitparser.debug;
-
-import 'package:petitparser/petitparser.dart';
-import 'package:petitparser/reflection.dart';
-
-part 'src/debug/continuation.dart';
-part 'src/debug/profile.dart';
-part 'src/debug/progress.dart';
-part 'src/debug/trace.dart';
-
-typedef void OutputHandler(Object object);
-
-String _repeat(int count, String value) {
-  var result = new StringBuffer();
-  for (var i = 0; i < count; i++) {
-    result.write(value);
-  }
-  return result.toString();
-}
diff --git a/packages/petitparser/lib/json.dart b/packages/petitparser/lib/json.dart
deleted file mode 100644
index 94fa212..0000000
--- a/packages/petitparser/lib/json.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-/// This package contains a complete implementation of [JSON](http://json.org/).
-///
-/// [JsonParser] creates a nested Dart objects from a given JSON string. For
-/// example the following code prints `{a: 1, b: [2, 3.4], c: false}`:
-///
-///     var json = new JsonParser();
-///     var result = json.parse('{"a": 1, "b": [2, 3.4], "c": false}');
-///     print(result.value);  // {a: 1, b: [2, 3.4], c: false}
-///
-/// The grammar definition [JsonGrammar] can be subclassed to construct other
-/// objects.
-library petitparser.json;
-
-import 'dart:collection';
-import 'petitparser.dart';
-
-part 'src/json/grammar.dart';
-part 'src/json/parser.dart';
diff --git a/packages/petitparser/lib/lisp.dart b/packages/petitparser/lib/lisp.dart
deleted file mode 100644
index 6f23996..0000000
--- a/packages/petitparser/lib/lisp.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-/// This package contains a simple grammar and evaluator for LISP.
-///
-/// The code is reasonably complete to run and evaluate reasonably complex
-/// programs from the console and from the web browser.
-library petitparser.lisp;
-
-import 'dart:collection';
-import 'petitparser.dart';
-
-part 'src/lisp/cons.dart';
-part 'src/lisp/environment.dart';
-part 'src/lisp/grammar.dart';
-part 'src/lisp/name.dart';
-part 'src/lisp/natives.dart';
-part 'src/lisp/parser.dart';
-part 'src/lisp/standard.dart';
-
-/// The standard lisp parser definition.
-final lispParser = new LispParser();
-
-/// The evaluation function.
-eval(Environment env, expr) {
-  if (expr is Cons) {
-    return eval(env, expr.head)(env, expr.tail);
-  } else if (expr is Name) {
-    return env[expr];
-  } else {
-    return expr;
-  }
-}
-
-/// Evaluate a cons of instructions.
-evalList(Environment env, expr) {
-  var result = null;
-  while (expr is Cons) {
-    result = eval(env, expr.head);
-    expr = expr.tail;
-  }
-  return result;
-}
-
-/// The arguments evaluation function.
-evalArguments(Environment env, args) {
-  if (args is Cons) {
-    return new Cons(eval(env, args.head), evalArguments(env, args.tail));
-  } else {
-    return null;
-  }
-}
-
-/// Reads and evaluates a [script].
-evalString(Parser parser, Environment env, String script) {
-  var result = null;
-  for (var cell in parser.parse(script).value) {
-    result = eval(env, cell);
-  }
-  return result;
-}
diff --git a/packages/petitparser/lib/petitparser.dart b/packages/petitparser/lib/petitparser.dart
deleted file mode 100644
index 5f559c9..0000000
--- a/packages/petitparser/lib/petitparser.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-/// This package contains the core library of PetitParser, a dynamic parser
-/// combinator framework.
-library petitparser;
-
-part 'src/petitparser/actions.dart';
-part 'src/petitparser/characters.dart';
-part 'src/petitparser/combinators.dart';
-part 'src/petitparser/composite.dart';
-part 'src/petitparser/context.dart';
-part 'src/petitparser/definition.dart';
-part 'src/petitparser/expression.dart';
-part 'src/petitparser/parser.dart';
-part 'src/petitparser/parsers.dart';
-part 'src/petitparser/predicates.dart';
-part 'src/petitparser/repeaters.dart';
-part 'src/petitparser/token.dart';
diff --git a/packages/petitparser/lib/reflection.dart b/packages/petitparser/lib/reflection.dart
deleted file mode 100644
index 91c63b0..0000000
--- a/packages/petitparser/lib/reflection.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-/// This package contains tools to reflect on and transform parsers.
-library petitparser.reflection;
-
-import 'dart:collection';
-
-import 'package:petitparser/petitparser.dart';
-
-part 'src/reflection/iterable.dart';
-part 'src/reflection/optimize.dart';
-part 'src/reflection/transform.dart';
diff --git a/packages/petitparser/lib/smalltalk.dart b/packages/petitparser/lib/smalltalk.dart
deleted file mode 100644
index a0f7f8e..0000000
--- a/packages/petitparser/lib/smalltalk.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-/// This package contains the complete grammar of Smalltalk.
-///
-/// It was automatically exported from PetitParser for Smalltalk.
-library petitparser.smalltalk;
-
-import 'petitparser.dart';
-
-part 'src/smalltalk/grammar.dart';
diff --git a/packages/petitparser/lib/src/dart/grammar.dart b/packages/petitparser/lib/src/dart/grammar.dart
deleted file mode 100644
index e7bfa41..0000000
--- a/packages/petitparser/lib/src/dart/grammar.dart
+++ /dev/null
@@ -1,763 +0,0 @@
-part of petitparser.dart;
-
-/// Dart grammar.
-class DartGrammar extends GrammarParser {
-  DartGrammar() : super(new DartGrammarDefinition());
-}
-
-/// Dart grammar definition.
-class DartGrammarDefinition extends GrammarDefinition {
-
-  Parser token(input) {
-    if (input is String) {
-      input = input.length == 1 ? char(input) : string(input);
-    } else if (input is Function) {
-      input = ref(input);
-    }
-    if (input is! Parser && input is TrimmingParser) {
-      throw new StateError('Invalid token parser: $input');
-    }
-    return input.token().trim(ref(HIDDEN_STUFF));
-  }
-
-
-  // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
-  // for details. All rights reserved. Use of this source code is governed by a
-  // BSD-style license that can be found in the LICENSE file.
-
-  // -----------------------------------------------------------------
-  // Keyword definitions.
-  // -----------------------------------------------------------------
-  BREAK()      => ref(token, 'break');
-  CASE()       => ref(token, 'case');
-  CATCH()      => ref(token, 'catch');
-  CONST()      => ref(token, 'const');
-  CONTINUE()   => ref(token, 'continue');
-  DEFAULT()    => ref(token, 'default');
-  DO()         => ref(token, 'do');
-  ELSE()       => ref(token, 'else');
-  FALSE()      => ref(token, 'false');
-  FINAL()      => ref(token, 'final');
-  FINALLY()    => ref(token, 'finally');
-  FOR()        => ref(token, 'for');
-  IF()         => ref(token, 'if');
-  IN()         => ref(token, 'in');
-  NEW()        => ref(token, 'new');
-  NULL()       => ref(token, 'null');
-  RETURN()     => ref(token, 'return');
-  SUPER()      => ref(token, 'super');
-  SWITCH()     => ref(token, 'switch');
-  THIS()       => ref(token, 'this');
-  THROW()      => ref(token, 'throw');
-  TRUE()       => ref(token, 'true');
-  TRY()        => ref(token, 'try');
-  VAR()        => ref(token, 'var');
-  VOID()       => ref(token, 'void');
-  WHILE()      => ref(token, 'while');
-
-  // Pseudo-keywords that should also be valid identifiers.
-  ABSTRACT()   => ref(token, 'abstract');
-  ASSERT()     => ref(token, 'assert');
-  CLASS()      => ref(token, 'class');
-  EXTENDS()    => ref(token, 'extends');
-  FACTORY()    => ref(token, 'factory');
-  GET()        => ref(token, 'get');
-  IMPLEMENTS() => ref(token, 'implements');
-  IMPORT()     => ref(token, 'import');
-  INTERFACE()  => ref(token, 'interface');
-  IS()         => ref(token, 'is');
-  LIBRARY()    => ref(token, 'library');
-  NATIVE()     => ref(token, 'native');
-  NEGATE()     => ref(token, 'negate');
-  OPERATOR()   => ref(token, 'operator');
-  SET()        => ref(token, 'set');
-  SOURCE()     => ref(token, 'source');
-  STATIC()     => ref(token, 'static');
-  TYPEDEF()    => ref(token, 'typedef');
-
-  // -----------------------------------------------------------------
-  // Grammar productions.
-  // -----------------------------------------------------------------
-  start() => ref(compilationUnit).end();
-
-  compilationUnit() =>
-        ref(HASHBANG).optional()
-      & ref(directive).star()
-      & ref(topLevelDefinition).star();
-
-  directive() =>
-        ref(token, '#')
-      & ref(identifier)
-      & ref(arguments)
-      & ref(token, ';');
-
-  topLevelDefinition() =>
-        ref(classDefinition)
-      | ref(interfaceDefinition)
-      | ref(functionTypeAlias)
-      | ref(functionDeclaration) & ref(functionBodyOrNative)
-      | ref(returnType).optional() & ref(getOrSet) & ref(identifier) & ref(formalParameterList) & ref(functionBodyOrNative)
-      | ref(FINAL) & ref(type).optional() & ref(staticFinalDeclarationList) & ref(token, ';')
-      | ref(constInitializedVariableDeclaration) & ref(token, ';');
-
-  classDefinition() =>
-        ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(superclass).optional() & ref(interfaces).optional() &
-        ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}')
-      | ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(interfaces).optional() & ref(NATIVE) & ref(token, STRING) &
-        ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}');
-
-  typeParameter() => ref(identifier) & (ref(EXTENDS) & ref(type)).optional();
-
-  typeParameters() => ref(token, '<') & ref(typeParameter) & (ref(token, ',') & ref(typeParameter)).star() & ref(token, '>');
-
-  superclass() => ref(EXTENDS) & ref(type);
-
-  interfaces() => ref(IMPLEMENTS) & ref(typeList);
-
-  superinterfaces() => ref(EXTENDS) & ref(typeList);
-
-  // This rule is organized in a way that may not be most readable, but
-  // gives the best error messages.
-  classMemberDefinition() =>
-        ref(declaration) & ref(token, ';')
-      | ref(constructorDeclaration) & ref(token, ';')
-      | ref(methodDeclaration) & ref(functionBodyOrNative)
-      | ref(CONST) & ref(factoryConstructorDeclaration) & ref(functionNative);
-
-  functionBodyOrNative() =>
-        ref(NATIVE) & ref(functionBody)
-      | ref(functionNative)
-      | ref(functionBody);
-
-  functionNative() => ref(NATIVE) & ref(token, STRING).optional() & ref(token, ';');
-
-  // A method, operator, or constructor (which all should be followed by
-  // a block of code).
-  methodDeclaration() =>
-        ref(factoryConstructorDeclaration)
-      | ref(STATIC) & ref(functionDeclaration)
-      | ref(specialSignatureDefinition)
-      | ref(functionDeclaration) & ref(initializers).optional()
-      | ref(namedConstructorDeclaration) & ref(initializers).optional();
-
-  // An abstract method/operator, a field, or const constructor (which
-  // all should be followed by a semicolon).
-  declaration() =>
-        ref(constantConstructorDeclaration) & (ref(redirection) | ref(initializers)).optional()
-      | ref(functionDeclaration) & ref(redirection)
-      | ref(namedConstructorDeclaration) & ref(redirection)
-      | ref(ABSTRACT) & ref(specialSignatureDefinition)
-      | ref(ABSTRACT) & ref(functionDeclaration)
-      | ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(staticFinalDeclarationList)
-      | ref(STATIC).optional() & ref(constInitializedVariableDeclaration);
-
-  initializers() => ref(token, ':') & ref(superCallOrFieldInitializer) & (ref(token, ',') & ref(superCallOrFieldInitializer)).star();
-
-  redirection() => ref(token, ':') & ref(THIS) & (ref(token, '.') & ref(identifier)).optional() & ref(arguments);
-
-  fieldInitializer() => (ref(THIS) & ref(token, '.')).optional() & ref(identifier) & ref(token, '=') & ref(conditionalExpression);
-
-  superCallOrFieldInitializer() =>
-        ref(SUPER) & ref(arguments)
-      | ref(SUPER) & ref(token, '.') & ref(identifier) & ref(arguments)
-      | ref(fieldInitializer);
-
-  staticFinalDeclarationList() => ref(staticFinalDeclaration) & (ref(token, ',') & ref(staticFinalDeclaration)).star();
-
-  staticFinalDeclaration() => ref(identifier) & ref(token, '=') & ref(constantExpression);
-
-  interfaceDefinition() => ref(INTERFACE) & ref(identifier) & ref(typeParameters).optional() &
-      ref(superinterfaces).optional() & ref(factorySpecification).optional() & ref(token, '{') &
-      ref(interfaceMemberDefinition).star() & ref(token, '}');
-
-  factorySpecification() => ref(FACTORY) & ref(type);
-
-  functionTypeAlias() => ref(TYPEDEF) & ref(functionPrefix) & ref(typeParameters).optional() &
-      ref(formalParameterList) & ref(token, ';');
-
-  interfaceMemberDefinition() =>
-        ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(initializedIdentifierList) & ref(token, ';')
-      | ref(functionDeclaration) & ref(token, ';')
-      | ref(constantConstructorDeclaration) & ref(token, ';')
-      | ref(namedConstructorDeclaration) & ref(token, ';')
-      | ref(specialSignatureDefinition) & ref(token, ';')
-      | ref(variableDeclaration) & ref(token, ';');
-
-  factoryConstructorDeclaration() => ref(FACTORY) & ref(qualified) & ref(typeParameters).optional() &
-      (ref(token, '.') & ref(identifier)).optional() & ref(formalParameterList);
-
-  namedConstructorDeclaration() => ref(identifier) & ref(token, '.') & ref(identifier) &
-      ref(formalParameterList);
-
-  constructorDeclaration() =>
-        ref(identifier) & ref(formalParameterList) & (ref(redirection) | ref(initializers)).optional()
-      | ref(namedConstructorDeclaration) & (ref(redirection) | ref(initializers)).optional();
-
-  constantConstructorDeclaration() => ref(CONST) & ref(qualified) & ref(formalParameterList);
-
-  specialSignatureDefinition() =>
-        ref(STATIC).optional() & ref(returnType).optional() & ref(getOrSet) & ref(identifier) & ref(formalParameterList)
-      | ref(returnType).optional() & ref(OPERATOR) & ref(userDefinableOperator) & ref(formalParameterList);
-
-  getOrSet() => ref(GET) | ref(SET);
-
-  userDefinableOperator() =>
-        ref(multiplicativeOperator)
-      | ref(additiveOperator)
-      | ref(shiftOperator)
-      | ref(relationalOperator)
-      | ref(bitwiseOperator)
-      | ref(token, '==')  // Disallow negative and === equality checks.
-      | ref(token, '~')   // Disallow ! operator.
-      | ref(NEGATE)
-      | ref(token, '[') & ref(token, ']')
-      | ref(token, '[') & ref(token, ']') & ref(token, '=');
-
-  prefixOperator() =>
-        ref(additiveOperator)
-      | ref(negateOperator);
-
-  postfixOperator() =>
-      ref(incrementOperator);
-
-  negateOperator() =>
-        ref(token, '!')
-      | ref(token, '~');
-
-  multiplicativeOperator() =>
-        ref(token, '*')
-      | ref(token, '/')
-      | ref(token, '%')
-      | ref(token, '~/');
-
-  assignmentOperator() =>
-        ref(token, '=')
-      | ref(token, '*=')
-      | ref(token, '/=')
-      | ref(token, '~/=')
-      | ref(token, '%=')
-      | ref(token, '+=')
-      | ref(token, '-=')
-      | ref(token, '<<=')
-      | ref(token, '>>>=')
-      | ref(token, '>>=')
-      | ref(token, '&=')
-      | ref(token, '^=')
-      | ref(token, '|=');
-
-  additiveOperator() =>
-        ref(token, '+')
-      | ref(token, '-');
-
-  incrementOperator() =>
-        ref(token, '++')
-      | ref(token, '--');
-
-  shiftOperator() =>
-        ref(token, '<<')
-      | ref(token, '>>>')
-      | ref(token, '>>');
-
-  relationalOperator() =>
-        ref(token, '>=')
-      | ref(token, '>')
-      | ref(token, '<=')
-      | ref(token, '<');
-
-  equalityOperator() =>
-        ref(token, '===')
-      | ref(token, '!==')
-      | ref(token, '==')
-      | ref(token, '!=');
-
-  bitwiseOperator() =>
-        ref(token, '&')
-      | ref(token, '^')
-      | ref(token, '|');
-
-  formalParameterList() =>
-        ref(token, '(') & ref(namedFormalParameters).optional() & ref(token, ')')
-      | ref(token, '(') & ref(normalFormalParameter) & ref(normalFormalParameterTail).optional() & ref(token, ')');
-
-  normalFormalParameterTail() =>
-        ref(token, ',') & ref(namedFormalParameters)
-      | ref(token, ',') & ref(normalFormalParameter) & ref(normalFormalParameterTail).optional();
-
-  normalFormalParameter() =>
-        ref(functionDeclaration)
-      | ref(fieldFormalParameter)
-      | ref(simpleFormalParameter);
-
-  simpleFormalParameter() =>
-        ref(declaredIdentifier)
-      | ref(identifier);
-
-  fieldFormalParameter() =>
-        ref(finalVarOrType).optional() & ref(THIS) & ref(token, '.') & ref(identifier);
-
-  namedFormalParameters() =>
-        ref(token, '[') & ref(defaultFormalParameter) & (ref(token, ',') & ref(defaultFormalParameter)).star() & ref(token, ']');
-
-  defaultFormalParameter() =>
-        ref(normalFormalParameter) & (ref(token, '=') & ref(constantExpression)).optional();
-
-  returnType() =>
-        ref(VOID)
-      | ref(type);
-
-  finalVarOrType() =>
-        ref(FINAL) & ref(type).optional()
-      | ref(VAR)
-      | ref(type)
-      ;
-
-  // We have to introduce a separate rule for 'declared' identifiers to
-  // allow ANTLR to decide if the first identifier we encounter after
-  // final is a type or an identifier. Before this change, we used the
-  // production 'finalVarOrType identifier' in numerous places.
-  declaredIdentifier() =>
-        ref(FINAL) & ref(type).optional() & ref(identifier)
-      | ref(VAR) & ref(identifier)
-      | ref(type) & ref(identifier)
-      ;
-
-  identifier() => ref(token, ref(IDENTIFIER));
-
-  qualified() =>
-        ref(identifier) & (ref(token, '.') & ref(identifier)).optional()
-      ;
-
-  type() =>
-        ref(qualified) & ref(typeArguments).optional()
-      ;
-
-  typeArguments() =>
-        ref(token, '<') & ref(typeList) & ref(token, '>')
-      ;
-
-  typeList() =>
-        ref(type) & (ref(token, ',') & ref(type)).star()
-      ;
-
-  block() =>
-        ref(token, '{') & ref(statements) & ref(token, '}')
-      ;
-
-  statements() =>
-        ref(statement).star()
-      ;
-
-  statement() =>
-        ref(label).star() & ref(nonLabelledStatement)
-      ;
-
-  nonLabelledStatement() =>
-        ref(block)
-      | ref(initializedVariableDeclaration) & ref(token, ';')
-      | ref(iterationStatement)
-      | ref(selectionStatement)
-      | ref(tryStatement)
-      | ref(BREAK) & ref(identifier).optional() & ref(token, ';')
-      | ref(CONTINUE) & ref(identifier).optional() & ref(token, ';')
-      | ref(RETURN) & ref(expression).optional() & ref(token, ';')
-      | ref(THROW) & ref(expression).optional() & ref(token, ';')
-      | ref(expression).optional() & ref(token, ';')
-      | ref(ASSERT) & ref(token, '(') & ref(conditionalExpression) & ref(token, ')') & ref(token, ';')
-      | ref(functionDeclaration) & ref(functionBody)
-      ;
-
-  label() =>
-        ref(identifier) & ref(token, ':')
-      ;
-
-  iterationStatement() =>
-        ref(WHILE) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(statement)
-      | ref(DO) & ref(statement) & ref(WHILE) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(token, ';')
-      | ref(FOR) & ref(token, '(') & ref(forLoopParts) & ref(token, ')') & ref(statement)
-      ;
-
-  forLoopParts() =>
-        ref(forInitializerStatement) & ref(expression).optional() & ref(token, ';') & ref(expressionList).optional()
-      | ref(declaredIdentifier) & ref(IN) & ref(expression)
-      | ref(identifier) & ref(IN) & ref(expression)
-      ;
-
-  forInitializerStatement() =>
-        ref(initializedVariableDeclaration) & ref(token, ';')
-      | ref(expression).optional() & ref(token, ';')
-      ;
-
-  selectionStatement() =>
-        ref(IF) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(statement) & (ref(ELSE) & ref(statement)).optional()
-      | ref(SWITCH) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(token, '{') & ref(switchCase).star() & ref(defaultCase).optional() & ref(token, '}')
-      ;
-
-  switchCase() =>
-        ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).plus() & ref(statements)
-      ;
-
-  defaultCase() =>
-        ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).star() & ref(DEFAULT) & ref(token, ':') & ref(statements)
-      ;
-
-  tryStatement() =>
-        ref(TRY) & ref(block) & (ref(catchPart).plus() & ref(finallyPart).optional() | ref(finallyPart))
-      ;
-
-  catchPart() =>
-        ref(CATCH) & ref(token, '(') & ref(declaredIdentifier) & (ref(token, ',') & ref(declaredIdentifier)).optional() & ref(token, ')') & ref(block)
-      ;
-
-  finallyPart() =>
-        ref(FINALLY) & ref(block)
-      ;
-
-  variableDeclaration() =>
-        ref(declaredIdentifier) & (ref(token, ',') & ref(identifier)).star()
-      ;
-
-  initializedVariableDeclaration() =>
-        ref(declaredIdentifier) & (ref(token, '=') & ref(expression)).optional() & (ref(token, ',') & ref(initializedIdentifier)).star()
-      ;
-
-  initializedIdentifierList() =>
-        ref(initializedIdentifier) & (ref(token, ',') & ref(initializedIdentifier)).star()
-      ;
-
-  initializedIdentifier() =>
-        ref(identifier) & (ref(token, '=') & ref(expression)).optional()
-      ;
-
-  constInitializedVariableDeclaration() =>
-        ref(declaredIdentifier) & (ref(token, '=') & ref(constantExpression)).optional() &
-        (ref(token, ',') & ref(constInitializedIdentifier)).star()
-      ;
-
-  constInitializedIdentifier() =>
-        ref(identifier) & (ref(token, '=') & ref(constantExpression)).optional()
-      ;
-
-  // The constant expression production is used to mark certain expressions
-  // as only being allowed to hold a compile-time constant. The grammar cannot
-  // express these restrictions (yet), so this will have to be enforced by a
-  // separate analysis phase.
-  constantExpression() =>
-        ref(expression)
-      ;
-
-  expression() =>
-        ref(assignableExpression) & ref(assignmentOperator) & ref(expression)
-      | ref(conditionalExpression)
-      ;
-
-  expressionList() =>
-        ref(expression) & (ref(token, ',') & ref(expression)).star()
-      ;
-
-  arguments() =>
-        ref(token, '(') & ref(argumentList).optional() & ref(token, ')')
-      ;
-
-  argumentList() =>
-        ref(namedArgument) & (ref(token, ',') & ref(namedArgument)).star()
-      | ref(expressionList) & (ref(token, ',') & ref(namedArgument)).star()
-      ;
-
-  namedArgument() =>
-        ref(label) & ref(expression)
-      ;
-
-  assignableExpression() =>
-        ref(primary) & (ref(arguments).star() & ref(assignableSelector)).plus()
-      | ref(SUPER) & ref(assignableSelector)
-      | ref(identifier)
-      ;
-
-  conditionalExpression() =>
-        ref(logicalOrExpression) & (ref(token, '?') & ref(expression) & ref(token, ':') & ref(expression)).optional()
-      ;
-
-  logicalOrExpression() =>
-        ref(logicalAndExpression) & (ref(token, '||') & ref(logicalAndExpression)).star()
-      ;
-
-  logicalAndExpression() =>
-        ref(bitwiseOrExpression) & (ref(token, '&&') & ref(bitwiseOrExpression)).star()
-      ;
-
-  bitwiseOrExpression() =>
-        ref(bitwiseXorExpression) & (ref(token, '|') & ref(bitwiseXorExpression)).star()
-      | ref(SUPER) & (ref(token, '|') & ref(bitwiseXorExpression)).plus()
-      ;
-
-  bitwiseXorExpression() =>
-        ref(bitwiseAndExpression) & (ref(token, '^') & ref(bitwiseAndExpression)).star()
-      | ref(SUPER) & (ref(token, '^') & ref(bitwiseAndExpression)).plus()
-      ;
-
-  bitwiseAndExpression() =>
-        ref(equalityExpression) & (ref(token, '&') & ref(equalityExpression)).star()
-      | ref(SUPER) & (ref(token, '&') & ref(equalityExpression)).plus()
-      ;
-
-  equalityExpression() =>
-        ref(relationalExpression) & (ref(equalityOperator) & ref(relationalExpression)).optional()
-      | ref(SUPER) & ref(equalityOperator) & ref(relationalExpression)
-      ;
-
-  relationalExpression() =>
-        ref(shiftExpression) & (ref(isOperator) & ref(type) | ref(relationalOperator) & ref(shiftExpression)).optional()
-      | ref(SUPER) & ref(relationalOperator) & ref(shiftExpression)
-      ;
-
-  isOperator() =>
-        ref(IS) & ref(token, '!').optional()
-      ;
-
-  shiftExpression() =>
-        ref(additiveExpression) & (ref(shiftOperator) & ref(additiveExpression)).star()
-      | ref(SUPER) & (ref(shiftOperator) & ref(additiveExpression)).plus()
-      ;
-
-  additiveExpression() =>
-        ref(multiplicativeExpression) & (ref(additiveOperator) & ref(multiplicativeExpression)).star()
-      | ref(SUPER) & (ref(additiveOperator) & ref(multiplicativeExpression)).plus()
-      ;
-
-  multiplicativeExpression() =>
-        ref(unaryExpression) & (ref(multiplicativeOperator) & ref(unaryExpression)).star()
-      | ref(SUPER) & (ref(multiplicativeOperator) & ref(unaryExpression)).plus()
-      ;
-
-  unaryExpression() =>
-        ref(postfixExpression)
-      | ref(prefixOperator) & ref(unaryExpression)
-      | ref(negateOperator) & ref(SUPER)
-      | ref(token, '-') & ref(SUPER)
-      | ref(incrementOperator) & ref(assignableExpression)
-      ;
-
-  postfixExpression() =>
-        ref(assignableExpression) & ref(postfixOperator)
-      | ref(primary) & ref(selector).star()
-      ;
-
-  selector() =>
-        ref(assignableSelector)
-      | ref(arguments)
-      ;
-
-  assignableSelector() =>
-        ref(token, '[') & ref(expression) & ref(token, ']')
-      | ref(token, '.') & ref(identifier)
-      ;
-
-  primary() =>
-        ref(primaryNoFE)
-      | ref(primaryFE)
-      ;
-
-  primaryFE() =>
-        ref(functionExpression)
-      | ref(primaryNoFE)
-      ;
-
-  primaryNoFE() =>
-        ref(THIS)
-      | ref(SUPER) & ref(assignableSelector)
-      | ref(literal)
-      | ref(identifier)
-      | ref(CONST).optional() & ref(typeArguments).optional() & ref(compoundLiteral)
-      | (ref(NEW) | ref(CONST)) & ref(type) & (ref(token, '.') & ref(identifier)).optional() & ref(arguments)
-      | ref(expressionInParentheses)
-      ;
-
-  expressionInParentheses() =>
-        ref(token, '(') & ref(expression) & ref(token, ')')
-      ;
-
-  literal() => ref(token,
-        ref(NULL)
-      | ref(TRUE)
-      | ref(FALSE)
-      | ref(HEX_NUMBER)
-      | ref(NUMBER)
-      | ref(STRING))
-      ;
-
-  compoundLiteral() =>
-        ref(listLiteral)
-      | ref(mapLiteral)
-      ;
-
-  listLiteral() =>
-        ref(token, '[') & (ref(expressionList) & ref(token, ',').optional()).optional() & ref(token, ']')
-      ;
-
-  mapLiteral() =>
-        ref(token, '{') & (ref(mapLiteralEntry) & (ref(token, ',') & ref(mapLiteralEntry)).star() & ref(token, ',').optional()).optional() & ref(token, '}')
-      ;
-
-  mapLiteralEntry() =>
-        ref(token, STRING) & ref(token, ':') & ref(expression)
-      ;
-
-  functionExpression() =>
-        (ref(returnType).optional() & ref(identifier)).optional() & ref(formalParameterList) & ref(functionExpressionBody)
-      ;
-
-  functionDeclaration() =>
-        ref(returnType).optional() & ref(identifier) & ref(formalParameterList)
-      ;
-
-  functionPrefix() =>
-        ref(returnType).optional() & ref(identifier)
-      ;
-
-  functionBody() =>
-        ref(token, '=>') & ref(expression) & ref(token, ';')
-      | ref(block)
-      ;
-
-  functionExpressionBody() =>
-        ref(token, '=>') & ref(expression)
-      | ref(block)
-      ;
-
-  // -----------------------------------------------------------------
-  // Library files.
-  // -----------------------------------------------------------------
-  libraryUnit() =>
-        ref(libraryDefinition).end()
-      ;
-
-  libraryDefinition() =>
-        ref(LIBRARY) & ref(token, '{') & ref(libraryBody) & ref(token, '}')
-      ;
-
-  libraryBody() =>
-        ref(libraryImport).optional() & ref(librarySource).optional()
-      ;
-
-  libraryImport() =>
-        ref(IMPORT) & ref(token, '=') & ref(token, '[') & ref(importReferences).optional() & ref(token, ']')
-      ;
-
-  importReferences() =>
-        ref(importReference) & (ref(token, ',') & ref(importReference)).star() & ref(token, ',').optional()
-      ;
-
-  importReference() =>
-        (ref(token, IDENTIFIER) & ref(token, ':')).optional() & ref(token, STRING)
-      ;
-
-  librarySource() =>
-        ref(SOURCE) & ref(token, '=') & ref(token, '[') & ref(sourceUrls).optional() & ref(token, ']')
-      ;
-
-  sourceUrls() =>
-        ref(token, STRING) & (ref(token, ',') & ref(token, STRING)).star() & ref(token, ',').optional()
-      ;
-
-
-  // -----------------------------------------------------------------
-  // Lexical tokens.
-  // -----------------------------------------------------------------
-  IDENTIFIER_NO_DOLLAR() =>
-        ref(IDENTIFIER_START_NO_DOLLAR) & ref(IDENTIFIER_PART_NO_DOLLAR).star()
-      ;
-
-  IDENTIFIER() =>
-        ref(IDENTIFIER_START) & ref(IDENTIFIER_PART).star()
-      ;
-
-  HEX_NUMBER() =>
-        string('0x') & ref(HEX_DIGIT).plus()
-      | string('0X') & ref(HEX_DIGIT).plus()
-      ;
-
-  NUMBER() =>
-        ref(DIGIT).plus() & ref(NUMBER_OPT_FRACTIONAL_PART) & ref(EXPONENT).optional() & ref(NUMBER_OPT_ILLEGAL_END)
-      | char('.') & ref(DIGIT).plus() & ref(EXPONENT).optional() & ref(NUMBER_OPT_ILLEGAL_END)
-      ;
-
-  NUMBER_OPT_FRACTIONAL_PART() =>
-        char('.') & ref(DIGIT).plus()
-      | epsilon()
-      ;
-
-  NUMBER_OPT_ILLEGAL_END() => epsilon();
-//        ref(IDENTIFIER_START).end()
-//      | epsilon()
-//      ;
-
-  HEX_DIGIT() => pattern('0-9a-fA-F');
-
-  IDENTIFIER_START() => ref(IDENTIFIER_START_NO_DOLLAR) | char('\$');
-
-  IDENTIFIER_START_NO_DOLLAR() => ref(LETTER) | char('_');
-
-  IDENTIFIER_PART_NO_DOLLAR() => ref(IDENTIFIER_START_NO_DOLLAR) | ref(DIGIT);
-
-  IDENTIFIER_PART() => ref(IDENTIFIER_START) | ref(DIGIT);
-
-  LETTER() => letter();
-
-  DIGIT() => digit();
-
-  EXPONENT() => pattern('eE') & pattern('+-').optional() & ref(DIGIT).plus();
-
-  STRING() =>
-        char('@').optional() & ref(MULTI_LINE_STRING)
-      | ref(SINGLE_LINE_STRING)
-      ;
-
-  MULTI_LINE_STRING() =>
-        string('"""') & any().starLazy(string('"""')) & string('"""')
-      | string("'''") & any().starLazy(string("'''")) & string("'''")
-      ;
-
-  SINGLE_LINE_STRING() =>
-        char('"') & ref(STRING_CONTENT_DQ).star() & char('"')
-      | char("'") & ref(STRING_CONTENT_SQ).star() & char("'")
-      | string('@"') & pattern('^"\n\r').star() & char('"')
-      | string("@'") & pattern("^'\n\r").star() & char("'")
-      ;
-
-  STRING_CONTENT_DQ() =>
-        pattern('^\\"\n\r')
-      | char('\\') & pattern('\n\r')
-      ;
-
-  STRING_CONTENT_SQ() =>
-        pattern("^\\'\n\r")
-      | char('\\') & pattern('\n\r')
-      ;
-
-  NEWLINE() => pattern('\n\r');
-
-  HASHBANG() => string('#!') & pattern('^\n\r').star() & ref(NEWLINE).optional();
-
-
-  // -----------------------------------------------------------------
-  // Whitespace and comments.
-  // -----------------------------------------------------------------
-  HIDDEN() => ref(HIDDEN_STUFF).plus();
-
-  HIDDEN_STUFF() => ref(WHITESPACE)
-      | ref(SINGLE_LINE_COMMENT)
-      | ref(MULTI_LINE_COMMENT)
-      ;
-
-  WHITESPACE() => whitespace();
-
-  SINGLE_LINE_COMMENT() => string('//')
-      & ref(NEWLINE).neg().star()
-      & ref(NEWLINE).optional()
-      ;
-
-  MULTI_LINE_COMMENT() => string('/*')
-      & (ref(MULTI_LINE_COMMENT) | string('*/').neg()).star() & string('*/')
-      ;
-
-}
diff --git a/packages/petitparser/lib/src/debug/continuation.dart b/packages/petitparser/lib/src/debug/continuation.dart
deleted file mode 100644
index b673bd9..0000000
--- a/packages/petitparser/lib/src/debug/continuation.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-part of petitparser.debug;
-
-/// Handler function for the [ContinuationParser].
-typedef Result ContinuationHandler(
-    Result continuation(Context context), Context context);
-
-/// Continuation parser that when activated captures a continuation function
-/// and passes it together with the current context into the handler.
-///
-/// Handlers are not required to call the continuation, but can completely ignore
-/// it, call it multiple times, and/or store it away for later use. Similarly
-/// handlers can modify the current context and/or modify the returned result.
-///
-/// The following example shows a simple wrapper. Messages are printed before and
-/// after the `digit()` parser is activated:
-///
-///     var wrapped = digit();
-///     var parser = new ContinuationParser(wrapped, (continuation, context) {
-///       print('Parser will be activated, the context is $context.');
-///       var result = continuation(context);
-///       print('Parser was activated, the result is $result.');
-///       return result;
-///     });
-///
-/// See [profile], [progress], and [trace] for more elaborate examples.
-class ContinuationParser extends DelegateParser {
-  final ContinuationHandler handler;
-
-  ContinuationParser(parser, this.handler) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    return handler((result) => super.parseOn(result), context);
-  }
-
-  @override
-  Parser copy() => new ContinuationParser(children[0], handler);
-}
diff --git a/packages/petitparser/lib/src/debug/profile.dart b/packages/petitparser/lib/src/debug/profile.dart
deleted file mode 100644
index b4e4424..0000000
--- a/packages/petitparser/lib/src/debug/profile.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-part of petitparser.debug;
-
-/// Returns a transformed [parser] that when being used measures
-/// the activation count and total time of each parser.
-///
-/// For example, the snippet
-///
-///     var parser = letter() & word().star();
-///     profile(parser).parse('f1234567890');
-///
-/// produces the following output:
-///
-///      1  2006  Instance of 'SequenceParser'
-///      1   697  Instance of 'PossessiveRepeatingParser'[0..*]
-///     11   406  Instance of 'CharacterParser'[letter or digit expected]
-///      1   947  Instance of 'CharacterParser'[letter expected]
-///
-/// The first number refers to the number of activations of each parser, and
-/// the second number is the microseconds spent in this parser and all its
-/// children.
-Parser profile(Parser root, [OutputHandler output = print]) {
-  var count = new Map();
-  var watch = new Map();
-  var parsers = new List();
-  return new ContinuationParser(transformParser(root, (parser) {
-    parsers.add(parser);
-    return new ContinuationParser(parser, (continuation, context) {
-      count[parser]++;
-      watch[parser].start();
-      var result = continuation(context);
-      watch[parser].stop();
-      return result;
-    });
-  }), (continuation, context) {
-    parsers.forEach((parser) {
-      count[parser] = 0;
-      watch[parser] = new Stopwatch();
-    });
-    var result = continuation(context);
-    parsers.forEach((parser) {
-      output('${count[parser]}\t'
-          '${watch[parser].elapsedMicroseconds}\t'
-          '$parser');
-    });
-    return result;
-  });
-}
diff --git a/packages/petitparser/lib/src/debug/progress.dart b/packages/petitparser/lib/src/debug/progress.dart
deleted file mode 100644
index 022e085..0000000
--- a/packages/petitparser/lib/src/debug/progress.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-part of petitparser.debug;
-
-/// Returns a transformed [parser] that when being used to read input
-/// visually prints its progress while progressing.
-///
-/// For example, the snippet
-///
-///     var parser = letter() & word().star();
-///     progress(parser).parse('f123');
-///
-/// produces the following output:
-///
-///     * Instance of 'SequenceParser'
-///     * Instance of 'CharacterParser'[letter expected]
-///     ** Instance of 'PossessiveRepeatingParser'[0..*]
-///     ** Instance of 'CharacterParser'[letter or digit expected]
-///     *** Instance of 'CharacterParser'[letter or digit expected]
-///     **** Instance of 'CharacterParser'[letter or digit expected]
-///     ***** Instance of 'CharacterParser'[letter or digit expected]
-///
-/// Jumps backwards mean that the parser is back-tracking. Often choices can
-/// be reordered to such expensive parses.
-Parser progress(Parser parser, [OutputHandler output = print]) {
-  return transformParser(parser, (each) {
-    return new ContinuationParser(each, (continuation, context) {
-      output('${_repeat(1 + context.position, '*')} $each');
-      return continuation(context);
-    });
-  });
-}
diff --git a/packages/petitparser/lib/src/debug/trace.dart b/packages/petitparser/lib/src/debug/trace.dart
deleted file mode 100644
index d47deb8..0000000
--- a/packages/petitparser/lib/src/debug/trace.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-part of petitparser.debug;
-
-/// Returns a transformed [parser] that when being used to read input prints a
-/// trace of all activated parsers and their respective parse results.
-///
-/// For example, the snippet
-///
-///     var parser = letter() & word().star();
-///     trace(parser).parse('f1');
-///
-/// produces the following output:
-///
-///     Instance of 'SequenceParser'
-///       Instance of 'CharacterParser'[letter expected]
-///       Success[1:2]: f
-///       Instance of 'PossessiveRepeatingParser'[0..*]
-///         Instance of 'CharacterParser'[letter or digit expected]
-///         Success[1:3]: 1
-///         Instance of 'CharacterParser'[letter or digit expected]
-///         Failure[1:3]: letter or digit expected
-///       Success[1:3]: [1]
-///     Success[1:3]: [f, [1]]
-///
-/// Indentation signifies the activation of a parser object. Reverse indentation
-/// signifies the returning of a parse result either with a success or failure
-/// context.
-Parser trace(Parser parser, [OutputHandler output = print]) {
-  var level = 0;
-  return transformParser(parser, (each) {
-    return new ContinuationParser(each, (continuation, context) {
-      output('${_repeat(level, '  ')}$each');
-      level++;
-      var result = continuation(context);
-      level--;
-      output('${_repeat(level, '  ')}$result');
-      return result;
-    });
-  });
-}
diff --git a/packages/petitparser/lib/src/json/grammar.dart b/packages/petitparser/lib/src/json/grammar.dart
deleted file mode 100644
index ba76150..0000000
--- a/packages/petitparser/lib/src/json/grammar.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-part of petitparser.json;
-
-/// JSON grammar.
-class JsonGrammar extends GrammarParser {
-  JsonGrammar() : super(const JsonGrammarDefinition());
-}
-
-/// JSON grammar definition.
-class JsonGrammarDefinition extends GrammarDefinition {
-  const JsonGrammarDefinition();
-
-  start() => ref(value).end();
-  token(p) => p.flatten().trim();
-
-  array() => ref(token, char('['))
-      & ref(elements).optional()
-      & ref(token, char(']'));
-  elements() => ref(value).separatedBy(ref(token, char(',')), includeSeparators: false);
-  members() => ref(pair).separatedBy(ref(token, char(',')), includeSeparators: false);
-  object() => ref(token, char('{'))
-      & ref(members).optional()
-      & ref(token, char('}'));
-  pair() => ref(stringToken)
-      & ref(token, char(':'))
-      & ref(value);
-  value() => ref(stringToken)
-      | ref(numberToken)
-      | ref(object)
-      | ref(array)
-      | ref(trueToken)
-      | ref(falseToken)
-      | ref(nullToken);
-
-  trueToken() => ref(token, string('true'));
-  falseToken() => ref(token, string('false'));
-  nullToken() => ref(token, string('null'));
-  stringToken() => ref(token, ref(stringPrimitive));
-  numberToken() => ref(token, ref(numberPrimitive));
-
-  characterPrimitive() => ref(characterNormal)
-      | ref(characterEscape)
-      | ref(characterUnicode);
-  characterNormal() => pattern('^"\\');
-  characterEscape() => char('\\')
-      & pattern(new List.from(jsonEscapeChars.keys).join());
-  characterUnicode() => string('\\u')
-      & pattern("0-9A-Fa-f").times(4);
-  numberPrimitive() => char('-').optional()
-      & char('0').or(digit().plus())
-      & char('.').seq(digit().plus()).optional()
-      & pattern('eE').seq(pattern('-+').optional()).seq(digit().plus()).optional();
-  stringPrimitive() => char('"')
-      & ref(characterPrimitive).star()
-      & char('"');
-
-}
-
-const jsonEscapeChars = const {
-  '\\': '\\',
-  '/': '/',
-  '"': '"',
-  'b': '\b',
-  'f': '\f',
-  'n': '\n',
-  'r': '\r',
-  't': '\t'
-};
diff --git a/packages/petitparser/lib/src/json/parser.dart b/packages/petitparser/lib/src/json/parser.dart
deleted file mode 100644
index e1647cb..0000000
--- a/packages/petitparser/lib/src/json/parser.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-part of petitparser.json;
-
-/// JSON parser.
-class JsonParser extends GrammarParser {
-  JsonParser() : super(const JsonParserDefinition());
-}
-
-/// JSON parser definition.
-class JsonParserDefinition extends JsonGrammarDefinition {
-  const JsonParserDefinition();
-
-  array() => super.array().map((each) => each[1] != null ? each[1] : new List());
-  object() => super.object().map((each) {
-    var result = new LinkedHashMap();
-    if (each[1] != null) {
-      for (var element in each[1]) {
-        result[element[0]] = element[2];
-      }
-    }
-    return result;
-  });
-
-  trueToken() => super.trueToken().map((each) => true);
-  falseToken() => super.falseToken().map((each) => false);
-  nullToken() => super.nullToken().map((each) => null);
-  stringToken() => ref(stringPrimitive).trim();
-  numberToken() => super.numberToken().map((each) {
-    var floating = double.parse(each);
-    var integral = floating.toInt();
-    if (floating == integral && each.indexOf('.') == -1) {
-      return integral;
-    } else {
-      return floating;
-    }
-  });
-
-  stringPrimitive() => super.stringPrimitive().map((each) => each[1].join());
-  characterEscape() => super.characterEscape().map((each) => jsonEscapeChars[each[1]]);
-  characterUnicode() => super.characterUnicode().map((each) {
-    var charCode = int.parse(each[1].join(), radix: 16);
-    return new String.fromCharCode(charCode);
-  });
-}
diff --git a/packages/petitparser/lib/src/lisp/cons.dart b/packages/petitparser/lib/src/lisp/cons.dart
deleted file mode 100644
index e9fcae7..0000000
--- a/packages/petitparser/lib/src/lisp/cons.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-part of petitparser.lisp;
-
-/// The basic data structure of LISP.
-class Cons {
-
-  /// The head of the cons.
-  dynamic head;
-
-  /// The tail of the cons.
-  dynamic tail;
-
-  /// Constructs a cons.
-  Cons(this.head, this.tail);
-
-  @override
-  bool operator ==(other) {
-    return other is Cons && head == other.head && tail == other.tail;
-  }
-
-  @override
-  int get hashCode => 31 * head.hashCode + tail.hashCode;
-
-  @override
-  String toString() {
-    var buffer = new StringBuffer();
-    buffer.write('(');
-    var current = this;
-    while (current is Cons) {
-      buffer.write(current.head.toString());
-      current = current.tail;
-      if (current != null) {
-        buffer.write(' ');
-      }
-    }
-    if (current != null) {
-      buffer.write('. ');
-      buffer.write(current);
-    }
-    buffer.write(')');
-    return buffer.toString();
-  }
-}
diff --git a/packages/petitparser/lib/src/lisp/environment.dart b/packages/petitparser/lib/src/lisp/environment.dart
deleted file mode 100644
index 579d4b9..0000000
--- a/packages/petitparser/lib/src/lisp/environment.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-part of petitparser.lisp;
-
-/// Environment of bindings.
-class Environment {
-
-  /// The owning environment.
-  final Environment _owner;
-
-  /// The internal environment bindings.
-  final Map<Name, dynamic> _bindings;
-
-  /// Constructor for the nested environment.
-  Environment([this._owner]) : _bindings = new Map();
-
-  /// Constructor for a nested environment.
-  Environment create() => new Environment(this);
-
-  /// Return the binding for [key].
-  operator [](Name key) {
-    if (_bindings.containsKey(key)) {
-      return _bindings[key];
-    } else if (_owner != null) {
-      return _owner[key];
-    } else {
-      return _invalidBinding(key);
-    }
-  }
-
-  /// Updates the binding for [key] with a [value].
-  void operator []=(Name key, value) {
-    if (_bindings.containsKey(key)) {
-      _bindings[key] = value;
-    } else if (_owner != null) {
-      _owner[key] = value;
-    } else {
-      _invalidBinding(key);
-    }
-  }
-
-  /// Defines a new binding from [key] to [value].
-  define(Name key, value) {
-    return _bindings[key] = value;
-  }
-
-  /// Returns the keys of the bindings.
-  Iterable<Name> get keys => _bindings.keys;
-
-  /// Returns the parent of the bindings.
-  Environment get owner => _owner;
-
-  /// Called when a missing binding is accessed.
-  _invalidBinding(Name key) {
-    throw new ArgumentError('Unknown binding for $key');
-  }
-}
diff --git a/packages/petitparser/lib/src/lisp/grammar.dart b/packages/petitparser/lib/src/lisp/grammar.dart
deleted file mode 100644
index 8e53646..0000000
--- a/packages/petitparser/lib/src/lisp/grammar.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-part of petitparser.lisp;
-
-/// LISP grammar.
-class LispGrammar extends GrammarParser {
-  LispGrammar() : super(new LispGrammarDefinition());
-}
-
-/// LISP grammar definition.
-class LispGrammarDefinition extends GrammarDefinition {
-
-  start() => ref(atom).star().end();
-
-  atom() => ref(atom_).trim(ref(space));
-  atom_() => ref(list)
-      | ref(number)
-      | ref(string)
-      | ref(symbol)
-      | ref(quote)
-      | ref(quasiquote)
-      | ref(unquote)
-      | ref(splice);
-
-  list() => ref(bracket, '()', ref(cells))
-      | ref(bracket, '[]', ref(cells))
-      | ref(bracket, '{}', ref(cells));
-  cells() => ref(cell)
-      | ref(empty);
-  cell() => ref(atom) & ref(cells);
-  empty() => ref(space).star();
-
-  number() => ref(number_).flatten();
-  number_() => anyIn('-+').optional()
-      & char('0').or(digit().plus())
-      & char('.').seq(digit().plus()).optional()
-      & anyIn('eE').seq(anyIn('-+').optional()).seq(digit().plus()).optional();
-
-  string() => ref(bracket, '""', ref(character).star());
-  character() => ref(characterEscape) | ref(characterRaw);
-  characterEscape() => char('\\') & any();
-  characterRaw() => pattern('^"');
-
-  symbol() => ref(symbol_).flatten();
-  symbol_() => pattern('a-zA-Z!#\$%&*/:<=>?@\\^_|~+-')
-      & pattern('a-zA-Z0-9!#\$%&*/:<=>?@\\^_|~+-').star();
-
-  quote() => char('\'') & ref(list);
-  quasiquote() => char('`') & ref(list);
-  unquote() => char(',') & ref(list);
-  splice() => char('@') & ref(list);
-
-  space() => whitespace() | ref(comment);
-  comment() => char(';') & Token.newlineParser().neg().star();
-  bracket(String brackets, Parser parser) => char(brackets[0]) & parser & char(brackets[1]);
-
-}
diff --git a/packages/petitparser/lib/src/lisp/name.dart b/packages/petitparser/lib/src/lisp/name.dart
deleted file mode 100644
index d07482a..0000000
--- a/packages/petitparser/lib/src/lisp/name.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-part of petitparser.lisp;
-
-/// An unique symbolic name.
-class Name {
-
-  /// The interned symbols.
-  static final Map<String, Name> _interned = new HashMap();
-
-  /// Factory for new symbol cells.
-  factory Name(String name) {
-    return _interned.putIfAbsent(name, () => new Name._internal(name));
-  }
-
-  /// The name of the symbol.
-  final String _name;
-
-  /// Internal constructor for symbol.
-  Name._internal(this._name);
-
-  /// Returns the string representation of the symbolic name.
-  String toString() => _name;
-}
diff --git a/packages/petitparser/lib/src/lisp/natives.dart b/packages/petitparser/lib/src/lisp/natives.dart
deleted file mode 100644
index 0b8551e..0000000
--- a/packages/petitparser/lib/src/lisp/natives.dart
+++ /dev/null
@@ -1,254 +0,0 @@
-part of petitparser.lisp;
-
-/// The native functions.
-class Natives {
-
-  /// Imports the native functions into the [environment].
-  static Environment import(Environment environment) {
-
-    // basic functions
-    environment.define(new Name('define'), _define);
-    environment.define(new Name('lambda'), _lambda);
-    environment.define(new Name('quote'), _quote);
-    environment.define(new Name('eval'), _eval);
-    environment.define(new Name('apply'), _apply);
-    environment.define(new Name('let'), _let);
-    environment.define(new Name('set!'), _set);
-    environment.define(new Name('print'), _print);
-
-    // control structures
-    environment.define(new Name('if'), _if);
-    environment.define(new Name('while'), _while);
-    environment.define(new Name('and'), _and);
-    environment.define(new Name('or'), _or);
-    environment.define(new Name('not'), _not);
-
-    // arithmetic operators
-    environment.define(new Name('+'), _plus);
-    environment.define(new Name('-'), _minus);
-    environment.define(new Name('*'), _multiply);
-    environment.define(new Name('/'), _divide);
-    environment.define(new Name('%'), _modulo);
-
-    // arithmetic comparators
-    environment.define(new Name('<'), _smaller);
-    environment.define(new Name('<='), _smallerOrEqual);
-    environment.define(new Name('='), _equal);
-    environment.define(new Name('!='), _notEqual);
-    environment.define(new Name('>'), _larger);
-    environment.define(new Name('>='), _largerOrEqual);
-
-    // list operators
-    environment.define(new Name('cons'), _cons);
-    environment.define(new Name('car'), _car);
-    environment.define(new Name('car!'), _carSet);
-    environment.define(new Name('cdr'), _cdr);
-    environment.define(new Name('cdr!'), _cdrSet);
-
-    return environment;
-  }
-
-  static _define(Environment env, args) {
-    if (args.head is Name) {
-      return env.define(args.head, evalList(env, args.tail));
-    } else if (args.head.head is Name) {
-      return env.define(
-          args.head.head, _lambda(env, new Cons(args.head.tail, args.tail)));
-    } else {
-      throw new ArgumentError('Invalid define: $args');
-    }
-  }
-
-  static _lambda(Environment lambdaEnv, lambdaArgs) {
-    return (Environment evalEnv, evalArgs) {
-      var inner = lambdaEnv.create();
-      var names = lambdaArgs.head;
-      var values = evalArguments(evalEnv, evalArgs);
-      while (names != null && values != null) {
-        inner.define(names.head, values.head);
-        names = names.tail;
-        values = values.tail;
-      }
-      return evalList(inner, lambdaArgs.tail);
-    };
-  }
-
-  static _quote(Environment env, args) {
-    return args;
-  }
-
-  static _eval(Environment env, args) {
-    return eval(env.create(), eval(env, args.head));
-  }
-
-  static _apply(Environment env, args) {
-    return eval(env, args.head)(env.create(), args.tail);
-  }
-
-  static _let(Environment env, args) {
-    var inner = env.create();
-    var binding = args.head;
-    while (binding != null) {
-      inner.define(binding.head.head, eval(env, binding.head.tail.head));
-      binding = binding.tail;
-    }
-    return evalList(inner, args.tail);
-  }
-
-  static _set(Environment env, args) {
-    return env[args.head] = eval(env, args.tail.head);
-  }
-
-  static _print(Environment env, args) {
-    var buffer = new StringBuffer();
-    while (args != null) {
-      buffer.write(eval(env, args.head));
-      args = args.tail;
-    }
-    print(buffer);
-    return null;
-  }
-
-  static _if(Environment env, args) {
-    var condition = eval(env, args.head);
-    if (condition) {
-      if (args.tail != null) {
-        return eval(env, args.tail.head);
-      }
-    } else {
-      if (args.tail != null && args.tail.tail != null) {
-        return eval(env, args.tail.tail.head);
-      }
-    }
-    return null;
-  }
-
-  static _while(Environment env, args) {
-    var result = null;
-    while (eval(env, args.head)) {
-      result = evalList(env, args.tail);
-    }
-    return result;
-  }
-
-  static _and(Environment env, args) {
-    while (args != null) {
-      if (!eval(env, args.head)) {
-        return false;
-      }
-      args = args.tail;
-    }
-    return true;
-  }
-
-  static _or(Environment env, args) {
-    while (args != null) {
-      if (eval(env, args.head)) {
-        return true;
-      }
-      args = args.tail;
-    }
-    return false;
-  }
-
-  static _not(Environment env, args) {
-    return !eval(env, args.head);
-  }
-
-  static _plus(Environment env, args) {
-    var value = eval(env, args.head);
-    for (args = args.tail; args != null; args = args.tail) {
-      value += eval(env, args.head);
-    }
-    return value;
-  }
-
-  static _minus(Environment env, args) {
-    var value = eval(env, args.head);
-    if (args.tail == null) {
-      return -value;
-    }
-    for (args = args.tail; args != null; args = args.tail) {
-      value -= eval(env, args.head);
-    }
-    return value;
-  }
-
-  static _multiply(Environment env, args) {
-    var value = eval(env, args.head);
-    for (args = args.tail; args != null; args = args.tail) {
-      value *= eval(env, args.head);
-    }
-    return value;
-  }
-
-  static _divide(Environment env, args) {
-    var value = eval(env, args.head);
-    for (args = args.tail; args != null; args = args.tail) {
-      value /= eval(env, args.head);
-    }
-    return value;
-  }
-
-  static _modulo(Environment env, args) {
-    var value = eval(env, args.head);
-    for (args = args.tail; args != null; args = args.tail) {
-      value %= eval(env, args.head);
-    }
-    return value;
-  }
-
-  static _smaller(Environment env, args) {
-    return eval(env, args.head) < eval(env, args.tail.head);
-  }
-
-  static _smallerOrEqual(Environment env, args) {
-    return eval(env, args.head) <= eval(env, args.tail.head);
-  }
-
-  static _equal(Environment env, args) {
-    return eval(env, args.head) == eval(env, args.tail.head);
-  }
-
-  static _notEqual(Environment env, args) {
-    return eval(env, args.head) != eval(env, args.tail.head);
-  }
-
-  static _larger(Environment env, args) {
-    return eval(env, args.head) > eval(env, args.tail.head);
-  }
-
-  static _largerOrEqual(Environment env, args) {
-    return eval(env, args.head) >= eval(env, args.tail.head);
-  }
-
-  static _cons(Environment env, args) {
-    return new Cons(eval(env, args.head), eval(env, args.tail.head));
-  }
-
-  static _car(Environment env, args) {
-    var cons = eval(env, args.head);
-    return cons is Cons ? cons.head : null;
-  }
-
-  static _carSet(Environment env, args) {
-    var cons = eval(env, args.head);
-    if (cons is Cons) {
-      cons.head = eval(env, args.tail.head);
-    }
-    return cons;
-  }
-
-  static _cdr(Environment env, args) {
-    var cons = eval(env, args.head);
-    return cons is Cons ? cons.tail : null;
-  }
-
-  static _cdrSet(Environment env, args) {
-    var cons = eval(env, args.head);
-    if (cons is Cons) {
-      cons.tail = eval(env, args.tail.head);
-    }
-    return cons;
-  }
-}
diff --git a/packages/petitparser/lib/src/lisp/parser.dart b/packages/petitparser/lib/src/lisp/parser.dart
deleted file mode 100644
index a14c291..0000000
--- a/packages/petitparser/lib/src/lisp/parser.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-part of petitparser.lisp;
-
-/// LISP parser.
-class LispParser extends GrammarParser {
-  LispParser() : super(new LispParserDefinition());
-}
-
-/// LISP parser definition.
-class LispParserDefinition extends LispGrammarDefinition {
-
-  list() => super.list().map((each) => each[1]);
-
-  cell() => super.cell().map((each) => new Cons(each[0], each[1]));
-  empty() => super.empty().map((each) => null);
-
-  string() => super.string().map((each) => new String.fromCharCodes(each[1]));
-  characterEscape() => super.characterEscape().map((each) => each[1].codeUnitAt(0));
-  characterRaw() => super.characterRaw().map((each) => each.codeUnitAt(0));
-
-  symbol() => super.symbol().map((each) => new Name(each));
-  number() => super.number().map((each) {
-    var floating = double.parse(each);
-    var integral = floating.toInt();
-    if (floating == integral && each.indexOf('.') == -1) {
-      return integral;
-    } else {
-      return floating;
-    }
-  });
-
-  quote() => super.quote().map((each) => new Cons(Natives._quote, each[1]));
-
-}
diff --git a/packages/petitparser/lib/src/lisp/standard.dart b/packages/petitparser/lib/src/lisp/standard.dart
deleted file mode 100644
index 8044d62..0000000
--- a/packages/petitparser/lib/src/lisp/standard.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-part of petitparser.lisp;
-
-/// The standard library.
-class Standard {
-
-  /// Imports the standard library into the [environment].
-  static Environment import(Environment environment) {
-    evalString(lispParser, environment, _standardLibrary);
-    return environment;
-  }
-
-  /// A simple standard library, should be moved to external file.
-  static String _standardLibrary = """
-; null functions
-(define null '())
-(define (null? x) (= '() x))
-
-; booleans
-(define true (and))
-(define false (or))
-
-; list functions
-(define (length list)
-  (if (null? list)
-      0
-      (+ 1 (length (cdr list)))))
-
-(define (append list1 list2)
-  (if (null? list1)
-    list2
-    (cons (car list1) (append (cdr list1) list2))))
-
-(define (list-head list index)
-  (if (= index 0)
-    (car list)
-    (list-head
-      (cdr list)
-      (- index 1))))
-
-(define (list-tail list index)
-  (if (= index 0)
-    (cdr list)
-    (list-tail
-      (cdr list)
-      (- index 1))))
-
-(define (for-each list proc)
-  (while (not (null? list))
-    (proc (car list))
-    (set! list (cdr list))))
-
-(define (map list proc)
-  (if (null? list)
-    '()
-    (cons (proc (car list))
-          (map (cdr list) proc))))
-
-(define (inject list value proc)
-  (if (null? list)
-    value
-    (inject
-      (cdr list)
-      (proc value (car list))
-      proc)))
-""";
-}
diff --git a/packages/petitparser/lib/src/petitparser/actions.dart b/packages/petitparser/lib/src/petitparser/actions.dart
deleted file mode 100644
index 4cdaa75..0000000
--- a/packages/petitparser/lib/src/petitparser/actions.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-part of petitparser;
-
-/// A parser that performs a transformation with a given function on the
-/// successful parse result of the delegate.
-class ActionParser extends DelegateParser {
-  final Function _function;
-
-  ActionParser(parser, this._function) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isSuccess) {
-      return result.success(_function(result.value));
-    } else {
-      return result;
-    }
-  }
-
-  @override
-  Parser copy() => new ActionParser(_delegate, _function);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is ActionParser
-        && super.hasEqualProperties(other)
-        && _function == other._function;
-  }
-}
-
-/// A parser that silently consumes input of another parser around
-/// its delegate.
-class TrimmingParser extends DelegateParser {
-  Parser _left;
-  Parser _right;
-
-  TrimmingParser(parser, this._left, this._right) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var current = context;
-    do {
-      current = _left.parseOn(current);
-    } while (current.isSuccess);
-    var result = _delegate.parseOn(current);
-    if (result.isFailure) {
-      return result;
-    }
-    current = result;
-    do {
-      current = _right.parseOn(current);
-    } while (current.isSuccess);
-    return current.success(result.value);
-  }
-
-  @override
-  Parser copy() => new TrimmingParser(_delegate, _left, _right);
-
-  @override
-  List<Parser> get children => [_delegate, _left, _right];
-
-  @override
-  void replace(Parser source, Parser target) {
-    super.replace(source, target);
-    if (_left == source) {
-      _left = target;
-    }
-    if (_right == source) {
-      _right = target;
-    }
-  }
-}
-
-/// A parser that answers a substring or sub-list of the range its delegate
-/// parses.
-class FlattenParser extends DelegateParser {
-  FlattenParser(parser) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isSuccess) {
-      var output = context.buffer is String
-          ? context.buffer.substring(context.position, result.position)
-          : context.buffer.sublist(context.position, result.position);
-      return result.success(output);
-    } else {
-      return result;
-    }
-  }
-
-  @override
-  Parser copy() => new FlattenParser(_delegate);
-}
-
-/// A parser that answers a token of the result its delegate parses.
-class TokenParser extends DelegateParser {
-  TokenParser(parser) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isSuccess) {
-      var token = new Token(
-          result.value, context.buffer, context.position, result.position);
-      return result.success(token);
-    } else {
-      return result;
-    }
-  }
-
-  @override
-  Parser copy() => new TokenParser(_delegate);
-}
diff --git a/packages/petitparser/lib/src/petitparser/characters.dart b/packages/petitparser/lib/src/petitparser/characters.dart
deleted file mode 100644
index fd754b7..0000000
--- a/packages/petitparser/lib/src/petitparser/characters.dart
+++ /dev/null
@@ -1,323 +0,0 @@
-part of petitparser;
-
-/// Parser class for individual character classes.
-class CharacterParser extends Parser {
-  final CharacterPredicate _predicate;
-
-  final String _message;
-
-  CharacterParser(this._predicate, this._message);
-
-  @override
-  Result parseOn(Context context) {
-    var buffer = context.buffer;
-    var position = context.position;
-    if (position < buffer.length &&
-        _predicate.test(buffer.codeUnitAt(position))) {
-      return context.success(buffer[position], position + 1);
-    }
-    return context.failure(_message);
-  }
-
-  @override
-  String toString() => '${super.toString()}[$_message]';
-
-  @override
-  Parser copy() => new CharacterParser(_predicate, _message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is CharacterParser
-        && super.hasEqualProperties(other)
-        && _predicate == other._predicate
-        && _message == other._message;
-  }
-}
-
-/// Abstract character predicate class.
-abstract class CharacterPredicate {
-
-  /// Tests if the character predicate is satisfied.
-  bool test(int value);
-}
-
-class _NotCharacterPredicate implements CharacterPredicate {
-  final CharacterPredicate predicate;
-
-  _NotCharacterPredicate(this.predicate);
-
-  @override
-  bool test(int value) => !predicate.test(value);
-}
-
-/// Returns a parser that accepts any of the specified characters.
-Parser anyOf(String string, [String message]) {
-  return new CharacterParser(_optimizedString(string),
-      message != null ? message : 'any of "$string" expected');
-}
-
-CharacterPredicate _optimizedString(String string) {
-  var ranges =
-      string.codeUnits.map((value) => new _RangeCharPredicate(value, value));
-  return _optimizedRanges(ranges);
-}
-
-CharacterPredicate _optimizedRanges(Iterable<_RangeCharPredicate> ranges) {
-
-  // 1. sort the ranges
-  var sortedRanges = new List.from(ranges, growable: false);
-  sortedRanges.sort((first, second) {
-    return first.start != second.start
-        ? first.start - second.start
-        : first.stop - second.stop;
-  });
-
-  // 2. merge adjacent or overlapping ranges
-  var mergedRanges = new List();
-  for (var thisRange in sortedRanges) {
-    if (mergedRanges.isEmpty) {
-      mergedRanges.add(thisRange);
-    } else {
-      var lastRange = mergedRanges.last;
-      if (lastRange.stop + 1 >= thisRange.start) {
-        var characterRange = new _RangeCharPredicate(lastRange.start, thisRange.stop);
-        mergedRanges[mergedRanges.length - 1] = characterRange;
-      } else {
-        mergedRanges.add(thisRange);
-      }
-    }
-  }
-
-  // 3. build the best resulting predicates
-  if (mergedRanges.length == 1) {
-    return mergedRanges[0].start == mergedRanges[0].stop
-        ? new _SingleCharPredicate(mergedRanges[0].start)
-        : mergedRanges[0];
-  } else {
-    return new _RangesCharPredicate(mergedRanges.length,
-        mergedRanges.map((range) => range.start).toList(growable: false),
-        mergedRanges.map((range) => range.stop).toList(growable: false));
-  }
-}
-
-/// Returns a parser that accepts none of the specified characters.
-Parser noneOf(String string, [String message]) {
-  return new CharacterParser(
-      new _NotCharacterPredicate(_optimizedString(string)),
-      message != null ? message : 'none of "$string" expected');
-}
-
-/// Returns a parser that accepts a specific character only.
-Parser char(element, [String message]) {
-  return new CharacterParser(new _SingleCharPredicate(_toCharCode(element)),
-      message != null ? message : '"$element" expected');
-}
-
-class _SingleCharPredicate implements CharacterPredicate {
-  final int value;
-
-  const _SingleCharPredicate(this.value);
-
-  @override
-  bool test(int value) => identical(this.value, value);
-}
-
-/// Returns a parser that accepts any digit character.
-Parser digit([String message]) {
-  return new CharacterParser(
-      _digitCharPredicate, message != null ? message : 'digit expected');
-}
-
-class _DigitCharPredicate implements CharacterPredicate {
-  const _DigitCharPredicate();
-
-  @override
-  bool test(int value) => 48 <= value && value <= 57;
-}
-
-const _digitCharPredicate = const _DigitCharPredicate();
-
-/// Returns a parser that accepts any letter character.
-Parser letter([String message]) {
-  return new CharacterParser(
-      _letterCharPredicate, message != null ? message : 'letter expected');
-}
-
-class _LetterCharPredicate implements CharacterPredicate {
-  const _LetterCharPredicate();
-
-  @override
-  bool test(int value) =>
-      (65 <= value && value <= 90) || (97 <= value && value <= 122);
-}
-
-const _letterCharPredicate = const _LetterCharPredicate();
-
-/// Returns a parser that accepts any lowercase character.
-Parser lowercase([String message]) {
-  return new CharacterParser(_lowercaseCharPredicate,
-      message != null ? message : 'lowercase letter expected');
-}
-
-class _LowercaseCharPredicate implements CharacterPredicate {
-  const _LowercaseCharPredicate();
-
-  @override
-  bool test(int value) => 97 <= value && value <= 122;
-}
-
-const _lowercaseCharPredicate = const _LowercaseCharPredicate();
-
-/// Returns a parser that accepts the given character class pattern.
-Parser pattern(String element, [String message]) {
-  return new CharacterParser(_patternParser.parse(element).value,
-      message != null ? message : '[$element] expected');
-}
-
-Parser _createPatternParser() {
-  var single = any().map(
-      (each) => new _RangeCharPredicate(_toCharCode(each), _toCharCode(each)));
-  var multiple = any().seq(char('-')).seq(any()).map((each) =>
-      new _RangeCharPredicate(_toCharCode(each[0]), _toCharCode(each[2])));
-  var positive =
-      multiple.or(single).plus().map((each) => _optimizedRanges(each));
-  return char('^').optional().seq(positive).map((each) =>
-      each[0] == null ? each[1] : new _NotCharacterPredicate(each[1]));
-}
-
-final _patternParser = _createPatternParser();
-
-class _RangesCharPredicate implements CharacterPredicate {
-  final int length;
-  final List<int> starts;
-  final List<int> stops;
-
-  _RangesCharPredicate(this.length, this.starts, this.stops);
-
-  @override
-  bool test(int value) {
-    var min = 0;
-    var max = length;
-    while (min < max) {
-      var mid = min + ((max - min) >> 1);
-      var comp = starts[mid] - value;
-      if (comp == 0) {
-        return true;
-      } else if (comp < 0) {
-        min = mid + 1;
-      } else {
-        max = mid;
-      }
-    }
-    return 0 < min && value <= stops[min - 1];
-  }
-}
-
-/// Returns a parser that accepts any character in the range
-/// between [start] and [stop].
-Parser range(start, stop, [String message]) {
-  return new CharacterParser(
-      new _RangeCharPredicate(_toCharCode(start), _toCharCode(stop)),
-      message != null ? message : '$start..$stop expected');
-}
-
-class _RangeCharPredicate implements CharacterPredicate {
-  final int start;
-  final int stop;
-
-  _RangeCharPredicate(this.start, this.stop);
-
-  @override
-  bool test(int value) => start <= value && value <= stop;
-}
-
-/// Returns a parser that accepts any uppercase character.
-Parser uppercase([String message]) {
-  return new CharacterParser(_uppercaseCharPredicate,
-      message != null ? message : 'uppercase letter expected');
-}
-
-class _UppercaseCharPredicate implements CharacterPredicate {
-  const _UppercaseCharPredicate();
-
-  @override
-  bool test(int value) => 65 <= value && value <= 90;
-}
-
-const _uppercaseCharPredicate = const _UppercaseCharPredicate();
-
-/// Returns a parser that accepts any whitespace character.
-Parser whitespace([String message]) {
-  return new CharacterParser(_whitespaceCharPredicate,
-      message != null ? message : 'whitespace expected');
-}
-
-class _WhitespaceCharPredicate implements CharacterPredicate {
-  const _WhitespaceCharPredicate();
-
-  @override
-  bool test(int value) {
-    if (value < 256) {
-      return value == 0x09 ||
-          value == 0x0A ||
-          value == 0x0B ||
-          value == 0x0C ||
-          value == 0x0D ||
-          value == 0x20 ||
-          value == 0x85 ||
-          value == 0xA0;
-    } else {
-      return value == 0x1680 ||
-          value == 0x180E ||
-          value == 0x2000 ||
-          value == 0x2001 ||
-          value == 0x2002 ||
-          value == 0x2003 ||
-          value == 0x2004 ||
-          value == 0x2005 ||
-          value == 0x2006 ||
-          value == 0x2007 ||
-          value == 0x2008 ||
-          value == 0x2009 ||
-          value == 0x200A ||
-          value == 0x2028 ||
-          value == 0x2029 ||
-          value == 0x202F ||
-          value == 0x205F ||
-          value == 0x3000 ||
-          value == 0xFEFF;
-    }
-  }
-}
-
-const _whitespaceCharPredicate = const _WhitespaceCharPredicate();
-
-/// Returns a parser that accepts any word character.
-Parser word([String message]) {
-  return new CharacterParser(_wordCharPredicate,
-      message != null ? message : 'letter or digit expected');
-}
-
-class _WordCharPredicate implements CharacterPredicate {
-  const _WordCharPredicate();
-
-  @override
-  bool test(int value) => (65 <= value && value <= 90) ||
-      (97 <= value && value <= 122) ||
-      (48 <= value && value <= 57) ||
-      (value == 95);
-}
-
-const _wordCharPredicate = const _WordCharPredicate();
-
-// internal converter for character codes
-int _toCharCode(element) {
-  if (element is num) {
-    return element.round();
-  }
-  var value = element.toString();
-  if (value.length != 1) {
-    throw new ArgumentError('$value is not a character');
-  }
-  return value.codeUnitAt(0);
-}
diff --git a/packages/petitparser/lib/src/petitparser/combinators.dart b/packages/petitparser/lib/src/petitparser/combinators.dart
deleted file mode 100644
index 074d15b..0000000
--- a/packages/petitparser/lib/src/petitparser/combinators.dart
+++ /dev/null
@@ -1,218 +0,0 @@
-part of petitparser;
-
-/// A parser that delegates to another one. Normally users do not need to
-/// directly use a delegate parser.
-class DelegateParser extends Parser {
-  Parser _delegate;
-
-  DelegateParser(this._delegate);
-
-  @override
-  Result parseOn(Context context) {
-    return _delegate.parseOn(context);
-  }
-
-  @override
-  List<Parser> get children => [_delegate];
-
-  @override
-  void replace(Parser source, Parser target) {
-    super.replace(source, target);
-    if (_delegate == source) {
-      _delegate = target;
-    }
-  }
-
-  @override
-  Parser copy() => new DelegateParser(_delegate);
-}
-
-/// A parser that succeeds only at the end of the input.
-class EndOfInputParser extends DelegateParser {
-  final String _message;
-
-  EndOfInputParser(parser, this._message) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isFailure || result.position == result.buffer.length) {
-      return result;
-    }
-    return result.failure(_message, result.position);
-  }
-
-  @override
-  String toString() => '${super.toString()}[$_message]';
-
-  @override
-  Parser copy() => new EndOfInputParser(_delegate, _message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is EndOfInputParser && super.hasEqualProperties(other)
-        && _message == other._message;
-  }
-}
-
-/// The and-predicate, a parser that succeeds whenever its delegate does, but
-/// does not consume the input stream [Parr 1994, 1995].
-class AndParser extends DelegateParser {
-  AndParser(parser) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isSuccess) {
-      return context.success(result.value);
-    } else {
-      return result;
-    }
-  }
-
-  @override
-  Parser copy() => new AndParser(_delegate);
-}
-
-/// The not-predicate, a parser that succeeds whenever its delegate does not,
-/// but consumes no input [Parr 1994, 1995].
-class NotParser extends DelegateParser {
-  final String _message;
-
-  NotParser(parser, this._message) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isFailure) {
-      return context.success(null);
-    } else {
-      return context.failure(_message);
-    }
-  }
-
-  @override
-  String toString() => '${super.toString()}[$_message]';
-
-  @override
-  Parser copy() => new NotParser(_delegate, _message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is NotParser
-        && super.hasEqualProperties(other)
-        && _message == other._message;
-  }
-}
-
-/// A parser that optionally parsers its delegate, or answers nil.
-class OptionalParser extends DelegateParser {
-  final _otherwise;
-
-  OptionalParser(parser, this._otherwise) : super(parser);
-
-  @override
-  Result parseOn(Context context) {
-    var result = _delegate.parseOn(context);
-    if (result.isSuccess) {
-      return result;
-    } else {
-      return context.success(_otherwise);
-    }
-  }
-
-  @override
-  Parser copy() => new OptionalParser(_delegate, _otherwise);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is OptionalParser
-        && super.hasEqualProperties(other)
-        && _otherwise == other._otherwise;
-  }
-}
-
-/// Abstract parser that parses a list of things in some way.
-abstract class ListParser extends Parser {
-  final List<Parser> _parsers;
-
-  ListParser(this._parsers);
-
-  @override
-  List<Parser> get children => _parsers;
-
-  @override
-  void replace(Parser source, Parser target) {
-    super.replace(source, target);
-    for (var i = 0; i < _parsers.length; i++) {
-      if (_parsers[i] == source) {
-        _parsers[i] = target;
-      }
-    }
-  }
-}
-
-/// A parser that uses the first parser that succeeds.
-class ChoiceParser extends ListParser {
-  factory ChoiceParser(Iterable<Parser> parsers) {
-    return new ChoiceParser._(new List.from(parsers, growable: false));
-  }
-
-  ChoiceParser._(parsers) : super(parsers);
-
-  @override
-  Result parseOn(Context context) {
-    var result;
-    for (var i = 0; i < _parsers.length; i++) {
-      result = _parsers[i].parseOn(context);
-      if (result.isSuccess) {
-        return result;
-      }
-    }
-    return result;
-  }
-
-  @override
-  Parser or(Parser other) {
-    return new ChoiceParser(new List()
-      ..addAll(_parsers)
-      ..add(other));
-  }
-
-  @override
-  Parser copy() => new ChoiceParser(_parsers);
-}
-
-/// A parser that parses a sequence of parsers.
-class SequenceParser extends ListParser {
-  factory SequenceParser(Iterable<Parser> parsers) {
-    return new SequenceParser._(new List.from(parsers, growable: false));
-  }
-
-  SequenceParser._(parsers) : super(parsers);
-
-  @override
-  Result parseOn(Context context) {
-    var current = context;
-    var elements = new List(_parsers.length);
-    for (var i = 0; i < _parsers.length; i++) {
-      var result = _parsers[i].parseOn(current);
-      if (result.isFailure) {
-        return result;
-      }
-      elements[i] = result.value;
-      current = result;
-    }
-    return current.success(elements);
-  }
-
-  @override
-  Parser seq(Parser other) {
-    return new SequenceParser(new List()
-      ..addAll(_parsers)
-      ..add(other));
-  }
-
-  @override
-  Parser copy() => new SequenceParser(_parsers);
-}
diff --git a/packages/petitparser/lib/src/petitparser/composite.dart b/packages/petitparser/lib/src/petitparser/composite.dart
deleted file mode 100644
index b7e8583..0000000
--- a/packages/petitparser/lib/src/petitparser/composite.dart
+++ /dev/null
@@ -1,167 +0,0 @@
-part of petitparser;
-
-/// Helper to compose complex grammars from various primitive parsers.
-///
-/// Note, this class is deprecated in favor of [GrammarDefinition] that provides
-/// a more flexible way to define composite parsers.
-///
-/// To create a new composite grammar subclass [CompositeParser]. Override
-/// the method [initialize] and for every production call [def] giving the
-/// production a name. The start production must be named 'start'. To refer
-/// to other productions (forward and backward) use [ref].
-///
-/// Consider the following example to parse a list of numbers:
-///
-///     class NumberListGrammar extends CompositeParser {
-///       void initialize() {
-///         def('start', ref('list').end());
-///         def('list', ref('element').separatedBy(char(','),
-///           includeSeparators: false));
-///         def('element', digit().plus().flatten());
-///       }
-///     }
-///
-/// You might want to create future subclasses of your composite grammar
-/// to redefine the grammar or attach custom actions. In such a subclass
-/// override the method [initialize] again and call super. Then use
-/// [redef] to redefine an existing production, and [action] to attach an
-/// action to an existing production.
-///
-/// Consider the following example that attaches a production action and
-/// converts the digits to actual numbers:
-///
-///     class NumberListParser extends NumberListGrammar {
-///       void initialize() {
-///         action('element', (value) => int.parse(value));
-///       }
-///     }
-@deprecated
-abstract class CompositeParser extends DelegateParser {
-  bool _completed = false;
-  final Map<String, Parser> _defined = new Map();
-  final Map<String, SettableParser> _undefined = new Map();
-
-  CompositeParser() : super(failure('Not initalized production: start')) {
-    initialize();
-    _complete();
-  }
-
-  /// Initializes the composite grammar.
-  void initialize();
-
-  /// Internal method to complete the grammar.
-  void _complete() {
-    _delegate = ref('start');
-    _undefined.forEach((name, parser) {
-      if (!_defined.containsKey(name)) {
-        throw new UndefinedProductionError(name);
-      }
-      parser.set(_defined[name]);
-    });
-    _undefined.clear();
-    _completed = true;
-    _delegate = ref('start');
-  }
-
-  /// Returns a reference to a production with a [name].
-  ///
-  /// This method works during initialization and after completion of the
-  /// initialization. During the initialization it returns delegate parsers
-  /// that are eventually replaced by the real parsers. Afterwards it
-  /// returns the defined parser (mostly useful for testing).
-  Parser ref(String name) {
-    if (_completed) {
-      if (_defined.containsKey(name)) {
-        return _defined[name];
-      } else {
-        throw new UndefinedProductionError(name);
-      }
-    } else {
-      return _undefined.putIfAbsent(name, () {
-        return failure('Not initalized production: $name').settable();
-      });
-    }
-  }
-
-  /// Convenience operator returning a reference to a production with
-  /// a [name]. See [CompositeParser.ref] for details.
-  Parser operator [](String name) => ref(name);
-
-  /// Defines a production with a [name] and a [parser]. Only call this method
-  /// from [initialize].
-  ///
-  /// The following example defines a list production that consumes
-  /// several elements separated by a comma.
-  ///
-  ///     def('list', ref('element').separatedBy(char(',')));
-  void def(String name, Parser parser) {
-    if (_completed) {
-      throw new CompletedParserError();
-    } else if (_defined.containsKey(name)) {
-      throw new RedefinedProductionError(name);
-    } else {
-      _defined[name] = parser;
-    }
-  }
-
-  /// Redefines an existing production with a [name] and a [replacement]
-  /// parser or function producing a new parser. The code raises an
-  /// [UndefinedProductionError] if [name] is an undefined production. Only call
-  /// this method from [initialize].
-  ///
-  /// The following example redefines the previously defined list production
-  /// by making it optional:
-  ///
-  ///     redef('list', (parser) => parser.optional());
-  void redef(String name, replacement) {
-    if (_completed) {
-      throw new CompletedParserError();
-    } else if (!_defined.containsKey(name)) {
-      throw new UndefinedProductionError(name);
-    } else {
-      _defined[name] =
-          replacement is Parser ? replacement : replacement(_defined[name]);
-    }
-  }
-
-  /// Attaches an action [function] to an existing production [name]. The code
-  /// raises an [UndefinedProductionError] if [name] is an undefined production.
-  /// Only call this method from [initialize].
-  ///
-  /// The following example attaches an action returning the size of list of
-  /// the previously defined list production:
-  ///
-  ///     action('list', (list) => list.length);
-  void action(String name, Function function) {
-    redef(name, (parser) => parser.map(function));
-  }
-}
-
-/// Error raised when somebody tries to modify a [CompositeParser] outside
-/// the [CompositeParser.initialize] method.
-class CompletedParserError extends Error {
-  CompletedParserError();
-
-  @override
-  String toString() => 'Completed parser';
-}
-
-/// Error raised when an undefined production is accessed.
-class UndefinedProductionError extends Error {
-  final String name;
-
-  UndefinedProductionError(this.name);
-
-  @override
-  String toString() => 'Undefined production: $name';
-}
-
-/// Error raised when a production is accidentally redefined.
-class RedefinedProductionError extends Error {
-  final String name;
-
-  RedefinedProductionError(this.name);
-
-  @override
-  String toString() => 'Redefined production: $name';
-}
diff --git a/packages/petitparser/lib/src/petitparser/context.dart b/packages/petitparser/lib/src/petitparser/context.dart
deleted file mode 100644
index 8594515..0000000
--- a/packages/petitparser/lib/src/petitparser/context.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-part of petitparser;
-
-/// An immutable parse context.
-class Context {
-  const Context(this.buffer, this.position);
-
-  /// The buffer we are working on.
-  final buffer;
-
-  /// The current position in the buffer.
-  final int position;
-
-  /// Returns a result indicating a parse success.
-  Result success(result, [int position]) {
-    return new Success(buffer, position == null ? this.position : position, result);
-  }
-
-  /// Returns a result indicating a parse failure.
-  Result failure(String message, [int position]) {
-    return new Failure(buffer, position == null ? this.position : position, message);
-  }
-
-  /// Returns a human readable string of the current context.
-  String toString() => 'Context[${toPositionString()}]';
-
-  /// Returns the line:column if the input is a string, otherwise the position.
-  String toPositionString() => Token.positionString(buffer, position);
-}
-
-/// An immutable parse result.
-abstract class Result extends Context {
-  const Result(buffer, position) : super(buffer, position);
-
-  /// Returns [true] if this result indicates a parse success.
-  bool get isSuccess => false;
-
-  /// Returns [true] if this result indicates a parse failure.
-  bool get isFailure => false;
-
-  /// Returns the parse result of the current context.
-  get value;
-
-  /// Returns the parse message of the current context.
-  String get message;
-}
-
-/// An immutable parse result in case of a successful parse.
-class Success extends Result {
-  const Success(buffer, position, this.value) : super(buffer, position);
-
-  @override
-  bool get isSuccess => true;
-
-  @override
-  final value;
-
-  @override
-  String get message => null;
-
-  @override
-  String toString() => 'Success[${toPositionString()}]: $value';
-}
-
-/// An immutable parse result in case of a failed parse.
-class Failure extends Result {
-  const Failure(buffer, position, this.message) : super(buffer, position);
-
-  @override
-  bool get isFailure => true;
-
-  @override
-  get value => throw new ParserError(this);
-
-  @override
-  final String message;
-
-  @override
-  String toString() => 'Failure[${toPositionString()}]: $message';
-}
-
-/// An exception raised in case of a parse error.
-class ParserError extends Error {
-  final Failure failure;
-
-  ParserError(this.failure);
-
-  @override
-  String toString() => '${failure.message} at ${failure.toPositionString()}';
-}
diff --git a/packages/petitparser/lib/src/petitparser/definition.dart b/packages/petitparser/lib/src/petitparser/definition.dart
deleted file mode 100644
index 44b7d72..0000000
--- a/packages/petitparser/lib/src/petitparser/definition.dart
+++ /dev/null
@@ -1,161 +0,0 @@
-part of petitparser;
-
-/// Helper to conveniently define and build complex, recursive grammars using
-/// plain Dart code.
-///
-/// To create a new grammar definition subclass [GrammarDefinition]. For every
-/// production create a new method returning the primitive parser defining it.
-/// The method called [start] is supposed to return the start production of the
-/// grammar. To refer to a production defined in the same definition use [ref]
-/// with the function reference as the first argument.
-///
-/// Consider the following example to parse a list of numbers:
-///
-///     class ListGrammarDefinition extends GrammarDefinition {
-///       start()   => ref(list).end();
-///       list()    => ref(element) & char(',') & ref(list)
-///                  | ref(element);
-///       element() => digit().plus().flatten();
-///     }
-///
-/// Since this is plain Dart code, common refactorings such as renaming a production
-/// updates all references correctly. Also code navigation and code completion
-/// works as expected.
-///
-/// To attach custom production actions you might want to further subclass your
-/// grammar definition and override overriding the necessary productions defined
-/// in the superclass:
-///
-///     class ListParserDefinition extends ListGrammarDefinition {
-///       element() => super.element().map((value) => int.parse(value));
-///     }
-///
-/// Note that productions can be parametrized. Define such productions with positional
-/// arguments and reference to multiple instances by passing the arguments to [ref].
-///
-/// Consider extending the above grammar with a parametrized token production:
-///
-///     class TokenizedListGrammarDefinition extends GrammarDefinition {
-///       start()   => ref(list).end();
-///       list()    => ref(element) & ref(token, char(',')) & ref(list)
-///                  | ref(element);
-///       element() => ref(token, digit().plus());
-///       token(p)  => p.token().trim();
-///     }
-abstract class GrammarDefinition {
-  const GrammarDefinition();
-
-  /// The starting production of this definition.
-  Parser start();
-
-  /// Returns a parser reference to a production defined by a [function].
-  ///
-  /// The optional arguments parametrize the called production.
-  Parser ref(Function function, [arg1, arg2, arg3, arg4, arg5, arg6]) {
-    var arguments = [arg1, arg2, arg3, arg4, arg5, arg6]
-        .takeWhile((each) => each != null)
-        .toList(growable: false);
-    return new _Reference(function, arguments);
-  }
-
-  /// Builds a composite parser from this definition.
-  ///
-  /// The optional [start] reference specifies a different starting production into
-  /// the grammar. The optional [arguments] list parametrizes the called production.
-  Parser build({Function start: null, List arguments: const []}) {
-    return _resolve(
-        new _Reference(start != null ? start : this.start, arguments));
-  }
-
-  /// Internal helper to resolve a complete parser graph.
-  Parser _resolve(_Reference reference) {
-    var mapping = new Map();
-
-    Parser _dereference(_Reference reference) {
-      var parser = mapping[reference];
-      if (parser == null) {
-        var references = [reference];
-        parser = reference.resolve();
-        while (parser is _Reference) {
-          if (references.contains(parser)) {
-            throw new StateError('Recursive references detected: $references');
-          }
-          references.add(parser);
-          parser = parser.resolve();
-        }
-        for (var each in references) {
-          mapping[each] = parser;
-        }
-      }
-      return parser;
-    }
-
-    var todo = [_dereference(reference)];
-    var seen = new Set.from(todo);
-
-    while (todo.isNotEmpty) {
-      var parent = todo.removeLast();
-      for (var child in parent.children) {
-        if (child is _Reference) {
-          var referenced = _dereference(child);
-          parent.replace(child, referenced);
-          child = referenced;
-        }
-        if (!seen.contains(child)) {
-          seen.add(child);
-          todo.add(child);
-        }
-      }
-    }
-
-    return mapping[reference];
-  }
-}
-
-/// A helper to build a parser from a {@link GrammarDefinition}.
-class GrammarParser extends DelegateParser {
-  GrammarParser(GrammarDefinition definition) : super(definition.build());
-}
-
-class _Reference extends Parser {
-  final Function function;
-  final List arguments;
-
-  _Reference(this.function, this.arguments);
-
-  Parser resolve() => Function.apply(function, arguments);
-
-  @override
-  bool operator ==(other) {
-    if (other is! _Reference ||
-        other.function != function ||
-        other.arguments.length != arguments.length) {
-      return false;
-    }
-    for (var i = 0; i < arguments.length; i++) {
-      var a = arguments[i],
-          b = other.arguments[i];
-      if (a is Parser && a is! _Reference && b is Parser && b is! _Reference) {
-        // for parsers do a deep equality check
-        if (!a.isEqualTo(b)) {
-          return false;
-        }
-      } else {
-        // for everything else just do standard equality
-        if (a != b) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  @override
-  int get hashCode => function.hashCode;
-
-  @override
-  Parser copy() => throw new UnsupportedError('References cannot be copied.');
-
-  @override
-  Result parseOn(Context context) => throw new UnsupportedError('References cannot be parsed.');
-}
diff --git a/packages/petitparser/lib/src/petitparser/expression.dart b/packages/petitparser/lib/src/petitparser/expression.dart
deleted file mode 100644
index 80b4f06..0000000
--- a/packages/petitparser/lib/src/petitparser/expression.dart
+++ /dev/null
@@ -1,202 +0,0 @@
-part of petitparser;
-
-/// A builder that allows the simple definition of expression grammars with
-/// prefix, postfix, and left- and right-associative infix operators.
-///
-/// The following code creates the empty expression builder:
-///
-///     var builder = new ExpressionBuilder();
-///
-/// Then we define the operator-groups in descending precedence. The highest
-/// precedence have the literal numbers themselves:
-///
-///     builder.group()
-///       ..primitive(digit().plus()
-///         .seq(char('.').seq(digit().plus()).optional())
-///         .flatten().trim().map((a) => double.parse(a)));
-///
-/// Then come the normal arithmetic operators. Note, that the action blocks receive
-/// both, the terms and the parsed operator in the order they appear in the parsed
-/// input.
-///
-///     // negation is a prefix operator
-///     builder.group()
-///       ..prefix(char('-').trim(), (op, a) => -a);
-///
-///     // power is right-associative
-///     builder.group()
-///       ..right(char('^').trim(), (a, op, b) => math.pow(a, b));
-///
-///     // multiplication and addition is left-associative
-///     builder.group()
-///       ..left(char('*').trim(), (a, op, b) => a * b)
-///       ..left(char('/').trim(), (a, op, b) => a / b);
-///     builder.group()
-///       ..left(char('+').trim(), (a, op, b) => a + b)
-///       ..left(char('-').trim(), (a, op, b) => a - b);
-///
-/// Finally we can build the parser:
-///
-///     var parser = builder.build();
-///
-/// After executing the above code we get an efficient parser that correctly
-/// evaluates expressions like:
-///
-///     parser.parse('-8');      // -8
-///     parser.parse('1+2*3');   // 7
-///     parser.parse('1*2+3');   // 5
-///     parser.parse('8/4/2');   // 2
-///     parser.parse('2^2^3');   // 256
-class ExpressionBuilder {
-  final List<ExpressionGroup> _groups = new List();
-
-  /// Creates a new group of operators that share the same priority.
-  ExpressionGroup group() {
-    var group = new ExpressionGroup();
-    _groups.add(group);
-    return group;
-  }
-
-  /// Builds the expression parser.
-  Parser build() => _groups.fold(
-      failure('Highest priority group should define a primitive parser.'),
-      (a, b) => b._build(a));
-}
-
-/// Models a group of operators of the same precedence.
-class ExpressionGroup {
-
-  /// Defines a new primitive or literal [parser].
-  void primitive(Parser parser) {
-    _primitives.add(parser);
-  }
-
-  Parser _buildPrimitive(Parser inner) {
-    return _buildChoice(_primitives, inner);
-  }
-
-  final List<Parser> _primitives = new List();
-
-  /// Adds a prefix operator [parser]. Evaluates the optional [action] with the
-  /// parsed `operator` and `value`.
-  void prefix(Parser parser, [action(operator, value)]) {
-    if (action == null) {
-      action = (operator, value) => [operator, value];
-    }
-    _prefix.add(parser.map((operator) => new _ExpressionResult(operator, action)));
-  }
-
-  Parser _buildPrefix(Parser inner) {
-    if (_prefix.isEmpty) {
-      return inner;
-    } else {
-      return new SequenceParser([_buildChoice(_prefix).star(), inner]).map(
-          (tuple) {
-        return tuple.first.reversed.fold(tuple.last, (value, result) {
-          return result.action(result.operator, value);
-        });
-      });
-    }
-  }
-
-  final List<Parser> _prefix = new List();
-
-  /// Adds a postfix operator [parser]. Evaluates the optional [action] with the
-  /// parsed `value` and `operator`.
-  void postfix(Parser parser, [action(value, operator)]) {
-    if (action == null) {
-      action = (value, operator) => [value, operator];
-    }
-    _postfix.add(parser.map((operator) => new _ExpressionResult(operator, action)));
-  }
-
-  Parser _buildPostfix(Parser inner) {
-    if (_postfix.isEmpty) {
-      return inner;
-    } else {
-      return new SequenceParser([inner, _buildChoice(_postfix).star()]).map(
-          (tuple) {
-        return tuple.last.fold(tuple.first, (value, result) {
-          return result.action(value, result.operator);
-        });
-      });
-    }
-  }
-
-  final List<Parser> _postfix = new List();
-
-  /// Adds a right-associative operator [parser]. Evaluates the optional [action] with
-  /// the parsed `left` term, `operator`, and `right` term.
-  void right(Parser parser, [action(left, operator, right)]) {
-    if (action == null) {
-      action = (left, operator, right) => [left, operator, right];
-    }
-    _right.add(parser.map((operator) => new _ExpressionResult(operator, action)));
-  }
-
-  Parser _buildRight(Parser inner) {
-    if (_right.isEmpty) {
-      return inner;
-    } else {
-      return inner.separatedBy(_buildChoice(_right)).map((sequence) {
-        var result = sequence.last;
-        for (var i = sequence.length - 2; i > 0; i -= 2) {
-          result =
-              sequence[i].action(sequence[i - 1], sequence[i].operator, result);
-        }
-        return result;
-      });
-    }
-  }
-
-  final List<Parser> _right = new List();
-
-  /// Adds a left-associative operator [parser]. Evaluates the optional [action] with
-  /// the parsed `left` term, `operator`, and `right` term.
-  void left(Parser parser, [action(left, operator, right)]) {
-    if (action == null) {
-      action = (left, operator, right) => [left, operator, right];
-    }
-    _left.add(parser.map((operator) => new _ExpressionResult(operator, action)));
-  }
-
-  Parser _buildLeft(Parser inner) {
-    if (_left.isEmpty) {
-      return inner;
-    } else {
-      return inner.separatedBy(_buildChoice(_left)).map((sequence) {
-        var result = sequence.first;
-        for (var i = 1; i < sequence.length; i += 2) {
-          result =
-              sequence[i].action(result, sequence[i].operator, sequence[i + 1]);
-        }
-        return result;
-      });
-    }
-  }
-
-  final List<Parser> _left = new List();
-
-  // helper to build an optimal choice parser
-  Parser _buildChoice(List<Parser> parsers, [Parser otherwise]) {
-    if (parsers.isEmpty) {
-      return otherwise;
-    } else if (parsers.length == 1) {
-      return parsers.first;
-    } else {
-      return new ChoiceParser(parsers);
-    }
-  }
-
-  // helper to build the group of parsers
-  Parser _build(Parser inner) {
-    return _buildLeft(_buildRight(_buildPostfix(_buildPrefix(_buildPrimitive(inner)))));
-  }
-}
-
-// helper class to associate operators and actions
-class _ExpressionResult {
-  final operator;
-  final Function action;
-  _ExpressionResult(this.operator, this.action);
-}
diff --git a/packages/petitparser/lib/src/petitparser/parser.dart b/packages/petitparser/lib/src/petitparser/parser.dart
deleted file mode 100644
index 34266be..0000000
--- a/packages/petitparser/lib/src/petitparser/parser.dart
+++ /dev/null
@@ -1,399 +0,0 @@
-part of petitparser;
-
-/// Abstract base class of all parsers.
-abstract class Parser {
-
-  /// Primitive method doing the actual parsing.
-  ///
-  /// The method is overridden in concrete subclasses to implement the
-  /// parser specific logic. The methods takes a parse [context] and
-  /// returns the resulting context, which is either a [Success] or
-  /// [Failure] context.
-  Result parseOn(Context context);
-
-  /// Returns the parse result of the [input].
-  ///
-  /// The implementation creates a default parse context on the input and calls
-  /// the internal parsing logic of the receiving parser.
-  ///
-  /// For example, `letter().plus().parse('abc')` results in an instance of
-  /// [Success], where [Result.position] is `3` and [Success.value] is
-  /// `[a, b, c]`.
-  ///
-  /// Similarly, `letter().plus().parse('123')` results in an instance of
-  /// [Failure], where [Result.position] is `0` and [Failure.message] is
-  /// ['letter expected'].
-  Result parse(input) {
-    return parseOn(new Context(input, 0));
-  }
-
-  /// Tests if the [input] can be successfully parsed.
-  ///
-  /// For example, `letter().plus().accept('abc')` returns `true`, and
-  /// `letter().plus().accept('123')` returns `false`.
-  bool accept(input) {
-    return parse(input).isSuccess;
-  }
-
-  /// Returns a list of all successful overlapping parses of the [input].
-  ///
-  /// For example, `letter().plus().matches('abc de')` results in the list
-  /// `[['a', 'b', 'c'], ['b', 'c'], ['c'], ['d', 'e'], ['e']]`. See
-  /// [Parser.matchesSkipping] to retrieve non-overlapping parse results.
-  Iterable matches(input) {
-    var list = new List();
-    and()
-        .map((each) => list.add(each))
-        .seq(any())
-        .or(any())
-        .star()
-        .parse(input);
-    return list;
-  }
-
-  /// Returns a list of all successful non-overlapping parses of the input.
-  ///
-  /// For example, `letter().plus().matchesSkipping('abc de')` results in the
-  /// list `[['a', 'b', 'c'], ['d', 'e']]`. See [Parser.matches] to retrieve
-  /// overlapping parse results.
-  Iterable matchesSkipping(input) {
-    var list = new List();
-    map((each) => list.add(each)).or(any()).star().parse(input);
-    return list;
-  }
-
-  /// Returns new parser that accepts the receiver, if possible. The resulting
-  /// parser returns the result of the receiver, or `null` if not applicable.
-  /// The returned value can be provided as an optional argument [otherwise].
-  ///
-  /// For example, the parser `letter().optional()` accepts a letter as input
-  /// and returns that letter. When given something else the parser succeeds as
-  /// well, does not consume anything and returns `null`.
-  Parser optional([otherwise]) => new OptionalParser(this, otherwise);
-
-  /// Returns a parser that accepts the receiver zero or more times. The
-  /// resulting parser returns a list of the parse results of the receiver.
-  ///
-  /// This is a greedy and blind implementation that tries to consume as much
-  /// input as possible and that does not consider what comes afterwards.
-  ///
-  /// For example, the parser `letter().star()` accepts the empty string or
-  /// any sequence of letters and returns a possibly empty list of the parsed
-  /// letters.
-  Parser star() => repeat(0, unbounded);
-
-  /// Returns a parser that parses the receiver zero or more times until it
-  /// reaches a [limit]. This is a greedy non-blind implementation of the
-  /// [Parser.star] operator. The [limit] is not consumed.
-  Parser starGreedy(Parser limit) => repeatGreedy(limit, 0, unbounded);
-
-  /// Returns a parser that parses the receiver zero or more times until it
-  /// reaches a [limit]. This is a lazy non-blind implementation of the
-  /// [Parser.star] operator. The [limit] is not consumed.
-  Parser starLazy(Parser limit) => repeatLazy(limit, 0, unbounded);
-
-  /// Returns a parser that accepts the receiver one or more times. The
-  /// resulting parser returns a list of the parse results of the receiver.
-  ///
-  /// This is a greedy and blind implementation that tries to consume as much
-  /// input as possible and that does not consider what comes afterwards.
-  ///
-  /// For example, the parser `letter().plus()` accepts any sequence of
-  /// letters and returns a list of the parsed letters.
-  Parser plus() => repeat(1, unbounded);
-
-  /// Returns a parser that parses the receiver one or more times until it
-  /// reaches [limit]. This is a greedy non-blind implementation of the
-  /// [Parser.plus] operator. The [limit] is not consumed.
-  Parser plusGreedy(Parser limit) => repeatGreedy(limit, 1, unbounded);
-
-  /// Returns a parser that parses the receiver one or more times until it
-  /// reaches a [limit]. This is a lazy non-blind implementation of the
-  /// [Parser.plus] operator. The [limit] is not consumed.
-  Parser plusLazy(Parser limit) => repeatLazy(limit, 1, unbounded);
-
-  /// Returns a parser that accepts the receiver between [min] and [max] times.
-  /// The resulting parser returns a list of the parse results of the receiver.
-  ///
-  /// This is a greedy and blind implementation that tries to consume as much
-  /// input as possible and that does not consider what comes afterwards.
-  ///
-  /// For example, the parser `letter().repeat(2, 4)` accepts a sequence of
-  /// two, three, or four letters and returns the accepted letters as a list.
-  Parser repeat(int min, int max) {
-    return new PossessiveRepeatingParser(this, min, max);
-  }
-
-  /// Returns a parser that parses the receiver at least [min] and at most [max]
-  /// times until it reaches a [limit]. This is a greedy non-blind implementation of
-  /// the [Parser.repeat] operator. The [limit] is not consumed.
-  Parser repeatGreedy(Parser limit, int min, int max) {
-    return new GreedyRepeatingParser(this, limit, min, max);
-  }
-
-  /// Returns a parser that parses the receiver at least [min] and at most [max]
-  /// times until it reaches a [limit]. This is a lazy non-blind implementation of
-  /// the [Parser.repeat] operator. The [limit] is not consumed.
-  Parser repeatLazy(Parser limit, int min, int max) {
-    return new LazyRepeatingParser(this, limit, min, max);
-  }
-
-  /// Returns a parser that accepts the receiver exactly [count] times. The
-  /// resulting parser returns a list of the parse results of the receiver.
-  ///
-  /// For example, the parser `letter().times(2)` accepts two letters and
-  /// returns a list of the two parsed letters.
-  Parser times(int count) => repeat(count, count);
-
-  /// Returns a parser that accepts the receiver followed by [other]. The
-  /// resulting parser returns a list of the parse result of the receiver
-  /// followed by the parse result of [other]. Calling this method on an
-  /// existing sequence code not nest this sequence into a new one, but
-  /// instead augments the existing sequence with [other].
-  ///
-  /// For example, the parser `letter().seq(digit()).seq(letter())` accepts a
-  /// letter followed by a digit and another letter. The parse result of the
-  /// input string `'a1b'` is the list `['a', '1', 'b']`.
-  Parser seq(Parser other) => new SequenceParser([this, other]);
-
-  /// Convenience operator returning a parser that accepts the receiver followed
-  /// by [other]. See [Parser.seq] for details.
-  Parser operator &(Parser other) => this.seq(other);
-
-  /// Returns a parser that accepts the receiver or [other]. The resulting
-  /// parser returns the parse result of the receiver, if the receiver fails
-  /// it returns the parse result of [other] (exclusive ordered choice).
-  ///
-  /// For example, the parser `letter().or(digit())` accepts a letter or a
-  /// digit. An example where the order matters is the following choice between
-  /// overlapping parsers: `letter().or(char('a'))`. In the example the parser
-  /// `char('a')` will never be activated, because the input is always consumed
-  /// `letter()`. This can be problematic if the author intended to attach a
-  /// production action to `char('a')`.
-  Parser or(Parser other) => new ChoiceParser([this, other]);
-
-  /// Convenience operator returning a parser that accepts the receiver or
-  /// [other]. See [Parser.or] for details.
-  Parser operator |(Parser other) => this.or(other);
-
-  /// Returns a parser (logical and-predicate) that succeeds whenever the
-  /// receiver does, but never consumes input.
-  ///
-  /// For example, the parser `char('_').and().seq(identifier)` accepts
-  /// identifiers that start with an underscore character. Since the predicate
-  /// does not consume accepted input, the parser `identifier` is given the
-  /// ability to process the complete identifier.
-  Parser and() => new AndParser(this);
-
-  /// Returns a parser (logical not-predicate) that succeeds whenever the
-  /// receiver fails, but never consumes input.
-  ///
-  /// For example, the parser `char('_').not().seq(identifier)` accepts
-  /// identifiers that do not start with an underscore character. If the parser
-  /// `char('_')` accepts the input, the negation and subsequently the
-  /// complete parser fails. Otherwise the parser `identifier` is given the
-  /// ability to process the complete identifier.
-  Parser not([String message]) => new NotParser(this, message);
-
-  /// Returns a parser that consumes any input token (character), but the
-  /// receiver.
-  ///
-  /// For example, the parser `letter().neg()` accepts any input but a letter.
-  /// The parser fails for inputs like `'a'` or `'Z'`, but succeeds for
-  /// input like `'1'`, `'_'` or `'$'`.
-  Parser neg([String message]) => not(message).seq(any()).pick(1);
-
-  /// Returns a parser that discards the result of the receiver, and returns
-  /// a sub-string of the consumed range in the string/list being parsed.
-  ///
-  /// For example, the parser `letter().plus().flatten()` returns `'abc'`
-  /// for the input `'abc'`. In contrast, the parser `letter().plus()` would
-  /// return `['a', 'b', 'c']` for the same input instead.
-  Parser flatten() => new FlattenParser(this);
-
-  /// Returns a parser that returns a [Token]. The token carries the parsed
-  /// value of the receiver [Token.value], as well as the consumed input
-  /// [Token.input] from [Token.start] to [Token.stop] of the input being
-  /// parsed.
-  ///
-  /// For example, the parser `letter().plus().token()` returns the token
-  /// `Token[start: 0, stop: 3, value: abc]` for the input `'abc'`.
-  Parser token() => new TokenParser(this);
-
-  /// Returns a parser that consumes input before and after the receiver. The
-  /// optional argument is a parser that consumes the excess input. By default
-  /// `whitespace()` is used. Two arguments can be provided to have different
-  /// parsers on the [left] and [right] side.
-  ///
-  /// For example, the parser `letter().plus().trim()` returns `['a', 'b']`
-  /// for the input `' ab\n'` and consumes the complete input string.
-  Parser trim([Parser left, Parser right]) {
-    if (left == null) left = whitespace();
-    if (right == null) right = left;
-    return new TrimmingParser(this, left, right);
-  }
-
-  /// Returns a parser that succeeds only if the receiver consumes the complete
-  /// input, otherwise return a failure with the optional [message].
-  ///
-  /// For example, the parser `letter().end()` succeeds on the input `'a'`
-  /// and fails on `'ab'`. In contrast the parser `letter()` alone would
-  /// succeed on both inputs, but not consume everything for the second input.
-  Parser end([String message = 'end of input expected']) {
-    return new EndOfInputParser(this, message);
-  }
-
-  /// Returns a parser that points to the receiver, but can be changed to point
-  /// to something else at a later point in time.
-  ///
-  /// For example, the parser `letter().settable()` behaves exactly the same
-  /// as `letter()`, but it can be replaced with another parser using
-  /// [SettableParser.set].
-  SettableParser settable() => new SettableParser(this);
-
-  /// Returns a parser that evaluates a [function] as the production action
-  /// on success of the receiver.
-  ///
-  /// For example, the parser `digit().map((char) => int.parse(char))` returns
-  /// the number `1` for the input string `'1'`. If the delegate fail, the
-  /// production action is not executed and the failure is passed on.
-  Parser map(Function function) => new ActionParser(this, function);
-
-  /// Returns a parser that transform a successful parse result by returning
-  /// the element at [index] of a list. A negative index can be used to access
-  /// the elements from the back of the list.
-  ///
-  /// For example, the parser `letter().star().pick(-1)` returns the last
-  /// letter parsed. For the input `'abc'` it returns `'c'`.
-  Parser pick(int index) {
-    return this.map((List list) {
-      return list[index < 0 ? list.length + index : index];
-    });
-  }
-
-  /// Returns a parser that transforms a successful parse result by returning
-  /// the permuted elements at [indexes] of a list. Negative indexes can be
-  /// used to access the elements from the back of the list.
-  ///
-  /// For example, the parser `letter().star().permute([0, -1])` returns the
-  /// first and last letter parsed. For the input `'abc'` it returns
-  /// `['a', 'c']`.
-  Parser permute(List<int> indexes) {
-    return this.map((List list) {
-      return indexes.map((index) {
-        return list[index < 0 ? list.length + index : index];
-      }).toList();
-    });
-  }
-
-  /// Returns a parser that consumes the receiver one or more times separated
-  /// by the [separator] parser. The resulting parser returns a flat list of
-  /// the parse results of the receiver interleaved with the parse result of the
-  /// separator parser.
-  ///
-  /// If the optional argument [includeSeparators] is set to `false`, then the
-  /// separators are not included in the parse result. If the optional argument
-  /// [optionalSeparatorAtEnd] is set to `true` the parser also accepts an
-  /// optional separator at the end.
-  ///
-  /// For example, the parser `digit().separatedBy(char('-'))` returns a parser
-  /// that consumes input like `'1-2-3'` and returns a list of the elements and
-  /// separators: `['1', '-', '2', '-', '3']`.
-  Parser separatedBy(Parser separator,
-      {bool includeSeparators: true, bool optionalSeparatorAtEnd: false}) {
-    var repeater = new SequenceParser([separator, this]).star();
-    var parser = new SequenceParser(optionalSeparatorAtEnd
-        ? [this, repeater, separator.optional(separator)]
-        : [this, repeater]);
-    return parser.map((List list) {
-      var result = new List();
-      result.add(list[0]);
-      for (var tuple in list[1]) {
-        if (includeSeparators) {
-          result.add(tuple[0]);
-        }
-        result.add(tuple[1]);
-      }
-      if (includeSeparators &&
-          optionalSeparatorAtEnd &&
-          !identical(list[2], separator)) {
-        result.add(list[2]);
-      }
-      return result;
-    });
-  }
-
-  /// Returns a shallow copy of the receiver.
-  ///
-  /// Override this method in all subclasses.
-  Parser copy();
-
-  /// Recursively tests for structural equality of two parsers.
-  ///
-  /// The code can automatically deals with recursive parsers and parsers that
-  /// refer to other parsers. This code is supposed to be overridden by parsers
-  /// that add other state.
-  bool isEqualTo(Parser other, [Set<Parser> seen]) {
-    if (seen == null) {
-      seen = new Set();
-    }
-    if (this == other || seen.contains(this)) {
-      return true;
-    }
-    seen.add(this);
-    return runtimeType == other.runtimeType &&
-        hasEqualProperties(other) &&
-        hasEqualChildren(other, seen);
-  }
-
-  /// Compare the properties of two parsers. Normally this method should not be
-  /// called directly, instead use [Parser#equals].
-  ///
-  /// Override this method in all subclasses that add new state.
-  bool hasEqualProperties(Parser other) => true;
-
-  /// Compare the children of two parsers. Normally this method should not be
-  /// called directly, instead use [Parser#equals].
-  ///
-  /// Normally this method does not need to be overridden, as this method works
-  /// generically on the returned [Parser#children].
-  bool hasEqualChildren(Parser other, Set<Parser> seen) {
-    var thisChildren = children,
-        otherChildren = other.children;
-    if (thisChildren.length != otherChildren.length) {
-      return false;
-    }
-    for (var i = 0; i < thisChildren.length; i++) {
-      if (!thisChildren[i].isEqualTo(otherChildren[i], seen)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /// Returns a list of directly referenced parsers.
-  ///
-  /// For example, `letter().children` returns the empty collection `[]`,
-  /// because the letter parser is a primitive or leaf parser that does not
-  /// depend or call any other parser.
-  ///
-  /// In contrast, `letter().or(digit()).children` returns a collection
-  /// containing both the `letter()` and `digit()` parser.
-  List<Parser> get children => const [];
-
-  /// Changes the receiver by replacing [source] with [target]. Does nothing
-  /// if [source] does not exist in [Parser.children].
-  ///
-  /// The following example creates a letter parser and then defines a parser
-  /// called `example` that accepts one or more letters. Eventually the parser
-  /// `example` is modified by replacing the `letter` parser with a new
-  /// parser that accepts a digit. The resulting `example` parser accepts one
-  /// or more digits.
-  ///
-  ///     var letter = letter();
-  ///     var example = letter.plus();
-  ///     example.replace(letter, digit());
-  void replace(Parser source, Parser target) {
-    // no children, nothing to do
-  }
-}
diff --git a/packages/petitparser/lib/src/petitparser/parsers.dart b/packages/petitparser/lib/src/petitparser/parsers.dart
deleted file mode 100644
index 8cc02d1..0000000
--- a/packages/petitparser/lib/src/petitparser/parsers.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-part of petitparser;
-
-/// Returns a parser that consumes nothing and succeeds.
-///
-/// For example, `char('a').or(epsilon())` is equivalent to
-/// `char('a').optional()`.
-Parser epsilon([result]) => new EpsilonParser(result);
-
-/// A parser that consumes nothing and succeeds.
-class EpsilonParser extends Parser {
-  final _result;
-
-  EpsilonParser(this._result);
-
-  @override
-  Result parseOn(Context context) => context.success(_result);
-
-  @override
-  Parser copy() => new EpsilonParser(_result);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is EpsilonParser
-        && super.hasEqualProperties(other)
-        && _result == other._result;
-  }
-}
-
-/// Returns a parser that consumes nothing and fails.
-///
-/// For example, `failure()` always fails, no matter what input it is given.
-Parser failure([String message = 'unable to parse']) {
-  return new FailureParser(message);
-}
-
-/// A parser that consumes nothing and fails.
-class FailureParser extends Parser {
-  final String _message;
-
-  FailureParser(this._message);
-
-  @override
-  Result parseOn(Context context) => context.failure(_message);
-
-  @override
-  String toString() => '${super.toString()}[$_message]';
-
-  @override
-  Parser copy() => new FailureParser(_message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is FailureParser
-        && super.hasEqualProperties(other)
-        && _message == other._message;
-  }
-}
-
-/// Returns a parser that is not defined, but that can be set at a later
-/// point in time.
-///
-/// For example, the following code sets up a parser that points to itself
-/// and that accepts a sequence of a's ended with the letter b.
-///
-///     var p = undefined();
-///     p.set(char('a').seq(p).or(char('b')));
-SettableParser undefined([String message = 'undefined parser']) {
-  return failure(message).settable();
-}
-
-/// A parser that is not defined, but that can be set at a later
-/// point in time.
-class SettableParser extends DelegateParser {
-  SettableParser(parser) : super(parser);
-
-  /// Sets the receiver to delegate to [parser].
-  void set(Parser parser) => replace(children[0], parser);
-
-  @override
-  Parser copy() => new SettableParser(_delegate);
-}
diff --git a/packages/petitparser/lib/src/petitparser/predicates.dart b/packages/petitparser/lib/src/petitparser/predicates.dart
deleted file mode 100644
index d5a750e..0000000
--- a/packages/petitparser/lib/src/petitparser/predicates.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-part of petitparser;
-
-/// Returns a parser that accepts any input element.
-///
-/// For example, `any()` succeeds and consumes any given letter. It only
-/// fails for an empty input.
-Parser any([String message = 'input expected']) {
-  return new AnyParser(message);
-}
-
-/// A parser that accepts any input element.
-class AnyParser extends Parser {
-  final String _message;
-
-  AnyParser(this._message);
-
-  @override
-  Result parseOn(Context context) {
-    var position = context.position;
-    var buffer = context.buffer;
-    return position < buffer.length
-        ? context.success(buffer[position], position + 1)
-        : context.failure(_message);
-  }
-
-  @override
-  Parser copy() => new AnyParser(_message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is AnyParser
-        && super.hasEqualProperties(other)
-        && _message == other._message;
-  }
-}
-
-/// Returns a parser that accepts any of the [elements].
-///
-/// For example, `anyIn('ab')` succeeds and consumes either the letter
-/// `'a'` or the letter `'b'`. For any other input the parser fails.
-Parser anyIn(elements, [String message]) {
-  return predicate(1, (each) => elements.indexOf(each) >= 0,
-      message != null ? message : 'any of $elements expected');
-}
-
-/// Returns a parser that accepts the string [element].
-///
-/// For example, `string('foo')` succeeds and consumes the input string
-/// `'foo'`. Fails for any other input.
-Parser string(String element, [String message]) {
-  return predicate(element.length, (String each) => element == each,
-      message != null ? message : '$element expected');
-}
-
-/// Returns a parser that accepts the string [element] ignoring the case.
-///
-/// For example, `stringIgnoreCase('foo')` succeeds and consumes the input
-/// string `'Foo'` or `'FOO'`. Fails for any other input.
-Parser stringIgnoreCase(String element, [String message]) {
-  final lowerElement = element.toLowerCase();
-  return predicate(element.length,
-      (String each) => lowerElement == each.toLowerCase(),
-      message != null ? message : '$element expected');
-}
-
-/// A generic predicate function returning [true] or [false] for a given
-/// [input] argument.
-typedef bool Predicate(input);
-
-/// Returns a parser that reads input of the specified [length], accepts
-/// it if the [predicate] matches, or fails with the given [message].
-Parser predicate(int length, Predicate predicate, String message) {
-  return new PredicateParser(length, predicate, message);
-}
-
-/// A parser for a literal satisfying a predicate.
-class PredicateParser extends Parser {
-  final int _length;
-  final Predicate _predicate;
-  final String _message;
-
-  PredicateParser(this._length, this._predicate, this._message);
-
-  @override
-  Result parseOn(Context context) {
-    final start = context.position;
-    final stop = start + _length;
-    if (stop <= context.buffer.length) {
-      var result = context.buffer is String
-          ? context.buffer.substring(start, stop)
-          : context.buffer.sublist(start, stop);
-      if (_predicate(result)) {
-        return context.success(result, stop);
-      }
-    }
-    return context.failure(_message);
-  }
-
-  @override
-  String toString() => '${super.toString()}[$_message]';
-
-  @override
-  Parser copy() => new PredicateParser(_length, _predicate, _message);
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is PredicateParser
-        && super.hasEqualProperties(other)
-        && _length == other._length
-        && _predicate == other._predicate
-        && _message == other._message;
-  }
-}
diff --git a/packages/petitparser/lib/src/petitparser/repeaters.dart b/packages/petitparser/lib/src/petitparser/repeaters.dart
deleted file mode 100644
index 0bb144e..0000000
--- a/packages/petitparser/lib/src/petitparser/repeaters.dart
+++ /dev/null
@@ -1,173 +0,0 @@
-part of petitparser;
-
-/// An [int] used to mark an unbounded maximum repetition.
-const int unbounded = -1;
-
-/// An abstract parser that repeatedly parses between 'min' and 'max' instances of
-/// its delegate.
-abstract class RepeatingParser extends DelegateParser {
-  final int _min;
-  final int _max;
-
-  RepeatingParser(Parser parser, this._min, this._max) : super(parser) {
-    assert(0 <= _min);
-    assert(_max == unbounded || _min <= _max);
-  }
-
-  @override
-  String toString() {
-    var max = _max == unbounded ? '*' : _max;
-    return '${super.toString()}[$_min..$max]';
-  }
-
-  @override
-  bool hasEqualProperties(Parser other) {
-    return other is RepeatingParser
-        && super.hasEqualProperties(other)
-        && _min == other._min
-        && _max == other._max;
-  }
-}
-
-/// A greedy parser that repeatedly parses between 'min' and 'max' instances of
-/// its delegate.
-class PossessiveRepeatingParser extends RepeatingParser {
-  PossessiveRepeatingParser(Parser parser, int min, int max)
-      : super(parser, min, max);
-
-  @override
-  Result parseOn(Context context) {
-    var current = context;
-    var elements = new List();
-    while (elements.length < _min) {
-      var result = _delegate.parseOn(current);
-      if (result.isFailure) {
-        return result;
-      }
-      elements.add(result.value);
-      current = result;
-    }
-    while (_max == unbounded || elements.length < _max) {
-      var result = _delegate.parseOn(current);
-      if (result.isFailure) {
-        return current.success(elements);
-      }
-      elements.add(result.value);
-      current = result;
-    }
-    return current.success(elements);
-  }
-
-  @override
-  Parser copy() => new PossessiveRepeatingParser(_delegate, _min, _max);
-}
-
-/// An abstract parser that repeatedly parses between 'min' and 'max' instances of
-/// its delegate and that requires the input to be completed with a specified parser
-/// 'limit'. Subclasses provide repeating behavior as typically seen in regular
-/// expression implementations (non-blind).
-abstract class LimitedRepeatingParser extends RepeatingParser {
-  Parser _limit;
-
-  LimitedRepeatingParser(Parser parser, this._limit, int min, int max)
-      : super(parser, min, max);
-
-  @override
-  List<Parser> get children => [_delegate, _limit];
-
-  @override
-  void replace(Parser source, Parser target) {
-    super.replace(source, target);
-    if (_limit == source) {
-      _limit = target;
-    }
-  }
-}
-
-/// A greedy repeating parser, commonly seen in regular expression implementations. It
-/// aggressively consumes as much input as possible and then backtracks to meet the
-/// 'limit' condition.
-class GreedyRepeatingParser extends LimitedRepeatingParser {
-  GreedyRepeatingParser(Parser parser, Parser limit, int min, int max)
-      : super(parser, limit, min, max);
-
-  @override
-  Result parseOn(Context context) {
-    var current = context;
-    var elements = new List();
-    while (elements.length < _min) {
-      var result = _delegate.parseOn(current);
-      if (result.isFailure) {
-        return result;
-      }
-      elements.add(result.value);
-      current = result;
-    }
-    var contexts = new List.from([current]);
-    while (_max == unbounded || elements.length < _max) {
-      var result = _delegate.parseOn(current);
-      if (result.isFailure) {
-        break;
-      }
-      elements.add(result.value);
-      contexts.add(current = result);
-    }
-    while (true) {
-      var limit = _limit.parseOn(contexts.last);
-      if (limit.isSuccess) {
-        return contexts.last.success(elements);
-      }
-      if (elements.isEmpty) {
-        return limit;
-      }
-      contexts.removeLast();
-      elements.removeLast();
-      if (contexts.isEmpty) {
-        return limit;
-      }
-    }
-  }
-
-  @override
-  Parser copy() => new GreedyRepeatingParser(_delegate, _limit, _min, _max);
-}
-
-/// A lazy repeating parser, commonly seen in regular expression implementations. It
-/// limits its consumption to meet the 'limit' condition as early as possible.
-class LazyRepeatingParser extends LimitedRepeatingParser {
-  LazyRepeatingParser(Parser parser, Parser limit, int min, int max)
-      : super(parser, limit, min, max);
-
-  @override
-  Result parseOn(Context context) {
-    var current = context;
-    var elements = new List();
-    while (elements.length < _min) {
-      var result = _delegate.parseOn(current);
-      if (result.isFailure) {
-        return result;
-      }
-      elements.add(result.value);
-      current = result;
-    }
-    while (true) {
-      var limit = _limit.parseOn(current);
-      if (limit.isSuccess) {
-        return current.success(elements);
-      } else {
-        if (_max != unbounded && elements.length >= _max) {
-          return limit;
-        }
-        var result = _delegate.parseOn(current);
-        if (result.isFailure) {
-          return limit;
-        }
-        elements.add(result.value);
-        current = result;
-      }
-    }
-  }
-
-  @override
-  Parser copy() => new LazyRepeatingParser(_delegate, _limit, _min, _max);
-}
diff --git a/packages/petitparser/lib/src/petitparser/token.dart b/packages/petitparser/lib/src/petitparser/token.dart
deleted file mode 100644
index 5fd8dcf..0000000
--- a/packages/petitparser/lib/src/petitparser/token.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-part of petitparser;
-
-/// A token represents a parsed part of the input stream.
-///
-/// The token holds the resulting value of the input, the input buffer,
-/// and the start and stop position in the input buffer. It provides many
-/// convenience methods to access the state of the token.
-class Token {
-
-  /// The parsed value of the token.
-  final value;
-
-  /// The parsed buffer of the token.
-  final buffer;
-
-  /// The start position of the token in the buffer.
-  final int start;
-
-  /// The stop position of the token in the buffer.
-  final int stop;
-
-  /// Constructs a token from the parsed value, the input buffer, and the
-  /// start and stop position in the input buffer.
-  const Token(this.value, this.buffer, this.start, this.stop);
-
-  /// The consumed input of the token.
-  get input => buffer is String
-      ? buffer.substring(start, stop)
-      : buffer.sublist(start, stop);
-
-  /// The length of the token.
-  int get length => stop - start;
-
-  /// The line number of the token (only works for [String] buffers).
-  int get line => Token.lineAndColumnOf(buffer, start)[0];
-
-  /// The column number of this token (only works for [String] buffers).
-  int get column => Token.lineAndColumnOf(buffer, start)[1];
-
-  @override
-  String toString() => 'Token[${positionString(buffer, start)}]: $value';
-
-  @override
-  bool operator ==(other) {
-    return other is Token
-        && value == other.value
-        && start == other.start
-        && stop == other.stop;
-  }
-
-  @override
-  int get hashCode => value.hashCode + start.hashCode + stop.hashCode;
-
-  /// Returns a parser for that detects newlines platform independently.
-  static Parser newlineParser() => _newlineParser;
-
-  static final Parser _newlineParser = char('\n') | (char('\r') & char('\n').optional());
-
-  /// Converts the [position] index in a [buffer] to a line and column tuple.
-  static List<int> lineAndColumnOf(String buffer, int position) {
-    var line = 1, offset = 0;
-    for (var token in newlineParser().token().matchesSkipping(buffer)) {
-      if (position < token.stop) {
-        return [line, position - offset + 1];
-      }
-      line++;
-      offset = token.stop;
-    }
-    return [line, position - offset + 1];
-  }
-
-  /// Returns a human readable string representing the [position] index in a [buffer].
-  static String positionString(buffer, int position) {
-    if (buffer is String) {
-      var lineAndColumn = Token.lineAndColumnOf(buffer, position);
-      return '${lineAndColumn[0]}:${lineAndColumn[1]}';
-    } else {
-      return '$position';
-    }
-  }
-}
diff --git a/packages/petitparser/lib/src/reflection/iterable.dart b/packages/petitparser/lib/src/reflection/iterable.dart
deleted file mode 100644
index 8273d35..0000000
--- a/packages/petitparser/lib/src/reflection/iterable.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-part of petitparser.reflection;
-
-/// Returns a lazy iterable over all parsers reachable from a [root].
-///
-/// For example, the following code prints the two parsers of the
-/// defined grammar:
-///
-///     var parser = range('0', '9').star();
-///     allParser(parser).forEach((each) {
-///       print(each);
-///     });
-///
-Iterable<Parser> allParser(Parser root) => new _ParserIterable(root);
-
-class _ParserIterable extends IterableBase<Parser> {
-  final Parser root;
-
-  _ParserIterable(this.root);
-
-  @override
-  Iterator<Parser> get iterator => new _ParserIterator([root]);
-}
-
-class _ParserIterator implements Iterator<Parser> {
-  final List<Parser> todo;
-  final Set<Parser> seen;
-
-  _ParserIterator(Iterable<Parser> roots)
-      : todo = new List.from(roots),
-        seen = new Set.from(roots);
-
-  @override
-  Parser current;
-
-  @override
-  bool moveNext() {
-    if (todo.isEmpty) {
-      current = null;
-      return false;
-    }
-    current = todo.removeLast();
-    for (var parser in current.children) {
-      if (!seen.contains(parser)) {
-        todo.add(parser);
-        seen.add(parser);
-      }
-    }
-    return true;
-  }
-}
diff --git a/packages/petitparser/lib/src/reflection/optimize.dart b/packages/petitparser/lib/src/reflection/optimize.dart
deleted file mode 100644
index c9dd847..0000000
--- a/packages/petitparser/lib/src/reflection/optimize.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-part of petitparser.reflection;
-
-/// Returns a copy of [parser] with all settable parsers removed.
-Parser removeSettables(Parser parser) {
-  return transformParser(parser, (each) {
-    while (each is SettableParser) {
-      each = each.children.first;
-    }
-    return each;
-  });
-}
-
-/// Returns a copy of [parser] with all duplicates parsers collapsed.
-Parser removeDuplicates(Parser parser) {
-  var uniques = new Set();
-  return transformParser(parser, (source) {
-    var target = uniques.firstWhere((each) {
-      return source != each && source.isEqualTo(each);
-    }, orElse: () => null);
-    if (target == null) {
-      uniques.add(source);
-      return source;
-    } else {
-      return target;
-    }
-  });
-}
diff --git a/packages/petitparser/lib/src/reflection/transform.dart b/packages/petitparser/lib/src/reflection/transform.dart
deleted file mode 100644
index 8ee449f..0000000
--- a/packages/petitparser/lib/src/reflection/transform.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-part of petitparser.reflection;
-
-/// A function transforming one parser to another one.
-typedef Parser TransformationHandler(Parser parser);
-
-/// Transforms all parsers reachable from [parser] with the given [handler].
-/// The identity function returns a copy of the the incoming parser.
-///
-/// The implementation first creates a copy of each parser reachable in the
-/// input grammar; then the resulting grammar is traversed until all references
-/// to old parsers are replaced with the transformed ones.
-Parser transformParser(Parser parser, TransformationHandler handler) {
-  var mapping = new Map.identity();
-  for (var each in allParser(parser)) {
-    mapping[each] = handler(each.copy());
-  }
-  var seen = new Set.from(mapping.values);
-  var todo = new List.from(mapping.values);
-  while (todo.isNotEmpty) {
-    var parent = todo.removeLast();
-    for (var child in parent.children) {
-      if (mapping.containsKey(child)) {
-        parent.replace(child, mapping[child]);
-      } else if (!seen.contains(child)) {
-        seen.add(child);
-        todo.add(child);
-      }
-    }
-  }
-  return mapping[parser];
-}
diff --git a/packages/petitparser/lib/src/smalltalk/grammar.dart b/packages/petitparser/lib/src/smalltalk/grammar.dart
deleted file mode 100644
index 24a2824..0000000
--- a/packages/petitparser/lib/src/smalltalk/grammar.dart
+++ /dev/null
@@ -1,225 +0,0 @@
-part of petitparser.smalltalk;
-
-/// Smalltalk grammar.
-class SmalltalkGrammar extends GrammarParser {
-  SmalltalkGrammar() : super(new SmalltalkGrammarDefinition());
-}
-
-/// Smalltalk grammar definition.
-class SmalltalkGrammarDefinition extends GrammarDefinition {
-
-  // the original implementation used a handwritten parser to
-  // build special token objects
-  token(input) {
-    if (input is String) {
-      input = input.length == 1 ? char(input) : string(input);
-    }
-    return input.token().trim(ref(spacer));
-  }
-
-  // the original implementation uses a handwritten parser to
-  // efficiently consume whitespace and comments
-  spacer() => whitespace()
-      .or(ref(comment));
-  comment() => char('"')
-      .seq(char('"').neg().star())
-      .seq(char('"'));
-
-  // the original implementation uses the hand written number
-  // parser of the system, this is the spec of the ANSI standard
-  number() => char('-').optional()
-      .seq(ref(positiveNumber));
-  positiveNumber() => ref(scaledDecimal)
-      .or(ref(float))
-      .or(ref(integer));
-
-  integer() => ref(radixInteger)
-      .or(ref(decimalInteger));
-  decimalInteger() => ref(digits);
-  digits() => digit().plus();
-  radixInteger() => ref(radixSpecifier)
-      .seq(char('r'))
-      .seq(ref(radixDigits));
-  radixSpecifier() => ref(digits);
-  radixDigits() => pattern('0-9A-Z').plus();
-
-  float() => ref(mantissa)
-      .seq(ref(exponentLetter)
-          .seq(ref(exponent))
-          .optional());
-  mantissa() => ref(digits)
-      .seq(char('.'))
-      .seq(ref(digits));
-  exponent() => char('-')
-      .seq(ref(decimalInteger));
-  exponentLetter() => pattern('edq');
-
-  scaledDecimal() => ref(scaledMantissa)
-      .seq(char('s'))
-      .seq(ref(fractionalDigits).optional());
-  scaledMantissa() => ref(decimalInteger)
-      .or(ref(mantissa));
-  fractionalDigits() => ref(decimalInteger);
-
-  // the original smalltalk grammar
-  array() => ref(token, '{')
-      .seq(ref(expression).separatedBy(ref(periodToken))
-        .seq(ref(periodToken).optional()).optional())
-      .seq(ref(token, '}'));
-  arrayItem() => ref(literal)
-      .or(ref(symbolLiteralArray))
-      .or(ref(arrayLiteralArray))
-      .or(ref(byteLiteralArray));
-  arrayLiteral() => ref(token, '#(')
-      .seq(ref(arrayItem).star())
-      .seq(ref(token, ')'));
-  arrayLiteralArray() => ref(token, '(')
-      .seq(ref(arrayItem).star())
-      .seq(ref(token, ')'));
-  assignment() => ref(variable)
-      .seq(ref(assignmentToken));
-  assignmentToken() => ref(token, ':=');
-  binary() => pattern('!%&*+,-/<=>?@\\|~').plus();
-  binaryExpression() => ref(unaryExpression)
-      .seq(ref(binaryMessage).star());
-  binaryMessage() => ref(binaryToken)
-      .seq(ref(unaryExpression));
-  binaryMethod() => ref(binaryToken)
-      .seq(ref(variable));
-  binaryPragma() => ref(binaryToken)
-      .seq(ref(arrayItem));
-  binaryToken() => ref(token, ref(binary));
-  block() => ref(token, '[')
-      .seq(ref(blockBody))
-      .seq(ref(token, ']'));
-  blockArgument() => ref(token, ':')
-      .seq(ref(variable));
-  blockArguments() => ref(blockArgumentsWith)
-      .or(ref(blockArgumentsWithout));
-  blockArgumentsWith() => ref(blockArgument).plus()
-      .seq(ref(token, '|').or(ref(token, ']').and()));
-  blockArgumentsWithout() => epsilon();
-  blockBody() => ref(blockArguments)
-      .seq(ref(sequence));
-  byteLiteral() => ref(token, '#[')
-      .seq(ref(numberLiteral).star())
-      .seq(ref(token, ']'));
-  byteLiteralArray() => ref(token, '[')
-      .seq(ref(numberLiteral).star())
-      .seq(ref(token, ']'));
-  cascadeExpression() => ref(keywordExpression)
-      .seq(ref(cascadeMessage).star());
-  cascadeMessage() => ref(token, ';')
-      .seq(ref(message));
-  character() => char('\$').seq(any());
-  characterLiteral() => ref(characterToken);
-  characterToken() => ref(token, ref(character));
-  expression() => ref(assignment).star()
-      .seq(ref(cascadeExpression));
-  falseLiteral() => ref(falseToken);
-  falseToken() => ref(token, 'false')
-      .seq(word().not());
-  identifier() => pattern('a-zA-Z_')
-      .seq(word().star());
-  identifierToken() => ref(token, ref(identifier));
-  keyword() => ref(identifier)
-      .seq(char(':'));
-  keywordExpression() => ref(binaryExpression)
-      .seq(ref(keywordMessage).optional());
-  keywordMessage() => ref(keywordToken)
-      .seq(ref(binaryExpression)).plus();
-  keywordMethod() => ref(keywordToken)
-      .seq(ref(variable)).plus();
-  keywordPragma() => ref(keywordToken)
-      .seq(ref(arrayItem)).plus();
-  keywordToken() => ref(token, ref(keyword));
-  literal() => ref(numberLiteral)
-      .or(ref(stringLiteral))
-      .or(ref(characterLiteral))
-      .or(ref(arrayLiteral))
-      .or(ref(byteLiteral))
-      .or(ref(symbolLiteral))
-      .or(ref(nilLiteral))
-      .or(ref(trueLiteral))
-      .or(ref(falseLiteral));
-  message() => ref(keywordMessage)
-      .or(ref(binaryMessage))
-      .or(ref(unaryMessage));
-  method() => ref(methodDeclaration)
-      .seq(ref(methodSequence));
-  methodDeclaration() => ref(keywordMethod)
-      .or(ref(unaryMethod))
-      .or(ref(binaryMethod));
-  methodSequence() => ref(periodToken).star()
-      .seq(ref(pragmas))
-      .seq(ref(periodToken).star())
-      .seq(ref(temporaries))
-      .seq(ref(periodToken).star())
-      .seq(ref(pragmas))
-      .seq(ref(periodToken).star())
-      .seq(ref(statements));
-  multiword() => ref(keyword).plus();
-  nilLiteral() => ref(nilToken);
-  nilToken() => ref(token, 'nil')
-      .seq(word().not());
-  numberLiteral() => ref(numberToken);
-  numberToken() => ref(token, ref(number));
-  parens() => ref(token, '(')
-      .seq(ref(expression))
-      .seq(ref(token, ')'));
-  period() => char('.');
-  periodToken() => ref(token, ref(period));
-  pragma() => ref(token, '<')
-      .seq(ref(pragmaMessage))
-      .seq(ref(token, '>'));
-  pragmaMessage() => ref(keywordPragma)
-      .or(ref(unaryPragma))
-      .or(ref(binaryPragma));
-  pragmas() => ref(pragma).star();
-  primary() => ref(literal)
-      .or(ref(variable))
-      .or(ref(block))
-      .or(ref(parens))
-      .or(ref(array));
-  answer() => ref(token, '^')
-      .seq(ref(expression));
-  sequence() => ref(temporaries)
-      .seq(ref(periodToken).star())
-      .seq(ref(statements));
-  start() => ref(startMethod);
-  startMethod() => ref(method).end();
-  statements() => ref(expression)
-      .seq(ref(periodToken).plus().seq(ref(statements))
-          .or(ref(periodToken).star()))
-          .or(ref(answer).seq(ref(periodToken).star()))
-          .or(ref(periodToken).star());
-  string_() => char('\'')
-      .seq(string('\'\'').or(pattern('^\'')).star())
-      .seq(char('\''));
-  stringLiteral() => ref(stringToken);
-  stringToken() => ref(token, ref(string_));
-  symbol() => ref(unary)
-      .or(ref(binary))
-      .or(ref(multiword))
-      .or(ref(string_));
-  symbolLiteral() => ref(token, '#').plus()
-      .seq(ref(token, ref(symbol)));
-  symbolLiteralArray() => ref(token, ref(symbol));
-  temporaries() => ref(token, '|')
-      .seq(ref(variable).star())
-      .seq(ref(token, '|'))
-          .optional();
-  trueLiteral() => ref(trueToken);
-  trueToken() => ref(token, 'true')
-      .seq(word().not());
-  unary() => ref(identifier)
-      .seq(char(':').not());
-  unaryExpression() => ref(primary)
-      .seq(ref(unaryMessage).star());
-  unaryMessage() => ref(unaryToken);
-  unaryMethod() => ref(identifierToken);
-  unaryPragma() => ref(identifierToken);
-  unaryToken() => ref(token, ref(unary));
-  variable() => ref(identifierToken);
-
-}
diff --git a/packages/petitparser/lib/test.dart b/packages/petitparser/lib/test.dart
deleted file mode 100644
index 508b2e0..0000000
--- a/packages/petitparser/lib/test.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-/// This package contains matches to write tests for parsers.
-///
-/// Examples:
-///
-///     var json = new JsonParser();
-///
-///     // verifies that the input gets parsed and all input is consumed
-///     expect('{"a": 1}', accepts(new JsonParser()));
-///
-///     // verifies that the input gets parsed to a dictionary and that all input is consumed
-///     expect('{"a": 1}', parses(new JsonParser(), {'a': 1}));
-
-library petitparser.test_util;
-
-import 'package:matcher/matcher.dart';
-import 'package:petitparser/petitparser.dart' hide predicate;
-
-/// Returns a matcher that succeeds if the [parser] accepts the input.
-Matcher accept(Parser parser) {
-  return parse(parser, predicate((value) => true, 'input'));
-}
-
-/// Returns a matcher that succeeds if the [parser] succeeds and accepts the provided [matcher].
-Matcher parse(Parser parser, matcher, [int position = -1]) {
-  return new _Parse(parser, wrapMatcher(matcher), position);
-}
-
-class _Parse extends Matcher {
-
-  final Parser parser;
-  final Matcher matcher;
-  final int position;
-
-  _Parse(this.parser, this.matcher, this.position);
-
-  @override
-  bool matches(item, Map matchState) {
-    Result result = parser.parse(item);
-    if (result.isFailure) {
-      addStateInfo(matchState, {'reason': 'failure', 'result': result});
-      return false;
-    }
-    if (!matcher.matches(result.value, matchState)) {
-      addStateInfo(matchState, {'reason': 'matcher', 'result': result});
-      return false;
-    }
-    if (position >= 0 && position != result.value) {
-      addStateInfo(matchState, {'reason': 'position', 'result': result});
-      return false;
-    }
-    return true;
-  }
-
-  @override
-  Description describe(Description description) {
-    return description.add('"$parser" accepts ').addDescriptionOf(matcher);
-  }
-
-  @override
-  Description describeMismatch(item, Description description, Map matchState, bool verbose) {
-    description.add('"$parser" produces "${matchState['result']}"');
-    switch (matchState['reason']) {
-      case 'failure':
-        description.add(' which is not accepted');
-        return description;
-      case 'matcher':
-        description.add(' which parse result ');
-        var subDescription = new StringDescription();
-        matcher.describeMismatch(matchState['result'].value, subDescription,
-            matchState['state'], verbose);
-        if (subDescription.length > 0) {
-          description.add(subDescription.toString());
-        } else {
-          description.add('doesn\'t match');
-          matcher.describe(description);
-        }
-        return description;
-      case 'position':
-        description
-            .add(' that consumes input to ')
-            .add(matchState['result'].position.toString())
-            .add(' instead of ')
-            .add(position.toString());
-        return description;
-    }
-    throw new Exception('Internal matcher error');
-  }
-}
diff --git a/packages/petitparser/pubspec.yaml b/packages/petitparser/pubspec.yaml
deleted file mode 100644
index b45791a..0000000
--- a/packages/petitparser/pubspec.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: petitparser
-version: 1.5.0
-author: Lukas Renggli <renggli@gmail.com>
-description: Dynamic parser combinator framework.
-homepage: https://github.com/renggli/dart-petitparser
-environment:
-  sdk: '>=1.8.0 <2.0.0'
-dev_dependencies:
-  browser: '>=0.10.0 <0.11.0'
-  test: '>=0.12.1 <0.13.0'
diff --git a/packages/petitparser/test/all_tests.dart b/packages/petitparser/test/all_tests.dart
deleted file mode 100644
index 3871de2..0000000
--- a/packages/petitparser/test/all_tests.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-library petitparser.test.all_tests;
-
-import 'package:test/test.dart';
-
-import 'petitparser_test.dart' as core_test;
-import 'dart_test.dart' as dart_test;
-import 'debug_test.dart' as debug_test;
-import 'json_test.dart' as json_test;
-import 'lisp_test.dart' as lisp_test;
-import 'reflection_test.dart' as reflection_test;
-import 'smalltalk_test.dart' as smalltalk_test;
-import 'test_test.dart' as test_test;
-
-void main() {
-  group('PetitParser', core_test.main);
-  group('Dart', dart_test.main);
-  group('Debug', debug_test.main);
-  group('JSON', json_test.main);
-  group('Lisp', lisp_test.main);
-  group('Reflection', reflection_test.main);
-  group('Smalltalk', smalltalk_test.main);
-  group('Test', test_test.main);
-}
diff --git a/packages/petitparser/test/core_benchmark.dart b/packages/petitparser/test/core_benchmark.dart
deleted file mode 100644
index a907ec9..0000000
--- a/packages/petitparser/test/core_benchmark.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-library petitparser.test.all_benchmark;
-
-import 'package:petitparser/petitparser.dart';
-
-double benchmark(Function function,
-    [int warmup = 100, int milliseconds = 2500]) {
-  var count = 0;
-  var elapsed = 0;
-  var watch = new Stopwatch();
-  while (warmup-- > 0) {
-    function();
-  }
-  watch.start();
-  while (elapsed < milliseconds) {
-    function();
-    elapsed = watch.elapsedMilliseconds;
-    count++;
-  }
-  return elapsed / count;
-}
-
-Function charTest(List<String> inputs, Parser parser) {
-  return () {
-    for (var i = 0; i < inputs.length; i++) {
-      parser.parse(inputs[i]);
-    }
-  };
-}
-
-final characters = new List.generate(256, (value) => new String.fromCharCode(value));
-
-Function stringTest(String input, Parser parser) {
-  return () {
-    parser.parse(input);
-  };
-}
-
-final string = characters.join();
-
-final benchmarks = {
-
-  // char tests
-  "any()": charTest(characters, any()),
-  "anyOf('uncopyrightable')": charTest(characters, anyOf('uncopyrightable')),
-  "char('a')": charTest(characters, char('a')),
-  "digit()": charTest(characters, digit()),
-  "letter()": charTest(characters, letter()),
-  "lowercase()": charTest(characters, lowercase()),
-  "noneOf('uncopyrightable')": charTest(characters, noneOf('uncopyrightable')),
-  "pattern('^a')": charTest(characters, pattern('^a')),
-  "pattern('^a-cx-zA-CX-Z1-37-9')": charTest(characters, pattern('^a-cx-zA-CX-Z1-37-9')),
-  "pattern('^a-z')": charTest(characters, pattern('^a-z')),
-  "pattern('^acegik')": charTest(characters, pattern('^acegik')),
-  "pattern('a')": charTest(characters, pattern('a')),
-  "pattern('a-cx-zA-CX-Z1-37-9')": charTest(characters, pattern('a-cx-zA-CX-Z1-37-9')),
-  "pattern('a-z')": charTest(characters, pattern('a-z')),
-  "pattern('acegik')": charTest(characters, pattern('acegik')),
-  "range('a', 'z')": charTest(characters, range('a', 'z')),
-  "uppercase()": charTest(characters, uppercase()),
-  "whitespace()": charTest(characters, whitespace()),
-  "word()": charTest(characters, word()),
-
-  // combinator tests
-  "star()": stringTest(string, any().star()),
-  "starLazy()": stringTest(string, any().starLazy(failure())),
-  "starGreedy()": stringTest(string, any().starGreedy(failure())),
-  "plus()": stringTest(string, any().plus()),
-  "plusLazy()": stringTest(string, any().plusLazy(failure())),
-  "plusGreedy()": stringTest(string, any().plusGreedy(failure())),
-  "or()": stringTest(string, failure().or(any()).star()),
-  "seq()": stringTest(string, new SequenceParser(new List.filled(string.length, any()))),
-};
-
-void main() {
-  print('<?xml version="1.0"?>');
-  print('<benchmarks>');
-  for (var name in benchmarks.keys) {
-    print('  <benchmark name="$name">${benchmark(benchmarks[name])}</benchmark>');
-  }
-  print('</benchmarks>');
-}
diff --git a/packages/petitparser/test/dart_file_tests.dart b/packages/petitparser/test/dart_file_tests.dart
deleted file mode 100644
index d30c21a..0000000
--- a/packages/petitparser/test/dart_file_tests.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-/// This test-case automatically generates various tests from Dart source
-/// code. Unfortunately the parser is currently unable to parse most of
-/// these files.
-library petitparser.test.dart_file_test;
-
-import 'dart:io';
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/dart.dart';
-import 'package:petitparser/test.dart';
-
-void generateTests(DartGrammar dart, String title, List<FileSystemEntity> files) {
-  group(title, () {
-    files
-        .where((file) => file is File && file.path.endsWith('.dart'))
-        .forEach((File file) {
-          test(file.path, () {
-            var source = new StringBuffer();
-            file
-                .openRead()
-                .transform(SYSTEM_ENCODING.decoder)
-                .listen((part) => source.write(part), onDone: expectAsync(() {
-                  expect(source.toString(), accept(dart));
-                }), onError: fail);
-          });
-        });
-  });
-}
-
-void main() {
-  var dart = new DartGrammar();
-  generateTests(dart, 'Dart SDK', new Directory('packages')
-      .listSync(recursive: true, followLinks: false));
-  generateTests(dart, 'PetitParser', Directory.current
-      .listSync(recursive: true, followLinks: true));
-}
diff --git a/packages/petitparser/test/dart_test.dart b/packages/petitparser/test/dart_test.dart
deleted file mode 100644
index 43b6307..0000000
--- a/packages/petitparser/test/dart_test.dart
+++ /dev/null
@@ -1,221 +0,0 @@
-library petitparser.test.dart_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/test.dart';
-import 'package:petitparser/dart.dart';
-
-void main() {
-  var definition = new DartGrammarDefinition();
-  var dart = new DartGrammar();
-  group('basic', () {
-    test('structure', () {
-      expect('library test;', accept(dart));
-      expect('library test; void main() { }', accept(dart));
-      expect('library test; void main() { print(2 + 3); }', accept(dart));
-    });
-  });
-  group('expression', () {
-    var expression = definition.build(start: definition.expression).end();
-    test('literal numbers', () {
-      expect('1', accept(expression));
-      expect('1.2', accept(expression));
-      expect('1.2e3', accept(expression));
-      expect('1.2e-3', accept(expression));
-      expect('-1.2e3', accept(expression));
-      expect('-1.2e-3', accept(expression));
-      expect('-1.2E-3', accept(expression));
-    });
-    test('literal objects', () {
-      expect('true', accept(expression));
-      expect('false', accept(expression));
-      expect('null', accept(expression));
-    });
-    test('unary increment/decrement', () {
-      expect('++a', accept(expression));
-      expect('--a', accept(expression));
-      expect('a++', accept(expression));
-      expect('a--', accept(expression));
-    });
-    test('unary operators', () {
-      expect('+a', accept(expression));
-      expect('-a', accept(expression));
-      expect('!a', accept(expression));
-      expect('~a', accept(expression));
-    });
-    test('binary arithmetic operators', () {
-      expect('a + b', accept(expression));
-      expect('a - b', accept(expression));
-      expect('a * b', accept(expression));
-      expect('a / b', accept(expression));
-      expect('a ~/ b', accept(expression));
-      expect('a % b', accept(expression));
-    });
-    test('binary logical operators', () {
-      expect('a & b', accept(expression));
-      expect('a | b', accept(expression));
-      expect('a ^ b', accept(expression));
-      expect('a && b', accept(expression));
-      expect('a || b', accept(expression));
-    });
-    test('binary conditional operators', () {
-      expect('a > b', accept(expression));
-      expect('a >= b', accept(expression));
-      expect('a < b', accept(expression));
-      expect('a <= b', accept(expression));
-      expect('a == b', accept(expression));
-      expect('a != b', accept(expression));
-      expect('a === b', accept(expression));
-      expect('a !== b', accept(expression));
-    });
-    test('binary shift operators', () {
-      expect('a << b', accept(expression));
-      expect('a >>> b', accept(expression));
-      expect('a >> b', accept(expression));
-    });
-    test('ternary operator', () {
-      expect('a ? b : c', accept(expression));
-    });
-    test('parenthesis', () {
-      expect('(a + b)', accept(expression));
-      expect('a * (b + c)', accept(expression));
-      expect('(a * b) + c', accept(expression));
-    });
-    test('access', () {
-      expect('a.b', accept(expression));
-    });
-    test('invoke', () {
-      expect('a.b()', accept(expression));
-      expect('a.b(c)', accept(expression));
-      expect('a.b(c, d)', accept(expression));
-      expect('a.b(c: d)', accept(expression));
-      expect('a.b(c: d, e: f)', accept(expression));
-    });
-    test('assignment', () {
-      expect('a = b', accept(expression));
-      expect('a += b', accept(expression));
-      expect('a -= b', accept(expression));
-      expect('a *= b', accept(expression));
-      expect('a /= b', accept(expression));
-      expect('a %= b', accept(expression));
-      expect('a ~/= b', accept(expression));
-      expect('a <<= b', accept(expression));
-      expect('a >>>= b', accept(expression));
-      expect('a >>= b', accept(expression));
-      expect('a &= b', accept(expression));
-      expect('a ^= b', accept(expression));
-      expect('a |= b', accept(expression));
-    });
-    test('indexed', () {
-      expect('a[b]', accept(expression));
-      expect('a[b] = c', accept(expression));
-    });
-  });
-  group('whitespace', () {
-    var whitespaces = definition.build(start: definition.HIDDEN).end();
-    test('whitespace', () {
-      expect(' ', accept(whitespaces));
-      expect('\t', accept(whitespaces));
-      expect('\n', accept(whitespaces));
-      expect('\r', accept(whitespaces));
-      expect('a', isNot(accept(whitespaces)));
-    });
-    test('single-line comment', () {
-      expect('//', accept(whitespaces));
-      expect('// foo', accept(whitespaces));
-      expect('//\n', accept(whitespaces));
-      expect('// foo\n', accept(whitespaces));
-    });
-    test('single-line documentation', () {
-      expect('///', accept(whitespaces));
-      expect('/// foo', accept(whitespaces));
-      expect('/// \n', accept(whitespaces));
-      expect('/// foo\n', accept(whitespaces));
-    });
-    test('multi-line comment', () {
-      expect('/**/', accept(whitespaces));
-      expect('/* foo */', accept(whitespaces));
-      expect('/* foo \n bar */', accept(whitespaces));
-      expect('/* foo ** bar */', accept(whitespaces));
-      expect('/* foo * / bar */', accept(whitespaces));
-    });
-    test('multi-line documentation', () {
-      expect('/***/', accept(whitespaces));
-      expect('/*******/', accept(whitespaces));
-      expect('/** foo */', accept(whitespaces));
-      expect('/**\n *\n *\n */', accept(whitespaces));
-    });
-    test('multi-line nested', () {
-      expect('/* outer /* nested */ */', accept(whitespaces));
-      expect('/* outer /* nested /* deeply nested */ */ */', accept(whitespaces));
-      expect('/* outer /* not closed */', isNot(accept(whitespaces)));
-    });
-    test('combined', () {
-      expect('/**/', accept(whitespaces));
-      expect(' /**/', accept(whitespaces));
-      expect('/**/ ', accept(whitespaces));
-      expect(' /**/ ', accept(whitespaces));
-      expect('/**///', accept(whitespaces));
-      expect('/**/ //', accept(whitespaces));
-      expect(' /**/ //', accept(whitespaces));
-    });
-  });
-  group('child parsers', () {
-    var parser = definition.build(start: definition.STRING).end();
-    test('singleLineString', () {
-      expect("'hi'", accept(parser));
-      expect('"hi"', accept(parser));
-      expect('no quotes', isNot(accept(parser)));
-      expect('"missing quote', isNot(accept(parser)));
-      expect("'missing quote", isNot(accept(parser)));
-    });
-  });
-  group('offical', () {
-    test('identifier', () {
-      var parser = definition.build(start: definition.identifier).end();
-      expect('foo', accept(parser));
-      expect('bar9', accept(parser));
-      expect('dollar\$', accept(parser));
-      expect('_foo', accept(parser));
-      expect('_bar9', accept(parser));
-      expect('_dollar\$', accept(parser));
-      expect('\$', accept(parser));
-      expect(' leadingSpace', accept(parser));
-      expect('9', isNot(accept(parser)));
-      expect('3foo', isNot(accept(parser)));
-      expect('', isNot(accept(parser)));
-    });
-    test('numeric literal', () {
-      var parser = definition.build(start: definition.literal).end();
-      expect('0', accept(parser));
-      expect('1984', accept(parser));
-      expect(' 1984', accept(parser));
-      expect('0xCAFE', accept(parser));
-      expect('0XCAFE', accept(parser));
-      expect('0xcafe', accept(parser));
-      expect('0Xcafe', accept(parser));
-      expect('0xCaFe', accept(parser));
-      expect('0XCaFe', accept(parser));
-      expect('3e4', accept(parser));
-      expect('3e-4', accept(parser));
-      expect('3E4', accept(parser));
-      expect('3E-4', accept(parser));
-      expect('3.14E4', accept(parser));
-      expect('3.14E-4', accept(parser));
-      expect('3.14', accept(parser));
-      expect('3e--4', isNot(accept(parser)));
-      expect('5.', isNot(accept(parser)));
-      expect('CAFE', isNot(accept(parser)));
-      expect('0xGHIJ', isNot(accept(parser)));
-      expect('-', isNot(accept(parser)));
-      expect('', isNot(accept(parser)));
-    });
-    test('boolean literal', () {
-      var parser = definition.build(start: definition.literal).end();
-      expect('true', accept(parser));
-      expect('false', accept(parser));
-      expect(' true', accept(parser));
-      expect(' false', accept(parser));
-    });
-  });
-}
diff --git a/packages/petitparser/test/debug_test.dart b/packages/petitparser/test/debug_test.dart
deleted file mode 100644
index c31af68..0000000
--- a/packages/petitparser/test/debug_test.dart
+++ /dev/null
@@ -1,146 +0,0 @@
-library petitparser.test.debug_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/petitparser.dart';
-import 'package:petitparser/debug.dart';
-
-final identifier = letter() & word().star();
-
-main() {
-  group('continuation', () {
-    test('delegation', () {
-      var parser = new ContinuationParser(digit(), (continuation, context) {
-        return continuation(context);
-      });
-      expect(parser.parse('1').isSuccess, isTrue);
-      expect(parser.parse('a').isSuccess, isFalse);
-    });
-    test('divertion', () {
-      var parser = new ContinuationParser(digit(), (continuation, context) {
-        return letter().parseOn(context);
-      });
-      expect(parser.parse('1').isSuccess, isFalse);
-      expect(parser.parse('a').isSuccess, isTrue);
-    });
-    test('resume', () {
-      var capture = new List();
-      var parser = new ContinuationParser(digit(), (continuation, Context context) {
-        capture.add([continuation, context]);
-        // we have to return something for now
-        return context.failure('Abort');
-      });
-      // execute the parser twice to collect the continuations
-      expect(parser.parse('1').isSuccess, isFalse);
-      expect(parser.parse('a').isSuccess, isFalse);
-      // later we can execute the captured continuations
-      expect(capture[0][0](capture[0][1]).isSuccess, isTrue);
-      expect(capture[1][0](capture[1][1]).isSuccess, isFalse);
-      // of course the continuations can be resumed multiple times
-      expect(capture[0][0](capture[0][1]).isSuccess, isTrue);
-      expect(capture[1][0](capture[1][1]).isSuccess, isFalse);
-    });
-    test('success', () {
-      var parser = new ContinuationParser(digit(), (continuation, Context context) {
-        return context.success('Always succeed');
-      });
-      expect(parser.parse('1').isSuccess, isTrue);
-      expect(parser.parse('a').isSuccess, isTrue);
-    });
-    test('failure', () {
-      var parser = new ContinuationParser(digit(), (continuation, Context context) {
-        return context.failure('Always fail');
-      });
-      expect(parser.parse('1').isSuccess, isFalse);
-      expect(parser.parse('a').isSuccess, isFalse);
-    });
-    test('copy', () {
-      var parser = new ContinuationParser(digit(), (continuation, context) {
-        return continuation(context);
-      });
-      var copy = parser.copy();
-      expect(copy.parse('1').isSuccess, isTrue);
-      expect(copy.parse('a').isSuccess, isFalse);
-    });
-  });
-  group('trace', () {
-    test('success', () {
-      var lines = new List();
-      expect(trace(identifier, (line) => lines.add(line)).parse('a').isSuccess, isTrue);
-      expect(lines, [
-        'Instance of \'SequenceParser\'',
-        '  Instance of \'CharacterParser\'[letter expected]',
-        '  Success[1:2]: a',
-        '  Instance of \'PossessiveRepeatingParser\'[0..*]',
-        '    Instance of \'CharacterParser\'[letter or digit expected]',
-        '    Failure[1:2]: letter or digit expected',
-        '  Success[1:2]: []',
-        'Success[1:2]: [a, []]'
-      ]);
-    });
-    test('failure', () {
-      var lines = new List();
-      expect(trace(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue);
-      expect(lines, [
-        'Instance of \'SequenceParser\'',
-        '  Instance of \'CharacterParser\'[letter expected]',
-        '  Failure[1:1]: letter expected',
-        'Failure[1:1]: letter expected'
-      ]);
-    });
-  });
-  group('profile', () {
-    test('success', () {
-      var lines = new List();
-      expect(profile(identifier, (line) => lines.add(line))
-          .parse('ab123').isSuccess, isTrue);
-      lines = lines
-          .map((row) => row.split('\t'))
-          .map((row) => [int.parse(row[0]), int.parse(row[1]), row[2]]);
-      expect(lines, hasLength(4));
-      expect(lines.every((row) => row[1] >= 0), isTrue);
-      expect(lines.firstWhere((row) => row[2].indexOf('SequenceParser') > 0)[0], 1);
-      expect(lines.firstWhere((row) => row[2].indexOf('letter expected') > 0)[0], 1);
-      expect(lines.firstWhere((row) => row[2].indexOf('PossessiveRepeatingParser') > 0)[0], 1);
-      expect(lines.firstWhere((row) => row[2].indexOf('letter or digit expected') > 0)[0], 5);
-    });
-    test('failure', () {
-      var lines = new List();
-      expect(profile(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue);
-      lines = lines
-          .map((row) => row.split('\t'))
-          .map((row) => [int.parse(row[0]), int.parse(row[1]), row[2]]);
-      expect(lines, hasLength(4));
-      expect(lines.every((row) => row[1] >= 0), isTrue);
-      expect(lines.firstWhere((row) => row[2].indexOf('SequenceParser') > 0)[0], 1);
-      expect(lines.firstWhere((row) => row[2].indexOf('letter expected') > 0)[0], 1);
-      expect(lines.firstWhere((row) => row[2].indexOf('PossessiveRepeatingParser') > 0)[0], 0);
-      expect(lines.firstWhere((row) => row[2].indexOf('letter or digit expected') > 0)[0], 0);
-    });
-  });
-  group('progress', () {
-    test('success', () {
-      var lines = new List();
-      expect(progress(identifier, (line) => lines.add(line))
-          .parse('ab123').isSuccess, isTrue);
-      expect(lines, [
-        '* Instance of \'SequenceParser\'',
-        '* Instance of \'CharacterParser\'[letter expected]',
-        '** Instance of \'PossessiveRepeatingParser\'[0..*]',
-        '** Instance of \'CharacterParser\'[letter or digit expected]',
-        '*** Instance of \'CharacterParser\'[letter or digit expected]',
-        '**** Instance of \'CharacterParser\'[letter or digit expected]',
-        '***** Instance of \'CharacterParser\'[letter or digit expected]',
-        '****** Instance of \'CharacterParser\'[letter or digit expected]'
-      ]);
-    });
-    test('failure', () {
-      var lines = new List();
-      expect(progress(identifier, (line) => lines.add(line)).parse('1').isFailure, isTrue);
-      expect(lines, [
-        '* Instance of \'SequenceParser\'',
-        '* Instance of \'CharacterParser\'[letter expected]'
-      ]);
-    });
-  });
-}
diff --git a/packages/petitparser/test/json_benchmark.dart b/packages/petitparser/test/json_benchmark.dart
deleted file mode 100644
index aca069e..0000000
--- a/packages/petitparser/test/json_benchmark.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-library petitparser.test.json_benchmark;
-
-import 'package:petitparser/json.dart';
-
-import 'dart:convert';
-
-double benchmark(Function function, [int warmup = 1000, int milliseconds = 5000]) {
-  var count = 0;
-  var elapsed = 0;
-  var watch = new Stopwatch();
-  while (warmup-- > 0) {
-    function();
-  }
-  watch.start();
-  while (elapsed < milliseconds) {
-    function();
-    elapsed = watch.elapsedMilliseconds;
-    count++;
-  }
-  return elapsed / count;
-}
-
-const jsonEvent = '{"type": "change", "eventPhase": 2, "bubbles": true, "cancelable": true, '
-    '"timeStamp": 0, "CAPTURING_PHASE": 1, "AT_TARGET": 2, "BUBBLING_PHASE": 3, "isTrusted": '
-    'true, "MOUSEDOWN": 1, "MOUSEUP": 2, "MOUSEOVER": 4, "MOUSEOUT": 8, "MOUSEMOVE": 16, '
-    '"MOUSEDRAG": 32, "CLICK": 64, "DBLCLICK": 128, "KEYDOWN": 256, "KEYUP": 512, "KEYPRESS": '
-    '1024, "DRAGDROP": 2048, "FOCUS": 4096, "BLUR": 8192, "SELECT": 16384, "CHANGE": 32768, '
-    '"RESET": 65536, "SUBMIT": 131072, "SCROLL": 262144, "LOAD": 524288, "UNLOAD": 1048576, '
-    '"XFER_DONE": 2097152, "ABORT": 4194304, "ERROR": 8388608, "LOCATE": 16777216, "MOVE": '
-    '33554432, "RESIZE": 67108864, "FORWARD": 134217728, "HELP": 268435456, "BACK": 536870912, '
-    '"TEXT": 1073741824, "ALT_MASK": 1, "CONTROL_MASK": 2, "SHIFT_MASK": 4, "META_MASK": 8}';
-
-final JsonParser json = new JsonParser();
-
-dynamic native(String input) => JSON.decode(input);
-dynamic custom(String input) => json.parse(input).value;
-
-void main() {
-  var nativeResult = native(jsonEvent);
-  var customResult = custom(jsonEvent);
-
-  if (nativeResult.toString() != customResult.toString()) {
-    print('Results not matching!');
-    print('  Native: $nativeResult');
-    print('  Custom: $customResult');
-    return;
-  }
-
-  var nativeTime = benchmark(() => native(jsonEvent));
-  var customTime = benchmark(() => custom(jsonEvent));
-  var ratio = customTime / nativeTime;
-
-  print('Slowdown: ${ratio.toStringAsFixed(1)}');
-  print('Native: ${nativeTime.toStringAsFixed(6)}');
-  print('Custom: ${customTime.toStringAsFixed(6)}');
-}
diff --git a/packages/petitparser/test/json_test.dart b/packages/petitparser/test/json_test.dart
deleted file mode 100644
index b79fd76..0000000
--- a/packages/petitparser/test/json_test.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-library petitparser.test.json_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/json.dart';
-
-void main() {
-  var json = new JsonParser();
-  group('arrays', () {
-    test('empty', () {
-      expect(json.parse('[]').value, []);
-    });
-    test('small', () {
-      expect(json.parse('["a"]').value, ['a']);
-    });
-    test('large', () {
-      expect(json.parse('["a", "b", "c"]').value, ['a', 'b', 'c']);
-    });
-    test('nested', () {
-      expect(json.parse('[["a"]]').value, [['a']]);
-    });
-    test('invalid', () {
-      expect(json.parse('[').isFailure, isTrue);
-      expect(json.parse('[1').isFailure, isTrue);
-      expect(json.parse('[1,').isFailure, isTrue);
-      expect(json.parse('[1,]').isFailure, isTrue);
-      expect(json.parse('[1 2]').isFailure, isTrue);
-      expect(json.parse('[]]').isFailure, isTrue);
-    });
-  });
-  group('objects', () {
-    test('empty', () {
-      expect(json.parse('{}').value, {});
-    });
-    test('small', () {
-      expect(json.parse('{"a": 1}').value, {'a': 1});
-    });
-    test('large', () {
-      expect(json.parse('{"a": 1, "b": 2, "c": 3}').value, {
-        'a': 1,
-        'b': 2,
-        'c': 3
-      });
-    });
-    test('nested', () {
-      expect(json.parse('{"obj": {"a": 1}}').value, {'obj': {"a": 1}});
-    });
-    test('invalid', () {
-      expect(json.parse('{').isFailure, isTrue);
-      expect(json.parse('{\'a\'').isFailure, isTrue);
-      expect(json.parse('{\'a\':').isFailure, isTrue);
-      expect(json.parse('{\'a\':\'b\'').isFailure, isTrue);
-      expect(json.parse('{\'a\':\'b\',').isFailure, isTrue);
-      expect(json.parse('{\'a\'}').isFailure, isTrue);
-      expect(json.parse('{\'a\':}').isFailure, isTrue);
-      expect(json.parse('{\'a\':\'b\',}').isFailure, isTrue);
-      expect(json.parse('{}}').isFailure, isTrue);
-    });
-  });
-  group('literals', () {
-    test('valid true', () {
-      expect(json.parse('true').value, isTrue);
-    });
-    test('invalid true', () {
-      expect(json.parse('tr').isFailure, isTrue);
-      expect(json.parse('trace').isFailure, isTrue);
-      expect(json.parse('truest').isFailure, isTrue);
-    });
-    test('valid false', () {
-      expect(json.parse('false').value, isFalse);
-    });
-    test('invalid false', () {
-      expect(json.parse('fa').isFailure, isTrue);
-      expect(json.parse('falsely').isFailure, isTrue);
-      expect(json.parse('fabulous').isFailure, isTrue);
-    });
-    test('valid null', () {
-      expect(json.parse('null').value, isNull);
-    });
-    test('invalid null', () {
-      expect(json.parse('nu').isFailure, isTrue);
-      expect(json.parse('nuclear').isFailure, isTrue);
-      expect(json.parse('nullified').isFailure, isTrue);
-    });
-    test('valid integer', () {
-      expect(json.parse('0').value, 0);
-      expect(json.parse('1').value, 1);
-      expect(json.parse('-1').value, -1);
-      expect(json.parse('12').value, 12);
-      expect(json.parse('-12').value, -12);
-      expect(json.parse('1e2').value, 100);
-      expect(json.parse('1e+2').value, 100);
-    });
-    test('invalid integer', () {
-      expect(json.parse('00').isFailure, isTrue);
-      expect(json.parse('01').isFailure, isTrue);
-    });
-    test('invalid integer', () {
-      expect(json.parse('00').isFailure, isTrue);
-      expect(json.parse('01').isFailure, isTrue);
-    });
-    test('valid float', () {
-      expect(json.parse('0.0').value, 0.0);
-      expect(json.parse('0.12').value, 0.12);
-      expect(json.parse('-0.12').value, -0.12);
-      expect(json.parse('12.34').value, 12.34);
-      expect(json.parse('-12.34').value, -12.34);
-      expect(json.parse('1.2e-1').value, 1.2e-1);
-      expect(json.parse('1.2E-1').value, 1.2e-1);
-    });
-    test('invalid float', () {
-      expect(json.parse('.1').isFailure, isTrue);
-      expect(json.parse('0.1.1').isFailure, isTrue);
-    });
-    test('plain string', () {
-      expect(json.parse('""').value, '');
-      expect(json.parse('"foo"').value, 'foo');
-      expect(json.parse('"foo bar"').value, 'foo bar');
-    });
-    test('escaped string', () {
-      expect(json.parse('"\\""').value, '"');
-      expect(json.parse('"\\\\"').value, '\\');
-      expect(json.parse('"\\b"').value, '\b');
-      expect(json.parse('"\\f"').value, '\f');
-      expect(json.parse('"\\n"').value, '\n');
-      expect(json.parse('"\\r"').value, '\r');
-      expect(json.parse('"\\t"').value, '\t');
-    });
-    test('unicode string', () {
-      expect(json.parse('"\\u0030"').value, '0');
-      expect(json.parse('"\\u007B"').value, '{');
-      expect(json.parse('"\\u007d"').value, '}');
-    });
-    test('invalid string', () {
-      expect(json.parse('"').isFailure, isTrue);
-      expect(json.parse('"a').isFailure, isTrue);
-      expect(json.parse('"a\\\"').isFailure, isTrue);
-      expect(json.parse('"\\u00"').isFailure, isTrue);
-      expect(json.parse('"\\u000X"').isFailure, isTrue);
-    });
-  });
-  group('browser', () {
-    test('Internet Explorer', () {
-      var input = '{"recordset": null, "type": "change", "fromElement": null, "toElement": null, '
-          '"altLeft": false, "keyCode": 0, "repeat": false, "reason": 0, "behaviorCookie": 0, '
-          '"contentOverflow": false, "behaviorPart": 0, "dataTransfer": null, "ctrlKey": false, '
-          '"shiftLeft": false, "dataFld": "", "qualifier": "", "wheelDelta": 0, "bookmarks": null, '
-          '"button": 0, "srcFilter": null, "nextPage": "", "cancelBubble": false, "x": 89, "y": '
-          '502, "screenX": 231, "screenY": 1694, "srcUrn": "", "boundElements": {"length": 0}, '
-          '"clientX": 89, "clientY": 502, "propertyName": "", "shiftKey": false, "ctrlLeft": '
-          'false, "offsetX": 25, "offsetY": 2, "altKey": false}';
-      expect(json.parse(input).isSuccess, isTrue);
-    });
-    test('FireFox', () {
-      var input = '{"type": "change", "eventPhase": 2, "bubbles": true, "cancelable": true, '
-          '"timeStamp": 0, "CAPTURING_PHASE": 1, "AT_TARGET": 2, "BUBBLING_PHASE": 3, '
-          '"isTrusted": true, "MOUSEDOWN": 1, "MOUSEUP": 2, "MOUSEOVER": 4, "MOUSEOUT": 8, '
-          '"MOUSEMOVE": 16, "MOUSEDRAG": 32, "CLICK": 64, "DBLCLICK": 128, "KEYDOWN": 256, '
-          '"KEYUP": 512, "KEYPRESS": 1024, "DRAGDROP": 2048, "FOCUS": 4096, "BLUR": 8192, '
-          '"SELECT": 16384, "CHANGE": 32768, "RESET": 65536, "SUBMIT": 131072, "SCROLL": '
-          '262144, "LOAD": 524288, "UNLOAD": 1048576, "XFER_DONE": 2097152, "ABORT": 4194304, '
-          '"ERROR": 8388608, "LOCATE": 16777216, "MOVE": 33554432, "RESIZE": 67108864, '
-          '"FORWARD": 134217728, "HELP": 268435456, "BACK": 536870912, "TEXT": 1073741824, '
-          '"ALT_MASK": 1, "CONTROL_MASK": 2, "SHIFT_MASK": 4, "META_MASK": 8}';
-      expect(json.parse(input).isSuccess, isTrue);
-    });
-    test('WebKit', () {
-      var input = '{"returnValue": true, "timeStamp": 1226697417289, "eventPhase": 2, "type": '
-          '"change", "cancelable": false, "bubbles": true, "cancelBubble": false, "MOUSEOUT": 8, '
-          '"FOCUS": 4096, "CHANGE": 32768, "MOUSEMOVE": 16, "AT_TARGET": 2, "SELECT": 16384, '
-          '"BLUR": 8192, "KEYUP": 512, "MOUSEDOWN": 1, "MOUSEDRAG": 32, "BUBBLING_PHASE": 3, '
-          '"MOUSEUP": 2, "CAPTURING_PHASE": 1, "MOUSEOVER": 4, "CLICK": 64, "DBLCLICK": 128, '
-          '"KEYDOWN": 256, "KEYPRESS": 1024, "DRAGDROP": 2048}';
-      expect(json.parse(input).isSuccess, isTrue);
-    });
-  });
-}
diff --git a/packages/petitparser/test/lisp_test.dart b/packages/petitparser/test/lisp_test.dart
deleted file mode 100644
index 2c88884..0000000
--- a/packages/petitparser/test/lisp_test.dart
+++ /dev/null
@@ -1,438 +0,0 @@
-library petitparser.test.lisp_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/lisp.dart';
-
-void main() {
-  var root = new Environment();
-  var native = Natives.import(root);
-  var standard = Standard.import(native.create());
-
-  dynamic exec(String value, [Environment env]) {
-    return evalString(lispParser, env != null ? env : standard.create(), value);
-  }
-
-  group('Cell', () {
-    test('Name', () {
-      var cell1 = new Name('foo');
-      var cell2 = new Name('foo');
-      var cell3 = new Name('bar');
-      expect(cell1, cell2);
-      expect(cell1, same(cell2));
-      expect(cell1, isNot(cell3));
-      expect(cell1, isNot(same(cell3)));
-    });
-    test('Cons', () {
-      var cell = new Cons(1, 2);
-      expect(cell.head, 1);
-      expect(cell.tail, 2);
-      cell.head = 3;
-      expect(cell.head, 3);
-      expect(cell.tail, 2);
-      cell.tail = new Cons(4, 5);
-      expect(cell.head, 3);
-      expect(cell.tail.head, 4);
-      expect(cell.tail.tail, 5);
-      expect(cell == cell, isTrue);
-      expect(cell.hashCode, isNonZero);
-      expect(cell.toString(), '(3 4 . 5)');
-    });
-  });
-  group('Environment', () {
-    var env = standard.create();
-    test('Standard', () {
-      expect(env.owner, isNotNull);
-      expect(env.keys, isEmpty);
-      expect(env.owner.keys, isNot(isEmpty));
-    });
-    test('Create', () {
-      var sub = env.create();
-      expect(sub.owner, same(env));
-      expect(sub.keys, isEmpty);
-    });
-  });
-  group('Parser', () {
-    var definition = new LispParserDefinition();
-    var atom = definition.build(start: definition.atom);
-    test('Name', () {
-      var cell = atom.parse('foo').value;
-      expect(cell, new isInstanceOf<Name>());
-      expect(cell.toString(), 'foo');
-    });
-    test('Name for operator', () {
-      var cell = atom.parse('+').value;
-      expect(cell, new isInstanceOf<Name>());
-      expect(cell.toString(), '+');
-    });
-    test('Name for special', () {
-      var cell = atom.parse('set!').value;
-      expect(cell, new isInstanceOf<Name>());
-      expect(cell.toString(), 'set!');
-    });
-    test('String', () {
-      var cell = atom.parse('"foo"').value;
-      expect(cell, new isInstanceOf<String>());
-      expect(cell, 'foo');
-    });
-    test('String with escape', () {
-      var cell = atom.parse('"\\""').value;
-      expect(cell, '"');
-    });
-    test('Number integer', () {
-      var cell = atom.parse('123').value;
-      expect(cell, 123);
-    });
-    test('Number negative integer', () {
-      var cell = atom.parse('-123').value;
-      expect(cell, -123);
-    });
-    test('Number positive integer', () {
-      var cell = atom.parse('+123').value;
-      expect(cell, 123);
-    });
-    test('Number floating', () {
-      var cell = atom.parse('123.45').value;
-      expect(cell, 123.45);
-    });
-    test('Number floating exponential', () {
-      var cell = atom.parse('1.23e4').value;
-      expect(cell, 1.23e4);
-    });
-    test('List empty', () {
-      var cell = atom.parse('()').value;
-      expect(cell, isNull);
-    });
-    test('List empty []', () {
-      var cell = atom.parse('[ ]').value;
-      expect(cell, isNull);
-    });
-    test('List empty {}', () {
-      var cell = atom.parse('{   }').value;
-      expect(cell, isNull);
-    });
-    test('List one element', () {
-      var cell = atom.parse('(1)').value;
-      expect(cell, new isInstanceOf<Cons>());
-      expect(cell.head, 1);
-      expect(cell.tail, isNull);
-    });
-    test('List two elements', () {
-      var cell = atom.parse('(1 2)').value;
-      expect(cell, new isInstanceOf<Cons>());
-      expect(cell.head, 1);
-      expect(cell.tail, new isInstanceOf<Cons>());
-      expect(cell.tail.head, 2);
-      expect(cell.tail.tail, isNull);
-    });
-    test('List three elements', () {
-      var cell = atom.parse('(+ 1 2)').value;
-      expect(cell, new isInstanceOf<Cons>());
-      expect(cell.head, new isInstanceOf<Name>());
-      expect(cell.head.toString(), '+');
-      expect(cell.tail, new isInstanceOf<Cons>());
-      expect(cell.tail.head, 1);
-      expect(cell.tail.tail, new isInstanceOf<Cons>());
-      expect(cell.tail.tail.head, 2);
-      expect(cell.tail.tail.tail, isNull);
-    });
-  });
-  group('Natives', () {
-    test('Define', () {
-      expect(exec('(define a 1)'), 1);
-      expect(exec('(define a 2) a'), 2);
-      expect(exec('((define (a) 3))'), 3);
-      expect(exec('(define (a) 4) (a)'), 4);
-      expect(exec('((define (a x) x) 5)'), 5);
-      expect(exec('(define (a x) x) (a 6)'), 6);
-    });
-    test('Lambda', () {
-      expect(exec('((lambda () 1) 2)'), 1);
-      expect(exec('((lambda (x) x) 2)'), 2);
-      expect(exec('((lambda (x) (+ x x)) 2)'), 4);
-      expect(exec('((lambda (x y) (+ x y)) 2 4)'), 6);
-      expect(exec('((lambda (x y z) (+ x y z)) 2 4 6)'), 12);
-    });
-    test('Quote', () {
-      expect(exec('(quote)'), null);
-      expect(exec('(quote 1)'), new Cons(1, null));
-      expect(exec('(quote + 1)'), new Cons(new Name('+'), new Cons(1, null)));
-    });
-    test('Quote (syntax)', () {
-      expect(exec('\'()'), null);
-      expect(exec('\'(1)'), new Cons(1, null));
-      expect(exec('\'(+ 1)'), new Cons(new Name('+'), new Cons(1, null)));
-    });
-    test('Eval', () {
-      expect(exec('(eval (quote + 1 2))'), 3);
-    });
-    test('Apply', () {
-      expect(exec('(apply + 1 2 3)'), 6);
-      expect(exec('(apply + 1 2 3 (+ 2 2))'), 10);
-    });
-    test('Let', () {
-      expect(exec('(let ((a 1)) a)'), 1);
-      expect(exec('(let ((a 1) (b 2)) a)'), 1);
-      expect(exec('(let ((a 1) (b 2)) b)'), 2);
-      expect(exec('(let ((a 1) (b 2)) (+ a b))'), 3);
-      expect(exec('(let ((a 1) (b 2)) (+ a b) 4)'), 4);
-    });
-    test('Set!', () {
-      var env = standard.create();
-      env.define(new Name('a'), null);
-      expect(exec('(set! a 1)', env), 1);
-      expect(exec('(set! a (+ 1 2))', env), 3);
-      expect(exec('(set! a (+ 1 2)) (+ a 1)', env), 4);
-    });
-    test('Set! (undefined)', () {
-      expect(() => exec('(set! a 1)'), throws);
-      expect(() => standard[new Name('a')], throws);
-    });
-    test('If', () {
-      expect(exec('(if true)'), isNull);
-      expect(exec('(if false)'), isNull);
-      expect(exec('(if true 1)'), 1);
-      expect(exec('(if false 1)'), isNull);
-      expect(exec('(if true 1 2)'), 1);
-      expect(exec('(if false 1 2)'), 2);
-    });
-    test('If (lazyness)', () {
-      expect(exec('(if (= 1 1) 3 4)'), 3);
-      expect(exec('(if (= 1 2) 3 4)'), 4);
-    });
-    test('While', () {
-      var env = standard.create();
-      env.define(new Name('a'), 0);
-      exec('(while (< a 3) (set! a (+ a 1)))', env);
-      expect(env[new Name('a')], 3);
-    });
-    test('True', () {
-      expect(exec('true'), isTrue);
-    });
-    test('False', () {
-      expect(exec('false'), isFalse);
-    });
-    test('And', () {
-      expect(exec('(and)'), isTrue);
-      expect(exec('(and true)'), isTrue);
-      expect(exec('(and false)'), isFalse);
-      expect(exec('(and true true)'), isTrue);
-      expect(exec('(and true false)'), isFalse);
-      expect(exec('(and false true)'), isFalse);
-      expect(exec('(and false false)'), isFalse);
-      expect(exec('(and true true true)'), isTrue);
-      expect(exec('(and true true false)'), isFalse);
-      expect(exec('(and true false true)'), isFalse);
-      expect(exec('(and true false false)'), isFalse);
-      expect(exec('(and false true true)'), isFalse);
-      expect(exec('(and false true false)'), isFalse);
-      expect(exec('(and false false true)'), isFalse);
-      expect(exec('(and false false false)'), isFalse);
-    });
-    test('And (lazyness)', () {
-      var env = standard.create();
-      env.define(new Name('a'), null);
-      exec('(and false (set! a true))', env);
-      expect(env[new Name('a')], isNull);
-      exec('(and true (set! a true))', env);
-      expect(env[new Name('a')], isTrue);
-    });
-    test('Or', () {
-      expect(exec('(or)'), isFalse);
-      expect(exec('(or true)'), isTrue);
-      expect(exec('(or false)'), isFalse);
-      expect(exec('(or true true)'), isTrue);
-      expect(exec('(or true false)'), isTrue);
-      expect(exec('(or false true)'), isTrue);
-      expect(exec('(or false false)'), isFalse);
-      expect(exec('(or true true true)'), isTrue);
-      expect(exec('(or true true false)'), isTrue);
-      expect(exec('(or true false true)'), isTrue);
-      expect(exec('(or true false false)'), isTrue);
-      expect(exec('(or false true true)'), isTrue);
-      expect(exec('(or false true false)'), isTrue);
-      expect(exec('(or false false true)'), isTrue);
-      expect(exec('(or false false false)'), isFalse);
-    });
-    test('Or (lazyness)', () {
-      var env = standard.create();
-      env.define(new Name('a'), null);
-      exec('(or true (set! a true))', env);
-      expect(env[new Name('a')], isNull);
-      exec('(or false (set! a true))', env);
-      expect(env[new Name('a')], isTrue);
-    });
-    test('Not', () {
-      expect(exec('(not true)'), isFalse);
-      expect(exec('(not false)'), isTrue);
-    });
-    test('Add', () {
-      expect(exec('(+ 1)'), 1);
-      expect(exec('(+ 1 2)'), 3);
-      expect(exec('(+ 1 2 3)'), 6);
-      expect(exec('(+ 1 2 3 4)'), 10);
-    });
-    test('Sub', () {
-      expect(exec('(- 1)'), -1);
-      expect(exec('(- 1 2)'), -1);
-      expect(exec('(- 1 2 3)'), -4);
-      expect(exec('(- 1 2 3 4)'), -8);
-    });
-    test('Mul', () {
-      expect(exec('(* 2)'), 2);
-      expect(exec('(* 2 3)'), 6);
-      expect(exec('(* 2 3 4)'), 24);
-    });
-    test('Div', () {
-      expect(exec('(/ 24)'), 24);
-      expect(exec('(/ 24 3)'), 8);
-      expect(exec('(/ 24 3 2)'), 4);
-    });
-    test('Mod', () {
-      expect(exec('(% 24)'), 24);
-      expect(exec('(% 24 5)'), 4);
-      expect(exec('(% 24 5 3)'), 1);
-    });
-    test('Less', () {
-      expect(exec('(< 1 2)'), isTrue);
-      expect(exec('(< 1 1)'), isFalse);
-      expect(exec('(< 2 1)'), isFalse);
-    });
-    test('Less equal', () {
-      expect(exec('(<= 1 2)'), isTrue);
-      expect(exec('(<= 1 1)'), isTrue);
-      expect(exec('(<= 2 1)'), isFalse);
-    });
-    test('Equal', () {
-      expect(exec('(= 1 1)'), isTrue);
-      expect(exec('(= 1 2)'), isFalse);
-      expect(exec('(= 2 1)'), isFalse);
-    });
-    test('Not equal', () {
-      expect(exec('(!= 1 1)'), isFalse);
-      expect(exec('(!= 1 2)'), isTrue);
-      expect(exec('(!= 2 1)'), isTrue);
-    });
-    test('Larger', () {
-      expect(exec('(> 1 1)'), isFalse);
-      expect(exec('(> 1 2)'), isFalse);
-      expect(exec('(> 2 1)'), isTrue);
-    });
-    test('Larger equal', () {
-      expect(exec('(>= 1 1)'), isTrue);
-      expect(exec('(>= 1 2)'), isFalse);
-      expect(exec('(>= 2 1)'), isTrue);
-    });
-    test('Cons', () {
-      expect(exec('(cons 1 2)'), new Cons(1, 2));
-    });
-    test('Car', () {
-      expect(exec('(car null)'), isNull);
-      expect(exec('(car (cons 1 2))'), 1);
-    });
-    test('Car!', () {
-      expect(exec('(car! null 3)'), isNull);
-      expect(exec('(car! (cons 1 2) 3)'), new Cons(3, 2));
-    });
-    test('Cdr', () {
-      expect(exec('(cdr null)'), isNull);
-      expect(exec('(cdr (cons 1 2))'), 2);
-    });
-    test('Cdr!', () {
-      expect(exec('(cdr! null 3)'), isNull);
-      expect(exec('(cdr! (cons 1 2) 3)'), new Cons(1, 3));
-    });
-  });
-  group('Library', () {
-    test('Null', () {
-      expect(exec('null'), isNull);
-    });
-    test('Null? (true)', () {
-      expect(exec('(null? \'())'), isTrue);
-      expect(exec('(null? null)'), isTrue);
-    });
-    test('Null? (false)', () {
-      expect(exec('(null? 1)'), isFalse);
-      expect(exec('(null? "a")'), isFalse);
-      expect(exec('(null? (quote a))'), isFalse);
-      expect(exec('(null? true)'), isFalse);
-      expect(exec('(null? false)'), isFalse);
-    });
-    test('Length', () {
-      expect(exec('(length \'())'), 0);
-      expect(exec('(length \'(1))'), 1);
-      expect(exec('(length \'(1 1))'), 2);
-      expect(exec('(length \'(1 1 1))'), 3);
-      expect(exec('(length \'(1 1 1 1))'), 4);
-      expect(exec('(length \'(1 1 1 1 1))'), 5);
-    });
-    test('Append', () {
-      expect(exec('(append \'() \'())'), isNull);
-      expect(exec('(append \'(1) \'())'), exec('\'(1)'));
-      expect(exec('(append \'() \'(1))'), exec('\'(1)'));
-      expect(exec('(append \'(1) \'(2))'), exec('\'(1 2)'));
-      expect(exec('(append \'(1 2) \'(3))'), exec('\'(1 2 3)'));
-      expect(exec('(append \'(1) \'(2 3))'), exec('\'(1 2 3)'));
-    });
-    test('List Head', () {
-      expect(exec('(list-head \'(5 6 7) 0)'), 5);
-      expect(exec('(list-head \'(5 6 7) 1)'), 6);
-      expect(exec('(list-head \'(5 6 7) 2)'), 7);
-      expect(exec('(list-head \'(5 6 7) 3)'), isNull);
-    });
-    test('List Tail', () {
-      expect(exec('(list-tail \'(5 6 7) 0)'), exec('\'(6 7)'));
-      expect(exec('(list-tail \'(5 6 7) 1)'), exec('\'(7)'));
-      expect(exec('(list-tail \'(5 6 7) 2)'), isNull);
-    });
-    test('Map', () {
-      expect(exec('(map \'() (lambda (x) (* 2 x)))'), isNull);
-      expect(exec('(map \'(2) (lambda (x) (* 2 x)))'), exec('\'(4)'));
-      expect(exec('(map \'(2 3) (lambda (x) (* 2 x)))'), exec('\'(4 6)'));
-      expect(exec('(map \'(2 3 4) (lambda (x) (* 2 x)))'), exec('\'(4 6 8)'));
-    });
-    test('Inject', () {
-      expect(exec('(inject \'() 5 (lambda (s e) (+ s e 1)))'), 5);
-      expect(exec('(inject \'(2) 5 (lambda (s e) (+ s e 1)))'), 8);
-      expect(exec('(inject \'(2 3) 5 (lambda (s e) (+ s e 1)))'), 12);
-    });
-  });
-  group('Examples', () {
-    test('Fibonacci', () {
-      var env = standard.create();
-      exec('(define (fib n)'
-          '  (if (<= n 1)'
-          '    1'
-          '    (+ (fib (- n 1)) (fib (- n 2)))))', env);
-      expect(exec('(fib 0)', env), 1);
-      expect(exec('(fib 1)', env), 1);
-      expect(exec('(fib 2)', env), 2);
-      expect(exec('(fib 3)', env), 3);
-      expect(exec('(fib 4)', env), 5);
-      expect(exec('(fib 5)', env), 8);
-    });
-    test('Closure', () {
-      var env = standard.create();
-      exec('(define (mul n)'
-          '  (lambda (x) (* n x)))', env);
-      expect(exec('((mul 2) 3)', env), 6);
-      expect(exec('((mul 3) 4)', env), 12);
-      expect(exec('((mul 4) 5)', env), 20);
-    });
-    test('Object', () {
-      var env = standard.create();
-      exec('(define (counter start)'
-          '  (let ((count start))'
-          '    (lambda ()'
-          '      (set! count (+ count 1)))))', env);
-      exec('(define a (counter 10))', env);
-      exec('(define b (counter 20))', env);
-      expect(exec('(a)', env), 11);
-      expect(exec('(b)', env), 21);
-      expect(exec('(a)', env), 12);
-      expect(exec('(b)', env), 22);
-      expect(exec('(a)', env), 13);
-      expect(exec('(b)', env), 23);
-    });
-  });
-}
diff --git a/packages/petitparser/test/petitparser_test.dart b/packages/petitparser/test/petitparser_test.dart
deleted file mode 100644
index 2883014..0000000
--- a/packages/petitparser/test/petitparser_test.dart
+++ /dev/null
@@ -1,1556 +0,0 @@
-library petitparser.test.core_test;
-
-import 'dart:math' as math;
-import 'package:test/test.dart' hide anyOf;
-
-import 'package:petitparser/petitparser.dart';
-
-void expectSuccess(Parser parser, dynamic input, dynamic expected,
-    [int position]) {
-  var result = parser.parse(input);
-  expect(result.isSuccess, isTrue);
-  expect(result.isFailure, isFalse);
-  expect(result.value, expected);
-  expect(result.position, position != null ? position : input.length);
-}
-
-void expectFailure(Parser parser, dynamic input,
-    [int position = 0, String message]) {
-  var result = parser.parse(input);
-  expect(result.isFailure, isTrue);
-  expect(result.isSuccess, isFalse);
-  expect(result.position, position);
-  if (message != null) {
-    expect(result.message, message);
-  }
-}
-
-class ListGrammarDefinition extends GrammarDefinition {
-  start() => ref(list).end();
-  list() => ref(element) & char(',') & ref(list) | ref(element);
-  element() => digit().plus().flatten();
-}
-
-class ListParserDefinition extends ListGrammarDefinition {
-  element() => super.element().map((value) => int.parse(value));
-}
-
-class TokenizedListGrammarDefinition extends GrammarDefinition {
-  start() => ref(list).end();
-  list() => ref(element) & ref(token, char(',')) & ref(list) | ref(element);
-  element() => ref(token, digit().plus());
-  token(p) => p.flatten().trim();
-}
-
-class BuggedGrammarDefinition extends GrammarDefinition {
-  start() => epsilon();
-
-  directRecursion1() => ref(directRecursion1);
-
-  indirectRecursion1() => ref(indirectRecursion2);
-  indirectRecursion2() => ref(indirectRecursion3);
-  indirectRecursion3() => ref(indirectRecursion1);
-
-  delegation1() => ref(delegation2);
-  delegation2() => ref(delegation3);
-  delegation3() => epsilon();
-}
-
-class LambdaGrammarDefinition extends GrammarDefinition {
-  start() => ref(expression).end();
-  expression() => ref(variable) | ref(abstraction) | ref(application);
-
-  variable() => (letter() & word().star()).flatten().trim();
-  abstraction() => token('\\') & ref(variable) & token('.') & ref(expression);
-  application() => token('(') & ref(expression) & ref(expression) & token(')');
-
-  token(value) => char(value).trim();
-}
-
-class ExpressionGrammarDefinition extends GrammarDefinition {
-  start() => ref(terms).end();
-  terms() => ref(addition) | ref(factors);
-
-  addition() => ref(factors).separatedBy(token(char('+') | char('-')));
-  factors() => ref(multiplication) | ref(power);
-
-  multiplication() => ref(power).separatedBy(token(char('*') | char('/')));
-  power() => ref(primary).separatedBy(char('^').trim());
-
-  primary() => ref(number) | ref(parentheses);
-  number() => token(char('-').optional() & digit().plus() & (char('.') & digit().plus()).optional());
-
-  parentheses() => token('(') & ref(terms) & token(')');
-  token(value) => value is String ? char(value).trim() : value.flatten().trim();
-}
-
-class PluggableCompositeParser extends CompositeParser {
-  final Function _function;
-
-  PluggableCompositeParser(this._function) : super();
-
-  void initialize() {
-    _function(this);
-  }
-}
-
-main() {
-  group('parsers', () {
-    test('and()', () {
-      var parser = char('a').and();
-      expectSuccess(parser, 'a', 'a', 0);
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '');
-    });
-    test('or() operator', () {
-      var parser = char('a') | char('b');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectFailure(parser, 'c');
-      expectFailure(parser, '');
-    });
-    test('or() of two', () {
-      var parser = char('a').or(char('b'));
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectFailure(parser, 'c');
-      expectFailure(parser, '');
-    });
-    test('or() of three', () {
-      var parser = char('a').or(char('b')).or(char('c'));
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectFailure(parser, 'd');
-      expectFailure(parser, '');
-    });
-    test('end()', () {
-      var parser = char('a').end();
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', 'a');
-      expectFailure(parser, 'aa', 1, 'end of input expected');
-    });
-    test('epsilon()', () {
-      var parser = epsilon();
-      expectSuccess(parser, '', null);
-      expectSuccess(parser, 'a', null, 0);
-    });
-    test('failure()', () {
-      var parser = failure('failure');
-      expectFailure(parser, '', 0, 'failure');
-      expectFailure(parser, 'a', 0, 'failure');
-    });
-    test('flatten()', () {
-      var parser = digit().plus().flatten();
-      expectFailure(parser, '');
-      expectFailure(parser, 'a');
-      expectSuccess(parser, '1', '1');
-      expectSuccess(parser, '12', '12');
-      expectSuccess(parser, '123', '123');
-      expectSuccess(parser, '1234', '1234');
-    });
-    test('token() on string', () {
-      var parser = digit().plus().token();
-      expectFailure(parser, '');
-      expectFailure(parser, 'a');
-      var token = parser.parse('123').value;
-      expect(token.value, ['1', '2', '3']);
-      expect(token.buffer, '123');
-      expect(token.start, 0);
-      expect(token.stop, 3);
-      expect(token.input, '123');
-      expect(token.length, 3);
-      expect(token.line, 1);
-      expect(token.column, 1);
-      expect(token.toString(), 'Token[1:1]: [1, 2, 3]');
-    });
-    test('token() on list', () {
-      var parser = any().plus().token();
-      var token = parser.parse([1, 2, 3]).value;
-      expect(token.value, [1, 2, 3]);
-      expect(token.buffer, [1, 2, 3]);
-      expect(token.start, 0);
-      expect(token.stop, 3);
-      expect(token.input, [1, 2, 3]);
-      expect(token.length, 3);
-      expect(token.toString(), 'Token[0]: [1, 2, 3]');
-    });
-    test('map()', () {
-      var parser = digit().map((String each) {
-        return each.codeUnitAt(0) - '0'.codeUnitAt(0);
-      });
-      expectSuccess(parser, '1', 1);
-      expectSuccess(parser, '4', 4);
-      expectSuccess(parser, '9', 9);
-      expectFailure(parser, '');
-      expectFailure(parser, 'a');
-    });
-    test('pick(1)', () {
-      var parser = digit().seq(letter()).pick(1);
-      expectSuccess(parser, '1a', 'a');
-      expectSuccess(parser, '2b', 'b');
-      expectFailure(parser, '');
-      expectFailure(parser, '1', 1, 'letter expected');
-      expectFailure(parser, '12', 1, 'letter expected');
-    });
-    test('pick(-1)', () {
-      var parser = digit().seq(letter()).pick(-1);
-      expectSuccess(parser, '1a', 'a');
-      expectSuccess(parser, '2b', 'b');
-      expectFailure(parser, '');
-      expectFailure(parser, '1', 1, 'letter expected');
-      expectFailure(parser, '12', 1, 'letter expected');
-    });
-    test('permute([1, 0])', () {
-      var parser = digit().seq(letter()).permute([1, 0]);
-      expectSuccess(parser, '1a', ['a', '1']);
-      expectSuccess(parser, '2b', ['b', '2']);
-      expectFailure(parser, '');
-      expectFailure(parser, '1', 1, 'letter expected');
-      expectFailure(parser, '12', 1, 'letter expected');
-    });
-    test('permute([-1, 0])', () {
-      var parser = digit().seq(letter()).permute([-1, 0]);
-      expectSuccess(parser, '1a', ['a', '1']);
-      expectSuccess(parser, '2b', ['b', '2']);
-      expectFailure(parser, '');
-      expectFailure(parser, '1', 1, 'letter expected');
-      expectFailure(parser, '12', 1, 'letter expected');
-    });
-    test('not()', () {
-      var parser = char('a').not('not "a" expected');
-      expectFailure(parser, 'a', 0, 'not "a" expected');
-      expectSuccess(parser, 'b', null, 0);
-      expectSuccess(parser, '', null);
-    });
-    test('neg()', () {
-      var parser = digit().neg('no digit expected');
-      expectFailure(parser, '1', 0, 'no digit expected');
-      expectFailure(parser, '9', 0, 'no digit expected');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, ' ', ' ');
-      expectFailure(parser, '', 0, 'input expected');
-    });
-    test('optional()', () {
-      var parser = char('a').optional();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', null, 0);
-      expectSuccess(parser, '', null);
-    });
-    test('plus()', () {
-      var parser = char('a').plus();
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'aa', ['a', 'a']);
-      expectSuccess(parser, 'aaa', ['a', 'a', 'a']);
-    });
-    test('plusGreedy()', () {
-      var parser = word().plusGreedy(digit());
-      expectFailure(parser, '', 0, 'letter or digit expected');
-      expectFailure(parser, 'a', 1, 'digit expected');
-      expectFailure(parser, 'ab', 1, 'digit expected');
-      expectFailure(parser, '1', 1, 'digit expected');
-      expectSuccess(parser, 'a1', ['a'], 1);
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '12', ['1'], 1);
-      expectSuccess(parser, 'a12', ['a', '1'], 2);
-      expectSuccess(parser, 'ab12', ['a', 'b', '1'], 3);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c', '1'], 4);
-      expectSuccess(parser, '123', ['1', '2'], 2);
-      expectSuccess(parser, 'a123', ['a', '1', '2'], 3);
-      expectSuccess(parser, 'ab123', ['a', 'b', '1', '2'], 4);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c', '1', '2'], 5);
-    });
-    test('plusLazy()', () {
-      var parser = word().plusLazy(digit());
-      expectFailure(parser, '');
-      expectFailure(parser, 'a', 1, 'digit expected');
-      expectFailure(parser, 'ab', 2, 'digit expected');
-      expectFailure(parser, '1', 1, 'digit expected');
-      expectSuccess(parser, 'a1', ['a'], 1);
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '12', ['1'], 1);
-      expectSuccess(parser, 'a12', ['a'], 1);
-      expectSuccess(parser, 'ab12', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '123', ['1'], 1);
-      expectSuccess(parser, 'a123', ['a'], 1);
-      expectSuccess(parser, 'ab123', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c'], 3);
-    });
-    test('times()', () {
-      var parser = char('a').times(2);
-      expectFailure(parser, '', 0, '"a" expected');
-      expectFailure(parser, 'a', 1, '"a" expected');
-      expectSuccess(parser, 'aa', ['a', 'a']);
-      expectSuccess(parser, 'aaa', ['a', 'a'], 2);
-    });
-    test('repeat()', () {
-      var parser = char('a').repeat(2, 3);
-      expectFailure(parser, '', 0, '"a" expected');
-      expectFailure(parser, 'a', 1, '"a" expected');
-      expectSuccess(parser, 'aa', ['a', 'a']);
-      expectSuccess(parser, 'aaa', ['a', 'a', 'a']);
-      expectSuccess(parser, 'aaaa', ['a', 'a', 'a'], 3);
-    });
-    test('repeat() unbounded', () {
-      var input = new List.filled(100000, 'a');
-      var parser = char('a').repeat(2, unbounded);
-      expectSuccess(parser, input.join(), input);
-    });
-    test('repeatGreedy()', () {
-      var parser = word().repeatGreedy(digit(), 2, 4);
-      expectFailure(parser, '', 0, 'letter or digit expected');
-      expectFailure(parser, 'a', 1, 'letter or digit expected');
-      expectFailure(parser, 'ab', 2, 'digit expected');
-      expectFailure(parser, 'abc', 2, 'digit expected');
-      expectFailure(parser, 'abcd', 2, 'digit expected');
-      expectFailure(parser, 'abcde', 2, 'digit expected');
-      expectFailure(parser, '1', 1, 'letter or digit expected');
-      expectFailure(parser, 'a1', 2, 'digit expected');
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, 'abcd1', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde1', 2, 'digit expected');
-      expectFailure(parser, '12', 2, 'digit expected');
-      expectSuccess(parser, 'a12', ['a', '1'], 2);
-      expectSuccess(parser, 'ab12', ['a', 'b', '1'], 3);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c', '1'], 4);
-      expectSuccess(parser, 'abcd12', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde12', 2, 'digit expected');
-      expectSuccess(parser, '123', ['1', '2'], 2);
-      expectSuccess(parser, 'a123', ['a', '1', '2'], 3);
-      expectSuccess(parser, 'ab123', ['a', 'b', '1', '2'], 4);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c', '1'], 4);
-      expectSuccess(parser, 'abcd123', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde123', 2, 'digit expected');
-    });
-    test('repeatGreedy() unbounded', () {
-      var inputLetter = new List.filled(100000, 'a');
-      var inputDigit = new List.filled(100000, '1');
-      var parser = word().repeatGreedy(digit(), 2, unbounded);
-      expectSuccess(parser, inputLetter.join() + '1', inputLetter, inputLetter.length);
-      expectSuccess(parser, inputDigit.join() + '1', inputDigit, inputDigit.length);
-    });
-    test('repeatLazy()', () {
-      var parser = word().repeatLazy(digit(), 2, 4);
-      expectFailure(parser, '', 0, 'letter or digit expected');
-      expectFailure(parser, 'a', 1, 'letter or digit expected');
-      expectFailure(parser, 'ab', 2, 'digit expected');
-      expectFailure(parser, 'abc', 3, 'digit expected');
-      expectFailure(parser, 'abcd', 4, 'digit expected');
-      expectFailure(parser, 'abcde', 4, 'digit expected');
-      expectFailure(parser, '1', 1, 'letter or digit expected');
-      expectFailure(parser, 'a1', 2, 'digit expected');
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, 'abcd1', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde1', 4, 'digit expected');
-      expectFailure(parser, '12', 2, 'digit expected');
-      expectSuccess(parser, 'a12', ['a', '1'], 2);
-      expectSuccess(parser, 'ab12', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, 'abcd12', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde12', 4, 'digit expected');
-      expectSuccess(parser, '123', ['1', '2'], 2);
-      expectSuccess(parser, 'a123', ['a', '1'], 2);
-      expectSuccess(parser, 'ab123', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, 'abcd123', ['a', 'b', 'c', 'd'], 4);
-      expectFailure(parser, 'abcde123', 4, 'digit expected');
-    });
-    test('repeatLazy() unbounded', () {
-      var input = new List.filled(100000, 'a');
-      var parser = word().repeatLazy(digit(), 2, unbounded);
-      expectSuccess(parser, input.join() + '1111', input, input.length);
-    });
-    test('separatedBy()', () {
-      var parser = char('a').separatedBy(char('b'));
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'ab', ['a'], 1);
-      expectSuccess(parser, 'aba', ['a', 'b', 'a']);
-      expectSuccess(parser, 'abab', ['a', 'b', 'a'], 3);
-      expectSuccess(parser, 'ababa', ['a', 'b', 'a', 'b', 'a']);
-      expectSuccess(parser, 'ababab', ['a', 'b', 'a', 'b', 'a'], 5);
-    });
-    test('separatedBy() without separators', () {
-      var parser = char('a').separatedBy(char('b'), includeSeparators: false);
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'ab', ['a'], 1);
-      expectSuccess(parser, 'aba', ['a', 'a']);
-      expectSuccess(parser, 'abab', ['a', 'a'], 3);
-      expectSuccess(parser, 'ababa', ['a', 'a', 'a']);
-      expectSuccess(parser, 'ababab', ['a', 'a', 'a'], 5);
-    });
-    test('separatedBy() separator at end', () {
-      var parser =
-          char('a').separatedBy(char('b'), optionalSeparatorAtEnd: true);
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'ab', ['a', 'b']);
-      expectSuccess(parser, 'aba', ['a', 'b', 'a']);
-      expectSuccess(parser, 'abab', ['a', 'b', 'a', 'b']);
-      expectSuccess(parser, 'ababa', ['a', 'b', 'a', 'b', 'a']);
-      expectSuccess(parser, 'ababab', ['a', 'b', 'a', 'b', 'a', 'b']);
-    });
-    test('separatedBy() without separators & separator at end', () {
-      var parser = char('a').separatedBy(char('b'),
-          includeSeparators: false, optionalSeparatorAtEnd: true);
-      expectFailure(parser, '', 0, '"a" expected');
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'ab', ['a']);
-      expectSuccess(parser, 'aba', ['a', 'a']);
-      expectSuccess(parser, 'abab', ['a', 'a']);
-      expectSuccess(parser, 'ababa', ['a', 'a', 'a']);
-      expectSuccess(parser, 'ababab', ['a', 'a', 'a']);
-    });
-    test('seq() operator', () {
-      var parser = char('a') & char('b');
-      expectSuccess(parser, 'ab', ['a', 'b']);
-      expectFailure(parser, '');
-      expectFailure(parser, 'x');
-      expectFailure(parser, 'a', 1);
-      expectFailure(parser, 'ax', 1);
-    });
-    test('seq() of two', () {
-      var parser = char('a').seq(char('b'));
-      expectSuccess(parser, 'ab', ['a', 'b']);
-      expectFailure(parser, '');
-      expectFailure(parser, 'x');
-      expectFailure(parser, 'a', 1);
-      expectFailure(parser, 'ax', 1);
-    });
-    test('seq() of three', () {
-      var parser = char('a').seq(char('b')).seq(char('c'));
-      expectSuccess(parser, 'abc', ['a', 'b', 'c']);
-      expectFailure(parser, '');
-      expectFailure(parser, 'x');
-      expectFailure(parser, 'a', 1);
-      expectFailure(parser, 'ax', 1);
-      expectFailure(parser, 'ab', 2);
-      expectFailure(parser, 'abx', 2);
-    });
-    test('star()', () {
-      var parser = char('a').star();
-      expectSuccess(parser, '', []);
-      expectSuccess(parser, 'a', ['a']);
-      expectSuccess(parser, 'aa', ['a', 'a']);
-      expectSuccess(parser, 'aaa', ['a', 'a', 'a']);
-    });
-    test('starGreedy()', () {
-      var parser = word().starGreedy(digit());
-      expectFailure(parser, '', 0, 'digit expected');
-      expectFailure(parser, 'a', 0, 'digit expected');
-      expectFailure(parser, 'ab', 0, 'digit expected');
-      expectSuccess(parser, '1', [], 0);
-      expectSuccess(parser, 'a1', ['a'], 1);
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '12', ['1'], 1);
-      expectSuccess(parser, 'a12', ['a', '1'], 2);
-      expectSuccess(parser, 'ab12', ['a', 'b', '1'], 3);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c', '1'], 4);
-      expectSuccess(parser, '123', ['1', '2'], 2);
-      expectSuccess(parser, 'a123', ['a', '1', '2'], 3);
-      expectSuccess(parser, 'ab123', ['a', 'b', '1', '2'], 4);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c', '1', '2'], 5);
-    });
-    test('starLazy()', () {
-      var parser = word().starLazy(digit());
-      expectFailure(parser, '');
-      expectFailure(parser, 'a', 1, 'digit expected');
-      expectFailure(parser, 'ab', 2, 'digit expected');
-      expectSuccess(parser, '1', [], 0);
-      expectSuccess(parser, 'a1', ['a'], 1);
-      expectSuccess(parser, 'ab1', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc1', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '12', [], 0);
-      expectSuccess(parser, 'a12', ['a'], 1);
-      expectSuccess(parser, 'ab12', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc12', ['a', 'b', 'c'], 3);
-      expectSuccess(parser, '123', [], 0);
-      expectSuccess(parser, 'a123', ['a'], 1);
-      expectSuccess(parser, 'ab123', ['a', 'b'], 2);
-      expectSuccess(parser, 'abc123', ['a', 'b', 'c'], 3);
-    });
-    test('trim()', () {
-      var parser = char('a').trim();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, ' a', 'a');
-      expectSuccess(parser, 'a ', 'a');
-      expectSuccess(parser, ' a ', 'a');
-      expectSuccess(parser, '  a', 'a');
-      expectSuccess(parser, 'a  ', 'a');
-      expectSuccess(parser, '  a  ', 'a');
-      expectFailure(parser, '', 0, '"a" expected');
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, ' b', 1, '"a" expected');
-      expectFailure(parser, '  b', 2, '"a" expected');
-    });
-    test('trim() both', () {
-      var parser = char('a').trim(char('*'));
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, '*a', 'a');
-      expectSuccess(parser, 'a*', 'a');
-      expectSuccess(parser, '*a*', 'a');
-      expectSuccess(parser, '**a', 'a');
-      expectSuccess(parser, 'a**', 'a');
-      expectSuccess(parser, '**a**', 'a');
-      expectFailure(parser, '', 0, '"a" expected');
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '*b', 1, '"a" expected');
-      expectFailure(parser, '**b', 2, '"a" expected');
-    });
-    test('trim() left/right', () {
-      var parser = char('a').trim(char('*'), char('#'));
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, '*a', 'a');
-      expectSuccess(parser, 'a#', 'a');
-      expectSuccess(parser, '*a#', 'a');
-      expectSuccess(parser, '**a', 'a');
-      expectSuccess(parser, 'a##', 'a');
-      expectSuccess(parser, '**a##', 'a');
-      expectFailure(parser, '', 0, '"a" expected');
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '*b', 1, '"a" expected');
-      expectFailure(parser, '**b', 2, '"a" expected');
-      expectFailure(parser, '#a', 0, '"a" expected');
-      expectSuccess(parser, 'a*', 'a', 1);
-    });
-    test('undefined()', () {
-      var parser = undefined();
-      expectFailure(parser, '', 0, 'undefined parser');
-      expectFailure(parser, 'a', 0, 'undefined parser');
-      parser.set(char('a'));
-      expectSuccess(parser, 'a', 'a');
-    });
-    test('setable()', () {
-      var parser = char('a').settable();
-      expectSuccess(parser, 'a', 'a');
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '');
-    });
-  });
-  group('characters', () {
-    test('anyOf()', () {
-      var parser = anyOf('uncopyrightable');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'g', 'g');
-      expectSuccess(parser, 'h', 'h');
-      expectSuccess(parser, 'i', 'i');
-      expectSuccess(parser, 'o', 'o');
-      expectSuccess(parser, 'p', 'p');
-      expectSuccess(parser, 'r', 'r');
-      expectSuccess(parser, 't', 't');
-      expectSuccess(parser, 'y', 'y');
-      expectFailure(parser, 'x', 0, 'any of "uncopyrightable" expected');
-    });
-    test('noneOf()', () {
-      var parser = noneOf('uncopyrightable');
-      expectSuccess(parser, 'x', 'x');
-      expectFailure(parser, 'c', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'g', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'h', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'i', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'o', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'p', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'r', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 't', 0, 'none of "uncopyrightable" expected');
-      expectFailure(parser, 'y', 0, 'none of "uncopyrightable" expected');
-    });
-    test('char() with number', () {
-      var parser = char(97, 'lowercase a');
-      expectSuccess(parser, 'a', 'a');
-      expectFailure(parser, 'b', 0, 'lowercase a');
-      expectFailure(parser, '');
-    });
-    test('char() invalid', () {
-      expect(() => char('ab'), throwsArgumentError);
-    });
-    test('digit()', () {
-      var parser = digit();
-      expectSuccess(parser, '1', '1');
-      expectSuccess(parser, '9', '9');
-      expectFailure(parser, 'a', 0, 'digit expected');
-      expectFailure(parser, '');
-    });
-    test('letter()', () {
-      var parser = letter();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'X', 'X');
-      expectFailure(parser, '0', 0, 'letter expected');
-      expectFailure(parser, '');
-    });
-    test('lowercase()', () {
-      var parser = lowercase();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'z', 'z');
-      expectFailure(parser, 'A', 0, 'lowercase letter expected');
-      expectFailure(parser, '0', 0, 'lowercase letter expected');
-      expectFailure(parser, '');
-    });
-    test('pattern() with single', () {
-      var parser = pattern('abc');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectFailure(parser, 'd', 0, '[abc] expected');
-      expectFailure(parser, '');
-    });
-    test('pattern() with range', () {
-      var parser = pattern('a-c');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectFailure(parser, 'd', 0, '[a-c] expected');
-      expectFailure(parser, '');
-    });
-    test('pattern() with overlapping range', () {
-      var parser = pattern('b-da-c');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectFailure(parser, 'e', 0, '[b-da-c] expected');
-      expectFailure(parser, '', 0, '[b-da-c] expected');
-    });
-    test('pattern() with adjacent range', () {
-      var parser = pattern('c-ea-c');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectSuccess(parser, 'e', 'e');
-      expectFailure(parser, 'f', 0, '[c-ea-c] expected');
-      expectFailure(parser, '', 0, '[c-ea-c] expected');
-    });
-    test('pattern() with prefix range', () {
-      var parser = pattern('a-ea-c');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectSuccess(parser, 'e', 'e');
-      expectFailure(parser, 'f', 0, '[a-ea-c] expected');
-      expectFailure(parser, '', 0, '[a-ea-c] expected');
-    });
-    test('pattern() with postfix range', () {
-      var parser = pattern('a-ec-e');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectSuccess(parser, 'e', 'e');
-      expectFailure(parser, 'f', 0, '[a-ec-e] expected');
-      expectFailure(parser, '', 0, '[a-ec-e] expected');
-    });
-    test('pattern() with repeated range', () {
-      var parser = pattern('a-ea-e');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectSuccess(parser, 'e', 'e');
-      expectFailure(parser, 'f', 0, '[a-ea-e] expected');
-      expectFailure(parser, '', 0, '[a-ea-e] expected');
-    });
-    test('pattern() with composed range', () {
-      var parser = pattern('ac-df-');
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'c', 'c');
-      expectSuccess(parser, 'd', 'd');
-      expectSuccess(parser, 'f', 'f');
-      expectSuccess(parser, '-', '-');
-      expectFailure(parser, 'b', 0, '[ac-df-] expected');
-      expectFailure(parser, 'e', 0, '[ac-df-] expected');
-      expectFailure(parser, 'g', 0, '[ac-df-] expected');
-      expectFailure(parser, '');
-    });
-    test('pattern() with negated single', () {
-      var parser = pattern('^a');
-      expectSuccess(parser, 'b', 'b');
-      expectFailure(parser, 'a', 0, '[^a] expected');
-      expectFailure(parser, '');
-    });
-    test('pattern() with negated range', () {
-      var parser = pattern('^a-c');
-      expectSuccess(parser, 'd', 'd');
-      expectFailure(parser, 'a', 0, '[^a-c] expected');
-      expectFailure(parser, 'b', 0, '[^a-c] expected');
-      expectFailure(parser, 'c', 0, '[^a-c] expected');
-      expectFailure(parser, '');
-    });
-    test('range()', () {
-      var parser = range('e', 'o');
-      expectSuccess(parser, 'e', 'e');
-      expectSuccess(parser, 'i', 'i');
-      expectSuccess(parser, 'o', 'o');
-      expectFailure(parser, 'p', 0, 'e..o expected');
-      expectFailure(parser, 'd', 0, 'e..o expected');
-      expectFailure(parser, '');
-    });
-    test('uppercase()', () {
-      var parser = uppercase();
-      expectSuccess(parser, 'A', 'A');
-      expectSuccess(parser, 'Z', 'Z');
-      expectFailure(parser, 'a', 0, 'uppercase letter expected');
-      expectFailure(parser, '0', 0, 'uppercase letter expected');
-      expectFailure(parser, '');
-    });
-    test('whitespace()', () {
-      var parser = whitespace();
-      expectSuccess(parser, ' ', ' ');
-      expectSuccess(parser, '\t', '\t');
-      expectSuccess(parser, '\r', '\r');
-      expectSuccess(parser, '\f', '\f');
-      expectFailure(parser, 'z', 0, 'whitespace expected');
-      expectFailure(parser, '');
-    });
-    test('whitespace() unicode', () {
-      var string = new String.fromCharCodes([
-        0x09,
-        0x0A,
-        0x0B,
-        0x0C,
-        0x0D,
-        0x20,
-        0x85,
-        0xA0,
-        0x1680,
-        0x180E,
-        0x2000,
-        0x2001,
-        0x2002,
-        0x2003,
-        0x2004,
-        0x2005,
-        0x2006,
-        0x2007,
-        0x2008,
-        0x2009,
-        0x200A,
-        0x2028,
-        0x2029,
-        0x202F,
-        0x205F,
-        0x3000,
-        0xFEFF
-      ]);
-      var parser = whitespace().star().flatten().end();
-      expectSuccess(parser, string, string);
-    });
-    test('word()', () {
-      var parser = word();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'z', 'z');
-      expectSuccess(parser, 'A', 'A');
-      expectSuccess(parser, 'Z', 'Z');
-      expectSuccess(parser, '0', '0');
-      expectSuccess(parser, '9', '9');
-      expectSuccess(parser, '_', '_');
-      expectFailure(parser, '-', 0, 'letter or digit expected');
-      expectFailure(parser, '');
-    });
-  });
-  group('predicates', () {
-    test('any()', () {
-      var parser = any();
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectFailure(parser, '', 0, 'input expected');
-    });
-    test('anyIn()', () {
-      var parser = anyIn(['a', 'b']);
-      expectSuccess(parser, 'a', 'a');
-      expectSuccess(parser, 'b', 'b');
-      expectFailure(parser, 'c');
-      expectFailure(parser, '');
-    });
-    test('string()', () {
-      var parser = string('foo');
-      expectSuccess(parser, 'foo', 'foo');
-      expectFailure(parser, '');
-      expectFailure(parser, 'f');
-      expectFailure(parser, 'fo');
-      expectFailure(parser, 'Foo');
-    });
-    test('stringIgnoreCase()', () {
-      var parser = stringIgnoreCase('foo');
-      expectSuccess(parser, 'foo', 'foo');
-      expectSuccess(parser, 'FOO', 'FOO');
-      expectSuccess(parser, 'fOo', 'fOo');
-      expectFailure(parser, '');
-      expectFailure(parser, 'f');
-      expectFailure(parser, 'Fo');
-    });
-  });
-  group('token', () {
-    var parser = any().map((value) => value.codeUnitAt(0)).token().star();
-    var buffer = '1\r12\r\n123\n1234';
-    var result = parser.parse(buffer).value;
-    test('value', () {
-      var expected = [49, 13, 49, 50, 13, 10, 49, 50, 51, 10, 49, 50, 51, 52];
-      expect(result.map((token) => token.value), expected);
-    });
-    test('buffer', () {
-      var expected = new List.filled(buffer.length, buffer);
-      expect(result.map((token) => token.buffer), expected);
-    });
-    test('start', () {
-      var expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
-      expect(result.map((token) => token.start), expected);
-    });
-    test('stop', () {
-      var expected = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
-      expect(result.map((token) => token.stop), expected);
-    });
-    test('length', () {
-      var expected = new List.filled(buffer.length, 1);
-      expect(result.map((token) => token.length), expected);
-    });
-    test('line', () {
-      var expected = [1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4];
-      expect(result.map((token) => token.line), expected);
-    });
-    test('column', () {
-      var expected = [1, 2, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4];
-      expect(result.map((token) => token.column), expected);
-    });
-    test('input', () {
-      var expected = ['1', '\r', '1', '2', '\r', '\n', '1', '2', '3', '\n', '1', '2', '3', '4'];
-      expect(result.map((token) => token.input), expected);
-    });
-    test('unique', () {
-      expect(new Set.from(result).length, result.length);
-    });
-    test('equals', () {
-      for (var i = 0; i < result.length; i++) {
-        for (var j = 0; j < result.length; j++) {
-          var condition = i == j ? isTrue : isFalse;
-          expect(result[i] == result[j], condition);
-          expect(result[i].hashCode == result[j].hashCode, condition);
-        }
-      }
-    });
-  });
-  group('context', () {
-    var buffer = 'a\nc';
-    var context = new Context(buffer, 0);
-    test('context', () {
-      expect(context.buffer, buffer);
-      expect(context.position, 0);
-      expect(context.toString(), 'Context[1:1]');
-    });
-    test('success', () {
-      var success = context.success('result');
-      expect(success.buffer, buffer);
-      expect(success.position, 0);
-      expect(success.value, 'result');
-      expect(success.message, isNull);
-      expect(success.isSuccess, isTrue);
-      expect(success.isFailure, isFalse);
-      expect(success.toString(), 'Success[1:1]: result');
-    });
-    test('success with position', () {
-      var success = context.success('result', 2);
-      expect(success.buffer, buffer);
-      expect(success.position, 2);
-      expect(success.value, 'result');
-      expect(success.message, isNull);
-      expect(success.isSuccess, isTrue);
-      expect(success.isFailure, isFalse);
-      expect(success.toString(), 'Success[2:1]: result');
-    });
-    test('failure', () {
-      var failure = context.failure('error');
-      expect(failure.buffer, buffer);
-      expect(failure.position, 0);
-      try {
-        failure.value;
-        fail('Expected ParserError to be thrown');
-      } on ParserError catch (error) {
-        expect(error.failure, same(failure));
-        expect(error.toString(), 'error at 1:1');
-      }
-      expect(failure.message, 'error');
-      expect(failure.isSuccess, isFalse);
-      expect(failure.isFailure, isTrue);
-      expect(failure.toString(), 'Failure[1:1]: error');
-    });
-    test('failure with position', () {
-      var failure = context.failure('error', 2);
-      expect(failure.buffer, buffer);
-      expect(failure.position, 2);
-      try {
-        failure.value;
-        fail('Expected ParserError to be thrown');
-      } on ParserError catch (error) {
-        expect(error.failure, same(failure));
-        expect(error.toString(), 'error at 2:1');
-      }
-      expect(failure.message, 'error');
-      expect(failure.isSuccess, isFalse);
-      expect(failure.isFailure, isTrue);
-      expect(failure.toString(), 'Failure[2:1]: error');
-    });
-  });
-  group('parsing', () {
-    test('parse()', () {
-      var parser = char('a');
-      expect(parser.parse('a').isSuccess, isTrue);
-      expect(parser.parse('b').isSuccess, isFalse);
-    });
-    test('accept()', () {
-      var parser = char('a');
-      expect(parser.accept('a'), isTrue);
-      expect(parser.accept('b'), isFalse);
-    });
-    test('matches()', () {
-      var parser = digit().seq(digit()).flatten();
-      expect(parser.matches('a123b45'), ['12', '23', '45']);
-    });
-    test('matchesSkipping()', () {
-      var parser = digit().seq(digit()).flatten();
-      expect(parser.matchesSkipping('a123b45'), ['12', '45']);
-    });
-  });
-  group('examples', () {
-    final identifier = letter().seq(word().star()).flatten();
-    final number = char('-')
-        .optional()
-        .seq(digit().plus())
-        .seq(char('.').seq(digit().plus()).optional())
-        .flatten();
-    final quoted = char('"')
-        .seq(char('"').neg().star())
-        .seq(char('"'))
-        .flatten();
-    final keyword = string('return')
-        .seq(whitespace().plus().flatten())
-        .seq(identifier.or(number).or(quoted))
-        .map((list) => list.last);
-    final javadoc = string('/**')
-        .seq(string('*/').neg().star())
-        .seq(string('*/'))
-        .flatten();
-    test('valid identifier', () {
-      expectSuccess(identifier, 'a', 'a');
-      expectSuccess(identifier, 'a1', 'a1');
-      expectSuccess(identifier, 'a12', 'a12');
-      expectSuccess(identifier, 'ab', 'ab');
-      expectSuccess(identifier, 'a1b', 'a1b');
-    });
-    test('incomplete identifier', () {
-      expectSuccess(identifier, 'a=', 'a', 1);
-      expectSuccess(identifier, 'a1-', 'a1', 2);
-      expectSuccess(identifier, 'a12+', 'a12', 3);
-      expectSuccess(identifier, 'ab ', 'ab', 2);
-    });
-    test('invalid identifier', () {
-      expectFailure(identifier, '', 0, 'letter expected');
-      expectFailure(identifier, '1', 0, 'letter expected');
-      expectFailure(identifier, '1a', 0, 'letter expected');
-    });
-    test('positive number', () {
-      expectSuccess(number, '1', '1');
-      expectSuccess(number, '12', '12');
-      expectSuccess(number, '12.3', '12.3');
-      expectSuccess(number, '12.34', '12.34');
-    });
-    test('negative number', () {
-      expectSuccess(number, '-1', '-1');
-      expectSuccess(number, '-12', '-12');
-      expectSuccess(number, '-12.3', '-12.3');
-      expectSuccess(number, '-12.34', '-12.34');
-    });
-    test('incomplete number', () {
-      expectSuccess(number, '1..', '1', 1);
-      expectSuccess(number, '12-', '12', 2);
-      expectSuccess(number, '12.3.', '12.3', 4);
-      expectSuccess(number, '12.34.', '12.34', 5);
-    });
-    test('invalid number', () {
-      expectFailure(number, '', 0, 'digit expected');
-      expectFailure(number, '-', 1, 'digit expected');
-      expectFailure(number, '-x', 1, 'digit expected');
-      expectFailure(number, '.', 0, 'digit expected');
-      expectFailure(number, '.1', 0, 'digit expected');
-    });
-    test('valid string', () {
-      expectSuccess(quoted, '""', '""');
-      expectSuccess(quoted, '"a"', '"a"');
-      expectSuccess(quoted, '"ab"', '"ab"');
-      expectSuccess(quoted, '"abc"', '"abc"');
-    });
-    test('incomplete string', () {
-      expectSuccess(quoted, '""x', '""', 2);
-      expectSuccess(quoted, '"a"x', '"a"', 3);
-      expectSuccess(quoted, '"ab"x', '"ab"', 4);
-      expectSuccess(quoted, '"abc"x', '"abc"', 5);
-    });
-    test('invalid string', () {
-      expectFailure(quoted, '"', 1, '""" expected');
-      expectFailure(quoted, '"a', 2, '""" expected');
-      expectFailure(quoted, '"ab', 3, '""" expected');
-      expectFailure(quoted, 'a"', 0, '""" expected');
-      expectFailure(quoted, 'ab"', 0, '""" expected');
-    });
-    test('return statement', () {
-      expectSuccess(keyword, 'return f', 'f');
-      expectSuccess(keyword, 'return  f', 'f');
-      expectSuccess(keyword, 'return foo', 'foo');
-      expectSuccess(keyword, 'return    foo', 'foo');
-      expectSuccess(keyword, 'return 1', '1');
-      expectSuccess(keyword, 'return  1', '1');
-      expectSuccess(keyword, 'return -2.3', '-2.3');
-      expectSuccess(keyword, 'return    -2.3', '-2.3');
-      expectSuccess(keyword, 'return "a"', '"a"');
-      expectSuccess(keyword, 'return  "a"', '"a"');
-    });
-    test('invalid statement', () {
-      expectFailure(keyword, 'retur f', 0, 'return expected');
-      expectFailure(keyword, 'return1', 6, 'whitespace expected');
-      expectFailure(keyword, 'return  _', 8, '""" expected');
-    });
-    test('javadoc', () {
-      expectSuccess(javadoc, '/** foo */', '/** foo */');
-      expectSuccess(javadoc, '/** * * */', '/** * * */');
-    });
-  });
-  group('copying, matching, replacing', () {
-    void verify(Parser parser) {
-      var copy = parser.copy();
-      // check copying
-      expect(copy, isNot(same(parser)));
-      expect(copy.toString(), parser.toString());
-      expect(copy.runtimeType, parser.runtimeType);
-      expect(copy.children,
-          pairwiseCompare(parser.children, identical, 'same children'));
-      // check equality
-      expect(copy.isEqualTo(copy), isTrue);
-      expect(parser.isEqualTo(parser), isTrue);
-      expect(copy.isEqualTo(parser), isTrue);
-      expect(parser.isEqualTo(copy), isTrue);
-      // check replacing
-      var replaced = new List();
-      for (var i = 0; i < copy.children.length; i++) {
-        var source = copy.children[i],
-            target = any();
-        copy.replace(source, target);
-        expect(copy.children[i], same(target));
-        replaced.add(target);
-      }
-      expect(copy.children,
-          pairwiseCompare(replaced, identical, 'replaced children'));
-    }
-    test('any()', () => verify(any()));
-    test('and()', () => verify(digit().and()));
-    test('char()', () => verify(char('a')));
-    test('digit()', () => verify(digit()));
-    test('delegate()', () => verify(new DelegateParser(any())));
-    test('end()', () => verify(digit().end()));
-    test('epsilon()', () => verify(epsilon()));
-    test('failure()', () => verify(failure()));
-    test('flatten()', () => verify(digit().flatten()));
-    test('map()', () => verify(digit().map((a) => a)));
-    test('not()', () => verify(digit().not()));
-    test('optional()', () => verify(digit().optional()));
-    test('or()', () => verify(digit().or(word())));
-    test('plus()', () => verify(digit().plus()));
-    test('plusGreedy()', () => verify(digit().plusGreedy(word())));
-    test('plusLazy()', () => verify(digit().plusLazy(word())));
-    test('repeat()', () => verify(digit().repeat(2, 3)));
-    test('repeatGreedy()', () => verify(digit().repeatGreedy(word(), 2, 3)));
-    test('repeatLazy()', () => verify(digit().repeatLazy(word(), 2, 3)));
-    test('seq()', () => verify(digit().seq(word())));
-    test('setable()', () => verify(digit().settable()));
-    test('star()', () => verify(digit().star()));
-    test('starGreedy()', () => verify(digit().starGreedy(word())));
-    test('starLazy()', () => verify(digit().starLazy(word())));
-    test('string()', () => verify(string('ab')));
-    test('times()', () => verify(digit().times(2)));
-    test('token()', () => verify(digit().token()));
-    test('trim()', () => verify(digit().trim(char('a'), char('b'))));
-    test('undefined()', () => verify(undefined()));
-  });
-  group('regressions', () {
-    test('flatten().trim()', () {
-      var parser = word().plus().flatten().trim();
-      expectSuccess(parser, 'ab1', 'ab1');
-      expectSuccess(parser, ' ab1 ', 'ab1');
-      expectSuccess(parser, '  ab1  ', 'ab1');
-    });
-    test('trim().flatten()', () {
-      var parser = word().plus().trim().flatten();
-      expectSuccess(parser, 'ab1', 'ab1');
-      expectSuccess(parser, ' ab1 ', ' ab1 ');
-      expectSuccess(parser, '  ab1  ', '  ab1  ');
-    });
-  });
-  group('definition', () {
-    var grammarDefinition = new ListGrammarDefinition();
-    var parserDefinition = new ListParserDefinition();
-    var tokenDefinition = new TokenizedListGrammarDefinition();
-    var buggedDefinition = new BuggedGrammarDefinition();
-
-    test('reference without parameters', () {
-      var firstReference = grammarDefinition.ref(grammarDefinition.start);
-      var secondReference = grammarDefinition.ref(grammarDefinition.start);
-      expect(firstReference, isNot(same(secondReference)));
-      expect(firstReference == secondReference, isTrue);
-    });
-    test('reference with different production', () {
-      var firstReference = grammarDefinition.ref(grammarDefinition.start);
-      var secondReference = grammarDefinition.ref(grammarDefinition.element);
-      expect(firstReference, isNot(same(secondReference)));
-      expect(firstReference == secondReference, isFalse);
-    });
-    test('reference with same parameters', () {
-      var firstReference = grammarDefinition.ref(grammarDefinition.start, 'a');
-      var secondReference = grammarDefinition.ref(grammarDefinition.start, 'a');
-      expect(firstReference, isNot(same(secondReference)));
-      expect(firstReference == secondReference, isTrue);
-    });
-    test('reference with different parameters', () {
-      var firstReference = grammarDefinition.ref(grammarDefinition.start, 'a');
-      var secondReference = grammarDefinition.ref(grammarDefinition.start, 'b');
-      expect(firstReference, isNot(same(secondReference)));
-      expect(firstReference == secondReference, isFalse);
-    });
-    test('grammar', () {
-      var parser = grammarDefinition.build();
-      expectSuccess(parser, '1,2', ['1', ',', '2']);
-      expectSuccess(parser, '1,2,3', ['1', ',', ['2', ',', '3']]);
-    });
-    test('parser', () {
-      var parser = parserDefinition.build();
-      expectSuccess(parser, '1,2', [1, ',', 2]);
-      expectSuccess(parser, '1,2,3', [1, ',', [2, ',', 3]]);
-    });
-    test('token', () {
-      var parser = tokenDefinition.build();
-      expectSuccess(parser, '1, 2', ['1', ',', '2']);
-      expectSuccess(parser, '1, 2, 3', ['1', ',', ['2', ',', '3']]);
-    });
-    test('direct recursion', () {
-      expect(() =>
-              buggedDefinition.build(start: buggedDefinition.directRecursion1),
-          throwsStateError);
-    });
-    test('indirect recursion', () {
-      expect(() => buggedDefinition.build(
-          start: buggedDefinition.indirectRecursion1), throwsStateError);
-      expect(() => buggedDefinition.build(
-          start: buggedDefinition.indirectRecursion2), throwsStateError);
-      expect(() => buggedDefinition.build(
-          start: buggedDefinition.indirectRecursion3), throwsStateError);
-    });
-    test('delegation', () {
-      expect(buggedDefinition.build(
-          start: buggedDefinition.delegation1) is EpsilonParser, isTrue);
-      expect(buggedDefinition.build(
-          start: buggedDefinition.delegation2) is EpsilonParser, isTrue);
-      expect(buggedDefinition.build(
-          start: buggedDefinition.delegation3) is EpsilonParser, isTrue);
-    });
-    test('lambda example', () {
-      var definition = new LambdaGrammarDefinition();
-      var parser = definition.build();
-      expect(parser.accept('x'), isTrue);
-      expect(parser.accept('xy'), isTrue);
-      expect(parser.accept('x12'), isTrue);
-      expect(parser.accept('\\x.y'), isTrue);
-      expect(parser.accept('\\x.\\y.z'), isTrue);
-      expect(parser.accept('(x x)'), isTrue);
-      expect(parser.accept('(x y)'), isTrue);
-      expect(parser.accept('(x (y z))'), isTrue);
-      expect(parser.accept('((x y) z)'), isTrue);
-    });
-    test('expression example', () {
-      var definition = new ExpressionGrammarDefinition();
-      var parser = definition.build();
-      expect(parser.accept('1'), isTrue);
-      expect(parser.accept('12'), isTrue);
-      expect(parser.accept('1.23'), isTrue);
-      expect(parser.accept('-12.3'), isTrue);
-      expect(parser.accept('1 + 2'), isTrue);
-      expect(parser.accept('1 + 2 + 3'), isTrue);
-      expect(parser.accept('1 - 2'), isTrue);
-      expect(parser.accept('1 - 2 - 3'), isTrue);
-      expect(parser.accept('1 * 2'), isTrue);
-      expect(parser.accept('1 * 2 * 3'), isTrue);
-      expect(parser.accept('1 / 2'), isTrue);
-      expect(parser.accept('1 / 2 / 3'), isTrue);
-      expect(parser.accept('1 ^ 2'), isTrue);
-      expect(parser.accept('1 ^ 2 ^ 3'), isTrue);
-      expect(parser.accept('1 + (2 * 3)'), isTrue);
-      expect(parser.accept('(1 + 2) * 3'), isTrue);
-    });
-  });
-  group('expression', () {
-    Parser build({attachAction: true}) {
-      var action = attachAction ? (func) => func : (func) => null;
-      var root = failure().settable();
-      var builder = new ExpressionBuilder();
-      builder.group()
-        ..primitive(char('(').trim().seq(root).seq(char(')').trim()).pick(1))
-        ..primitive(digit().plus().seq(char('.').seq(digit().plus()).optional())
-            .flatten().trim().map((a) => double.parse(a)));
-      builder.group()
-        ..prefix(char('-').trim(), action((op, a) => -a));
-      builder.group()
-        ..postfix(string('++').trim(), action((a, op) => ++a))
-        ..postfix(string('--').trim(), action((a, op) => --a));
-      builder.group()
-        ..right(char('^').trim(), action((a, op, b) => math.pow(a, b)));
-      builder.group()
-        ..left(char('*').trim(), action((a, op, b) => a * b))
-        ..left(char('/').trim(), action((a, op, b) => a / b));
-      builder.group()
-        ..left(char('+').trim(), action((a, op, b) => a + b))
-        ..left(char('-').trim(), action((a, op, b) => a - b));
-      root.set(builder.build());
-      return root.end();
-    }
-    var epsilon = 1e-5;
-    var evaluator = build(attachAction: true);
-    var parser = build(attachAction: false);
-    test('number', () {
-      expect(evaluator.parse('0').value, closeTo(0, epsilon));
-      expect(evaluator.parse('0.0').value, closeTo(0, epsilon));
-      expect(evaluator.parse('1').value, closeTo(1, epsilon));
-      expect(evaluator.parse('1.2').value, closeTo(1.2, epsilon));
-      expect(evaluator.parse('34').value, closeTo(34, epsilon));
-      expect(evaluator.parse('34.7').value, closeTo(34.7, epsilon));
-      expect(evaluator.parse('56.78').value, closeTo(56.78, epsilon));
-    });
-    test('number negative', () {
-      expect(evaluator.parse('-1').value, closeTo(-1, epsilon));
-      expect(evaluator.parse('-1.2').value, closeTo(-1.2, epsilon));
-    });
-    test('number parse', () {
-      expect(parser.parse('0').value, 0);
-      expect(parser.parse('-1').value, ['-', 1]);
-    });
-    test('add', () {
-      expect(evaluator.parse('1 + 2').value, closeTo(3, epsilon));
-      expect(evaluator.parse('2 + 1').value, closeTo(3, epsilon));
-      expect(evaluator.parse('1 + 2.3').value, closeTo(3.3, epsilon));
-      expect(evaluator.parse('2.3 + 1').value, closeTo(3.3, epsilon));
-      expect(evaluator.parse('1 + -2').value, closeTo(-1, epsilon));
-      expect(evaluator.parse('-2 + 1').value, closeTo(-1, epsilon));
-    });
-    test('add many', () {
-      expect(evaluator.parse('1').value, closeTo(1, epsilon));
-      expect(evaluator.parse('1 + 2').value, closeTo(3, epsilon));
-      expect(evaluator.parse('1 + 2 + 3').value, closeTo(6, epsilon));
-      expect(evaluator.parse('1 + 2 + 3 + 4').value, closeTo(10, epsilon));
-      expect(evaluator.parse('1 + 2 + 3 + 4 + 5').value, closeTo(15, epsilon));
-    });
-    test('add parse', () {
-      expect(parser.parse('1 + 2 + 3').value, [[1, '+', 2], '+', 3]);
-    });
-    test('sub', () {
-      expect(evaluator.parse('1 - 2').value, closeTo(-1, epsilon));
-      expect(evaluator.parse('1.2 - 1.2').value, closeTo(0, epsilon));
-      expect(evaluator.parse('1 - -2').value, closeTo(3, epsilon));
-      expect(evaluator.parse('-1 - -2').value, closeTo(1, epsilon));
-    });
-    test('sub many', () {
-      expect(evaluator.parse('1').value, closeTo(1, epsilon));
-      expect(evaluator.parse('1 - 2').value, closeTo(-1, epsilon));
-      expect(evaluator.parse('1 - 2 - 3').value, closeTo(-4, epsilon));
-      expect(evaluator.parse('1 - 2 - 3 - 4').value, closeTo(-8, epsilon));
-      expect(evaluator.parse('1 - 2 - 3 - 4 - 5').value, closeTo(-13, epsilon));
-    });
-    test('sub parse', () {
-      expect(parser.parse('1 - 2 - 3').value, [[1, '-', 2], '-', 3]);
-    });
-    test('mul', () {
-      expect(evaluator.parse('2 * 3').value, closeTo(6, epsilon));
-      expect(evaluator.parse('2 * -4').value, closeTo(-8, epsilon));
-    });
-    test('mul many', () {
-      expect(evaluator.parse('1 * 2').value, closeTo(2, epsilon));
-      expect(evaluator.parse('1 * 2 * 3').value, closeTo(6, epsilon));
-      expect(evaluator.parse('1 * 2 * 3 * 4').value, closeTo(24, epsilon));
-      expect(evaluator.parse('1 * 2 * 3 * 4 * 5').value, closeTo(120, epsilon));
-    });
-    test('mul parse', () {
-      expect(parser.parse('1 * 2 * 3').value, [[1, '*', 2], '*', 3]);
-    });
-    test('div', () {
-      expect(evaluator.parse('12 / 3').value, closeTo(4, epsilon));
-      expect(evaluator.parse('-16 / -4').value, closeTo(4, epsilon));
-    });
-    test('div many', () {
-      expect(evaluator.parse('100 / 2').value, closeTo(50, epsilon));
-      expect(evaluator.parse('100 / 2 / 2').value, closeTo(25, epsilon));
-      expect(evaluator.parse('100 / 2 / 2 / 5').value, closeTo(5, epsilon));
-      expect(evaluator.parse('100 / 2 / 2 / 5 / 5').value, closeTo(1, epsilon));
-    });
-    test('mul parse', () {
-      expect(parser.parse('1 / 2 / 3').value, [[1, '/', 2], '/', 3]);
-    });
-    test('pow', () {
-      expect(evaluator.parse('2 ^ 3').value, closeTo(8, epsilon));
-      expect(evaluator.parse('-2 ^ 3').value, closeTo(-8, epsilon));
-      expect(evaluator.parse('-2 ^ -3').value, closeTo(-0.125, epsilon));
-    });
-    test('pow many', () {
-      expect(evaluator.parse('4 ^ 3').value, closeTo(64, epsilon));
-      expect(evaluator.parse('4 ^ 3 ^ 2').value, closeTo(262144, epsilon));
-      expect(evaluator.parse('4 ^ 3 ^ 2 ^ 1').value, closeTo(262144, epsilon));
-      expect(evaluator.parse('4 ^ 3 ^ 2 ^ 1 ^ 0').value, closeTo(262144, epsilon));
-    });
-    test('pow parse', () {
-      expect(parser.parse('1 ^ 2 ^ 3').value, [1, '^', [2, '^', 3]]);
-    });
-    test('parens', () {
-      expect(evaluator.parse('(1)').value, closeTo(1, epsilon));
-      expect(evaluator.parse('(1 + 2)').value, closeTo(3, epsilon));
-      expect(evaluator.parse('((1))').value, closeTo(1, epsilon));
-      expect(evaluator.parse('((1 + 2))').value, closeTo(3, epsilon));
-      expect(evaluator.parse('2 * (3 + 4)').value, closeTo(14, epsilon));
-      expect(evaluator.parse('(2 + 3) * 4').value, closeTo(20, epsilon));
-      expect(evaluator.parse('6 / (2 + 4)').value, closeTo(1, epsilon));
-      expect(evaluator.parse('(2 + 6) / 2').value, closeTo(4, epsilon));
-    });
-    test('priority', () {
-      expect(evaluator.parse('2 * 3 + 4').value, closeTo(10, epsilon));
-      expect(evaluator.parse('2 + 3 * 4').value, closeTo(14, epsilon));
-      expect(evaluator.parse('6 / 3 + 4').value, closeTo(6, epsilon));
-      expect(evaluator.parse('2 + 6 / 2').value, closeTo(5, epsilon));
-    });
-    test('priority parse', () {
-      expect(parser.parse('2 * 3 + 4').value, [[2.0, '*', 3.0], '+', 4.0]);
-      expect(parser.parse('2 + 3 * 4').value, [2.0, '+', [3.0, '*', 4.0]]);
-    });
-    test('postfix add', () {
-      expect(evaluator.parse('0++').value, closeTo(1, epsilon));
-      expect(evaluator.parse('0++++').value, closeTo(2, epsilon));
-      expect(evaluator.parse('0++++++').value, closeTo(3, epsilon));
-      expect(evaluator.parse('0+++1').value, closeTo(2, epsilon));
-      expect(evaluator.parse('0+++++1').value, closeTo(3, epsilon));
-      expect(evaluator.parse('0+++++++1').value, closeTo(4, epsilon));
-    });
-    test('postfix sub', () {
-      expect(evaluator.parse('1--').value, closeTo(0, epsilon));
-      expect(evaluator.parse('2----').value, closeTo(0, epsilon));
-      expect(evaluator.parse('3------').value, closeTo(0, epsilon));
-      expect(evaluator.parse('2---1').value, closeTo(0, epsilon));
-      expect(evaluator.parse('3-----1').value, closeTo(0, epsilon));
-      expect(evaluator.parse('4-------1').value, closeTo(0, epsilon));
-    });
-    test('prefix negate', () {
-      expect(evaluator.parse('1').value, closeTo(1, epsilon));
-      expect(evaluator.parse('-1').value, closeTo(-1, epsilon));
-      expect(evaluator.parse('--1').value, closeTo(1, epsilon));
-      expect(evaluator.parse('---1').value, closeTo(-1, epsilon));
-    });
-  });
-  group('tutorial', () {
-    test('simple grammar', () {
-      var id = letter().seq(letter().or(digit()).star());
-      var id1 = id.parse('yeah');
-      var id2 = id.parse('f12');
-      expect(id1.value, ['y', ['e', 'a', 'h']]);
-      expect(id2.value, ['f', ['1', '2']]);
-      var id3 = id.parse('123');
-      expect(id3.message, 'letter expected');
-      expect(id3.position, 0);
-      expect(id.accept('foo'), isTrue);
-      expect(id.accept('123'), isFalse);
-    });
-    test('different parsers', () {
-      var id = letter().seq(word().star()).flatten();
-      var matches = id.matchesSkipping('foo 123 bar4');
-      expect(matches, ['foo', 'bar4']);
-    });
-    test('complicated grammar', () {
-      var number = digit().plus().flatten().trim().map(int.parse);
-      var term = undefined();
-      var prod = undefined();
-      var prim = undefined();
-      term.set(prod.seq(char('+').trim()).seq(term).map((values) {
-        return values[0] + values[2];
-      }).or(prod));
-      prod.set(prim.seq(char('*').trim()).seq(prod).map((values) {
-        return values[0] * values[2];
-      }).or(prim));
-      prim.set(char('(').trim().seq(term).seq(char(')'.trim())).map((values) {
-        return values[1];
-      }).or(number));
-      var start = term.end();
-      expect(7, start.parse('1 + 2 * 3').value);
-      expect(9, start.parse('(1 + 2) * 3').value);
-    });
-  });
-  group('composite (deprecated)', () {
-    test('start', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', char('a'));
-      });
-      expectSuccess(parser, 'a', 'a', 1);
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '');
-    });
-    test('circular', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', self.ref('loop').or(char('b')));
-        self.def('loop', char('a').seq(self.ref('start')));
-      });
-      expect(parser.accept('b'), isTrue);
-      expect(parser.accept('ab'), isTrue);
-      expect(parser.accept('aab'), isTrue);
-      expect(parser.accept('aaab'), isTrue);
-    });
-    test('redefine parser', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', char('b'));
-        self.redef('start', char('a'));
-      });
-      expectSuccess(parser, 'a', 'a', 1);
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '');
-    });
-    test('redefine function', () {
-      var parser = new PluggableCompositeParser((self) {
-        var b = char('b');
-        self.def('start', b);
-        self.redef('start', (old) {
-          expect(b, old);
-          return char('a');
-        });
-      });
-      expectSuccess(parser, 'a', 'a', 1);
-      expectFailure(parser, 'b', 0, '"a" expected');
-      expectFailure(parser, '');
-    });
-    test('define completed', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', char('a'));
-      });
-      expect(() => parser.def('other', char('b')), throws);
-      expect(() => parser.redef('start', char('b')), throws);
-      expect(() => parser.action('start', (each) => each), throws);
-    });
-    test('reference completed', () {
-      var parsers = {
-        'start': char('a'),
-        'for_b': char('b'),
-        'for_c': char('c')
-      };
-      var parser = new PluggableCompositeParser((self) {
-        for (var key in parsers.keys) {
-          self.def(key, parsers[key]);
-        }
-      });
-      for (var key in parsers.keys) {
-        expect(parsers[key], parser[key]);
-        expect(parsers[key], parser.ref(key));
-      }
-    });
-    test('reference unknown', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', char('a'));
-      });
-      try {
-        parser.ref('star1');
-        fail('Expected UndefinedProductionError to be thrown');
-      } on UndefinedProductionError catch (error) {
-        expect(error.toString(), 'Undefined production: star1');
-      }
-    });
-    test('duplicated start', () {
-      new PluggableCompositeParser((self) {
-        self.def('start', char('a'));
-        try {
-          self.def('start', char('b'));
-          fail('Expected UndefinedProductionError to be thrown');
-        } on RedefinedProductionError catch (error) {
-          expect(error.toString(), 'Redefined production: start');
-        }
-      });
-    });
-    test('undefined start', () {
-      expect(() => new PluggableCompositeParser((self) {}), throws);
-    });
-    test('undefined redef', () {
-      new PluggableCompositeParser((self) {
-        self.def('start', char('a'));
-        expect(() => self.redef('star1', char('b')), throws);
-      });
-    });
-    test('example (lambda)', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', self.ref('expression').end());
-        self.def('variable', letter().seq(word().star()).flatten().trim());
-        self.def('expression', self
-        .ref('variable')
-        .or(self.ref('abstraction'))
-        .or(self.ref('application')));
-        self.def('abstraction', char('\\')
-        .trim()
-        .seq(self.ref('variable'))
-        .seq(char('.').trim())
-        .seq(self.ref('expression')));
-        self.def('application', char('(')
-        .trim()
-        .seq(self.ref('expression'))
-        .seq(self.ref('expression'))
-        .seq(char(')').trim()));
-      });
-      expect(parser.accept('x'), isTrue);
-      expect(parser.accept('xy'), isTrue);
-      expect(parser.accept('x12'), isTrue);
-      expect(parser.accept('\\x.y'), isTrue);
-      expect(parser.accept('\\x.\\y.z'), isTrue);
-      expect(parser.accept('(x x)'), isTrue);
-      expect(parser.accept('(x y)'), isTrue);
-      expect(parser.accept('(x (y z))'), isTrue);
-      expect(parser.accept('((x y) z)'), isTrue);
-    });
-    test('example (expression)', () {
-      var parser = new PluggableCompositeParser((self) {
-        self.def('start', self.ref('terms').end());
-        self.def('terms', self.ref('addition').or(self.ref('factors')));
-        self.def('addition',
-        self.ref('factors').separatedBy(char('+').or(char('-')).trim()));
-        self.def('factors', self.ref('multiplication').or(self.ref('power')));
-        self.def('multiplication',
-        self.ref('power').separatedBy(char('*').or(char('/')).trim()));
-        self.def('power', self.ref('primary').separatedBy(char('^').trim()));
-        self.def('primary', self.ref('number').or(self.ref('parentheses')));
-        self.def('number', char('-')
-        .optional()
-        .seq(digit().plus())
-        .seq(char('.').seq(digit().plus()).optional())
-        .flatten()
-        .trim());
-        self.def('parentheses',
-        char('(').trim().seq(self.ref('terms')).seq(char(')').trim()));
-      });
-      expect(parser.accept('1'), isTrue);
-      expect(parser.accept('12'), isTrue);
-      expect(parser.accept('1.23'), isTrue);
-      expect(parser.accept('-12.3'), isTrue);
-      expect(parser.accept('1 + 2'), isTrue);
-      expect(parser.accept('1 + 2 + 3'), isTrue);
-      expect(parser.accept('1 - 2'), isTrue);
-      expect(parser.accept('1 - 2 - 3'), isTrue);
-      expect(parser.accept('1 * 2'), isTrue);
-      expect(parser.accept('1 * 2 * 3'), isTrue);
-      expect(parser.accept('1 / 2'), isTrue);
-      expect(parser.accept('1 / 2 / 3'), isTrue);
-      expect(parser.accept('1 ^ 2'), isTrue);
-      expect(parser.accept('1 ^ 2 ^ 3'), isTrue);
-      expect(parser.accept('1 + (2 * 3)'), isTrue);
-      expect(parser.accept('(1 + 2) * 3'), isTrue);
-    });
-  });
-}
diff --git a/packages/petitparser/test/reflection_test.dart b/packages/petitparser/test/reflection_test.dart
deleted file mode 100644
index dc200a9..0000000
--- a/packages/petitparser/test/reflection_test.dart
+++ /dev/null
@@ -1,159 +0,0 @@
-library petitparser.test.reflection_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/petitparser.dart';
-import 'package:petitparser/reflection.dart';
-
-main() {
-  group('iterator', () {
-    test('single', () {
-      var parser1 = lowercase();
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1]);
-    });
-    test('nested', () {
-      var parser3 = lowercase();
-      var parser2 = parser3.star();
-      var parser1 = parser2.flatten();
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1, parser2, parser3]);
-    });
-    test('branched', () {
-      var parser3 = lowercase();
-      var parser2 = uppercase();
-      var parser1 = parser2.seq(parser3);
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1, parser3, parser2]);
-    });
-    test('duplicated', () {
-      var parser2 = uppercase();
-      var parser1 = parser2.seq(parser2);
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1, parser2]);
-    });
-    test('knot', () {
-      var parser1 = undefined();
-      parser1.set(parser1);
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1]);
-    });
-    test('looping', () {
-      var parser1 = undefined();
-      var parser2 = undefined();
-      var parser3 = undefined();
-      parser1.set(parser2);
-      parser2.set(parser3);
-      parser3.set(parser1);
-      var parsers = allParser(parser1).toList();
-      expect(parsers, [parser1, parser2, parser3]);
-    });
-    test('basic', () {
-      var lower = lowercase();
-      var iterator = allParser(lower).iterator;
-      expect(iterator.current, isNull);
-      expect(iterator.moveNext(), isTrue);
-      expect(iterator.current, lower);
-      expect(iterator.current, lower);
-      expect(iterator.moveNext(), isFalse);
-      expect(iterator.current, isNull);
-      expect(iterator.moveNext(), isFalse);
-    });
-  });
-  group('transform', () {
-    test('copy', () {
-      var input = lowercase().settable();
-      var output = transformParser(input, (parser) => parser);
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isTrue);
-      expect(input.children.single, isNot(output.children.single));
-    });
-    test('root', () {
-      var source = lowercase();
-      var input = source;
-      var target = uppercase();
-      var output = transformParser(input, (parser) {
-        return source.isEqualTo(parser) ? target : parser;
-      });
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isFalse);
-      expect(input, source);
-      expect(output, target);
-    });
-    test('single', () {
-      var source = lowercase();
-      var input = source.settable();
-      var target = uppercase();
-      var output = transformParser(input, (parser) {
-        return source.isEqualTo(parser) ? target : parser;
-      });
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isFalse);
-      expect(input.children.single, source);
-      expect(output.children.single, target);
-    });
-    test('double', () {
-      var source = lowercase();
-      var input = source & source;
-      var target = uppercase();
-      var output = transformParser(input, (parser) {
-        return source.isEqualTo(parser) ? target : parser;
-      });
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isFalse);
-      expect(input.isEqualTo(source & source), isTrue);
-      expect(input.children.first, input.children.last);
-      expect(output.isEqualTo(target & target), isTrue);
-      expect(output.children.first, output.children.last);
-    });
-    test('loop (existing)', () {
-      var input = failure().settable().settable().settable();
-      input.children.single.children.single.set(input);
-      var output = transformParser(input, (parser) {
-        return parser;
-      });
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isTrue);
-      var inputs = allParser(input).toSet();
-      var outputs = allParser(output).toSet();
-      inputs.forEach((each) => expect(outputs.contains(each), isFalse));
-      outputs.forEach((each) => expect(inputs.contains(each), isFalse));
-    });
-    test('loop (new)', () {
-      var source = lowercase();
-      var input = source;
-      var target = failure().settable().settable().settable();
-      target.children.single.children.single.set(target);
-      var output = transformParser(input, (parser) {
-        return source.isEqualTo(parser) ? target : parser;
-      });
-      expect(input, isNot(output));
-      expect(input.isEqualTo(output), isFalse);
-      expect(output.isEqualTo(target), isTrue);
-    });
-  });
-  group('optimize', () {
-    test('remove setables', () {
-      var input = lowercase().settable();
-      var output = removeSettables(input);
-      expect(output.isEqualTo(lowercase()), isTrue);
-    });
-    test('remove nested setables', () {
-      var input = lowercase().settable().star();
-      var output = removeSettables(input);
-      expect(output.isEqualTo(lowercase().star()), isTrue);
-    });
-    test('remove double setables', () {
-      var input = lowercase().settable().settable();
-      var output = removeSettables(input);
-      expect(output.isEqualTo(lowercase()), isTrue);
-    });
-    test('remove duplicate', () {
-      var input = lowercase() & lowercase();
-      var output = removeDuplicates(input);
-      expect(input.isEqualTo(output), isTrue);
-      expect(input.children.first, isNot(input.children.last));
-      expect(output.children.first, output.children.last);
-    });
-  });
-}
diff --git a/packages/petitparser/test/smalltalk_test.dart b/packages/petitparser/test/smalltalk_test.dart
deleted file mode 100644
index 860fdba..0000000
--- a/packages/petitparser/test/smalltalk_test.dart
+++ /dev/null
@@ -1,422 +0,0 @@
-library petitparser.test.smalltalk_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/smalltalk.dart';
-
-var definition = new SmalltalkGrammarDefinition();
-
-dynamic validate(String source, Function production) {
-  var parser = definition.build(start: production).end();
-  var result = parser.parse(source);
-  return result.value;
-}
-
-void main() {
-  test('testArray1', () {
-    return validate('{}', definition.array);
-  });
-  test('testArray2', () {
-    return validate('{self foo}', definition.array);
-  });
-  test('testArray3', () {
-    return validate('{self foo. self bar}', definition.array);
-  });
-  test('testArray4', () {
-    return validate('{self foo. self bar.}', definition.array);
-  });
-  test('testAssignment1', () {
-    return validate('1', definition.expression);
-  });
-  test('testAssignment2', () {
-    return validate('a := 1', definition.expression);
-  });
-  test('testAssignment3', () {
-    return validate('a := b := 1', definition.expression);
-  });
-  test('testAssignment6', () {
-    return validate('a := (b := c)', definition.expression);
-  });
-  test('testComment1', () {
-    return validate('1"one"+2', definition.expression);
-  });
-  test('testComment2', () {
-    return validate('1 "one" +2', definition.expression);
-  });
-  test('testComment3', () {
-    return validate('1"one"+"two"2', definition.expression);
-  });
-  test('testComment4', () {
-    return validate('1"one""two"+2', definition.expression);
-  });
-  test('testComment5', () {
-    return validate('1"one" "two"+2', definition.expression);
-  });
-  test('testMethod1', () {
-    return validate('negated ^ 0 - self', definition.method);
-  });
-  test('testMethod2', () {
-    return validate('   negated ^ 0 - self', definition.method);
-  });
-  test('testMethod3', () {
-    return validate(' negated ^ 0 - self  ', definition.method);
-  });
-  test('testSequence1', () {
-    return validate('| a | 1 . 2', definition.sequence);
-  });
-  test('testStatements1', () {
-    return validate('1', definition.sequence);
-  });
-  test('testStatements2', () {
-    return validate('1 . 2', definition.sequence);
-  });
-  test('testStatements3', () {
-    return validate('1 . 2 . 3', definition.sequence);
-  });
-  test('testStatements4', () {
-    return validate('1 . 2 . 3 .', definition.sequence);
-  });
-  test('testStatements5', () {
-    return validate('1 . . 2', definition.sequence);
-  });
-  test('testStatements6', () {
-    return validate('1. 2', definition.sequence);
-  });
-  test('testStatements7', () {
-    return validate('. 1', definition.sequence);
-  });
-  test('testStatements8', () {
-    return validate('.1', definition.sequence);
-  });
-  test('testTemporaries1', () {
-    return validate('| a |', definition.sequence);
-  });
-  test('testTemporaries2', () {
-    return validate('| a b |', definition.sequence);
-  });
-  test('testTemporaries3', () {
-    return validate('| a b c |', definition.sequence);
-  });
-  test('testVariable1', () {
-    return validate('trueBinding', definition.primary);
-  });
-  test('testVariable2', () {
-    return validate('falseBinding', definition.primary);
-  });
-  test('testVariable3', () {
-    return validate('nilly', definition.primary);
-  });
-  test('testVariable4', () {
-    return validate('selfish', definition.primary);
-  });
-  test('testVariable5', () {
-    return validate('supernanny', definition.primary);
-  });
-  test('testVariable6', () {
-    return validate('super_nanny', definition.primary);
-  });
-  test('testVariable7', () {
-    return validate('__gen_var_123__', definition.primary);
-  });
-  test('testArgumentsBlock1', () {
-    return validate('[ :a | ]', definition.block);
-  });
-  test('testArgumentsBlock2', () {
-    return validate('[ :a :b | ]', definition.block);
-  });
-  test('testArgumentsBlock3', () {
-    return validate('[ :a :b :c | ]', definition.block);
-  });
-  test('testComplexBlock1', () {
-    return validate('[ :a | | b | c ]', definition.block);
-  });
-  test('testComplexBlock2', () {
-    return validate('[:a||b|c]', definition.block);
-  });
-  test('testSimpleBlock1', () {
-    return validate('[ ]', definition.block);
-  });
-  test('testSimpleBlock2', () {
-    return validate('[ nil ]', definition.block);
-  });
-  test('testSimpleBlock3', () {
-    return validate('[ :a ]', definition.block);
-  });
-  test('testStatementBlock1', () {
-    return validate('[ nil ]', definition.block);
-  });
-  test('testStatementBlock2', () {
-    return validate('[ | a | nil ]', definition.block);
-  });
-  test('testStatementBlock3', () {
-    return validate('[ | a b | nil ]', definition.block);
-  });
-  test('testArrayLiteral1', () {
-    return validate('#()', definition.arrayLiteral);
-  });
-  test('testArrayLiteral10', () {
-    return validate('#((1 2) #(1 2 3))', definition.arrayLiteral);
-  });
-  test('testArrayLiteral11', () {
-    return validate('#([1 2] #[1 2 3])', definition.arrayLiteral);
-  });
-  test('testArrayLiteral2', () {
-    return validate('#(1)', definition.arrayLiteral);
-  });
-  test('testArrayLiteral3', () {
-    return validate('#(1 2)', definition.arrayLiteral);
-  });
-  test('testArrayLiteral4', () {
-    return validate('#(true false nil)', definition.arrayLiteral);
-  });
-  test('testArrayLiteral5', () {
-    return validate('#(\$a)', definition.arrayLiteral);
-  });
-  test('testArrayLiteral6', () {
-    return validate('#(1.2)', definition.arrayLiteral);
-  });
-  test('testArrayLiteral7', () {
-    return validate('#(size #at: at:put: #' '==' ')', definition.arrayLiteral);
-  });
-  test('testArrayLiteral8', () {
-    return validate('#(' 'baz' ')', definition.arrayLiteral);
-  });
-  test('testArrayLiteral9', () {
-    return validate('#((1) 2)', definition.arrayLiteral);
-  });
-  test('testByteLiteral1', () {
-    return validate('#[]', definition.byteLiteral);
-  });
-  test('testByteLiteral2', () {
-    return validate('#[0]', definition.byteLiteral);
-  });
-  test('testByteLiteral3', () {
-    return validate('#[255]', definition.byteLiteral);
-  });
-  test('testByteLiteral4', () {
-    return validate('#[ 1 2 ]', definition.byteLiteral);
-  });
-  test('testByteLiteral5', () {
-    return validate('#[ 2r1010 8r77 16rFF ]', definition.byteLiteral);
-  });
-  test('testCharLiteral1', () {
-    return validate('\$a', definition.characterLiteral);
-  });
-  test('testCharLiteral2', () {
-    return validate('\$ ', definition.characterLiteral);
-  });
-  test('testCharLiteral3', () {
-    return validate('\$\$', definition.characterLiteral);
-  });
-  test('testNumberLiteral1', () {
-    return validate('0', definition.numberLiteral);
-  });
-  test('testNumberLiteral10', () {
-    return validate('10r10', definition.numberLiteral);
-  });
-  test('testNumberLiteral11', () {
-    return validate('8r777', definition.numberLiteral);
-  });
-  test('testNumberLiteral12', () {
-    return validate('16rAF', definition.numberLiteral);
-  });
-  test('testNumberLiteral2', () {
-    return validate('0.1', definition.numberLiteral);
-  });
-  test('testNumberLiteral3', () {
-    return validate('123', definition.numberLiteral);
-  });
-  test('testNumberLiteral4', () {
-    return validate('123.456', definition.numberLiteral);
-  });
-  test('testNumberLiteral5', () {
-    return validate('-0', definition.numberLiteral);
-  });
-  test('testNumberLiteral6', () {
-    return validate('-0.1', definition.numberLiteral);
-  });
-  test('testNumberLiteral7', () {
-    return validate('-123', definition.numberLiteral);
-  });
-  test('testNumberLiteral8', () {
-    return validate('-123', definition.numberLiteral);
-  });
-  test('testNumberLiteral9', () {
-    return validate('-123.456', definition.numberLiteral);
-  });
-  test('testSpecialLiteral1', () {
-    return validate('true', definition.trueLiteral);
-  });
-  test('testSpecialLiteral2', () {
-    return validate('false', definition.falseLiteral);
-  });
-  test('testSpecialLiteral3', () {
-    return validate('nil', definition.nilLiteral);
-  });
-  test('testStringLiteral1', () {
-    return validate('\'\'', definition.stringLiteral);
-  });
-  test('testStringLiteral2', () {
-    return validate('\'ab\'', definition.stringLiteral);
-  });
-  test('testStringLiteral3', () {
-    return validate('\'ab\'\'cd\'', definition.stringLiteral);
-  });
-  test('testSymbolLiteral1', () {
-    return validate('#foo', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral2', () {
-    return validate('#+', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral3', () {
-    return validate('#key:', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral4', () {
-    return validate('#key:value:', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral5', () {
-    return validate('#\'testing-result\'', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral6', () {
-    return validate('#__gen__binding', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral7', () {
-    return validate('# fucker', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral8', () {
-    return validate('##fucker', definition.symbolLiteral);
-  });
-  test('testSymbolLiteral9', () {
-    return validate('## fucker', definition.symbolLiteral);
-  });
-  test('testBinaryExpression1', () {
-    return validate('1 + 2', definition.expression);
-  });
-  test('testBinaryExpression2', () {
-    return validate('1 + 2 + 3', definition.expression);
-  });
-  test('testBinaryExpression3', () {
-    return validate('1 // 2', definition.expression);
-  });
-  test('testBinaryExpression4', () {
-    return validate('1 -- 2', definition.expression);
-  });
-  test('testBinaryExpression5', () {
-    return validate('1 ==> 2', definition.expression);
-  });
-  test('testBinaryMethod1', () {
-    return validate('+ a', definition.method);
-  });
-  test('testBinaryMethod2', () {
-    return validate('+ a | b |', definition.method);
-  });
-  test('testBinaryMethod3', () {
-    return validate('+ a b', definition.method);
-  });
-  test('testBinaryMethod4', () {
-    return validate('+ a | b | c', definition.method);
-  });
-  test('testBinaryMethod5', () {
-    return validate('-- a', definition.method);
-  });
-  test('testCascadeExpression1', () {
-    return validate('1 abs; negated', definition.expression);
-  });
-  test('testCascadeExpression2', () {
-    return validate(
-        '1 abs negated; raisedTo: 12; negated', definition.expression);
-  });
-  test('testCascadeExpression3', () {
-    return validate('1 + 2; - 3', definition.expression);
-  });
-  test('testKeywordExpression1', () {
-    return validate('1 to: 2', definition.expression);
-  });
-  test('testKeywordExpression2', () {
-    return validate('1 to: 2 by: 3', definition.expression);
-  });
-  test('testKeywordExpression3', () {
-    return validate('1 to: 2 by: 3 do: 4', definition.expression);
-  });
-  test('testKeywordMethod1', () {
-    return validate('to: a', definition.method);
-  });
-  test('testKeywordMethod2', () {
-    return validate('to: a do: b | c |', definition.method);
-  });
-  test('testKeywordMethod3', () {
-    return validate('to: a do: b by: c d', definition.method);
-  });
-  test('testKeywordMethod4', () {
-    return validate('to: a do: b by: c | d | e', definition.method);
-  });
-  test('testUnaryExpression1', () {
-    return validate('1 abs', definition.expression);
-  });
-  test('testUnaryExpression2', () {
-    return validate('1 abs negated', definition.expression);
-  });
-  test('testUnaryMethod1', () {
-    return validate('abs', definition.method);
-  });
-  test('testUnaryMethod2', () {
-    return validate('abs | a |', definition.method);
-  });
-  test('testUnaryMethod3', () {
-    return validate('abs a', definition.method);
-  });
-  test('testUnaryMethod4', () {
-    return validate('abs | a | b', definition.method);
-  });
-  test('testUnaryMethod5', () {
-    return validate('abs | a |', definition.method);
-  });
-  test('testPragma1', () {
-    return validate('method <foo>', definition.method);
-  });
-  test('testPragma10', () {
-    return validate('method <foo: bar>', definition.method);
-  });
-  test('testPragma11', () {
-    return validate('method <foo: true>', definition.method);
-  });
-  test('testPragma12', () {
-    return validate('method <foo: false>', definition.method);
-  });
-  test('testPragma13', () {
-    return validate('method <foo: nil>', definition.method);
-  });
-  test('testPragma14', () {
-    return validate('method <foo: ()>', definition.method);
-  });
-  test('testPragma15', () {
-    return validate('method <foo: #()>', definition.method);
-  });
-  test('testPragma16', () {
-    return validate('method < + 1 >', definition.method);
-  });
-  test('testPragma2', () {
-    return validate('method <foo> <bar>', definition.method);
-  });
-  test('testPragma3', () {
-    return validate('method | a | <foo>', definition.method);
-  });
-  test('testPragma4', () {
-    return validate('method <foo> | a |', definition.method);
-  });
-  test('testPragma5', () {
-    return validate('method <foo> | a | <bar>', definition.method);
-  });
-  test('testPragma6', () {
-    return validate('method <foo: 1>', definition.method);
-  });
-  test('testPragma7', () {
-    return validate('method <foo: 1.2>', definition.method);
-  });
-  test('testPragma8', () {
-    return validate('method <foo: ' 'bar' '>', definition.method);
-  });
-  test('testPragma9', () {
-    return validate('method <foo: #' 'bar' '>', definition.method);
-  });
-}
diff --git a/packages/petitparser/test/test_test.dart b/packages/petitparser/test/test_test.dart
deleted file mode 100644
index 3122aca..0000000
--- a/packages/petitparser/test/test_test.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-library petitparser.test.test_test;
-
-import 'package:test/test.dart';
-
-import 'package:petitparser/petitparser.dart';
-import 'package:petitparser/test.dart';
-
-void main() {
-  group('accept', () {
-    test('success', () {
-      var matcher = accept(char('a'));
-      var state = new Map();
-      expect(matcher.matches('a', state), isTrue);
-      expect(state, isEmpty);
-      var description = new StringDescription();
-      matcher.describe(description);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" accepts input');
-    });
-    test('failure', () {
-      var matcher = accept(char('a'));
-      var state = new Map();
-      expect(matcher.matches('b', state), isFalse);
-      expect(state, isNot(isEmpty));
-      var description = new StringDescription();
-      matcher.describeMismatch('b', description, state, false);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" produces "Failure[1:1]: "a" expected" which is not accepted');
-    });
-  });
-  group('parse', () {
-    test('success', () {
-      var matcher = parse(char('a'), 'a');
-      var state = new Map();
-      expect(matcher.matches('a', state), isTrue);
-      expect(state, isEmpty);
-      var description = new StringDescription();
-      matcher.describe(description);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" '
-          'accepts \'a\'');
-    });
-    test('failure', () {
-      var matcher = parse(char('a'), 'a');
-      var state = new Map();
-      expect(matcher.matches('b', state), isFalse);
-      expect(state, isNot(isEmpty));
-      var description = new StringDescription();
-      matcher.describeMismatch('b', description, state, false);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" '
-          'produces "Failure[1:1]: "a" expected" which is not accepted');
-    });
-    test('matcher', () {
-      var matcher = parse(char('a'), 'b');
-      var state = new Map();
-      expect(matcher.matches('a', state), isFalse);
-      expect(state, isNot(isEmpty));
-      var description = new StringDescription();
-      matcher.describeMismatch('a', description, state, false);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" '
-          'produces "Success[1:2]: a" which parse result is different.\n'
-          'Expected: b\n  Actual: a\n          ^\n Differ at offset 0');
-    });
-    test('position', () {
-      var matcher = parse(char('a'), 'a', 0);
-      var state = new Map();
-      expect(matcher.matches('a', state), isFalse);
-      expect(state, isNot(isEmpty));
-      var description = new StringDescription();
-      matcher.describeMismatch('a', description, state, false);
-      expect(description.toString(), '"Instance of \'CharacterParser\'["a" expected]" '
-      'produces "Success[1:2]: a" that consumes input to 1 instead of 0');
-    });
-  });
-}
diff --git a/packages/petitparser/tool/travis.sh b/packages/petitparser/tool/travis.sh
deleted file mode 100755
index ae84321..0000000
--- a/packages/petitparser/tool/travis.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-# Fast fail the script on failures.
-set -e
-
-# Verify that the libraries are error free.
-dartanalyzer --fatal-warnings \
-  lib/*.dart \
-  test/*.dart
-
-# Verify that all the tests pass.
-pub run test
-
-# Verify the coverage of the tests.
-if [ "$COVERALLS_TOKEN" ] && [ "$TRAVIS_DART_VERSION" = "stable" ]; then
-  pub global activate dart_coveralls
-  pub global run dart_coveralls report \
-    --token $COVERALLS_TOKEN \
-    --retry 2 \
-    --exclude-test-files \
-    test/all_tests.dart
-fi
diff --git a/packages/plugin/._AUTHORS b/packages/plugin/._AUTHORS
new file mode 100755
index 0000000..8fb8ff1
--- /dev/null
+++ b/packages/plugin/._AUTHORS
Binary files differ
diff --git a/packages/plugin/._CHANGELOG.md b/packages/plugin/._CHANGELOG.md
new file mode 100755
index 0000000..8fb8ff1
--- /dev/null
+++ b/packages/plugin/._CHANGELOG.md
Binary files differ
diff --git a/packages/plugin/._CONTRIBUTING.md b/packages/plugin/._CONTRIBUTING.md
new file mode 100755
index 0000000..8fb8ff1
--- /dev/null
+++ b/packages/plugin/._CONTRIBUTING.md
Binary files differ
diff --git a/packages/plugin/._LICENSE b/packages/plugin/._LICENSE
new file mode 100755
index 0000000..8fb8ff1
--- /dev/null
+++ b/packages/plugin/._LICENSE
Binary files differ
diff --git a/packages/plugin/._README.md b/packages/plugin/._README.md
new file mode 100755
index 0000000..8fb8ff1
--- /dev/null
+++ b/packages/plugin/._README.md
Binary files differ
diff --git a/packages/pool/.analysis_options b/packages/pool/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/pool/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/pool/CHANGELOG.md b/packages/pool/CHANGELOG.md
index dc852aa..80d54c7 100644
--- a/packages/pool/CHANGELOG.md
+++ b/packages/pool/CHANGELOG.md
@@ -1,3 +1,26 @@
+## 1.3.1
+
+* Fix the type annotation of `Pool.withResource()` to indicate that it takes
+  `() -> FutureOr<T>`.
+
+## 1.3.0
+
+* Add a `Pool.done` getter that returns the same future returned by
+  `Pool.close()`.
+
+## 1.2.4
+
+* Fix a strong-mode error.
+
+## 1.2.3
+
+* Fix a bug in which `Pool.withResource()` could throw a `StateError` when
+  called immediately before closing the pool.
+
+## 1.2.2
+
+* Fix strong mode warnings and add generic method annotations.
+
 ## 1.2.1
 
 * Internal changes only.
diff --git a/packages/pool/lib/pool.dart b/packages/pool/lib/pool.dart
index ef38614..04aaaea 100644
--- a/packages/pool/lib/pool.dart
+++ b/packages/pool/lib/pool.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library pool;
-
 import 'dart:async';
 import 'dart:collection';
 
@@ -65,7 +63,14 @@
   FutureGroup _closeGroup;
 
   /// Whether [close] has been called.
-  bool get isClosed => _closeGroup != null;
+  bool get isClosed => _closeMemo.hasRun;
+
+  /// A future that completes once the pool is closed and all its outstanding
+  /// resources have been released.
+  ///
+  /// If any [PoolResource.allowRelease] callback throws an exception after the
+  /// pool is closed, this completes with that exception.
+  Future get done => _closeMemo.future;
 
   /// Creates a new pool with the given limit on how many resources may be
   /// allocated at once.
@@ -108,15 +113,18 @@
   /// Future.
   ///
   /// The return value of [callback] is piped to the returned Future.
-  Future withResource(callback()) {
+  Future<T> withResource<T>(FutureOr<T> callback()) {
     if (isClosed) {
       throw new StateError(
           "withResource() may not be called on a closed Pool.");
     }
 
-    // TODO(nweiz): Use async/await when sdk#23497 is fixed.
-    return request().then((resource) {
-      return new Future.sync(callback).whenComplete(resource.release);
+    // We can't use async/await here because we need to start the request
+    // synchronously in case the pool is closed immediately afterwards. Async
+    // functions have an asynchronous gap between calling and running the body,
+    // and [close] could be called during that gap. See #3.
+    return request().then<Future<T>>((resource) {
+      return new Future<T>.sync(callback).whenComplete(resource.release);
     });
   }
 
@@ -131,7 +139,7 @@
   /// an error, the returned future completes with that error.
   ///
   /// This may be called more than once; it returns the same [Future] each time.
-  Future close() {
+  Future close() => _closeMemo.runOnce(() {
     if (_closeGroup != null) return _closeGroup.future;
 
     _resetTimer();
@@ -146,7 +154,8 @@
 
     if (_allocatedResources == 0) _closeGroup.close();
     return _closeGroup.future;
-  }
+  });
+  final _closeMemo = new AsyncMemoizer();
 
   /// If there are any pending requests, this will fire the oldest one.
   void _onResourceReleased() {
@@ -191,7 +200,7 @@
       _onReleaseCompleters.removeFirst().completeError(error, stackTrace);
     });
 
-    var completer = new Completer.sync();
+    var completer = new Completer<PoolResource>.sync();
     _onReleaseCompleters.add(completer);
     return completer.future;
   }
diff --git a/packages/pool/pubspec.yaml b/packages/pool/pubspec.yaml
index 9635620..8efc8e5 100644
--- a/packages/pool/pubspec.yaml
+++ b/packages/pool/pubspec.yaml
@@ -1,5 +1,5 @@
 name: pool
-version: 1.2.1
+version: 1.3.1
 author: Dart Team <misc@dartlang.org>
 description: A class for managing a finite pool of resources.
 homepage: https://github.com/dart-lang/pool
@@ -7,7 +7,7 @@
   async: "^1.4.0"
   stack_trace: ">=0.9.2 <2.0.0"
 environment:
-  sdk: ">=1.9.0 <2.0.0"
+  sdk: ">=1.22.0 <2.0.0"
 dev_dependencies:
   fake_async: ">=0.1.0 <0.2.0"
   test: ">=0.12.0 <0.13.0"
diff --git a/packages/pool/test/pool_test.dart b/packages/pool/test/pool_test.dart
index 65fd00e..7fba9c0 100644
--- a/packages/pool/test/pool_test.dart
+++ b/packages/pool/test/pool_test.dart
@@ -96,6 +96,13 @@
         async.elapse(new Duration(seconds: 1));
       });
     });
+
+    // Regression test for #3.
+    test("can be called immediately before close()", () async {
+      var pool = new Pool(1);
+      pool.withResource(expectAsync(() {}));
+      await pool.close();
+    });
   });
 
   group("with a timeout", () {
@@ -272,6 +279,16 @@
     });
   });
 
+  test("done doesn't complete without close", () async {
+    var pool = new Pool(1);
+    pool.done.then(expectAsync1((_) {}, count: 0));
+
+    var resource = await pool.request();
+    resource.release();
+
+    await new Future.delayed(Duration.ZERO);
+  });
+
   group("close()", () {
     test("disallows request() and withResource()", () {
       var pool = new Pool(1)..close();
@@ -285,6 +302,7 @@
       expect(pool.request().then((resource2) {
         resource2.release();
       }), completes);
+      expect(pool.done, completes);
       expect(pool.close(), completes);
       resource1.release();
     });
@@ -398,6 +416,7 @@
       var completer = new Completer();
       resource.allowRelease(() => completer.future);
 
+      expect(pool.done, throwsA("oh no!"));
       expect(pool.close(), throwsA("oh no!"));
 
       await new Future.delayed(Duration.ZERO);
diff --git a/packages/quiver/.analysis_options b/packages/quiver/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/quiver/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/quiver/.gitignore b/packages/quiver/.gitignore
index 3079dbf..9d0511b 100644
--- a/packages/quiver/.gitignore
+++ b/packages/quiver/.gitignore
@@ -3,6 +3,7 @@
 pubspec.lock
 build/
 .pub
+.packages
 
 # IDE
 .project
diff --git a/packages/quiver/.travis.yml b/packages/quiver/.travis.yml
index a4a70c4..47285fa 100644
--- a/packages/quiver/.travis.yml
+++ b/packages/quiver/.travis.yml
@@ -5,4 +5,4 @@
   - dev
 script: ./tool/travis.sh
 env:
-  - DARTANALYZER_FLAGS=--fatal-warnings
+  - DARTANALYZER_FLAGS='--fatal-warnings --strong'
diff --git a/packages/quiver/CHANGELOG.md b/packages/quiver/CHANGELOG.md
index 6d9d012..1cce8e0 100644
--- a/packages/quiver/CHANGELOG.md
+++ b/packages/quiver/CHANGELOG.md
@@ -1,3 +1,39 @@
+#### 0.25.0 - 2017-03-28
+   * BREAKING CHANGE: minimum SDK constraint increased to 1.21.0. This allows
+     use of async-await and generic function in Quiver.
+   * BREAKING CHANGE: eliminated deprecated `FakeTimer`.
+   * BREAKING CHANGE: `StreamBuffer<T>` now implements `StreamConsumer<T>` as
+     opposed to `StreamConsumer<T|List<T>>`.
+   * Deprecated: `FutureGroup`. Use the replacement in `package:async` which
+     requires a `close()` call to trigger auto-completion when the count of
+     pending tasks drops to 0.
+   * Deprecated: `repeat` in the `strings` library. Use the `*` operator on
+     the String class.
+   * Deprecated: in the strings library, `flip` has been renamed `reverse`.
+     `flip` is deprecated and will be removed in the next release.
+   * Iterables: `enumerate` is now generic.
+   * Collection: added `indexOf`.
+
+#### 0.24.0 - 2016-10-31
+   * BREAKING CHANGE: eliminated deprecated `nullToEmpty`, `emptyToNull`.
+   * Fix: Strong mode: As of Dart SDK 1.21.0, `Set.difference` takes a
+     `Set<Object>` parameter.
+
+#### 0.23.0 - 2016-09-21
+   * Strings: `nullToEmpty`, `emptyToNull` deprecated. Removal in 0.24.0.
+   * BREAKING CHANGE: eliminated deprecated multimap `toMap`.
+   * BREAKING CHANGE: eliminated deprecated `pad*`, `trim*` string functions.
+
+#### 0.22.0 - 2015-04-21
+   * BREAKING CHANGE: `streams` and `async` libraries have been [merged](https://github.com/google/quiver-dart/commit/671f1bc75742b4393e203c9520a3bf1e031967dc) into one `async` library
+   * BREAKING CHANGE: Pre-1.8.0 SDKs are no longer supported.
+   * Quiver is now [strong mode](https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md) compliant
+   * New: `Optional` now implements `Iterable` and its methods are generic (using temporary syntax)
+   * New: `isNotEmpty` and `isDigit` in `strings.dart`
+   * New: `Multimap.fromIterable`
+   * Fix: Change `TreeSearch` from `class` to `enum`.
+   * Fix: `fake_async.dart` timers are now active while executing the callback
+
 #### 0.21.4 - 2015-05-15
    * Add stats reporting for fake async tests. You can query the number of 
      pending microtasks and timers via `microtaskCount`, `periodicTimerCount`, 
diff --git a/packages/quiver/CONTRIBUTING.md b/packages/quiver/CONTRIBUTING.md
index d320e5b..75c2f33 100644
--- a/packages/quiver/CONTRIBUTING.md
+++ b/packages/quiver/CONTRIBUTING.md
@@ -19,7 +19,7 @@
      (see above) before sending your pull request. It's quick, we promise!
    * Have test cases for your changes and ensure that the existing ones pass in
      checked mode.
-   * Run your changes through `dartformat`. Follow the installation instructions
+   * Run your changes through `dartfmt`. Follow the installation instructions
      in the [dart_style](https://github.com/dart-lang/dart_style) README for
      more info.
    * Squash your commits into a single commit with a good description. You can
@@ -27,5 +27,7 @@
      Atlassian's
      [tutorial](https://www.atlassian.com/git/tutorials/rewriting-history).
    * During code review, go ahead and pile up commits addressing review
-     comments. Once you get an LGTM (looks good to me) on the review, we'll ask
-     you to squash your commits one last time, then we'll be good to merge!
+     comments. Once you get an LGTM (looks good to me) on the review, we'll
+     squash your commits and merge!
+   * If you're not already listed as an author in `pubspec.yaml`, remember to
+     add yourself and claim your rightful place amongst the Quiverati.
diff --git a/packages/quiver/README.md b/packages/quiver/README.md
index 61cbd95..6d15a91 100644
--- a/packages/quiver/README.md
+++ b/packages/quiver/README.md
@@ -17,7 +17,7 @@
 We recommend the following version constraint:
 
     dependencies:
-      quiver: '>=0.21.0<0.22.0'
+      quiver: '>=0.25.0<0.26.0'
 
 # Main Libraries
 
@@ -25,6 +25,19 @@
 
 Utilities for working with Futures, Streams and async computations.
 
+`collect` collects the completion events of an `Iterable` of `Future`s into a
+`Stream`.
+
+`enumerate` and `concat` represent `Stream` versions of the same-named
+[quiver.iterables][] methods.
+
+`doWhileAsync`, `reduceAsync` and `forEachAsync` perform async computations on
+the elements of on Iterables, waiting for the computation to complete before
+processing the next element.
+
+`StreamBuffer` allows for the orderly reading of elements from a stream, such
+as a socket.
+
 `FutureGroup` is collection of Futures that signals when all its child futures
 have completed. Allows adding new Futures as long as it hasn't completed yet.
 Useful when async tasks can spwn new async tasks and you need to wait for all of
@@ -39,10 +52,6 @@
 `CountdownTimer` is a simple countdown timer that fires events in regular
 increments.
 
-`doWhileAsync`, `reduceAsync` and `forEachAsync` perform async computations on
-the elements of on Iterables, waiting for the computation to complete before
-processing the next element.
-
 `CreateTimer` and `CreateTimerPeriodic` are typedefs that are useful for
 passing Timer factories to classes and functions, increasing the testability of
 code that depends on Timer.
@@ -164,19 +173,6 @@
 
 [quiver.pattern]: http://www.dartdocs.org/documentation/quiver/latest#quiver/quiver-pattern
 
-## [quiver.streams][]
-
-`collect` collects the completion events of an `Iterable` of `Future`s into a
-`Stream`.
-
-`enumerate` and `concat` represent `Stream` versions of the same-named
-[quiver.iterables][] methods.
-
-`StreamBuffer` allows for the orderly reading of elements from a stream, such
-as a socket.
-
-[quiver.streams]: http://www.dartdocs.org/documentation/quiver/latest#quiver/quiver-streams
-
 ## [quiver.strings][]
 
 `isBlank` checks if a string is `null`, empty or made of whitespace characters.
diff --git a/packages/quiver/lib/async.dart b/packages/quiver/lib/async.dart
index 1cc8e12..e0daa87 100644
--- a/packages/quiver/lib/async.dart
+++ b/packages/quiver/lib/async.dart
@@ -16,33 +16,31 @@
 
 import 'dart:async';
 
+import 'package:quiver/iterables.dart' show IndexedValue;
 import 'package:quiver/time.dart';
 
+part 'src/async/collect.dart';
 part 'src/async/countdown_timer.dart';
+part 'src/async/concat.dart';
+part 'src/async/enumerate.dart';
 part 'src/async/future_group.dart';
 part 'src/async/future_stream.dart';
 part 'src/async/iteration.dart';
 part 'src/async/metronome.dart';
+part 'src/async/stream_buffer.dart';
 part 'src/async/stream_router.dart';
 
-/**
- * The signature of a one-shot [Timer] factory.
- */
+/// The signature of a one-shot [Timer] factory.
 typedef Timer CreateTimer(Duration duration, void callback());
 
-/**
- * Creates a new one-shot [Timer] using `new Timer(duration, callback)`.
- */
+/// Creates a new one-shot [Timer] using `new Timer(duration, callback)`.
 Timer createTimer(Duration duration, void callback()) =>
     new Timer(duration, callback);
-/**
- * The signature of a periodic timer factory.
- */
+
+/// The signature of a periodic timer factory.
 typedef Timer CreateTimerPeriodic(Duration duration, void callback(Timer));
 
-/**
- * Creates a new periodic [Timer] using
- * `new Timer.periodic(duration, callback)`.
- */
-Timer createTimerPeriodic(Duration duration, void callback(Timer)) =>
+/// Creates a new periodic [Timer] using
+/// `new Timer.periodic(duration, callback)`.
+Timer createTimerPeriodic(Duration duration, void callback(Timer t)) =>
     new Timer.periodic(duration, callback);
diff --git a/packages/quiver/lib/check.dart b/packages/quiver/lib/check.dart
index abbefb6..58b7a11 100644
--- a/packages/quiver/lib/check.dart
+++ b/packages/quiver/lib/check.dart
@@ -58,7 +58,7 @@
 
 /// Throws an [ArgumentError] if the given [reference] is `null`. Otherwise,
 /// returns the [reference] parameter.
-dynamic checkNotNull(reference, {message}) {
+T checkNotNull<T>(T reference, {message}) {
   if (reference == null) {
     throw new ArgumentError(_resolveMessage(message, 'null pointer'));
   }
diff --git a/packages/quiver/lib/collection.dart b/packages/quiver/lib/collection.dart
index 269aaac..4e8f310 100644
--- a/packages/quiver/lib/collection.dart
+++ b/packages/quiver/lib/collection.dart
@@ -12,9 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Collection classes and related utilities.
- */
+/// Collection classes and related utilities.
 library quiver.collection;
 
 import 'dart:collection';
@@ -33,13 +31,11 @@
 part 'src/collection/delegates/queue.dart';
 part 'src/collection/delegates/set.dart';
 
-/**
- * Checks [List]s [a] and [b] for equality.
- *
- * Returns `true` if [a] and [b] are both null, or they are the same length and
- * every element of [a] is equal to the corresponding element at the same index
- * in [b].
- */
+/// Checks [List]s [a] and [b] for equality.
+///
+/// Returns `true` if [a] and [b] are both null, or they are the same length
+/// and every element of [a] is equal to the corresponding element at the same
+/// index in [b].
 bool listsEqual(List a, List b) {
   if (a == b) return true;
   if (a == null || b == null) return false;
@@ -52,12 +48,10 @@
   return true;
 }
 
-/**
- * Checks [Map]s [a] and [b] for equality.
- *
- * Returns `true` if [a] and [b] are both null, or they are the same length and
- * every key `k` in [a] exists in [b] and the values `a[k] == b[k]`.
- */
+/// Checks [Map]s [a] and [b] for equality.
+///
+/// Returns `true` if [a] and [b] are both null, or they are the same length
+/// and every key `k` in [a] exists in [b] and the values `a[k] == b[k]`.
 bool mapsEqual(Map a, Map b) {
   if (a == b) return true;
   if (a == null || b == null) return false;
@@ -72,12 +66,10 @@
   return true;
 }
 
-/**
- * Checks [Set]s [a] and [b] for equality.
- *
- * Returns `true` if [a] and [b] are both null, or they are the same length and
- * every element in [b] exists in [a].
- */
+/// Checks [Set]s [a] and [b] for equality.
+///
+/// Returns `true` if [a] and [b] are both null, or they are the same length and
+/// every element in [b] exists in [a].
 bool setsEqual(Set a, Set b) {
   if (a == b) return true;
   if (a == null || b == null) return false;
@@ -85,3 +77,23 @@
 
   return a.containsAll(b);
 }
+
+/// Returns the index of the first item in [elements] where [predicate]
+/// evaluates to true.
+///
+/// Returns -1 if there are no items where [predicate] evaluates to true.
+int indexOf<T>(Iterable<T> elements, bool predicate(T element)) {
+  if (elements is List<T>) {
+    for (int i = 0; i < elements.length; i++) {
+      if (predicate(elements[i])) return i;
+    }
+    return -1;
+  }
+
+  int i = 0;
+  for (T element in elements) {
+    if (predicate(element)) return i;
+    i++;
+  }
+  return -1;
+}
diff --git a/packages/quiver/lib/core.dart b/packages/quiver/lib/core.dart
index 8239f2d..9b04015 100644
--- a/packages/quiver/lib/core.dart
+++ b/packages/quiver/lib/core.dart
@@ -12,20 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Simple code with broad use cases.
- */
+/// Simple code with broad use cases.
 library quiver.core;
 
+import 'dart:collection';
+
 part 'src/core/hash.dart';
 part 'src/core/optional.dart';
 
-/**
- * Returns the first non-null argument. If all arguments are null, throws
- * an [ArgumentError].
- *
- * Note: if [o1] is an [Optional], this can be accomplished with `o1.or(o2)`.
- */
+/// Returns the first non-null argument. If all arguments are null, throws an
+/// [ArgumentError].
+///
+/// Note: if [o1] is an [Optional], this can be accomplished with `o1.or(o2)`.
 firstNonNull(o1, o2, [o3, o4]) {
   if (o1 != null) return o1;
   if (o2 != null) return o2;
diff --git a/packages/quiver/lib/io.dart b/packages/quiver/lib/io.dart
index e5e5e4e..e71fb7b 100644
--- a/packages/quiver/lib/io.dart
+++ b/packages/quiver/lib/io.dart
@@ -20,27 +20,21 @@
 
 import 'package:quiver/async.dart';
 
-/**
- * Converts a [Stream] of byte lists to a [String].
- */
+///  Converts a [Stream] of byte lists to a [String].
 Future<String> byteStreamToString(Stream<List<int>> stream,
     {Encoding encoding: UTF8}) {
   return stream.transform(encoding.decoder).join();
 }
 
-/**
- * Gets the full path of [path] by using [File.fullPathSync].
- */
+/// Gets the full path of [path] by using [File.fullPathSync].
 String getFullPath(path) => new File(path).resolveSymbolicLinksSync();
 
-/**
- * Lists the sub-directories and files of this Directory, optionally recursing
- * into sub-directories based on the return value of [visit].
- *
- * [visit] is called with a [File], [Directory] or [Link] to a directory,
- * never a Symlink to a File. If [visit] returns true, then it's argument is
- * listed recursively.
- */
+/// Lists the sub-directories and files of this Directory, optionally recursing
+/// into sub-directories based on the return value of [visit].
+///
+/// [visit] is called with a [File], [Directory] or [Link] to a directory,
+/// never a Symlink to a File. If [visit] returns true, then it's argument is
+/// listed recursively.
 Future visitDirectory(Directory dir, Future<bool> visit(FileSystemEntity f)) {
   var futureGroup = new FutureGroup();
 
@@ -72,6 +66,7 @@
       completer.complete(null);
     }, cancelOnError: true);
   }
+
   _list(dir);
 
   return futureGroup.future;
diff --git a/packages/quiver/lib/mirrors.dart b/packages/quiver/lib/mirrors.dart
index 9f73e9f..b377f4c 100644
--- a/packages/quiver/lib/mirrors.dart
+++ b/packages/quiver/lib/mirrors.dart
@@ -16,21 +16,15 @@
 
 import 'dart:mirrors';
 
-/**
- * Returns the qualified name of [t].
- */
+/// Returns the qualified name of [t].
 Symbol getTypeName(Type t) => reflectClass(t).qualifiedName;
 
-/**
- * Returns true if [o] implements [type].
- */
+/// Returns true if [o] implements [type].
 bool implements(Object o, Type type) =>
     classImplements(reflect(o).type, reflectClass(type));
 
-/**
- * Returns true if the class represented by [classMirror] implements the class
- * represented by [interfaceMirror].
- */
+/// Returns true if the class represented by [classMirror] implements the class
+/// represented by [interfaceMirror].
 bool classImplements(ClassMirror classMirror, ClassMirror interfaceMirror) {
   if (classMirror == null) return false;
   // TODO: change to comparing mirrors when dartbug.com/19781 is fixed
@@ -41,13 +35,11 @@
   return false;
 }
 
-/**
- * Walks up the class hierarchy to find a method declaration with the given
- * [name].
- *
- * Note that it's not possible to tell if there's an implementation via
- * noSuchMethod().
- */
+/// Walks up the class hierarchy to find a method declaration with the given
+/// [name].
+///
+/// Note that it's not possible to tell if there's an implementation via
+/// noSuchMethod().
 DeclarationMirror getDeclaration(ClassMirror classMirror, Symbol name) {
   if (classMirror.declarations.containsKey(name)) {
     return classMirror.declarations[name];
@@ -67,9 +59,7 @@
   return null;
 }
 
-/**
- * Closurzes a method reflectively.
- */
+/// Closurizes a method reflectively.
 class Method /* implements Function */ {
   final InstanceMirror mirror;
   final Symbol symbol;
@@ -80,8 +70,9 @@
     if (i.isMethod && i.memberName == const Symbol('call')) {
       if (i.namedArguments != null && i.namedArguments.isNotEmpty) {
         // this will fail until named argument support is implemented
-        return mirror.invoke(
-            symbol, i.positionalArguments, i.namedArguments).reflectee;
+        return mirror
+            .invoke(symbol, i.positionalArguments, i.namedArguments)
+            .reflectee;
       }
       return mirror.invoke(symbol, i.positionalArguments).reflectee;
     }
diff --git a/packages/quiver/lib/pattern.dart b/packages/quiver/lib/pattern.dart
index 937b0a0..31a7cfb 100644
--- a/packages/quiver/lib/pattern.dart
+++ b/packages/quiver/lib/pattern.dart
@@ -50,7 +50,7 @@
       {Iterable<Pattern> this.exclude});
 
   Iterable<Match> allMatches(String str, [int start = 0]) {
-    var _allMatches = [];
+    final _allMatches = <Match>[];
     for (var pattern in include) {
       var matches = pattern.allMatches(str, start);
       if (_hasMatch(matches)) {
@@ -61,15 +61,15 @@
             }
           }
         }
-        _allMatches.add(matches);
+        _allMatches.addAll(matches);
       }
     }
-    return _allMatches.expand((x) => x);
+    return _allMatches;
   }
 
   Match matchAsPrefix(String str, [int start = 0]) {
-    return allMatches(str).firstWhere((match) => match.start == start,
-        orElse: () => null);
+    return allMatches(str)
+        .firstWhere((match) => match.start == start, orElse: () => null);
   }
 }
 
diff --git a/packages/quiver/lib/src/async/collect.dart b/packages/quiver/lib/src/async/collect.dart
new file mode 100644
index 0000000..6a52a4a
--- /dev/null
+++ b/packages/quiver/lib/src/async/collect.dart
@@ -0,0 +1,34 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+part of quiver.async;
+
+/// Returns a stream of completion events for the input [futures].
+///
+/// Successfully completed futures yield data events, while futures completed
+/// with errors yield error events.
+///
+/// The iterator obtained from [futures] is only advanced once the previous
+/// future completes and yields an event.  Thus, lazily creating the futures is
+/// supported, for example:
+///
+///     collect(files.map((file) => file.readAsString()));
+///
+/// If you need to modify [futures], or a backing collection thereof, before
+/// the returned stream is done, pass a copy instead to avoid a
+/// [ConcurrentModificationError]:
+///
+///     collect(files.toList().map((file) => file.readAsString()));
+Stream collect(Iterable futures) =>
+    new Stream.fromIterable(futures).asyncMap((f) => f);
diff --git a/packages/quiver/lib/src/streams/concat.dart b/packages/quiver/lib/src/async/concat.dart
similarity index 70%
rename from packages/quiver/lib/src/streams/concat.dart
rename to packages/quiver/lib/src/async/concat.dart
index d8c44e0..e83ed64 100644
--- a/packages/quiver/lib/src/streams/concat.dart
+++ b/packages/quiver/lib/src/async/concat.dart
@@ -12,29 +12,26 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-part of quiver.streams;
+part of quiver.async;
 
-/**
- * Returns the concatentation of the input streams.
- *
- * When the returned stream is listened to, the [streams] are iterated through
- * asynchronously, forwarding all events (both data and error) for the current
- * stream to the returned stream before advancing the iterator and listening to
- * the next stream.  If advancing the iterator throws an error, the returned
- * stream ends immediately with that error.
- *
- * Pausing and resuming the returned stream's subscriptions will pause and
- * resume the subscription of the current stream being listened to.
- *
- * Note: Events from pre-existing broadcast streams which occur before
- * the stream is reached by the iteration will be dropped.
- *
- * Example:
- *
- *     concat(files.map((file) =>
- *         file.openRead().transform(const LineSplitter())))
- *
- */
+/// Returns the concatentation of the input streams.
+///
+/// When the returned stream is listened to, the [streams] are iterated through
+/// asynchronously, forwarding all events (both data and error) for the current
+/// stream to the returned stream before advancing the iterator and listening
+/// to the next stream.  If advancing the iterator throws an error, the
+/// returned stream ends immediately with that error.
+///
+/// Pausing and resuming the returned stream's subscriptions will pause and
+/// resume the subscription of the current stream being listened to.
+///
+/// Note: Events from pre-existing broadcast streams which occur before the
+/// stream is reached by the iteration will be dropped.
+///
+/// Example:
+///
+///     concat(files.map((file) =>
+///         file.openRead().transform(const LineSplitter())))
 Stream concat(Iterable<Stream> streams) => new _ConcatStream(streams);
 
 class _ConcatStream extends Stream {
diff --git a/packages/quiver/lib/src/async/countdown_timer.dart b/packages/quiver/lib/src/async/countdown_timer.dart
index cd052e7..6e17c84 100644
--- a/packages/quiver/lib/src/async/countdown_timer.dart
+++ b/packages/quiver/lib/src/async/countdown_timer.dart
@@ -14,36 +14,35 @@
 
 part of quiver.async;
 
-/**
- * A simple countdown timer that fires events in regular increments until a
- * duration has passed.
- *
- * CountdownTimer implements [Stream] and sends itself as the event. From the
- * timer you can get the [remaining] and [elapsed] time, or [cancel] the timer.
- */
+/// A simple countdown timer that fires events in regular increments until a
+/// duration has passed.
+///
+/// CountdownTimer implements [Stream] and sends itself as the event. From the
+/// timer you can get the [remaining] and [elapsed] time, or [cancel] the
+/// timer.
 class CountdownTimer extends Stream<CountdownTimer> {
   static const _THRESHOLD_MS = 4;
 
   final Duration _duration;
-  final Duration _increment;
   final Stopwatch _stopwatch;
+
+  /// The duration between timer events.
+  final Duration increment;
   final StreamController<CountdownTimer> _controller;
   Timer _timer;
 
-  /**
-   * Creates a new [CountdownTimer] that fires events in increments of
-   * [increment], until the [duration] has passed.
-   *
-   * [stopwatch] is for testing purposes. If you're using CountdownTimer and
-   * need to control time in a test, pass a mock or a fake. See [FakeAsync] and
-   * [FakeStopwatch].
-   */
+  /// Creates a new [CountdownTimer] that fires events in increments of
+  /// [increment], until the [duration] has passed.
+  ///
+  /// [stopwatch] is for testing purposes. If you're using CountdownTimer and
+  /// need to control time in a test, pass a mock or a fake. See [FakeAsync]
+  /// and [FakeStopwatch].
   CountdownTimer(Duration duration, Duration increment, {Stopwatch stopwatch})
       : _duration = duration,
-        _increment = increment,
+        increment = increment,
         _stopwatch = stopwatch == null ? new Stopwatch() : stopwatch,
-        _controller = new StreamController<CountdownTimer>.broadcast(
-            sync: true) {
+        _controller =
+            new StreamController<CountdownTimer>.broadcast(sync: true) {
     _timer = new Timer.periodic(increment, _tick);
     _stopwatch.start();
   }
diff --git a/packages/quiver/lib/src/streams/enumerate.dart b/packages/quiver/lib/src/async/enumerate.dart
similarity index 83%
rename from packages/quiver/lib/src/streams/enumerate.dart
rename to packages/quiver/lib/src/async/enumerate.dart
index 7978a05..62148d7 100644
--- a/packages/quiver/lib/src/streams/enumerate.dart
+++ b/packages/quiver/lib/src/async/enumerate.dart
@@ -12,12 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-part of quiver.streams;
+part of quiver.async;
 
-/**
- * Returns a [Stream] of [IndexedValue]s where the nth value holds the nth
- * element of [stream] and its index.
- */
+/// Returns a [Stream] of [IndexedValue]s where the nth value holds the nth
+/// element of [stream] and its index.
 Stream<IndexedValue> enumerate(Stream stream) {
   var index = 0;
   return stream.map((value) => new IndexedValue(index++, value));
diff --git a/packages/quiver/lib/src/async/future_group.dart b/packages/quiver/lib/src/async/future_group.dart
index c96ee1a..65a6d3c 100644
--- a/packages/quiver/lib/src/async/future_group.dart
+++ b/packages/quiver/lib/src/async/future_group.dart
@@ -14,13 +14,16 @@
 
 part of quiver.async;
 
-/**
- * A collection of [Future]s that signals when all added Futures complete. New
- * Futures can be added to the group as long as it hasn't completed.
- *
- * FutureGroup is useful for managing a set of async tasks that may spawn new
- * async tasks as they execute.
- */
+/// A collection of [Future]s that signals when all added Futures complete. New
+/// Futures can be added to the group as long as it hasn't completed.
+///
+/// FutureGroup is useful for managing a set of async tasks that may spawn new
+/// async tasks as they execute.
+///
+/// DEPRECATED: use `FutureGroup` from `package:async`. Note that it requires a
+/// `close()` call before auto-completion will be triggered upon the count of
+/// pending tasks dropping to 0.
+@deprecated
 class FutureGroup<E> {
   static const _FINISHED = -1;
 
@@ -29,18 +32,16 @@
   final Completer<List> _completer = new Completer<List>();
   final List results = [];
 
-  /** Gets the task that failed, if any. */
+  /// Gets the task that failed, if any.
   Future get failedTask => _failedTask;
 
-  /**
-   * Wait for [task] to complete.
-   *
-   * If this group has already been marked as completed, a [StateError] will be
-   * thrown.
-   *
-   * If this group has a [failedTask], new tasks will be ignored, because the
-   * error has already been signaled.
-   */
+  /// Wait for [task] to complete.
+  ///
+  /// If this group has already been marked as completed, a [StateError] will
+  /// be thrown.
+  ///
+  /// If this group has a [failedTask], new tasks will be ignored, because the
+  /// error has already been signaled.
   void add(Future task) {
     if (_failedTask != null) return;
     if (_pending == _FINISHED) throw new StateError("Future already completed");
@@ -63,12 +64,10 @@
     });
   }
 
-  /**
-   * A Future that complets with a List of the values from all the added
-   * tasks, when they have all completed.
-   *
-   * If any task fails, this Future will receive the error. Only the first
-   * error will be sent to the Future.
-   */
+  /// A Future that complets with a List of the values from all the added
+  /// tasks, when they have all completed.
+  ///
+  /// If any task fails, this Future will receive the error. Only the first
+  /// error will be sent to the Future.
   Future<List<E>> get future => _completer.future;
 }
diff --git a/packages/quiver/lib/src/async/future_stream.dart b/packages/quiver/lib/src/async/future_stream.dart
index 58b8629..fc36ad2 100644
--- a/packages/quiver/lib/src/async/future_stream.dart
+++ b/packages/quiver/lib/src/async/future_stream.dart
@@ -14,32 +14,32 @@
 
 part of quiver.async;
 
-/**
- * A Stream that will emit the same values as the stream returned by [future]
- * once [future] completes.
- *
- * If [future] completes to an error, the return value will emit that error and
- * then close.
- *
- * If [broadcast] is true, this will be a broadcast stream. This assumes that
- * the stream returned by [future] will be a broadcast stream as well.
- * [broadcast] defaults to false.
- *
- * # Example
- *
- * This class is useful when you need to retreive some object via a `Future`,
- * then return a `Stream` from that object:
- *
- *     var futureOfStream = getResource().then((resource) => resource.stream);
- *     return new FutureStream(futureOfStream);
- */
+/// A Stream that will emit the same values as the stream returned by [future]
+/// once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error
+/// and then close.
+///
+/// If [broadcast] is true, this will be a broadcast stream. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+///
+/// # Example
+///
+/// This class is useful when you need to retreive some object via a `Future`,
+/// then return a `Stream` from that object:
+///
+///     var futureOfStream = getResource().then((resource) => resource.stream);
+///     return new FutureStream(futureOfStream);
 class FutureStream<T> extends Stream<T> {
+  static T _identity<T>(T t) => t;
+
   Future<Stream<T>> _future;
   StreamController<T> _controller;
   StreamSubscription _subscription;
 
   FutureStream(Future<Stream<T>> future, {bool broadcast: false}) {
-    _future = future.catchError((e, stackTrace) {
+    _future = future.then(_identity, onError: (e, stackTrace) {
       // Since [controller] is synchronous, it's likely that emitting an error
       // will cause it to be cancelled before we call close.
       if (_controller != null) {
diff --git a/packages/quiver/lib/src/async/iteration.dart b/packages/quiver/lib/src/async/iteration.dart
index 4132573..d68affa 100644
--- a/packages/quiver/lib/src/async/iteration.dart
+++ b/packages/quiver/lib/src/async/iteration.dart
@@ -14,56 +14,49 @@
 
 part of quiver.async;
 
-/**
- * An asynchronous callback that returns a value.
- */
+/// An asynchronous callback that returns a value.
 typedef Future<T> AsyncAction<T>(e);
 
-/**
- * An asynchronous funcuntion that combines an element [e] with a previous value
- * [previous], for use with [reduceAsync].
- */
+/// An asynchronous funcuntion that combines an element [e] with a previous
+/// value [previous], for use with [reduceAsync].
 typedef Future<T> AsyncCombiner<T>(T previous, e);
 
-/**
- * Calls [action] for each item in [iterable] in turn, waiting for the Future
- * returned by action to complete.
- *
- * If the Future completes to [true], iteration continues.
- *
- * The Future returned completes to [true] if the entire iterable was processed,
- * otherwise [false].
- */
+/// Calls [action] for each item in [iterable] in turn, waiting for the Future
+/// returned by action to complete.
+///
+/// If the Future completes to [true], iteration continues.
+///
+/// The Future returned completes to [true] if the entire iterable was
+/// processed, otherwise [false].
 Future doWhileAsync(Iterable iterable, AsyncAction<bool> action) =>
     _doWhileAsync(iterable.iterator, action);
 
-Future _doWhileAsync(
-    Iterator iterator, AsyncAction<bool> action) => (iterator.moveNext())
-    ? action(iterator.current).then((bool result) =>
-        (result) ? _doWhileAsync(iterator, action) : new Future.value(false))
-    : new Future.value(true);
+Future _doWhileAsync(Iterator iterator, AsyncAction<bool> action) async {
+  if (iterator.moveNext()) {
+    return await action(iterator.current)
+        ? _doWhileAsync(iterator, action)
+        : false;
+  }
+  return true;
+}
 
-/**
- * Reduces a collection to a single value by iteratively combining elements
- * of the collection using the provided [combine] function. Similar to
- * [Iterable.reduce], except that [combine] is an async function that returns a
- * [Future].
- */
+/// Reduces a collection to a single value by iteratively combining elements of
+/// the collection using the provided [combine] function. Similar to
+/// [Iterable.reduce], except that [combine] is an async function that returns
+/// a [Future].
 Future reduceAsync(Iterable iterable, initialValue, AsyncCombiner combine) =>
     _reduceAsync(iterable.iterator, initialValue, combine);
 
-Future _reduceAsync(Iterator iterator, currentValue, AsyncCombiner combine) {
+Future _reduceAsync(Iterator iterator, current, AsyncCombiner combine) async {
   if (iterator.moveNext()) {
-    return combine(currentValue, iterator.current)
-        .then((result) => _reduceAsync(iterator, result, combine));
+    var result = await combine(current, iterator.current);
+    return _reduceAsync(iterator, result, combine);
   }
-  return new Future.value(currentValue);
+  return current;
 }
 
-/**
- * Schedules calls to [action] for each element in [iterable]. No more than
- * [maxTasks] calls to [action] will be pending at once.
- */
+/// Schedules calls to [action] for each element in [iterable]. No more than
+/// [maxTasks] calls to [action] will be pending at once.
 Future forEachAsync(Iterable iterable, AsyncAction action, {int maxTasks: 1}) {
   if (maxTasks == null || maxTasks < 1) {
     throw new ArgumentError("maxTasks must be greater than 0, was: $maxTasks");
@@ -92,16 +85,17 @@
           if (!scheduleTask() && pending == 0) {
             completer.complete();
           }
-        }).catchError((e) {
+        }).catchError((e, stack) {
           if (failed) return;
           failed = true;
-          completer.completeError(e);
+          completer.completeError(e, stack);
         });
       });
       return true;
     }
     return false;
   }
+
   while (scheduleTask()) {}
   return completer.future;
 }
diff --git a/packages/quiver/lib/src/async/metronome.dart b/packages/quiver/lib/src/async/metronome.dart
index 41dc697..b7a10da 100644
--- a/packages/quiver/lib/src/async/metronome.dart
+++ b/packages/quiver/lib/src/async/metronome.dart
@@ -14,39 +14,37 @@
 
 part of quiver.async;
 
-/**
- * A stream of [DateTime] events at [interval]s centered on [anchor].
- *
- * This stream accounts for drift but only guarantees that events are
- * delivered on or after the interval. If the system is busy for longer than
- * two [interval]s, only one will be delivered.
- *
- * [anchor] defaults to [clock.now], which means the stream represents a
- * self-correcting periodic timer. If anchor is the epoch, then the stream is
- * synchronized to wall-clock time. It can be anchored anywhere in time, but
- * this does not delay the first delivery.
- *
- * Examples:
- *
- *     new Metronome.epoch(aMinute).listen((d) => print(d));
- *
- * Could print the following stream of events, anchored by epoch,
- * till the stream is canceled:
- *     2014-05-04 14:06:00.001
- *     2014-05-04 14:07:00.000
- *     2014-05-04 14:08:00.003
- *     ...
- *
- * Example anchored in the future (now = 2014-05-05 20:06:00.123)
- *     new IsochronousStream.periodic(aMillisecond * 100,
- *         anchorMs: DateTime.parse("2014-05-05 21:07:00"))
- *         .listen((d) => print(d));
- *
- *     2014-05-04 20:06:00.223
- *     2014-05-04 20:06:00.324
- *     2014-05-04 20:06:00.423
- *     ...
- */
+/// A stream of [DateTime] events at [interval]s centered on [anchor].
+///
+/// This stream accounts for drift but only guarantees that events are
+/// delivered on or after the interval. If the system is busy for longer than
+/// two [interval]s, only one will be delivered.
+///
+/// [anchor] defaults to [clock.now], which means the stream represents a
+/// self-correcting periodic timer. If anchor is the epoch, then the stream is
+/// synchronized to wall-clock time. It can be anchored anywhere in time, but
+/// this does not delay the first delivery.
+///
+/// Examples:
+///
+///     new Metronome.epoch(aMinute).listen((d) => print(d));
+///
+/// Could print the following stream of events, anchored by epoch, till the
+/// stream is canceled:
+///     2014-05-04 14:06:00.001
+///     2014-05-04 14:07:00.000
+///     2014-05-04 14:08:00.003
+///     ...
+///
+/// Example anchored in the future (now = 2014-05-05 20:06:00.123)
+///     new IsochronousStream.periodic(aMillisecond * 100,
+///         anchorMs: DateTime.parse("2014-05-05 21:07:00"))
+///         .listen(print);
+///
+///     2014-05-04 20:06:00.223
+///     2014-05-04 20:06:00.324
+///     2014-05-04 20:06:00.423
+///     ...
 class Metronome extends Stream<DateTime> {
   static final DateTime _EPOCH = new DateTime.fromMillisecondsSinceEpoch(0);
 
@@ -55,7 +53,7 @@
   final DateTime anchor;
 
   Timer _timer;
-  StreamController _controller;
+  StreamController<DateTime> _controller;
   final int _intervalMs;
   final int _anchorMs;
 
@@ -73,15 +71,16 @@
         this.anchor = anchor,
         this.interval = interval,
         this._intervalMs = interval.inMilliseconds,
-        this._anchorMs = (anchor == null
-            ? clock.now()
-            : anchor).millisecondsSinceEpoch {
+        this._anchorMs =
+            (anchor == null ? clock.now() : anchor).millisecondsSinceEpoch {
     _controller = new StreamController<DateTime>.broadcast(
-        sync: true, onCancel: () {
-      _timer.cancel();
-    }, onListen: () {
-      _startTimer(clock.now());
-    });
+        sync: true,
+        onCancel: () {
+          _timer.cancel();
+        },
+        onListen: () {
+          _startTimer(clock.now());
+        });
   }
 
   StreamSubscription<DateTime> listen(void onData(DateTime event),
diff --git a/packages/quiver/lib/src/streams/streambuffer.dart b/packages/quiver/lib/src/async/stream_buffer.dart
similarity index 72%
rename from packages/quiver/lib/src/streams/streambuffer.dart
rename to packages/quiver/lib/src/async/stream_buffer.dart
index bca6108..1943d3e 100644
--- a/packages/quiver/lib/src/streams/streambuffer.dart
+++ b/packages/quiver/lib/src/async/stream_buffer.dart
@@ -12,12 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-part of quiver.streams;
+part of quiver.async;
 
-/**
- * Underflow errors happen when the socket feeding a buffer is finished while
- * there are still blocked readers. Each reader will complete with this error.
- */
+/// Underflow errors happen when the socket feeding a buffer is finished while
+/// there are still blocked readers. Each reader will complete with this error.
 class UnderflowError extends Error {
   final message;
 
@@ -32,22 +30,20 @@
   }
 }
 
-/**
- * Allow orderly reading of elements from a datastream, such as Socket, which
- * might not receive List<int> bytes regular chunks.
- *
- * Example usage:
- *     StreamBuffer<int> buffer = new StreamBuffer();
- *     Socket.connect('127.0.0.1', 5555).then((sock) => sock.pipe(buffer));
- *     buffer.read(100).then((bytes) {
- *       // do something with 100 bytes;
- *     });
- *
- * Throws [UnderflowError] if [throwOnError] is true. Useful for unexpected
- * [Socket] disconnects.
- */
-class StreamBuffer<T> implements StreamConsumer {
-  List _chunks = [];
+/// Allow orderly reading of elements from a datastream, such as Socket, which
+/// might not receive List<int> bytes regular chunks.
+///
+/// Example usage:
+///     StreamBuffer<int> buffer = new StreamBuffer();
+///     Socket.connect('127.0.0.1', 5555).then((sock) => sock.pipe(buffer));
+///     buffer.read(100).then((bytes) {
+///       // do something with 100 bytes;
+///     });
+///
+/// Throws [UnderflowError] if [throwOnError] is true. Useful for unexpected
+/// [Socket] disconnects.
+class StreamBuffer<T> implements StreamConsumer<T> {
+  List<T> _chunks = [];
   int _offset = 0;
   int _counter = 0; // sum(_chunks[*].length) - _offset
   List<_ReaderInWaiting<List<T>>> _readers = [];
@@ -75,23 +71,19 @@
 
   bool get limited => _limit > 0;
 
-  /**
-   * Create a stream buffer with optional, soft [limit] to the amount of data
-   * the buffer will hold before pausing the underlying stream. A limit of 0
-   * means no buffer limits.
-   */
+  /// Create a stream buffer with optional, soft [limit] to the amount of data
+  /// the buffer will hold before pausing the underlying stream. A limit of 0
+  /// means no buffer limits.
   StreamBuffer({bool throwOnError: false, int limit: 0})
       : this._throwOnError = throwOnError,
         this._limit = limit;
 
-  /**
-   * The amount of unread data buffered.
-   */
+  /// The amount of unread data buffered.
   int get buffered => _counter;
 
   List<T> _consume(int size) {
     var follower = 0;
-    var ret = new List(size);
+    var ret = new List<T>(size);
     var leftToRead = size;
     while (leftToRead > 0) {
       var chunk = _chunks.first;
@@ -99,7 +91,7 @@
       var subsize = leftToRead > listCap ? listCap : leftToRead;
       if (chunk is List) {
         ret.setRange(follower, follower + subsize,
-            chunk.getRange(_offset, _offset + subsize));
+            (chunk as List<T>).getRange(_offset, _offset + subsize));
       } else {
         ret[follower] = chunk;
       }
@@ -107,7 +99,7 @@
       _offset += subsize;
       _counter -= subsize;
       leftToRead -= subsize;
-      if (chunk is! List || _offset >= chunk.length) {
+      if (chunk is! List || _offset >= (chunk as List).length) {
         _offset = 0;
         _chunks.removeAt(0);
       }
@@ -118,11 +110,9 @@
     return ret;
   }
 
-  /**
-   * Read fully [size] bytes from the stream and return in the future.
-   *
-   * Throws [ArgumentError] if size is larger than optional buffer [limit].
-   */
+  /// Read fully [size] bytes from the stream and return in the future.
+  ///
+  /// Throws [ArgumentError] if size is larger than optional buffer [limit].
   Future<List<T>> read(int size) {
     if (limited && size > limit) {
       throw new ArgumentError("Cannot read $size with limit $limit");
@@ -133,7 +123,7 @@
     if (size <= buffered && _readers.isEmpty) {
       return new Future.value(_consume(size));
     }
-    Completer completer = new Completer<List<T>>();
+    final completer = new Completer<List<T>>();
     _readers.add(new _ReaderInWaiting<List<T>>(size, completer));
     return completer.future;
   }
@@ -164,16 +154,16 @@
         _closed(new UnderflowError());
       }
       streamDone.complete();
-    }, onError: (e) {
-      _closed(e);
+    }, onError: (e, stack) {
+      _closed(e, stack);
     });
     return streamDone.future;
   }
 
-  _closed(e) {
+  void _closed(e, [StackTrace stack]) {
     for (var reader in _readers) {
       if (!reader.completer.isCompleted) {
-        reader.completer.completeError(e);
+        reader.completer.completeError(e, stack);
       }
     }
     _readers.clear();
diff --git a/packages/quiver/lib/src/async/stream_router.dart b/packages/quiver/lib/src/async/stream_router.dart
index 0707f3d..6b93bbb 100644
--- a/packages/quiver/lib/src/async/stream_router.dart
+++ b/packages/quiver/lib/src/async/stream_router.dart
@@ -14,43 +14,37 @@
 
 part of quiver.async;
 
-/**
- * Splits a [Stream] of events into multiple Streams based on a set of
- * predicates.
- *
- * Using StreamRouter differs from [Stream.where] because events are only sent
- * to one Stream. If more than one predicate matches the event, the event is
- * sent to the stream created by the earlier call to [route]. Events not matched
- * by a call to [route] are sent to the [defaultStream].
- *
- * Example:
- *   import 'dart:html';
- *   import 'package:quiver/async.dart';
- *
- *   var router = new StreamRouter(window.onClick);
- *   var onRightClick = router.route((e) => e.button == 2);
- *   var onAltClick = router.route((e) => e.altKey);
- *   var onOtherClick router.defaultStream;
- */
+/// Splits a [Stream] of events into multiple Streams based on a set of
+/// predicates.
+///
+/// Using StreamRouter differs from [Stream.where] because events are only sent
+/// to one Stream. If more than one predicate matches the event, the event is
+/// sent to the stream created by the earlier call to [route]. Events not
+/// matched by a call to [route] are sent to the [defaultStream].
+///
+/// Example:
+///    import 'dart:html';
+///    import 'package:quiver/async.dart';
+///
+///    var router = new StreamRouter(window.onClick);
+///    var onRightClick = router.route((e) => e.button == 2);
+///    var onAltClick = router.route((e) => e.altKey);
+///    var onOtherClick router.defaultStream;
 class StreamRouter<T> {
   final Stream<T> _incoming;
   StreamSubscription _subscription;
 
-  final List<_Route> _routes = <_Route>[];
+  final List<_Route<T>> _routes = <_Route<T>>[];
   final StreamController<T> _defaultController =
       new StreamController<T>.broadcast();
 
-  /**
-   * Create a new StreamRouter that listens to the [incoming] stream.
-   */
+  /// Create a new StreamRouter that listens to the [incoming] stream.
   StreamRouter(Stream<T> incoming) : _incoming = incoming {
     _subscription = _incoming.listen(_handle, onDone: close);
   }
 
-  /**
-   * Events that match [predicate] are sent to the stream created by this
-   * method, and not sent to any other router streams.
-   */
+  /// Events that match [predicate] are sent to the stream created by this
+  /// method, and not sent to any other router streams.
   Stream<T> route(bool predicate(T event)) {
     var controller = new StreamController<T>.broadcast();
     _routes.add(new _Route(predicate, controller));
@@ -75,9 +69,9 @@
 
 typedef bool _Predicate(event);
 
-class _Route {
+class _Route<T> {
   final _Predicate predicate;
-  final StreamController controller;
+  final StreamController<T> controller;
 
   _Route(this.predicate, this.controller);
 }
diff --git a/packages/quiver/lib/src/cache/cache.dart b/packages/quiver/lib/src/cache/cache.dart
index 55ae643..dc6e3c3 100644
--- a/packages/quiver/lib/src/cache/cache.dart
+++ b/packages/quiver/lib/src/cache/cache.dart
@@ -14,38 +14,27 @@
 
 part of quiver.cache;
 
-/**
- * A function that produces a value for [key], for when a [Cache] needs to
- * populate an entry.
- *
- * The loader function should either return a value synchronously or a [Future]
- * which completes with the value asynchronously.
- */
+/// A function that produces a value for [key], for when a [Cache] needs to
+/// populate an entry.
+///
+/// The loader function should either return a value synchronously or a
+/// [Future] which completes with the value asynchronously.
 typedef dynamic Loader<K>(K key);
 
-/**
- * A semi-persistent mapping of keys to values.
- *
- * All access to a Cache is asynchronous because many implementations will store
- * their entries in remote systems, isolates, or otherwise have to do async IO
- * to read and write.
- */
+/// A semi-persistent mapping of keys to values.
+///
+/// All access to a Cache is asynchronous because many implementations will
+/// store their entries in remote systems, isolates, or otherwise have to do
+/// async IO to read and write.
 abstract class Cache<K, V> {
-
-  /**
-   * Returns the value associated with [key].
-   */
+  /// Returns the value associated with [key].
   Future<V> get(K key, {Loader<K> ifAbsent});
 
-  /**
-   * Sets the value associated with [key]. The Future completes with null when
-   * the operation is complete.
-   */
+  /// Sets the value associated with [key]. The Future completes with null when
+  /// the operation is complete.
   Future set(K key, V value);
 
-  /**
-   * Removes the value associated with [key]. The Future completes with null
-   * when the operation is complete.
-   */
+  /// Removes the value associated with [key]. The Future completes with null
+  /// when the operation is complete.
   Future invalidate(K key);
 }
diff --git a/packages/quiver/lib/src/cache/map_cache.dart b/packages/quiver/lib/src/cache/map_cache.dart
index 3544422..e236478 100644
--- a/packages/quiver/lib/src/cache/map_cache.dart
+++ b/packages/quiver/lib/src/cache/map_cache.dart
@@ -14,21 +14,15 @@
 
 part of quiver.cache;
 
-/**
- * A [Cache] that's backed by a [Map].
- */
+/// A [Cache] that's backed by a [Map].
 class MapCache<K, V> implements Cache<K, V> {
   final Map<K, V> _map;
 
-  /**
-   * Creates a new [MapCache], optionally using [map] as the backing [Map].
-   */
+  /// Creates a new [MapCache], optionally using [map] as the backing [Map].
   MapCache({Map<K, V> map}) : _map = map != null ? map : new HashMap<K, V>();
 
-  /**
-   * Creates a new [MapCache], using [LruMap] as the backing [Map].
-   * Optionally specify [maximumSize].
-   */
+  /// Creates a new [MapCache], using [LruMap] as the backing [Map].
+  /// Optionally specify [maximumSize].
   factory MapCache.lru({int maximumSize}) {
     return new MapCache<K, V>(map: new LruMap(maximumSize: maximumSize));
   }
@@ -38,12 +32,12 @@
       var valOrFuture = ifAbsent(key);
       if (valOrFuture is Future) {
         return valOrFuture.then((v) {
-          _map[key] = v;
-          return v;
+          _map[key] = v as V;
+          return v as V;
         });
       } else {
-        _map[key] = valOrFuture;
-        return new Future.value(valOrFuture);
+        _map[key] = valOrFuture as V;
+        return new Future<V>.value(valOrFuture);
       }
     }
     return new Future.value(_map[key]);
diff --git a/packages/quiver/lib/src/collection/bimap.dart b/packages/quiver/lib/src/collection/bimap.dart
index 0757aa5..ece246b 100644
--- a/packages/quiver/lib/src/collection/bimap.dart
+++ b/packages/quiver/lib/src/collection/bimap.dart
@@ -14,47 +14,35 @@
 
 part of quiver.collection;
 
-/**
- * A bi-directional map whose key-value pairs form a one-to-one correspondence.
- * BiMaps support an `inverse` property which gives access to an inverted view
- * of the map, such that there is a mapping (v, k) for each pair (k, v) in the
- * original map. Since a one-to-one key-value invariant applies, it is an error
- * to insert duplicate values into this map. It is also an error to insert null
- * keys or values into this map.
- */
+/// A bi-directional map whose key-value pairs form a one-to-one
+/// correspondence.  BiMaps support an `inverse` property which gives access to
+/// an inverted view of the map, such that there is a mapping (v, k) for each
+/// pair (k, v) in the original map. Since a one-to-one key-value invariant
+/// applies, it is an error to insert duplicate values into this map. It is
+/// also an error to insert null keys or values into this map.
 abstract class BiMap<K, V> implements Map<K, V> {
-  /**
-   * Creates a BiMap instance with the default implementation.
-   */
+  /// Creates a BiMap instance with the default implementation.
   factory BiMap() => new HashBiMap();
 
-  /**
-   * Adds an association between key and value.
-   *
-   * Throws [ArgumentError] if an association involving [value] exists in the
-   * map; otherwise, the association is inserted, overwriting any existing
-   * association for the key.
-   */
+  /// Adds an association between key and value.
+  ///
+  /// Throws [ArgumentError] if an association involving [value] exists in the
+  /// map; otherwise, the association is inserted, overwriting any existing
+  /// association for the key.
   void operator []=(K key, V value);
 
-  /**
-   * Replaces any existing associations(s) involving key and value.
-   *
-   * If an association involving [key] or [value] exists in the map, it is
-   * removed.
-   */
+  /// Replaces any existing associations(s) involving key and value.
+  ///
+  /// If an association involving [key] or [value] exists in the map, it is
+  /// removed.
   void replace(K key, V value);
 
-  /**
-   * Returns the inverse of this map, with key-value pairs (v, k) for each
-   * pair (k, v) in this map.
-   */
+  /// Returns the inverse of this map, with key-value pairs (v, k) for each pair
+  /// (k, v) in this map.
   BiMap<V, K> get inverse;
 }
 
-/**
- * A hash-table based implementation of BiMap.
- */
+/// A hash-table based implementation of BiMap.
 class HashBiMap<K, V> implements BiMap<K, V> {
   final Map<K, V> _map;
   final Map<V, K> _inverse;
@@ -67,9 +55,11 @@
   void operator []=(K key, V value) {
     _add(key, value, false);
   }
+
   void replace(K key, V value) {
     _add(key, value, true);
   }
+
   void addAll(Map<K, V> other) => other.forEach((k, v) => _add(k, v, false));
   bool containsKey(Object key) => _map.containsKey(key);
   bool containsValue(Object value) => _inverse.containsKey(value);
diff --git a/packages/quiver/lib/src/collection/delegates/iterable.dart b/packages/quiver/lib/src/collection/delegates/iterable.dart
index 14f5ed1..8784920 100644
--- a/packages/quiver/lib/src/collection/delegates/iterable.dart
+++ b/packages/quiver/lib/src/collection/delegates/iterable.dart
@@ -14,19 +14,16 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of [Iterable] that delegates all methods to another
- * [Iterable].
- * For instance you can create a FruitIterable like this :
- *
- *     class FruitIterable extends DelegatingIterable<Fruit> {
- *       final Iterable<Fruit> _fruits = [];
- *
- *       Iterable<Fruit> get delegate => _fruits;
- *
- *       // custom methods
- *     }
- */
+/// An implementation of [Iterable] that delegates all methods to another
+/// [Iterable].  For instance you can create a FruitIterable like this :
+///
+///     class FruitIterable extends DelegatingIterable<Fruit> {
+///       final Iterable<Fruit> _fruits = [];
+///
+///       Iterable<Fruit> get delegate => _fruits;
+///
+///       // custom methods
+///     }
 abstract class DelegatingIterable<E> implements Iterable<E> {
   Iterable<E> get delegate;
 
@@ -38,15 +35,15 @@
 
   bool every(bool test(E element)) => delegate.every(test);
 
-  Iterable expand(Iterable f(E element)) => delegate.expand(f);
+  Iterable<T> expand<T>(Iterable<T> f(E element)) => delegate.expand(f);
 
   E get first => delegate.first;
 
   E firstWhere(bool test(E element), {E orElse()}) =>
       delegate.firstWhere(test, orElse: orElse);
 
-  fold(initialValue, combine(previousValue, E element)) =>
-      delegate.fold(initialValue, combine);
+  T fold<T>(T initialValue, T combine(T previousValue, E element)) => delegate
+      .fold(initialValue, combine);
 
   void forEach(void f(E element)) => delegate.forEach(f);
 
@@ -65,7 +62,7 @@
 
   int get length => delegate.length;
 
-  Iterable map(f(E element)) => delegate.map(f);
+  Iterable<T> map<T>(T f(E e)) => delegate.map(f);
 
   E reduce(E combine(E value, E element)) => delegate.reduce(combine);
 
diff --git a/packages/quiver/lib/src/collection/delegates/list.dart b/packages/quiver/lib/src/collection/delegates/list.dart
index 7863539..864ff86 100644
--- a/packages/quiver/lib/src/collection/delegates/list.dart
+++ b/packages/quiver/lib/src/collection/delegates/list.dart
@@ -14,18 +14,16 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of [List] that delegates all methods to another [List].
- * For instance you can create a FruitList like this :
- *
- *     class FruitList extends DelegatingList<Fruit> {
- *       final List<Fruit> _fruits = [];
- *
- *       List<Fruit> get delegate => _fruits;
- *
- *       // custom methods
- *     }
- */
+/// An implementation of [List] that delegates all methods to another [List].
+/// For instance you can create a FruitList like this :
+///
+///     class FruitList extends DelegatingList<Fruit> {
+///       final List<Fruit> _fruits = [];
+///
+///       List<Fruit> get delegate => _fruits;
+///
+///       // custom methods
+///     }
 abstract class DelegatingList<E> extends DelegatingIterable<E>
     implements List<E> {
   List<E> get delegate;
diff --git a/packages/quiver/lib/src/collection/delegates/map.dart b/packages/quiver/lib/src/collection/delegates/map.dart
index befd5aa..1e66c59 100644
--- a/packages/quiver/lib/src/collection/delegates/map.dart
+++ b/packages/quiver/lib/src/collection/delegates/map.dart
@@ -14,18 +14,16 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of [Map] that delegates all methods to another [Map].
- * For instance you can create a FruitMap like this :
- *
- *     class FruitMap extends DelegatingMap<String, Fruit> {
- *       final Map<String, Fruit> _fruits = {};
- *
- *       Map<String, Fruit> get delegate => _fruits;
- *
- *       // custom methods
- *     }
- */
+/// An implementation of [Map] that delegates all methods to another [Map].
+/// For instance you can create a FruitMap like this :
+///
+///     class FruitMap extends DelegatingMap<String, Fruit> {
+///       final Map<String, Fruit> _fruits = {};
+///
+///       Map<String, Fruit> get delegate => _fruits;
+///
+///       // custom methods
+///     }
 abstract class DelegatingMap<K, V> implements Map<K, V> {
   Map<K, V> get delegate;
 
diff --git a/packages/quiver/lib/src/collection/delegates/queue.dart b/packages/quiver/lib/src/collection/delegates/queue.dart
index 1c85fc7..58688f7 100644
--- a/packages/quiver/lib/src/collection/delegates/queue.dart
+++ b/packages/quiver/lib/src/collection/delegates/queue.dart
@@ -14,18 +14,16 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of [Queue] that delegates all methods to another [Queue].
- * For instance you can create a FruitQueue like this :
- *
- *     class FruitQueue extends DelegatingQueue<Fruit> {
- *       final Queue<Fruit> _fruits = new Queue<Fruit>();
- *
- *       Queue<Fruit> get delegate => _fruits;
- *
- *       // custom methods
- *     }
- */
+/// An implementation of [Queue] that delegates all methods to another [Queue].
+/// For instance you can create a FruitQueue like this :
+///
+///     class FruitQueue extends DelegatingQueue<Fruit> {
+///       final Queue<Fruit> _fruits = new Queue<Fruit>();
+///
+///       Queue<Fruit> get delegate => _fruits;
+///
+///       // custom methods
+///     }
 abstract class DelegatingQueue<E> extends DelegatingIterable<E>
     implements Queue<E> {
   Queue<E> get delegate;
diff --git a/packages/quiver/lib/src/collection/delegates/set.dart b/packages/quiver/lib/src/collection/delegates/set.dart
index 87e3527..9362e80 100644
--- a/packages/quiver/lib/src/collection/delegates/set.dart
+++ b/packages/quiver/lib/src/collection/delegates/set.dart
@@ -14,18 +14,16 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of [Set] that delegates all methods to another [Set].
- * For instance you can create a FruitSet like this :
- *
- *     class FruitSet extends DelegatingSet<Fruit> {
- *       final Set<Fruit> _fruits = new Set<Fruit>();
- *
- *       Set<Fruit> get delegate => _fruits;
- *
- *       // custom methods
- *     }
- */
+/// An implementation of [Set] that delegates all methods to another [Set].
+/// For instance you can create a FruitSet like this :
+///
+///     class FruitSet extends DelegatingSet<Fruit> {
+///       final Set<Fruit> _fruits = new Set<Fruit>();
+///
+///       Set<Fruit> get delegate => _fruits;
+///
+///       // custom methods
+///     }
 abstract class DelegatingSet<E> extends DelegatingIterable<E>
     implements Set<E> {
   Set<E> get delegate;
@@ -38,7 +36,7 @@
 
   bool containsAll(Iterable<Object> other) => delegate.containsAll(other);
 
-  Set<E> difference(Set<E> other) => delegate.difference(other);
+  Set<E> difference(Set<Object> other) => delegate.difference(other);
 
   Set<E> intersection(Set<Object> other) => delegate.intersection(other);
 
diff --git a/packages/quiver/lib/src/collection/lru_map.dart b/packages/quiver/lib/src/collection/lru_map.dart
index 13e094a..bb6f0a1 100644
--- a/packages/quiver/lib/src/collection/lru_map.dart
+++ b/packages/quiver/lib/src/collection/lru_map.dart
@@ -14,35 +14,27 @@
 
 part of quiver.collection;
 
-/**
- * An implementation of a [Map] which has a maximum size and uses a (Least
- * Recently Used)[http://en.wikipedia.org/wiki/Cache_algorithms#LRU] algorithm
- * to remove items from the [Map] when the [maximumSize] is reached and new
- * items are added.
- *
- * It is safe to access the [keys] and [values] collections without affecting
- * the "used" ordering - as well as using [forEach]. Other types of access,
- * including bracket, and [putIfAbsent], promotes the key-value pair to the MRU
- * position.
- */
+/// An implementation of a [Map] which has a maximum size and uses a (Least
+/// Recently Used)[http://en.wikipedia.org/wiki/Cache_algorithms#LRU] algorithm
+/// to remove items from the [Map] when the [maximumSize] is reached and new
+/// items are added.
+///
+/// It is safe to access the [keys] and [values] collections without affecting
+/// the "used" ordering - as well as using [forEach]. Other types of access,
+/// including bracket, and [putIfAbsent], promotes the key-value pair to the
+/// MRU position.
 abstract class LruMap<K, V> implements Map<K, V> {
-  /**
-   * Creates a [LruMap] instance with the default implementation.
-   */
-  factory LruMap({int maximumSize}) = LinkedLruHashMap;
+  /// Creates a [LruMap] instance with the default implementation.
+  factory LruMap({int maximumSize}) = LinkedLruHashMap<K, V>;
 
-  /**
-   * Maximum size of the [Map]. If [length] exceeds this value at any time,
-   * n entries accessed the earliest are removed, where n is [length] -
-   * [maximumSize].
-   */
+  /// Maximum size of the [Map]. If [length] exceeds this value at any time, n
+  /// entries accessed the earliest are removed, where n is [length] -
+  /// [maximumSize].
   int maximumSize;
 }
 
-/**
- * Simple implementation of a linked-list entry that contains a [key] and
- * [value].
- */
+/// Simple implementation of a linked-list entry that contains a [key] and
+/// [value].
 class _LinkedEntry<K, V> {
   K key;
   V value;
@@ -53,9 +45,7 @@
   _LinkedEntry([this.key, this.value]);
 }
 
-/**
- * A linked hash-table based implementation of [LruMap].
- */
+/// A linked hash-table based implementation of [LruMap].
 class LinkedLruHashMap<K, V> implements LruMap<K, V> {
   static const _DEFAULT_MAXIMUM_SIZE = 100;
 
@@ -66,32 +56,26 @@
   _LinkedEntry<K, V> _head;
   _LinkedEntry<K, V> _tail;
 
-  /**
-   * Create a new LinkedLruHashMap with a [maximumSize].
-   */
+  /// Create a new LinkedLruHashMap with a [maximumSize].
   factory LinkedLruHashMap({int maximumSize}) =>
       new LinkedLruHashMap._fromMap(new HashMap<K, _LinkedEntry<K, V>>(),
           maximumSize: maximumSize);
 
-  LinkedLruHashMap._fromMap(
-      this._entries, {
-      int maximumSize})
-          // This pattern is used instead of a default value because we want to
-          // be able to respect null values coming in from MapCache.lru.
-          : _maximumSize = firstNonNull(maximumSize, _DEFAULT_MAXIMUM_SIZE);
+  LinkedLruHashMap._fromMap(this._entries, {int maximumSize})
+      // This pattern is used instead of a default value because we want to
+      // be able to respect null values coming in from MapCache.lru.
+      : _maximumSize = firstNonNull(maximumSize, _DEFAULT_MAXIMUM_SIZE);
 
-  /**
-   * Adds all key-value pairs of [other] to this map.
-   *
-   * The operation is equivalent to doing this[key] = value for each key and
-   * associated value in other. It iterates over other, which must therefore not
-   * change during the iteration.
-   *
-   * If a key of [other] is already in this map, its value is overwritten. If
-   * the number of unique keys is greater than [maximumSize] then the least
-   * recently use keys are evicted. For keys written to by [other], the least
-   * recently user order is determined by [other]'s iteration order.
-   */
+  /// Adds all key-value pairs of [other] to this map.
+  ///
+  /// The operation is equivalent to doing this[key] = value for each key and
+  /// associated value in other. It iterates over other, which must therefore
+  /// not change during the iteration.
+  ///
+  /// If a key of [other] is already in this map, its value is overwritten. If
+  /// the number of unique keys is greater than [maximumSize] then the least
+  /// recently use keys are evicted. For keys written to by [other], the least
+  /// recently user order is determined by [other]'s iteration order.
   @override
   void addAll(Map<K, V> other) => other.forEach((k, v) => this[k] = v);
 
@@ -102,16 +86,15 @@
   }
 
   @override
-  bool containsKey(K key) => _entries.containsKey(key);
+  bool containsKey(Object key) => _entries.containsKey(key);
 
   @override
-  bool containsValue(V value) => values.contains(value);
+  bool containsValue(Object value) => values.contains(value);
 
-  /**
-   * Applies [action] to each key-value pair of the map in order of MRU to LRU.
-   *
-   * Calling `action` must not add or remove keys from the map.
-   */
+  /// Applies [action] to each key-value pair of the map in order of MRU to
+  /// LRU.
+  ///
+  /// Calling `action` must not add or remove keys from the map.
   @override
   void forEach(void action(K key, V value)) {
     var head = _head;
@@ -130,27 +113,21 @@
   @override
   bool get isNotEmpty => _entries.isNotEmpty;
 
-  /**
-   * Creates an [Iterable] around the entries of the map.
-   */
+  /// Creates an [Iterable] around the entries of the map.
   Iterable<_LinkedEntry<K, V>> _iterable() {
     return new GeneratingIterable<_LinkedEntry<K, V>>(
         () => _head, (n) => n.next);
   }
 
-  /**
-   * The keys of [this] - in order of MRU to LRU.
-   *
-   * The returned iterable does *not* have efficient `length` or `contains`.
-   */
+  /// The keys of [this] - in order of MRU to LRU.
+  ///
+  /// The returned iterable does *not* have efficient `length` or `contains`.
   @override
   Iterable<K> get keys => _iterable().map((e) => e.key);
 
-  /**
-   * The values of [this] - in order of MRU to LRU.
-   *
-   * The returned iterable does *not* have efficient `length` or `contains`.
-   */
+  /// The values of [this] - in order of MRU to LRU.
+  ///
+  /// The returned iterable does *not* have efficient `length` or `contains`.
   @override
   Iterable<V> get values => _iterable().map((e) => e.value);
 
@@ -166,19 +143,17 @@
     _maximumSize = maximumSize;
   }
 
-  /**
-   * Look up the value associated with [key], or add a new value if it isn't
-   * there. The pair is promoted to the MRU position.
-   *
-   * Otherwise calls [ifAbsent] to get a new value, associates [key] to that
-   * [value], and then returns the new [value], with the key-value pair in the
-   * MRU position. If this causes [length] to exceed [maximumSize], then the
-   * LRU position is removed.
-   */
+  /// Look up the value associated with [key], or add a new value if it isn't
+  /// there. The pair is promoted to the MRU position.
+  ///
+  /// Otherwise calls [ifAbsent] to get a new value, associates [key] to that
+  /// [value], and then returns the new [value], with the key-value pair in the
+  /// MRU position. If this causes [length] to exceed [maximumSize], then the
+  /// LRU position is removed.
   @override
   V putIfAbsent(K key, V ifAbsent()) {
-    final entry =  _entries.putIfAbsent(
-        key, () => _createEntry(key, ifAbsent()));
+    final entry =
+        _entries.putIfAbsent(key, () => _createEntry(key, ifAbsent()));
     if (length > maximumSize) {
       _removeLru();
     }
@@ -186,14 +161,12 @@
     return entry.value;
   }
 
-  /**
-   * Get the value for a [key] in the [Map]. The [key] will be promoted to the
-   * 'Most Recently Used' position. *NOTE*: Calling [] inside an iteration over
-   * keys/values is currently unsupported; use [keys] or [values] if you
-   * need information about entries without modifying their position.
-   */
+  /// Get the value for a [key] in the [Map]. The [key] will be promoted to the
+  /// 'Most Recently Used' position. *NOTE*: Calling [] inside an iteration
+  /// over keys/values is currently unsupported; use [keys] or [values] if you
+  /// need information about entries without modifying their position.
   @override
-  V operator[](K key) {
+  V operator [](Object key) {
     final entry = _entries[key];
     if (entry != null) {
       _promoteEntry(entry);
@@ -203,12 +176,11 @@
     }
   }
 
-  /**
-   * If [key] already exists, promotes it to the MRU position & assigns [value].
-   *
-   * Otherwise, adds [key] and [value] to the MRU position.
-   * If [length] exceeds [maximumSize] while adding, removes the LRU position.
-   */
+  /// If [key] already exists, promotes it to the MRU position & assigns
+  /// [value].
+  ///
+  /// Otherwise, adds [key] and [value] to the MRU position.  If [length]
+  /// exceeds [maximumSize] while adding, removes the LRU position.
   @override
   void operator []=(K key, V value) {
     // Add this item to the MRU position.
@@ -222,7 +194,7 @@
   }
 
   @override
-  V remove(K key) {
+  V remove(Object key) {
     final entry = _entries.remove(key);
     if (entry != null) {
       if (entry == _head) {
@@ -241,9 +213,7 @@
   @override
   String toString() => Maps.mapToString(this);
 
-  /**
-   * Moves [entry] to the MRU position, shifting the linked list if necessary.
-   */
+  /// Moves [entry] to the MRU position, shifting the linked list if necessary.
   void _promoteEntry(_LinkedEntry<K, V> entry) {
     if (entry.previous != null) {
       // If already existed in the map, link previous to next.
@@ -270,18 +240,14 @@
     }
   }
 
-  /**
-   * Creates and returns an entry from [key] and [value].
-   */
+  /// Creates and returns an entry from [key] and [value].
   _LinkedEntry<K, V> _createEntry(K key, V value) {
     return new _LinkedEntry<K, V>(key, value);
   }
 
-  /**
-   * If [entry] does not exist, inserts it into the backing map.
-   * If it does, replaces the existing [_LinkedEntry.value] with [entry.value].
-   * Then, in either case, promotes [entry] to the MRU position.
-   */
+  /// If [entry] does not exist, inserts it into the backing map.  If it does,
+  /// replaces the existing [_LinkedEntry.value] with [entry.value].  Then, in
+  /// either case, promotes [entry] to the MRU position.
   void _insertMru(_LinkedEntry<K, V> entry) {
     // Insert a new entry if necessary (only 1 hash lookup in entire function).
     // Otherwise, just updates the existing value.
@@ -289,9 +255,7 @@
     _promoteEntry(_entries.putIfAbsent(entry.key, () => entry)..value = value);
   }
 
-  /**
-   * Removes the LRU position, shifting the linked list if necessary.
-   */
+  /// Removes the LRU position, shifting the linked list if necessary.
   void _removeLru() {
     // Remove the tail from the internal map.
     _entries.remove(_tail.key);
diff --git a/packages/quiver/lib/src/collection/multimap.dart b/packages/quiver/lib/src/collection/multimap.dart
index 9144478..27d64a9 100644
--- a/packages/quiver/lib/src/collection/multimap.dart
+++ b/packages/quiver/lib/src/collection/multimap.dart
@@ -14,134 +14,108 @@
 
 part of quiver.collection;
 
-/**
- * An associative container that maps a key to multiple values.
- *
- * Key lookups return mutable collections that are views of the multimap.
- * Updates to the multimap are reflected in these collections and similarly,
- * modifications to the returned collections are reflected in the multimap.
- */
+/// An associative container that maps a key to multiple values.
+///
+/// Key lookups return mutable collections that are views of the multimap.
+/// Updates to the multimap are reflected in these collections and similarly,
+/// modifications to the returned collections are reflected in the multimap.
 abstract class Multimap<K, V> {
-  /**
-   * Constructs a new list-backed multimap.
-   */
+  /// Constructs a new list-backed multimap.
   factory Multimap() => new ListMultimap<K, V>();
 
-  /**
-   * Returns whether this multimap contains the given [value].
-   */
+  /// Constructs a new list-backed multimap. For each element e of [iterable],
+  /// adds an association from [key](e) to [value](e). [key] and [value] each
+  /// default to the identity function.
+  factory Multimap.fromIterable(Iterable iterable,
+      {K key(element), V value(element)}) = ListMultimap<K, V>.fromIterable;
+
+  /// Returns whether this multimap contains the given [value].
   bool containsValue(Object value);
 
-  /**
-   * Returns whether this multimap contains the given [key].
-   */
+  /// Returns whether this multimap contains the given [key].
   bool containsKey(Object key);
 
-  /**
-   * Returns the values for the given [key]. An empty iterable is returned if
-   * [key] is not mapped. The returned collection is a view on the multimap.
-   * Updates to the collection modify the multimap and likewise, modifications
-   * to the multimap are reflected in the returned collection.
-   */
+  /// Returns the values for the given [key]. An empty iterable is returned if
+  /// [key] is not mapped. The returned collection is a view on the multimap.
+  /// Updates to the collection modify the multimap and likewise, modifications
+  /// to the multimap are reflected in the returned collection.
   Iterable<V> operator [](Object key);
 
-  /**
-   * Adds an association from the given key to the given value.
-   */
+  /// Adds an association from the given key to the given value.
   void add(K key, V value);
 
-  /**
-   * Adds an association from the given key to each of the given values.
-   */
+  /// Adds an association from the given key to each of the given values.
   void addValues(K key, Iterable<V> values);
 
-  /**
-   * Adds all associations of [other] to this multimap.
-   *
-   * The operation is equivalent to doing `this[key] = value` for each key
-   * and associated value in other. It iterates over [other], which must
-   * therefore not change during the iteration.
-   */
+  /// Adds all associations of [other] to this multimap.
+  ///
+  /// The operation is equivalent to doing `this[key] = value` for each key and
+  /// associated value in other. It iterates over [other], which must therefore
+  /// not change during the iteration.
   void addAll(Multimap<K, V> other);
 
-  /**
-   * Removes the association between the given [key] and [value]. Returns
-   * `true` if the association existed, `false` otherwise.
-   */
+  /// Removes the association between the given [key] and [value]. Returns
+  /// `true` if the association existed, `false` otherwise.
   bool remove(Object key, V value);
 
-  /**
-   * Removes the association for the given [key]. Returns the collection of
-   * removed values, or an empty iterable if [key] was unmapped.
-   */
+  /// Removes the association for the given [key]. Returns the collection of
+  /// removed values, or an empty iterable if [key] was unmapped.
   Iterable<V> removeAll(Object key);
 
-  /**
-   * Removes all data from the multimap.
-   */
+  /// Removes all data from the multimap.
   void clear();
 
-  /**
-   * Applies [f] to each {key, Iterable<value>} pair of the multimap.
-   *
-   * It is an error to add or remove keys from the map during iteration.
-   */
+  /// Applies [f] to each {key, Iterable<value>} pair of the multimap.
+  ///
+  /// It is an error to add or remove keys from the map during iteration.
   void forEachKey(void f(K key, Iterable<V> value));
 
-  /**
-   * Applies [f] to each {key, value} pair of the multimap.
-   *
-   * It is an error to add or remove keys from the map during iteration.
-   */
+  /// Applies [f] to each {key, value} pair of the multimap.
+  ///
+  /// It is an error to add or remove keys from the map during iteration.
   void forEach(void f(K key, V value));
 
-  /**
-   * The keys of [this].
-   */
+  /// The keys of [this].
   Iterable<K> get keys;
 
-  /**
-   * The values of [this].
-   */
+  /// The values of [this].
   Iterable<V> get values;
 
-  /**
-   * Returns a view of this multimap as a map.
-   */
+  /// Returns a view of this multimap as a map.
   Map<K, Iterable<V>> asMap();
 
-  /**
-   * Returns a view of this multimap as a map.
-   *
-   * DEPRECATED: this method is replaced with `asMap`.
-   */
-  @Deprecated('Will be removed in 0.22.0')
-  Map<K, Iterable<V>> toMap();
-
-  /**
-   * The number of keys in the multimap.
-   */
+  /// The number of keys in the multimap.
   int get length;
 
-  /**
-   * Returns true if there is no key in the multimap.
-   */
+  /// Returns true if there is no key in the multimap.
   bool get isEmpty;
 
-  /**
-   * Returns true if there is at least one key in the multimap.
-   */
+  /// Returns true if there is at least one key in the multimap.
   bool get isNotEmpty;
 }
 
-/**
- * Abstract base class for multimap implementations.
- */
+/// Abstract base class for multimap implementations.
 abstract class _BaseMultimap<K, V, C extends Iterable<V>>
     implements Multimap<K, V> {
-  final Map<K, Iterable<V>> _map = new HashMap();
+  static T _id<T>(x) => x;
 
-  Iterable<V> _create();
+  _BaseMultimap();
+
+  /// Constructs a new multimap. For each element e of [iterable], adds an
+  /// association from [key](e) to [value](e). [key] and [value] each default
+  /// to the identity function.
+  _BaseMultimap.fromIterable(Iterable iterable,
+      {K key(element), V value(element)}) {
+    key ??= _id;
+    value ??= _id;
+    for (var element in iterable) {
+      add(key(element), value(element));
+    }
+  }
+
+  final Map<K, C> _map = new HashMap();
+
+  C _create();
   void _add(C iterable, V value);
   void _addAll(C iterable, Iterable<V> value);
   void _clear(C iterable);
@@ -169,16 +143,14 @@
     _addAll(_map[key], values);
   }
 
-  /**
-   * Adds all associations of [other] to this multimap.
-   *
-   * The operation is equivalent to doing `this[key] = value` for each key
-   * and associated value in other. It iterates over [other], which must
-   * therefore not change during the iteration.
-   *
-   * This implementation iterates through each key of [other] and adds the
-   * associated values to this instance via [addValues].
-   */
+  /// Adds all associations of [other] to this multimap.
+  ///
+  /// The operation is equivalent to doing `this[key] = value` for each key and
+  /// associated value in other. It iterates over [other], which must therefore
+  /// not change during the iteration.
+  ///
+  /// This implementation iterates through each key of [other] and adds the
+  /// associated values to this instance via [addValues].
   void addAll(Multimap<K, V> other) => other.forEachKey(addValues);
 
   bool remove(Object key, V value) {
@@ -196,7 +168,7 @@
       retValues.addAll(values);
       values.clear();
     }
-    return retValues;
+    return retValues as Iterable<V>;
   }
 
   void clear() {
@@ -204,7 +176,7 @@
     _map.clear();
   }
 
-  void forEachKey(void f(K key, Iterable<V> value)) => _map.forEach(f);
+  void forEachKey(void f(K key, C value)) => _map.forEach(f);
 
   void forEach(void f(K key, V value)) {
     _map.forEach((K key, Iterable<V> values) {
@@ -220,18 +192,25 @@
   bool get isNotEmpty => _map.isNotEmpty;
 }
 
-/**
- * A multimap implementation that uses [List]s to store the values associated
- * with each key.
- */
+/// A multimap implementation that uses [List]s to store the values associated
+/// with each key.
 class ListMultimap<K, V> extends _BaseMultimap<K, V, List<V>> {
-  ListMultimap() : super();
+  ListMultimap();
+
+  /// Constructs a new list-backed multimap. For each element e of [iterable],
+  /// adds an association from [key](e) to [value](e). [key] and [value] each
+  /// default to the identity function.
+  ListMultimap.fromIterable(Iterable iterable,
+      {K key(element), V value(element)})
+      : super.fromIterable(iterable, key: key, value: value);
+
   @override
   List<V> _create() => new List<V>();
   @override
   void _add(List<V> iterable, V value) {
     iterable.add(value);
   }
+
   @override
   void _addAll(List<V> iterable, Iterable<V> value) => iterable.addAll(value);
   @override
@@ -244,22 +223,27 @@
   List<V> operator [](Object key) => super[key];
   List<V> removeAll(Object key) => super.removeAll(key);
   Map<K, List<V>> asMap() => new _WrappedMap<K, V, List<V>>(this);
-  @Deprecated('Will be removed in 0.22.0')
-  Map<K, List<V>> toMap() => asMap();
 }
 
-/**
- * A multimap implementation that uses [Set]s to store the values associated
- * with each key.
- */
+/// A multimap implementation that uses [Set]s to store the values associated
+/// with each key.
 class SetMultimap<K, V> extends _BaseMultimap<K, V, Set<V>> {
-  SetMultimap() : super();
+  SetMultimap();
+
+  /// Constructs a new set-backed multimap. For each element e of [iterable],
+  /// adds an association from [key](e) to [value](e). [key] and [value] each
+  /// default to the identity function.
+  SetMultimap.fromIterable(Iterable iterable,
+      {K key(element), V value(element)})
+      : super.fromIterable(iterable, key: key, value: value);
+
   @override
   Set<V> _create() => new Set<V>();
   @override
   void _add(Set<V> iterable, V value) {
     iterable.add(value);
   }
+
   @override
   void _addAll(Set<V> iterable, Iterable<V> value) => iterable.addAll(value);
   @override
@@ -272,13 +256,9 @@
   Set<V> operator [](Object key) => super[key];
   Set<V> removeAll(Object key) => super.removeAll(key);
   Map<K, Set<V>> asMap() => new _WrappedMap<K, V, Set<V>>(this);
-  @Deprecated('Will be removed in 0.22.0')
-  Map<K, Set<V>> toMap() => asMap();
 }
 
-/**
- * A [Map] that delegates its operations to an underlying multimap.
- */
+/// A [Map] that delegates its operations to an underlying multimap.
 class _WrappedMap<K, V, C extends Iterable<V>> implements Map<K, C> {
   final _BaseMultimap<K, V, C> _multimap;
 
@@ -310,9 +290,7 @@
   Iterable<C> get values => _multimap._groupedValues;
 }
 
-/**
- * Iterable wrapper that syncs to an underlying map.
- */
+/// Iterable wrapper that syncs to an underlying map.
 class _WrappedIterable<K, V, C extends Iterable<V>> implements Iterable<V> {
   final K _key;
   final Map<K, C> _map;
@@ -322,14 +300,12 @@
 
   _addToMap() => _map[_key] = _delegate;
 
-  /**
-   * Ensures we hold an up-to-date delegate. In the case where all mappings for
-   * _key are removed from the multimap, the Iterable referenced by _delegate is
-   * removed from the underlying map. At that point, any new addition via the
-   * multimap triggers the creation of a new Iterable, and the empty delegate
-   * we hold would be stale. As such, we check the underlying map and update
-   * our delegate when the one we hold is empty.
-   */
+  /// Ensures we hold an up-to-date delegate. In the case where all mappings
+  /// for _key are removed from the multimap, the Iterable referenced by
+  /// _delegate is removed from the underlying map. At that point, any new
+  /// addition via the multimap triggers the creation of a new Iterable, and
+  /// the empty delegate we hold would be stale. As such, we check the
+  /// underlying map and update our delegate when the one we hold is empty.
   _syncDelegate() {
     if (_delegate.isEmpty) {
       var updated = _map[_key];
@@ -359,7 +335,7 @@
     return _delegate.every(test);
   }
 
-  Iterable expand(Iterable f(V element)) {
+  Iterable<T> expand<T>(Iterable<T> f(V element)) {
     _syncDelegate();
     return _delegate.expand(f);
   }
@@ -374,7 +350,7 @@
     return _delegate.firstWhere(test, orElse: orElse);
   }
 
-  fold(initialValue, combine(previousValue, V element)) {
+  T fold<T>(T initialValue, T combine(T previousValue, V element)) {
     _syncDelegate();
     return _delegate.fold(initialValue, combine);
   }
@@ -419,7 +395,7 @@
     return _delegate.length;
   }
 
-  Iterable map(f(V element)) {
+  Iterable<T> map<T>(T f(V element)) {
     _syncDelegate();
     return _delegate.map(f);
   }
@@ -482,7 +458,7 @@
 
 class _WrappedList<K, V> extends _WrappedIterable<K, V, List<V>>
     implements List<V> {
-  _WrappedList(Map<K, List<V>> map, K key, List<V> delegate)
+  _WrappedList(Map<K, Iterable<V>> map, K key, List<V> delegate)
       : super(map, key, delegate);
 
   V operator [](int index) => elementAt(index);
@@ -664,7 +640,7 @@
     return _delegate.containsAll(other);
   }
 
-  Set<V> difference(Set<V> other) {
+  Set<V> difference(Set<Object> other) {
     _syncDelegate();
     return _delegate.difference(other);
   }
diff --git a/packages/quiver/lib/src/collection/treeset.dart b/packages/quiver/lib/src/collection/treeset.dart
index 200c21f..6375a21 100644
--- a/packages/quiver/lib/src/collection/treeset.dart
+++ b/packages/quiver/lib/src/collection/treeset.dart
@@ -14,86 +14,59 @@
 
 part of quiver.collection;
 
-/**
- * A [Set] of items stored in a binary tree according to [comparator].
- * Supports bidirectional iteration.
- */
+/// A [Set] of items stored in a binary tree according to [comparator].
+/// Supports bidirectional iteration.
 abstract class TreeSet<V> extends IterableBase<V> implements Set<V> {
   final Comparator<V> comparator;
 
   int get length;
 
-  /**
-   * Create a new [TreeSet] with an ordering defined by [comparator] or the
-   * default `(a, b) => a.compareTo(b)`.
-   */
+  /// Create a new [TreeSet] with an ordering defined by [comparator] or the
+  /// default `(a, b) => a.compareTo(b)`.
   factory TreeSet({Comparator<V> comparator}) {
-    if (comparator == null) {
-      comparator = (a, b) => a.compareTo(b);
-    }
+    comparator ??= (a, b) => (a as dynamic).compareTo(b);
     return new AvlTreeSet(comparator: comparator);
   }
 
   TreeSet._(this.comparator);
 
-  /**
-   * Returns an [BidirectionalIterator] that iterates over this tree.
-   */
+  /// Returns an [BidirectionalIterator] that iterates over this tree.
   BidirectionalIterator<V> get iterator;
 
-  /**
-   * Returns an [BidirectionalIterator] that iterates over this tree, in reverse.
-   */
+  /// Returns an [BidirectionalIterator] that iterates over this tree, in
+  /// reverse.
   BidirectionalIterator<V> get reverseIterator;
 
-  /**
-   * Returns an [BidirectionalIterator] that starts at [anchor].
-   * By default, the iterator includes the anchor with the first movement;
-   * set [inclusive] to false if you want to exclude the anchor. Set [reversed]
-   * to true to change the direction of of moveNext and movePrevious.
-   *
-   * Note: This iterator allows you to walk the entire set. It does not present
-   * a subview.
-   */
+  /// Returns an [BidirectionalIterator] that starts at [anchor].  By default,
+  /// the iterator includes the anchor with the first movement; set [inclusive]
+  /// to false if you want to exclude the anchor. Set [reversed] to true to
+  /// change the direction of of moveNext and movePrevious.
+  ///
+  /// Note: This iterator allows you to walk the entire set. It does not
+  /// present a subview.
   BidirectionalIterator<V> fromIterator(V anchor,
       {bool reversed: false, bool inclusive: true});
 
-  /**
-   * Search the tree for the matching [object] or the [nearestOption]
-   * if missing.  See [TreeSearch].
-   */
+  /// Search the tree for the matching [object] or the [nearestOption]
+  /// if missing.  See [TreeSearch].
   V nearest(V object, {TreeSearch nearestOption: TreeSearch.NEAREST});
 
   // TODO: toString or not toString, that is the question.
 }
 
-/**
- * Controls the results for [TreeSet.searchNearest]()
- */
-class TreeSearch {
+/// Controls the results for [TreeSet.searchNearest]()
+enum TreeSearch {
+  /// If result not found, always chose the smaller element
+  LESS_THAN,
 
-  /**
-   * If result not found, always chose the smaler element
-   */
-  static const LESS_THAN = const TreeSearch._(1);
+  /// If result not found, chose the nearest based on comparison
+  NEAREST,
 
-  /**
-   * If result not found, chose the nearest based on comparison
-   */
-  static const NEAREST = const TreeSearch._(2);
-
-  /**
-   * If result not found, always chose the greater element
-   */
-  static const GREATER_THAN = const TreeSearch._(3);
-
-  final int _val;
-  const TreeSearch._(this._val);
+  /// If result not found, always chose the greater element
+  GREATER_THAN
 }
 
-/**
- * A node in the [TreeSet].
- */
+/// A node in the [TreeSet].
 abstract class _TreeNode<V> {
   _TreeNode<V> get left;
   _TreeNode<V> get right;
@@ -102,14 +75,10 @@
   _TreeNode<V> get parent;
   V object;
 
-  /**
-   * TreeNodes are always allocated as leafs.
-   */
+  /// TreeNodes are always allocated as leafs.
   _TreeNode({this.object});
 
-  /**
-   *  Return the minimum node for the subtree
-   */
+  /// Return the minimum node for the subtree
   _TreeNode<V> get minimumNode {
     var node = this;
     while (node.left != null) {
@@ -118,9 +87,7 @@
     return node;
   }
 
-  /**
-   *  Return the maximum node for the subtree
-   */
+  /// Return the maximum node for the subtree
   _TreeNode<V> get maximumNode {
     var node = this;
     while (node.right != null) {
@@ -129,9 +96,7 @@
     return node;
   }
 
-  /**
-   *  Return the next greatest element (or null)
-   */
+  /// Return the next greatest element (or null)
   _TreeNode<V> get successor {
     var node = this;
     if (node.right != null) {
@@ -143,30 +108,26 @@
     return node.parent;
   }
 
-  /**
-   *  Return the next smaller element (or null)
-   */
+  /// Return the next smaller element (or null)
   _TreeNode<V> get predecessor {
     var node = this;
     if (node.left != null) {
       return node.left.maximumNode;
     }
-    while (node.parent != null && node.parent._left == node) {
+    while (node.parent != null && node.parent.left == node) {
       node = node.parent;
     }
     return node.parent;
   }
 }
 
-/**
- * AVL implementation of a self-balancing binary tree. Optimized for lookup
- * operations.
- *
- * Notes: Adapted from "Introduction to Algorithms", second edition,
- *        by Thomas H. Cormen, Charles E. Leiserson,
- *           Ronald L. Rivest, Clifford Stein.
- *        chapter 13.2
- */
+/// AVL implementation of a self-balancing binary tree. Optimized for lookup
+/// operations.
+///
+/// Notes: Adapted from "Introduction to Algorithms", second edition,
+///        by Thomas H. Cormen, Charles E. Leiserson,
+///           Ronald L. Rivest, Clifford Stein.
+///        chapter 13.2
 class AvlTreeSet<V> extends TreeSet<V> {
   int _length = 0;
   AvlNode<V> _root;
@@ -177,9 +138,7 @@
 
   AvlTreeSet({Comparator<V> comparator}) : super._(comparator);
 
-  /**
-   * Add the element to the tree.
-   */
+  /// Add the element to the tree.
   bool add(V element) {
     if (_root == null) {
       AvlNode<V> node = new AvlNode<V>(object: element);
@@ -290,9 +249,7 @@
     return true;
   }
 
-  /**
-   * Test to see if an element is stored in the tree
-   */
+  /// Test to see if an element is stored in the tree
   AvlNode<V> _getNode(V element) {
     if (element == null) return null;
     AvlNode<V> x = _root;
@@ -311,20 +268,18 @@
     return null;
   }
 
-  /**
-   * This function will right rotate/pivot N with its left child, placing
-   * it on the right of its left child.
-   *
-   *      N                      Y
-   *     / \                    / \
-   *    Y   A                  Z   N
-   *   / \          ==>       / \ / \
-   *  Z   B                  D  CB   A
-   * / \
-   *D   C
-   *
-   * Assertion: must have a left element
-   */
+  /// This function will right rotate/pivot N with its left child, placing
+  /// it on the right of its left child.
+  ///
+  ///          N                      Y
+  ///         / \                    / \
+  ///        Y   A                  Z   N
+  ///       / \          ==>       / \ / \
+  ///      Z   B                  D  CB   A
+  ///     / \
+  ///    D   C
+  ///
+  /// Assertion: must have a left element
   void _rotateRight(AvlNode<V> node) {
     AvlNode<V> y = node.left;
     if (y == null) throw new AssertionError();
@@ -348,20 +303,18 @@
     node._parent = y;
   }
 
-  /**
-   * This function will left rotate/pivot N with its right child, placing
-   * it on the left of its right child.
-   *
-   *      N                      Y
-   *     / \                    / \
-   *    A   Y                  N   Z
-   *       / \      ==>       / \ / \
-   *      B   Z              A  BC   D
-   *         / \
-   *        C   D
-   *
-   * Assertion: must have a right element
-   */
+  /// This function will left rotate/pivot N with its right child, placing
+  /// it on the left of its right child.
+  ///
+  ///      N                      Y
+  ///     / \                    / \
+  ///    A   Y                  N   Z
+  ///       / \      ==>       / \ / \
+  ///      B   Z              A  BC   D
+  ///         / \
+  ///        C   D
+  ///
+  /// Assertion: must have a right element
   void _rotateLeft(AvlNode<V> node) {
     AvlNode<V> y = node.right;
     if (y == null) throw new AssertionError();
@@ -385,35 +338,31 @@
     node._parent = y;
   }
 
-  /**
-   *  This function will double rotate node with right/left operations.
-   *  node is S.
-   *
-   *    S                      G
-   *   / \                    / \
-   *  A   C                  S   C
-   *     / \      ==>       / \ / \
-   *    G   B              A  DC   B
-   *   / \
-   *  D   C
-   */
+  /// This function will double rotate node with right/left operations.
+  /// node is S.
+  ///
+  ///      S                      G
+  ///     / \                    / \
+  ///    A   C                  S   C
+  ///       / \      ==>       / \ / \
+  ///      G   B              A  DC   B
+  ///     / \
+  ///    D   C
   void _rotateRightLeft(AvlNode<V> node) {
     _rotateRight(node.right);
     _rotateLeft(node);
   }
 
-  /**
-   * This function will double rotate node with left/right operations.
-   * node is S.
-   *
-   *    S                      G
-   *   / \                    / \
-   *  C   A                  C   S
-   * / \          ==>       / \ / \
-   *B   G                  B  CD   A
-   *   / \
-   *  C   D
-   */
+  /// This function will double rotate node with left/right operations.
+  /// node is S.
+  ///
+  ///        S                      G
+  ///       / \                    / \
+  ///      C   A                  C   S
+  ///     / \          ==>       / \ / \
+  ///    B   G                  B  CD   A
+  ///       / \
+  ///      C   D
   void _rotateLeftRight(AvlNode<V> node) {
     _rotateLeft(node.left);
     _rotateRight(node);
@@ -441,7 +390,9 @@
   }
 
   bool remove(Object item) {
-    AvlNode<V> x = _getNode(item);
+    if (item is! V) return false;
+
+    AvlNode<V> x = _getNode(item as V);
     if (x != null) {
       _removeNode(x);
       return true;
@@ -617,22 +568,18 @@
     }
   }
 
-  /**
-   * See [Set.removeAll]
-   */
+  /// See [Set.removeAll]
   void removeAll(Iterable items) {
     for (var ele in items) {
       remove(ele);
     }
   }
 
-  /**
-   * See [Set.retainAll]
-   */
+  /// See [Set.retainAll]
   void retainAll(Iterable<Object> elements) {
-    List<V> chosen = [];
+    List<V> chosen = <V>[];
     for (var target in elements) {
-      if (contains(target)) {
+      if (target is V && contains(target)) {
         chosen.add(target);
       }
     }
@@ -640,9 +587,7 @@
     addAll(chosen);
   }
 
-  /**
-   * See [Set.retainWhere]
-   */
+  /// See [Set.retainWhere]
   void retainWhere(bool test(V element)) {
     List<V> chosen = [];
     for (var target in this) {
@@ -654,9 +599,7 @@
     addAll(chosen);
   }
 
-  /**
-   * See [Set.removeWhere]
-   */
+  /// See [Set.removeWhere]
   void removeWhere(bool test(V element)) {
     List<V> damned = [];
     for (var target in this) {
@@ -667,33 +610,27 @@
     removeAll(damned);
   }
 
-  /**
-   * See [IterableBase.first]
-   */
+  /// See [IterableBase.first]
   V get first {
     if (_root == null) return null;
     AvlNode<V> min = _root.minimumNode;
     return min != null ? min.object : null;
   }
 
-  /**
-   * See [IterableBase.last]
-   */
+  /// See [IterableBase.last]
   V get last {
     if (_root == null) return null;
     AvlNode<V> max = _root.maximumNode;
     return max != null ? max.object : null;
   }
 
-  /**
-   * See [Set.lookup]
-   */
+  /// See [Set.lookup]
   V lookup(Object element) {
-    if (element == null || _root == null) return null;
+    if (element is! V || _root == null) return null;
     AvlNode<V> x = _root;
     int compare = 0;
     while (x != null) {
-      compare = comparator(element, x.object);
+      compare = comparator(element as V, x.object);
       if (compare == 0) {
         return x.object;
       } else if (compare < 0) {
@@ -710,11 +647,9 @@
     return (found != null) ? found.object : null;
   }
 
-  /**
-   * Search the tree for the matching element, or the 'nearest' node.
-   * NOTE: [BinaryTree.comparator] needs to have finer granulatity than -1,0,1
-   * in order for this to return something that's meaningful.
-   */
+  /// Search the tree for the matching element, or the 'nearest' node.
+  /// NOTE: [BinaryTree.comparator] needs to have finer granulatity than -1,0,1
+  /// in order for this to return something that's meaningful.
   AvlNode<V> _searchNearest(V element,
       {TreeSearch option: TreeSearch.NEAREST}) {
     if (element == null || _root == null) {
@@ -758,28 +693,20 @@
   // [IterableBase]<V> Methods
   //
 
-  /**
-   * See [IterableBase.iterator]
-   */
+  /// See [IterableBase.iterator]
   BidirectionalIterator<V> get iterator => new _AvlTreeIterator._(this);
 
-  /**
-   * See [TreeSet.reverseIterator]
-   */
+  /// See [TreeSet.reverseIterator]
   BidirectionalIterator<V> get reverseIterator =>
       new _AvlTreeIterator._(this, reversed: true);
 
-  /**
-   * See [TreeSet.fromIterator]
-   */
+  /// See [TreeSet.fromIterator]
   BidirectionalIterator<V> fromIterator(V anchor,
           {bool reversed: false, bool inclusive: true}) =>
       new _AvlTreeIterator<V>._(this,
           anchorObject: anchor, reversed: reversed, inclusive: inclusive);
 
-  /**
-   * See [IterableBase.contains]
-   */
+  /// See [IterableBase.contains]
   bool contains(Object object) {
     AvlNode<V> x = _getNode(object as V);
     return x != null;
@@ -789,14 +716,12 @@
   // [Set] methods
   //
 
-  /**
-   * See [Set.intersection]
-   */
+  /// See [Set.intersection]
   Set<V> intersection(Set<Object> other) {
     TreeSet<V> set = new TreeSet(comparator: comparator);
 
-    // Opitimized for sorted sets
-    if (other is TreeSet) {
+    // Optimized for sorted sets
+    if (other is TreeSet<V>) {
       var i1 = iterator;
       var i2 = other.iterator;
       var hasMore1 = i1.moveNext();
@@ -825,9 +750,7 @@
     return set;
   }
 
-  /**
-   * See [Set.union]
-   */
+  /// See [Set.union]
   Set<V> union(Set<V> other) {
     TreeSet<V> set = new TreeSet(comparator: comparator);
 
@@ -860,15 +783,11 @@
     }
 
     // Non-optimized version.
-    return set
-      ..addAll(this)
-      ..addAll(other);
+    return set..addAll(this)..addAll(other);
   }
 
-  /**
-   * See [Set.difference]
-   */
-  Set<V> difference(Set<V> other) {
+  /// See [Set.difference]
+  Set<V> difference(Set<Object> other) {
     TreeSet<V> set = new TreeSet(comparator: comparator);
 
     if (other is TreeSet) {
@@ -905,21 +824,17 @@
     return set;
   }
 
-  /**
-   * Visible for testing only.
-   */
+  /// Visible for testing only.
   AvlNode<V> getNode(V object) => _getNode(object);
 }
 
 typedef bool _IteratorMove();
 
-/**
- * This iterator either starts at the beginning or end (see [TreeSet.iterator]
- * and [TreeSet.reverseIterator]) or from an anchor point in the set (see
- * [TreeSet.fromIterator]). When using fromIterator, the inital
- * anchor point is included in the first movement (either [moveNext] or
- * [movePrevious]) but can optionally be excluded in the constructor.
- */
+/// This iterator either starts at the beginning or end (see [TreeSet.iterator]
+/// and [TreeSet.reverseIterator]) or from an anchor point in the set (see
+/// [TreeSet.fromIterator]). When using fromIterator, the inital anchor point
+/// is included in the first movement (either [moveNext] or [movePrevious]) but
+/// can optionally be excluded in the constructor.
 class _AvlTreeIterator<V> implements BidirectionalIterator<V> {
   static const LEFT = -1;
   static const WALK = 0;
@@ -928,7 +843,7 @@
   final bool reversed;
   final AvlTreeSet<V> tree;
   final int _modCountGuard;
-  final Object anchorObject;
+  final V anchorObject;
   final bool inclusive;
 
   _IteratorMove _moveNext;
@@ -1028,13 +943,11 @@
   }
 }
 
-/**
- * Private class used to track element insertions in the [TreeSet].
- */
+/// Private class used to track element insertions in the [TreeSet].
 class AvlNode<V> extends _TreeNode<V> {
   AvlNode<V> _left;
   AvlNode<V> _right;
-  //TODO(codefu): Remove need for [parent]; this is just an implementation note
+  // TODO(codefu): Remove need for [parent]; this is just an implementation note
   AvlNode<V> _parent;
   int _balanceFactor = 0;
 
diff --git a/packages/quiver/lib/src/core/hash.dart b/packages/quiver/lib/src/core/hash.dart
index de5317c..1c0ce80 100644
--- a/packages/quiver/lib/src/core/hash.dart
+++ b/packages/quiver/lib/src/core/hash.dart
@@ -14,26 +14,18 @@
 
 part of quiver.core;
 
-/**
- * Generates a hash code for multiple [objects].
- */
+/// Generates a hash code for multiple [objects].
 int hashObjects(Iterable objects) =>
     _finish(objects.fold(0, (h, i) => _combine(h, i.hashCode)));
 
-/**
- * Generates a hash code for two objects.
- */
+/// Generates a hash code for two objects.
 int hash2(a, b) => _finish(_combine(_combine(0, a.hashCode), b.hashCode));
 
-/**
- * Generates a hash code for three objects.
- */
+/// Generates a hash code for three objects.
 int hash3(a, b, c) => _finish(
     _combine(_combine(_combine(0, a.hashCode), b.hashCode), c.hashCode));
 
-/**
- * Generates a hash code for four objects.
- */
+/// Generates a hash code for four objects.
 int hash4(a, b, c, d) => _finish(_combine(
     _combine(_combine(_combine(0, a.hashCode), b.hashCode), c.hashCode),
     d.hashCode));
diff --git a/packages/quiver/lib/src/core/optional.dart b/packages/quiver/lib/src/core/optional.dart
index 6802229..d7496cc 100644
--- a/packages/quiver/lib/src/core/optional.dart
+++ b/packages/quiver/lib/src/core/optional.dart
@@ -14,47 +14,35 @@
 
 part of quiver.core;
 
-/**
- * A value that might be absent.
- *
- * Use Optional as an alternative to allowing fields, parameters or return
- * values to be null. It signals that a value is not required and provides
- * convenience methods for dealing with the absent case.
- */
-class Optional<T> {
+/// A value that might be absent.
+///
+/// Use Optional as an alternative to allowing fields, parameters or return
+/// values to be null. It signals that a value is not required and provides
+/// convenience methods for dealing with the absent case.
+class Optional<T> extends IterableBase<T> {
   final T _value;
 
-  /**
-   * Constructs an empty Optional.
-   */
+  /// Constructs an empty Optional.
   const Optional.absent() : _value = null;
 
-  /**
-   * Constructs an Optional of the given [value].
-   *
-   * Throws [ArgumentError] if [value] is null.
-   */
+  /// Constructs an Optional of the given [value].
+  ///
+  /// Throws [ArgumentError] if [value] is null.
   Optional.of(T value) : this._value = value {
     if (this._value == null) throw new ArgumentError('Must not be null.');
   }
 
-  /**
-   * Constructs an Optional of the given [value].
-   *
-   * If [value] is null, returns [absent()].
-   */
+  /// Constructs an Optional of the given [value].
+  ///
+  /// If [value] is null, returns [absent()].
   const Optional.fromNullable(T value) : this._value = value;
 
-  /**
-   * Whether the Optional contains a value.
-   */
+  /// Whether the Optional contains a value.
   bool get isPresent => _value != null;
 
-  /**
-   * Gets the Optional value.
-   *
-   * Throws [StateError] if [value] is null.
-   */
+  /// Gets the Optional value.
+  ///
+  /// Throws [StateError] if [value] is null.
   T get value {
     if (this._value == null) {
       throw new StateError('value called on absent Optional.');
@@ -62,31 +50,25 @@
     return _value;
   }
 
-  /**
-   * Executes a function if the Optional value is present.
-   */
+  /// Executes a function if the Optional value is present.
   void ifPresent(void ifPresent(T value)) {
     if (isPresent) {
       ifPresent(_value);
     }
   }
 
-  /**
-   * Execution a function if the Optional value is absent.
-   */
+  /// Execution a function if the Optional value is absent.
   void ifAbsent(void ifAbsent()) {
     if (!isPresent) {
       ifAbsent();
     }
   }
 
-  /**
-   * Gets the Optional value with a default.
-   *
-   * The default is returned if the Optional is [absent()].
-   *
-   * Throws [ArgumentError] if [defaultValue] is null.
-   */
+  /// Gets the Optional value with a default.
+  ///
+  /// The default is returned if the Optional is [absent()].
+  ///
+  /// Throws [ArgumentError] if [defaultValue] is null.
   T or(T defaultValue) {
     if (defaultValue == null) {
       throw new ArgumentError('defaultValue must not be null.');
@@ -94,32 +76,28 @@
     return _value == null ? defaultValue : _value;
   }
 
-  /**
-   * Gets the Optional value, or [null] if there is none.
-   */
+  /// Gets the Optional value, or [null] if there is none.
   T get orNull => _value;
 
-  /**
-   * Transforms the Optional value.
-   *
-   * If the Optional is [absent()], returns [absent()] without applying the transformer.
-   *
-   * The transformer must not return [null]. If it does, an [ArgumentError] is thrown.
-   */
-  Optional transform(dynamic transformer(T value)) {
+  /// Transforms the Optional value.
+  ///
+  /// If the Optional is [absent()], returns [absent()] without applying the transformer.
+  ///
+  /// The transformer must not return [null]. If it does, an [ArgumentError] is thrown.
+  Optional<S> transform<S>(S transformer(T value)) {
     return _value == null
         ? new Optional.absent()
         : new Optional.of(transformer(_value));
   }
 
-  /**
-   * Delegates to the underlying [value] hashCode.
-   */
+  @override
+  Iterator<T> get iterator =>
+      isPresent ? <T>[_value].iterator : new Iterable<T>.empty().iterator;
+
+  /// Delegates to the underlying [value] hashCode.
   int get hashCode => _value.hashCode;
 
-  /**
-   * Delegates to the underlying [value] operator==.
-   */
+  /// Delegates to the underlying [value] operator==.
   bool operator ==(o) => o is Optional && o._value == _value;
 
   String toString() {
diff --git a/packages/quiver/lib/src/iterables/concat.dart b/packages/quiver/lib/src/iterables/concat.dart
index b4ab751..66d99c8 100644
--- a/packages/quiver/lib/src/iterables/concat.dart
+++ b/packages/quiver/lib/src/iterables/concat.dart
@@ -14,9 +14,8 @@
 
 part of quiver.iterables;
 
-/**
- * Returns the concatentation of the input iterables.
- *
- * The returned iterable is a lazily-evaluated view on the input iterables.
- */
-Iterable concat(Iterable<Iterable> iterables) => iterables.expand((x) => x);
+/// Returns the concatentation of the input iterables.
+///
+/// The returned iterable is a lazily-evaluated view on the input iterables.
+Iterable<T>
+    concat<T>(Iterable<Iterable<T>> iterables) => iterables.expand((x) => x);
diff --git a/packages/quiver/lib/src/iterables/count.dart b/packages/quiver/lib/src/iterables/count.dart
index 66e949a..87dbfea 100644
--- a/packages/quiver/lib/src/iterables/count.dart
+++ b/packages/quiver/lib/src/iterables/count.dart
@@ -14,10 +14,8 @@
 
 part of quiver.iterables;
 
-/**
- * Returns an infinite [Iterable] of [num]s, starting from [start] and
- * increasing by [step].
- */
+/// Returns an infinite [Iterable] of [num]s, starting from [start] and
+/// increasing by [step].
 Iterable<num> count([num start = 0, num step = 1]) => new _Count(start, step);
 
 class _Count extends InfiniteIterable<num> {
diff --git a/packages/quiver/lib/src/iterables/cycle.dart b/packages/quiver/lib/src/iterables/cycle.dart
index 5cf3b12..9b6fe0e 100644
--- a/packages/quiver/lib/src/iterables/cycle.dart
+++ b/packages/quiver/lib/src/iterables/cycle.dart
@@ -14,11 +14,9 @@
 
 part of quiver.iterables;
 
-/**
- * Returns an [Iterable] that infinitely cycles through the elements of
- * [iterable]. If [iterable] is empty, the returned Iterable will also be empty.
- */
-Iterable cycle(Iterable iterable) => new _Cycle(iterable);
+/// Returns an [Iterable] that infinitely cycles through the elements of
+/// [iterable]. If [iterable] is empty, the returned Iterable will also be empty.
+Iterable<T> cycle<T>(Iterable<T> iterable) => new _Cycle<T>(iterable);
 
 class _Cycle<T> extends InfiniteIterable<T> {
   final Iterable<T> _iterable;
@@ -38,7 +36,7 @@
   final Iterable<T> _iterable;
   Iterator<T> _iterator;
 
-  _CycleIterator(_iterable)
+  _CycleIterator(Iterable<T> _iterable)
       : _iterable = _iterable,
         _iterator = _iterable.iterator;
 
diff --git a/packages/quiver/lib/src/iterables/enumerate.dart b/packages/quiver/lib/src/iterables/enumerate.dart
index 72a02a9..2d940b8 100644
--- a/packages/quiver/lib/src/iterables/enumerate.dart
+++ b/packages/quiver/lib/src/iterables/enumerate.dart
@@ -14,12 +14,10 @@
 
 part of quiver.iterables;
 
-/**
- * Returns an [Iterable] of [IndexedValue]s where the nth value holds the nth
- * element of [iterable] and its index.
- */
-Iterable<IndexedValue> enumerate(Iterable iterable) =>
-    new EnumerateIterable(iterable);
+/// Returns an [Iterable] of [IndexedValue]s where the nth value holds the nth
+/// element of [iterable] and its index.
+Iterable<IndexedValue<E>>
+    enumerate<E>(Iterable<E> iterable) => new EnumerateIterable<E>(iterable);
 
 class IndexedValue<V> {
   final int index;
@@ -32,10 +30,8 @@
   String toString() => '($index, $value)';
 }
 
-/**
- * An [Iterable] of [IndexedValue]s where the nth value holds the nth
- * element of [iterable] and its index. See [enumerate].
- */
+/// An [Iterable] of [IndexedValue]s where the nth value holds the nth
+/// element of [iterable] and its index. See [enumerate].
 // This was inspired by MappedIterable internal to Dart collections.
 class EnumerateIterable<V> extends IterableBase<IndexedValue<V>> {
   final Iterable<V> _iterable;
@@ -57,7 +53,7 @@
       new IndexedValue<V>(index, _iterable.elementAt(index));
 }
 
-/** The [Iterator] returned by [EnumerateIterable.iterator]. */
+/// The [Iterator] returned by [EnumerateIterable.iterator].
 class EnumerateIterator<V> extends Iterator<IndexedValue<V>> {
   final Iterator<V> _iterator;
   int _index = 0;
diff --git a/packages/quiver/lib/src/iterables/generating_iterable.dart b/packages/quiver/lib/src/iterables/generating_iterable.dart
index d11d198..7db7097 100644
--- a/packages/quiver/lib/src/iterables/generating_iterable.dart
+++ b/packages/quiver/lib/src/iterables/generating_iterable.dart
@@ -14,55 +14,51 @@
 
 part of quiver.iterables;
 
+typedef T _Initial<T>();
+typedef T _Next<T>(T value);
+
 Iterable generate(initial(), next(o)) => new GeneratingIterable(initial, next);
 
-/**
- * An Iterable who's first value is [object] and who's subsequent values are
- * generated by passing the current value to the [next] function.
- *
- * The class is useful for creating lazy iterables from object hierarchies and
- * graphs.
- *
- * It's important that for the given initial value and next function that the
- * sequence of items eventually terminates. Otherwise calling methods that
- * expect a finite sequence, like `length` or `last`, will cause an infinite
- * loop.
- *
- * Example:
- *
- *     class Node {
- *       Node parent;
- *
- *       /**
- *        * An iterable of node and all ancestors up to the root.
- *        */
- *       Iterable<Node> ancestors =
- *           new GeneratingIterable<Node>(() => this, (n) => n.parent);
- *
- *       /**
- *        * An iterable of the root and the path of nodes to this. The reverse
- *        * of ancestors.
- *        */
- *       Iterable<Node> path = ancestors.toList().reversed();
- *     }
- *
- */
+/// An Iterable who's first value is [object] and who's subsequent values are
+/// generated by passing the current value to the [next] function.
+///
+/// The class is useful for creating lazy iterables from object hierarchies and
+/// graphs.
+///
+/// It's important that for the given initial value and next function that the
+/// sequence of items eventually terminates. Otherwise calling methods that
+/// expect a finite sequence, like `length` or `last`, will cause an infinite
+/// loop.
+///
+/// Example:
+///
+///     class Node {
+///       Node parent;
+///
+///       /// An iterable of node and all ancestors up to the root.
+///       Iterable<Node> ancestors =
+///           new GeneratingIterable<Node>(() => this, (n) => n.parent);
+///
+///       /// An iterable of the root and the path of nodes to this. The
+///       /// reverse of ancestors.
+///       Iterable<Node> path = ancestors.toList().reversed();
+///     }
 class GeneratingIterable<T> extends IterableBase<T> {
-  final initial;
-  final next;
+  final _Initial<T> initial;
+  final _Next<T> next;
 
-  GeneratingIterable(T this.initial(), T this.next(T o));
+  GeneratingIterable(this.initial, this.next);
 
   @override
   Iterator<T> get iterator => new _GeneratingIterator(initial(), next);
 }
 
 class _GeneratingIterator<T> implements Iterator<T> {
-  final next;
+  final _Next<T> next;
   T object;
   bool started = false;
 
-  _GeneratingIterator(T this.object, T this.next(T o));
+  _GeneratingIterator(T this.object, this.next);
 
   @override
   T get current => started ? object : null;
diff --git a/packages/quiver/lib/src/iterables/infinite_iterable.dart b/packages/quiver/lib/src/iterables/infinite_iterable.dart
index cfe0bd2..2a7eb9c 100644
--- a/packages/quiver/lib/src/iterables/infinite_iterable.dart
+++ b/packages/quiver/lib/src/iterables/infinite_iterable.dart
@@ -14,10 +14,9 @@
 
 part of quiver.iterables;
 
-/**
- * A base class for [Iterable]s of infinite length that throws
- * [UnsupportedError] for methods that would require the Iterable to terminate.
- */
+/// A base class for [Iterable]s of infinite length that throws
+/// [UnsupportedError] for methods that would require the Iterable to
+/// terminate.
 abstract class InfiniteIterable<T> extends IterableBase<T> {
   bool get isEmpty => false;
 
@@ -31,7 +30,7 @@
 
   bool every(bool f(T element)) => throw new UnsupportedError('every');
 
-  bool fold(initialValue, combine(previousValue, T element)) =>
+  T1 fold<T1>(T1 initialValue, T1 combine(T1 previousValue, T element)) =>
       throw new UnsupportedError('fold');
 
   void forEach(void f(T element)) => throw new UnsupportedError('forEach');
diff --git a/packages/quiver/lib/src/iterables/merge.dart b/packages/quiver/lib/src/iterables/merge.dart
index 53441e1..99466e3 100644
--- a/packages/quiver/lib/src/iterables/merge.dart
+++ b/packages/quiver/lib/src/iterables/merge.dart
@@ -14,18 +14,16 @@
 
 part of quiver.iterables;
 
-/**
- * Returns the result of merging an [Iterable] of [Iterable]s, according to
- * the order specified by the [compare] function. This function assumes the
- * provided iterables are already sorted according to the provided [compare]
- * function. It will not check for this condition or sort the iterables.
- *
- * The compare function must act as a [Comparator]. If [compare] is omitted,
- * [Comparable.compare] is used.
- *
- * If any of the [iterables] contain null elements, an exception will be
- * thrown.
- */
+/// Returns the result of merging an [Iterable] of [Iterable]s, according to
+/// the order specified by the [compare] function. This function assumes the
+/// provided iterables are already sorted according to the provided [compare]
+/// function. It will not check for this condition or sort the iterables.
+///
+/// The compare function must act as a [Comparator]. If [compare] is omitted,
+/// [Comparable.compare] is used.
+///
+/// If any of the [iterables] contain null elements, an exception will be
+/// thrown.
 Iterable merge(Iterable<Iterable> iterables,
         [Comparator compare = Comparable.compare]) =>
     (iterables.isEmpty) ? const [] : new _Merge(iterables, compare);
diff --git a/packages/quiver/lib/src/iterables/min_max.dart b/packages/quiver/lib/src/iterables/min_max.dart
index c1e3069..b151ca0 100644
--- a/packages/quiver/lib/src/iterables/min_max.dart
+++ b/packages/quiver/lib/src/iterables/min_max.dart
@@ -14,41 +14,35 @@
 
 part of quiver.iterables;
 
-/**
- * Returns the maximum value in [i], according to the order specified by the
- * [compare] function, or `null` if [i] is empty.
- *
- * The compare function must act as a [Comparator]. If [compare] is omitted,
- * [Comparable.compare] is used. If [i] contains null elements, an exception
- * will be thrown.
- *
- */
+/// Returns the maximum value in [i], according to the order specified by the
+/// [compare] function, or `null` if [i] is empty.
+///
+/// The compare function must act as a [Comparator]. If [compare] is omitted,
+/// [Comparable.compare] is used. If [i] contains null elements, an exception
+/// will be thrown.
 dynamic max(Iterable i, [Comparator compare = Comparable.compare]) =>
     i.isEmpty ? null : i.reduce((a, b) => compare(a, b) > 0 ? a : b);
 
-/**
- * Returns the minimum value in [i], according to the order specified by the
- * [compare] function, or `null` if [i] is empty.
- *
- * The compare function must act as a [Comparator]. If [compare] is omitted,
- * [Comparable.compare] is used. If [i] contains null elements, an exception
- * will be thrown.
- */
+/// Returns the minimum value in [i], according to the order specified by the
+/// [compare] function, or `null` if [i] is empty.
+///
+/// The compare function must act as a [Comparator]. If [compare] is omitted,
+/// [Comparable.compare] is used. If [i] contains null elements, an exception
+/// will be thrown.
 dynamic min(Iterable i, [Comparator compare = Comparable.compare]) =>
     i.isEmpty ? null : i.reduce((a, b) => compare(a, b) < 0 ? a : b);
 
-/**
- * Returns the minimum and maximum values in [i], according to the order
- * specified by the [compare] function, in an [Extent] instance. Always returns
- * an [Extent], but [Extent.min] and [Extent.max] may be `null` if [i] is empty.
- *
- * The compare function must act as a [Comparator]. If [compare] is omitted,
- * [Comparable.compare] is used. If [i] contains null elements, an exception
- * will be thrown.
- *
- * If [i] is empty, an [Extent] is returned with [:null:] values for [:min:] and
- * [:max:], since there are no valid values for them.
- */
+/// Returns the minimum and maximum values in [i], according to the order
+/// specified by the [compare] function, in an [Extent] instance. Always
+/// returns an [Extent], but [Extent.min] and [Extent.max] may be `null` if [i]
+/// is empty.
+///
+/// The compare function must act as a [Comparator]. If [compare] is omitted,
+/// [Comparable.compare] is used. If [i] contains null elements, an exception
+/// will be thrown.
+///
+/// If [i] is empty, an [Extent] is returned with [:null:] values for [:min:]
+/// and [:max:], since there are no valid values for them.
 Extent extent(Iterable i, [Comparator compare = Comparable.compare]) {
   var iterator = i.iterator;
   var hasNext = iterator.moveNext();
diff --git a/packages/quiver/lib/src/iterables/partition.dart b/packages/quiver/lib/src/iterables/partition.dart
index cb96443..e9fb818 100644
--- a/packages/quiver/lib/src/iterables/partition.dart
+++ b/packages/quiver/lib/src/iterables/partition.dart
@@ -14,9 +14,7 @@
 
 part of quiver.iterables;
 
-/**
- * Partitions the input iterable into lists of the specified size.
- */
+/// Partitions the input iterable into lists of the specified size.
 Iterable<List> partition(Iterable iterable, int size) {
   return iterable.isEmpty ? [] : new _Partition(iterable, size);
 }
diff --git a/packages/quiver/lib/src/iterables/range.dart b/packages/quiver/lib/src/iterables/range.dart
index c707748..1f3baa9 100644
--- a/packages/quiver/lib/src/iterables/range.dart
+++ b/packages/quiver/lib/src/iterables/range.dart
@@ -14,18 +14,17 @@
 
 part of quiver.iterables;
 
-/**
- * Returns an [Iterable] sequence of [num]s.
- *
- * If only one argument is provided, [start_or_stop] is the upper bound for the
- * sequence. If two or more arguments are provided, [stop] is the upper bound.
- *
- * The sequence starts at 0 if one argument is provided, or [start_or_stop] if
- * two or more arguments are provided. The sequence increments by 1, or [step]
- * if provided. [step] can be negative, in which case the sequence counts down
- * from the starting point and [stop] must be less than the starting point so
- * that it becomes the lower bound.
- */
+/// Returns an [Iterable] sequence of [num]s.
+///
+/// If only one argument is provided, [start_or_stop] is the upper bound for
+/// the sequence. If two or more arguments are provided, [stop] is the upper
+/// bound.
+///
+/// The sequence starts at 0 if one argument is provided, or [start_or_stop] if
+/// two or more arguments are provided. The sequence increments by 1, or [step]
+/// if provided. [step] can be negative, in which case the sequence counts down
+/// from the starting point and [stop] must be less than the starting point so
+/// that it becomes the lower bound.
 Iterable<num> range(num start_or_stop, [num stop, num step]) =>
     new _Range(start_or_stop, stop, step);
 
diff --git a/packages/quiver/lib/src/iterables/zip.dart b/packages/quiver/lib/src/iterables/zip.dart
index 69d397e..2d17d87 100644
--- a/packages/quiver/lib/src/iterables/zip.dart
+++ b/packages/quiver/lib/src/iterables/zip.dart
@@ -14,12 +14,10 @@
 
 part of quiver.iterables;
 
-/**
- * Returns an [Iterable] of [List]s where the nth element in the returned
- * iterable contains the nth element from every Iterable in [iterables]. The
- * returned Iterable is as long as the shortest Iterable in the argument. If
- * [iterables] is empty, it returns an empty list.
- */
+/// Returns an [Iterable] of [List]s where the nth element in the returned
+/// iterable contains the nth element from every Iterable in [iterables]. The
+/// returned Iterable is as long as the shortest Iterable in the argument. If
+/// [iterables] is empty, it returns an empty list.
 Iterable<List> zip(Iterable<Iterable> iterables) =>
     (iterables.isEmpty) ? const [] : new _Zip(iterables);
 
diff --git a/packages/quiver/lib/src/pattern/glob.dart b/packages/quiver/lib/src/pattern/glob.dart
index d855227..5413ae1 100644
--- a/packages/quiver/lib/src/pattern/glob.dart
+++ b/packages/quiver/lib/src/pattern/glob.dart
@@ -16,17 +16,15 @@
 
 // TODO(justin): add more detailed documentation and explain how matching
 // differs or is similar to globs in Python and various shells.
-/**
- * A [Pattern] that matches against filesystem path-like strings with
- * wildcards.
- *
- * The pattern matches strings as follows:
- *   * The whole string must match, not a substring
- *   * Any non wildcard is matched as a literal
- *   * '*' matches one or more characters except '/'
- *   * '?' matches exactly one character except '/'
- *   * '**' matches one or more characters including '/'
- */
+/// A [Pattern] that matches against filesystem path-like strings with
+/// wildcards.
+///
+/// The pattern matches strings as follows:
+///   * The whole string must match, not a substring
+///   * Any non wildcard is matched as a literal
+///   * '*' matches one or more characters except '/'
+///   * '?' matches exactly one character except '/'
+///   * '**' matches one or more characters including '/'
 class Glob implements Pattern {
   final RegExp regex;
   final String pattern;
diff --git a/packages/quiver/lib/src/streams/collect.dart b/packages/quiver/lib/src/streams/collect.dart
deleted file mode 100644
index 0b7719e..0000000
--- a/packages/quiver/lib/src/streams/collect.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.streams;
-
-/**
- * Returns a stream of completion events for the input [futures].
- *
- * Successfully completed futures yield data events, while futures completed
- * with errors yield error events.
- *
- * The iterator obtained from [futures] is only advanced once the previous
- * future completes and yields an event.  Thus, lazily creating the futures is
- * supported, for example:
- *
- *     collect(files.map((file) => file.readAsString()));
- *
- * If you need to modify [futures], or a backing collection thereof, before the
- * returned stream is done, pass a copy instead to avoid a
- * [ConcurrentModificationError]:
- *
- *     collect(files.toList().map((file) => file.readAsString()));
- *
- */
-Stream collect(Iterable futures) =>
-    new Stream.fromIterable(futures).asyncMap((f) => f);
diff --git a/packages/quiver/lib/src/time/clock.dart b/packages/quiver/lib/src/time/clock.dart
index dcc8a2c..f9879be 100644
--- a/packages/quiver/lib/src/time/clock.dart
+++ b/packages/quiver/lib/src/time/clock.dart
@@ -22,11 +22,26 @@
 
 /// Days in a month. This array uses 1-based month numbers, i.e. January is
 /// the 1-st element in the array, not the 0-th.
-const _DAYS_IN_MONTH =
-    const [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
+const _DAYS_IN_MONTH = const [
+  0,
+  31,
+  28,
+  31,
+  30,
+  31,
+  30,
+  31,
+  31,
+  30,
+  31,
+  30,
+  31
+];
 
-int _daysInMonth(int year, int month) => (month == DateTime.FEBRUARY &&
-    _isLeapYear(year)) ? 29 : _DAYS_IN_MONTH[month];
+int _daysInMonth(int year, int month) =>
+    (month == DateTime.FEBRUARY && _isLeapYear(year))
+        ? 29
+        : _DAYS_IN_MONTH[month];
 
 bool _isLeapYear(int year) =>
     (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
@@ -83,8 +98,14 @@
   /// Returns the point in time that's given amount of time ago. The
   /// amount of time is the sum of individual parts. Parts are compatible with
   /// ones defined in [Duration].
-  DateTime ago({int days: 0, int hours: 0, int minutes: 0, int seconds: 0,
-      int milliseconds: 0, int microseconds: 0}) => agoBy(new Duration(
+  DateTime ago(
+          {int days: 0,
+          int hours: 0,
+          int minutes: 0,
+          int seconds: 0,
+          int milliseconds: 0,
+          int microseconds: 0}) =>
+      agoBy(new Duration(
           days: days,
           hours: hours,
           minutes: minutes,
@@ -95,8 +116,14 @@
   /// Returns the point in time that's given amount of time from now. The
   /// amount of time is the sum of individual parts. Parts are compatible with
   /// ones defined in [Duration].
-  DateTime fromNow({int days: 0, int hours: 0, int minutes: 0, int seconds: 0,
-      int milliseconds: 0, int microseconds: 0}) => fromNowBy(new Duration(
+  DateTime fromNow(
+          {int days: 0,
+          int hours: 0,
+          int minutes: 0,
+          int seconds: 0,
+          int milliseconds: 0,
+          int microseconds: 0}) =>
+      fromNowBy(new Duration(
           days: days,
           hours: hours,
           minutes: minutes,
diff --git a/packages/quiver/lib/streams.dart b/packages/quiver/lib/streams.dart
deleted file mode 100644
index 0480a29..0000000
--- a/packages/quiver/lib/streams.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.streams;
-
-import 'dart:async';
-import 'package:quiver/iterables.dart' show IndexedValue;
-
-part 'src/streams/collect.dart';
-part 'src/streams/concat.dart';
-part 'src/streams/enumerate.dart';
-part 'src/streams/streambuffer.dart';
diff --git a/packages/quiver/lib/strings.dart b/packages/quiver/lib/strings.dart
index 013ba3a..858ab35 100644
--- a/packages/quiver/lib/strings.dart
+++ b/packages/quiver/lib/strings.dart
@@ -14,21 +14,18 @@
 
 library quiver.strings;
 
-/**
- * Returns [true] if [s] is either null, empty or is solely made of whitespace
- * characters (as defined by [String.trim]).
- */
+/// Returns [true] if [s] is either null, empty or is solely made of whitespace
+/// characters (as defined by [String.trim]).
 bool isBlank(String s) => s == null || s.trim().isEmpty;
 
-/**
- * Returns [true] if [s] is either null or empty.
- */
+/// Returns [true] if [s] is either null or empty.
 bool isEmpty(String s) => s == null || s.isEmpty;
 
-/**
- * Returns a string with characters from the given [s] in reverse order.
- */
-String flip(String s) {
+/// Returns [true] if [s] is a not empty string.
+bool isNotEmpty(String s) => s != null && s.isNotEmpty;
+
+/// Returns a string with characters from the given [s] in reverse order.
+String reverse(String s) {
   if (s == null || s == '') return s;
   StringBuffer sb = new StringBuffer();
   var runes = s.runes;
@@ -38,62 +35,57 @@
   return sb.toString();
 }
 
-/**
- * If [s] is [null] returns empty string, otherwise returns [s] as is.
- */
-String nullToEmpty(String s) => s == null ? '' : s;
+/// Returns a string with characters from the given [s] in reverse order.
+///
+/// DEPRECATED: use [reverse] instead.
+@deprecated
+String flip(String s) => reverse(s);
 
-/**
- * If [s] is an empty string returns [null], otherwise returns [s] as is.
- */
-String emptyToNull(String s) => s == '' ? null : s;
-
-/**
- * Concatenates [s] to itself a given number of [times]. Empty and null
- * strings will always result in empty and null strings respectively no matter
- * how many [times] they are [repeat]ed.
- *
- * If [times] is negative, returns the [flip]ped string repeated given number
- * of [times].
- */
+/// Concatenates [s] to itself a given number of [times]. Empty and null
+/// strings will always result in empty and null strings respectively no matter
+/// how many [times] they are [repeat]ed.
+///
+/// If [times] is negative, returns the reversed string repeated given number
+/// of [times].
+///
+/// DEPRECATED: use the `*` operator on [String].
+@deprecated
 String repeat(String s, int times) {
   if (s == null || s == '') return s;
   if (times < 0) {
-    return repeat(flip(s), -times);
+    return repeat(reverse(s), -times);
   }
   StringBuffer sink = new StringBuffer();
   _repeat(sink, s, times);
   return sink.toString();
 }
 
-/**
- * Loops over [s] and returns traversed characters. Takes arbitrary [from] and
- * [to] indices. Works as a substitute for [String.substring], except it never
- * throws [RangeError]. Supports negative indices. Think of an index as a
- * coordinate in an infinite in both directions vector filled with repeating
- * string [s], whose 0-th coordinate coincides with the 0-th character in [s].
- * Then [loop] returns the sub-vector defined by the interval ([from], [to]).
- * [from] is inclusive. [to] is exclusive.
- *
- * This method throws exceptions on [null] and empty strings.
- *
- * If [to] is omitted or is [null] the traversing ends at the end of the loop.
- *
- * If [to] < [from], traverses [s] in the opposite direction.
- *
- * For example:
- *
- * loop('Hello, World!', 7) == 'World!'
- * loop('ab', 0, 6) == 'ababab'
- * loop('test.txt', -3) == 'txt'
- * loop('ldwor', -3, 2) == 'world'
- */
+/// Loops over [s] and returns traversed characters. Takes arbitrary [from] and
+/// [to] indices. Works as a substitute for [String.substring], except it never
+/// throws [RangeError]. Supports negative indices. Think of an index as a
+/// coordinate in an infinite in both directions vector filled with repeating
+/// string [s], whose 0-th coordinate coincides with the 0-th character in [s].
+/// Then [loop] returns the sub-vector defined by the interval ([from], [to]).
+/// [from] is inclusive. [to] is exclusive.
+///
+/// This method throws exceptions on [null] and empty strings.
+///
+/// If [to] is omitted or is [null] the traversing ends at the end of the loop.
+///
+/// If [to] < [from], traverses [s] in the opposite direction.
+///
+/// For example:
+///
+/// loop('Hello, World!', 7) == 'World!'
+/// loop('ab', 0, 6) == 'ababab'
+/// loop('test.txt', -3) == 'txt'
+/// loop('ldwor', -3, 2) == 'world'
 String loop(String s, int from, [int to]) {
   if (s == null || s == '') {
     throw new ArgumentError('Input string cannot be null or empty');
   }
   if (to != null && to < from) {
-    return loop(flip(s), -from, -to);
+    return loop(reverse(s), -from, -to);
   }
   int len = s.length;
   int leftFrag = from >= 0 ? from ~/ len : ((from - len) ~/ len);
@@ -117,90 +109,18 @@
   }
 }
 
-/**
- * Returns a [String] of length [width] padded on the left with characters from
- * [fill] if `input.length` is less than [width]. [fill] is repeated if
- * neccessary to pad.
- *
- * Returns [input] if `input.length` is equal to or greater than width. [input]
- * can be `null` and is treated as an empty string.
- */
-@Deprecated('Will be removed in 0.22.0')
-String padLeft(String input, int width, String fill) {
-  if (fill == null || fill.length == 0) {
-    throw new ArgumentError('fill cannot be null or empty');
-  }
-  if (input == null || input.length == 0) return loop(fill, 0, width);
-  if (input.length >= width) return input;
-  return loop(fill, 0, width - input.length) + input;
-}
+/// Returns `true` if [rune] represents a digit.
+///
+/// The definition of digit matches the Unicode `0x3?` range of Western
+/// European digits.
+bool isDigit(int rune) => rune ^ 0x30 <= 9;
 
-/**
- * Returns a [String] of length [width] padded on the right with characters from
- * [fill] if `input.length` is less than [width]. Characters are selected from
- * [fill] starting at the end, so that the last character in [fill] is the last
- * character in the result. [fill] is repeated if neccessary to pad.
- *
- * Returns [input] if `input.length` is equal to or greater than width. [input]
- * can be `null` and is treated as an empty string.
- */
-@Deprecated('Will be removed in 0.22.0')
-String padRight(String input, int width, String fill) {
-  if (fill == null || fill.length == 0) {
-    throw new ArgumentError('fill cannot be null or empty');
-  }
-  if (input == null || input.length == 0) {
-    return loop(fill, -width, 0);
-  }
-  if (input.length >= width) return input;
-  return input + loop(fill, input.length - width, 0);
-}
-
-/**
- * Removes leading whitespace from a string.
- *
- * Whitespace is defined to be the same as [String.trim].
- */
-@Deprecated('Will be removed in 0.22.0')
-String trimLeft(String input) {
-  int i = 0;
-  for (var rune in input.runes) {
-    if (isWhitespace(rune)) {
-      i++;
-    } else {
-      break;
-    }
-  }
-  return input.substring(i);
-}
-
-/**
- * Removes trailing whitespace from a string.
- *
- * Whitespace is defined to be the same as [String.trim].
- */
-@Deprecated('Will be removed in 0.22.0')
-String trimRight(String input) {
-  int i = 0;
-  int lastNonWhitespace = -1;
-  for (var rune in input.runes) {
-    i++;
-    if (!isWhitespace(rune)) {
-      lastNonWhitespace = i;
-    }
-  }
-  if (lastNonWhitespace == -1) return '';
-  return input.substring(0, lastNonWhitespace);
-}
-
-/**
- * Returns `true` if [rune] represents a whitespace character.
- *
- * The definition of whitespace matches that used in [String.trim] which is
- * based on Unicode 6.2. This maybe be a different set of characters than the
- * environment's [RegExp] definition for whitespace, which is given by the
- * ECMAScript standard: http://ecma-international.org/ecma-262/5.1/#sec-15.10
- */
+/// Returns `true` if [rune] represents a whitespace character.
+///
+/// The definition of whitespace matches that used in [String.trim] which is
+/// based on Unicode 6.2. This maybe be a different set of characters than the
+/// environment's [RegExp] definition for whitespace, which is given by the
+/// ECMAScript standard: http://ecma-international.org/ecma-262/5.1/#sec-15.10
 bool isWhitespace(int rune) => ((rune >= 0x0009 && rune <= 0x000D) ||
     rune == 0x0020 ||
     rune == 0x0085 ||
@@ -215,38 +135,39 @@
     rune == 0x3000 ||
     rune == 0xFEFF);
 
-/**
- * Returns a [String] of length [width] padded with the same number of
- * characters on the left and right from [fill].  On the right, characters are
- * selected from [fill] starting at the end so that the last character in [fill]
- * is the last character in the result. [fill] is repeated if neccessary to pad.
- *
- * Returns [input] if `input.length` is equal to or greater than width. [input]
- * can be `null` and is treated as an empty string.
- *
- * If there are an odd number of characters to pad, then the right will be
- * padded with one more than the left.
- */
+/// Returns a [String] of length [width] padded with the same number of
+/// characters on the left and right from [fill].  On the right, characters are
+/// selected from [fill] starting at the end so that the last character in
+/// [fill] is the last character in the result. [fill] is repeated if
+/// neccessary to pad.
+///
+/// Returns [input] if `input.length` is equal to or greater than width.
+/// [input] can be `null` and is treated as an empty string.
+///
+/// If there are an odd number of characters to pad, then the right will be
+/// padded with one more than the left.
 String center(String input, int width, String fill) {
   if (fill == null || fill.length == 0) {
     throw new ArgumentError('fill cannot be null or empty');
   }
   if (input == null) input = '';
-  var leftWidth = input.length + (width - input.length) ~/ 2;
-  return padRight(padLeft(input, leftWidth, fill), width, fill);
+  if (input.length >= width) return input;
+
+  var padding = width - input.length;
+  if (padding ~/ 2 > 0) {
+    input = loop(fill, 0, padding ~/ 2) + input;
+  }
+  return input + loop(fill, input.length - width, 0);
 }
 
-/**
- * Returns `true` if [a] and [b] are equal after being converted to lower case,
- * or are both null.
- */
-bool equalsIgnoreCase(String a, String b) => (a == null && b == null) ||
+/// Returns `true` if [a] and [b] are equal after being converted to lower
+/// case, or are both null.
+bool equalsIgnoreCase(String a, String b) =>
+    (a == null && b == null) ||
     (a != null && b != null && a.toLowerCase() == b.toLowerCase());
 
-/**
- * Compares [a] and [b] after converting to lower case.
- *
- * Both [a] and [b] must not be null.
- */
+/// Compares [a] and [b] after converting to lower case.
+///
+/// Both [a] and [b] must not be null.
 int compareIgnoreCase(String a, String b) =>
     a.toLowerCase().compareTo(b.toLowerCase());
diff --git a/packages/quiver/lib/testing/async.dart b/packages/quiver/lib/testing/async.dart
index 409f97d..92f776c 100644
--- a/packages/quiver/lib/testing/async.dart
+++ b/packages/quiver/lib/testing/async.dart
@@ -12,9 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Testing support for dart:async.
- */
+/// Testing support for dart:async.
 library quiver.testing.async;
 
 import 'dart:async';
@@ -23,5 +21,4 @@
 import 'package:quiver/iterables.dart';
 import 'package:quiver/time.dart';
 
-part 'src/async/async.dart';
 part 'src/async/fake_async.dart';
diff --git a/packages/quiver/lib/testing/equality.dart b/packages/quiver/lib/testing/equality.dart
index 32e4f70..7846fbc 100644
--- a/packages/quiver/lib/testing/equality.dart
+++ b/packages/quiver/lib/testing/equality.dart
@@ -12,12 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Utilities for testing the equality of Dart object
- */
+/// Utilities for testing the equality of Dart object
 library quiver.testing.equality;
 
 import 'package:matcher/matcher.dart';
-import 'package:quiver/iterables.dart';
 
 part 'src/equality/equality.dart';
diff --git a/packages/quiver/lib/testing/runtime.dart b/packages/quiver/lib/testing/runtime.dart
index b72fd86..4e28e2d 100644
--- a/packages/quiver/lib/testing/runtime.dart
+++ b/packages/quiver/lib/testing/runtime.dart
@@ -12,9 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Testing support related to the Dart runtime.
- */
+/// Testing support related to the Dart runtime.
 library quiver.testing.runtime;
 
 part 'src/runtime/checked_mode.dart';
diff --git a/packages/quiver/lib/testing/src/async/async.dart b/packages/quiver/lib/testing/src/async/async.dart
deleted file mode 100644
index 881efc7..0000000
--- a/packages/quiver/lib/testing/src/async/async.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.testing.async;
-
-/**
- * DEPRECATED: Use a much more feature-rich FakeAsync instead.
- *
- * A [Timer] implementation that stores its duration and callback for access
- * in tests.
- */
-@deprecated
-class FakeTimer implements Timer {
-  Duration duration;
-  var callback;
-  var onCancel;
-
-  /**
-   * Sets this timers [duration] and [callback] and returns [this].
-   *
-   * This method is usable as a [CreateTimer] or [CreateTimerPeriodic]
-   * function. In tests, construct a FakeTimer so that you have a refernece to
-   * it, then pass [create] to the function or class under test.
-   */
-  FakeTimer create(Duration duration, callback) {
-    if (this.duration != null) {
-      throw new StateError("FakeTimer.create already called");
-    }
-    this.duration = duration;
-    this.callback = callback;
-    return this;
-  }
-
-  void cancel() {
-    if (onCancel != null) onCancel();
-  }
-
-  bool isActive = true;
-}
diff --git a/packages/quiver/lib/testing/src/async/fake_async.dart b/packages/quiver/lib/testing/src/async/fake_async.dart
index eb14769..376847c 100644
--- a/packages/quiver/lib/testing/src/async/fake_async.dart
+++ b/packages/quiver/lib/testing/src/async/fake_async.dart
@@ -39,8 +39,6 @@
 abstract class FakeAsync {
   factory FakeAsync() = _FakeAsync;
 
-  FakeAsync._();
-
   /// Returns a fake [Clock] whose time can is elapsed by calls to [elapse] and
   /// [elapseBlocking].
   ///
@@ -89,8 +87,9 @@
   /// and [ZoneSpecification.scheduleMicrotask] to store callbacks for later
   /// execution within the zone via calls to [elapse].
   ///
-  /// [callback] is called with `this` as argument.
-  run(callback(FakeAsync self));
+  /// Calls [callback] with `this` as argument and returns the result returned
+  /// by [callback].
+  dynamic run(callback(FakeAsync self));
 
   /// Runs all remaining microtasks, including those scheduled as a result of
   /// running them, until there are no more microtasks scheduled.
@@ -104,7 +103,8 @@
   /// [timeout] lets you set the maximum amount of time the flushing will take.
   /// Throws a [StateError] if the [timeout] is exceeded. The default timeout
   /// is 1 hour. [timeout] is relative to the elapsed time.
-  void flushTimers({Duration timeout: const Duration(hours: 1),
+  void flushTimers(
+      {Duration timeout: const Duration(hours: 1),
       bool flushPeriodicTimers: true});
 
   /// The number of created periodic timers that have not been canceled.
@@ -117,16 +117,12 @@
   int get microtaskCount;
 }
 
-class _FakeAsync extends FakeAsync {
+class _FakeAsync implements FakeAsync {
   Duration _elapsed = Duration.ZERO;
   Duration _elapsingTo;
   Queue<Function> _microtasks = new Queue();
   Set<_FakeTimer> _timers = new Set<_FakeTimer>();
 
-  _FakeAsync() : super._() {
-    _elapsed;
-  }
-
   @override
   Clock getClock(DateTime initialTime) =>
       new Clock(() => initialTime.add(_elapsed));
@@ -162,7 +158,8 @@
   }
 
   @override
-  void flushTimers({Duration timeout: const Duration(hours: 1),
+  void flushTimers(
+      {Duration timeout: const Duration(hours: 1),
       bool flushPeriodicTimers: true}) {
     final absoluteTimeout = _elapsed + timeout;
     _drainTimersWhile((_FakeTimer timer) {
@@ -186,6 +183,7 @@
     }
     return _zone.runGuarded(() => callback(this));
   }
+
   Zone _zone;
 
   @override
@@ -200,13 +198,14 @@
   int get microtaskCount => _microtasks.length;
 
   ZoneSpecification get _zoneSpec => new ZoneSpecification(
-      createTimer: (_, __, ___, Duration duration, Function callback) {
-    return _createTimer(duration, callback, false);
-  }, createPeriodicTimer: (_, __, ___, Duration duration, Function callback) {
-    return _createTimer(duration, callback, true);
-  }, scheduleMicrotask: (_, __, ___, Function microtask) {
-    _microtasks.add(microtask);
-  });
+          createTimer: (_, __, ___, Duration duration, Function callback) {
+        return _createTimer(duration, callback, false);
+      }, createPeriodicTimer:
+              (_, __, ___, Duration duration, Function callback) {
+        return _createTimer(duration, callback, true);
+      }, scheduleMicrotask: (_, __, ___, Function microtask) {
+        _microtasks.add(microtask);
+      });
 
   _drainTimersWhile(bool predicate(_FakeTimer)) {
     _drainMicrotasks();
@@ -241,8 +240,8 @@
       timer._callback(timer);
       timer._nextCall += timer._duration;
     } else {
-      timer._callback();
       _timers.remove(timer);
+      timer._callback();
     }
   }
 
diff --git a/packages/quiver/lib/testing/src/equality/equality.dart b/packages/quiver/lib/testing/src/equality/equality.dart
index 2053e57..e67222a 100644
--- a/packages/quiver/lib/testing/src/equality/equality.dart
+++ b/packages/quiver/lib/testing/src/equality/equality.dart
@@ -14,43 +14,40 @@
 
 part of quiver.testing.equality;
 
-/**
- * Matcher for == and hashCode methods of a class.
- *
- * To use, invoke areEqualityGroups with a list of equality groups where each
- * group contains objects that are supposed to be equal to each other, and
- * objects of different groups are expected to be unequal. For example:
- *
- *     expect({
- *      'hello': ["hello", "h" + "ello"],
- *      'world': ["world", "wor" + "ld"],
- *      'three': [2, 1 + 1]
- *     }, areEqualityGroups);
- *
- * This tests that:
- *
- * * comparing each object against itself returns true
- * * comparing each object against an instance of an incompatible class
- *     returns false
- * * comparing each pair of objects within the same equality group returns
- *     true
- * * comparing each pair of objects from different equality groups returns
- *     false
- * * the hash codes of any two equal objects are equal
- * * equals implementation is idempotent
- *
- * The format of the Map passed to expect is such that the map keys are used in
- * error messages to identify the group described by the map value.
- *
- * When a test fails, the error message labels the objects involved in
- * the failed comparison as follows:
- *
- *      "`[group x, item j]`" refers to the ith item in the xth equality group,
- *       where both equality groups and the items within equality groups are
- *       numbered starting from 1.  When either a constructor argument or an
- *       equal object is provided, that becomes group 1.
- *
- */
+/// Matcher for == and hashCode methods of a class.
+///
+/// To use, invoke areEqualityGroups with a list of equality groups where each
+/// group contains objects that are supposed to be equal to each other, and
+/// objects of different groups are expected to be unequal. For example:
+///
+///     expect({
+///      'hello': ["hello", "h" + "ello"],
+///      'world': ["world", "wor" + "ld"],
+///      'three': [2, 1 + 1]
+///     }, areEqualityGroups);
+///
+/// This tests that:
+///
+///    * comparing each object against itself returns true
+///    * comparing each object against an instance of an incompatible class
+///      returns false
+///    * comparing each pair of objects within the same equality group returns
+///      true
+///    * comparing each pair of objects from different equality groups returns
+///      false
+///    * the hash codes of any two equal objects are equal
+///    * equals implementation is idempotent
+///
+/// The format of the Map passed to expect is such that the map keys are used in
+/// error messages to identify the group described by the map value.
+///
+/// When a test fails, the error message labels the objects involved in
+/// the failed comparison as follows:
+///
+///     "`[group x, item j]`" refers to the ith item in the xth equality group,
+///      where both equality groups and the items within equality groups are
+///      numbered starting from 1.  When either a constructor argument or an
+///      equal object is provided, that becomes group 1.
 const Matcher areEqualityGroups = const _EqualityGroupMatcher();
 
 const _repetitions = 3;
@@ -64,9 +61,9 @@
       description.add('to be equality groups');
 
   @override
-  bool matches(Map<String, List> item, Map matchState) {
+  bool matches(item, Map matchState) {
     try {
-      _verifyEqualityGroups(item, matchState);
+      _verifyEqualityGroups(item as Map<String, List>, matchState);
       return true;
     } on MatchError catch (e) {
       matchState[failureReason] = e.toString();
@@ -82,7 +79,7 @@
     if (equalityGroups == null) {
       throw new MatchError('Equality Group must not be null');
     }
-    var equalityGroupsCopy = {};
+    final equalityGroupsCopy = <String, List>{};
     equalityGroups.forEach((String groupName, List group) {
       if (groupName == null) {
         throw new MatchError('Group name must not be null');
@@ -94,7 +91,7 @@
     });
 
     // Run the test multiple times to ensure deterministic equals
-    for (var run in range(_repetitions)) {
+    for (var i = 0; i < _repetitions; i++) {
       _checkBasicIdentity(equalityGroupsCopy, matchState);
       _checkGroupBasedEquality(equalityGroupsCopy);
     }
diff --git a/packages/quiver/lib/testing/src/runtime/checked_mode.dart b/packages/quiver/lib/testing/src/runtime/checked_mode.dart
index 05dfaae..63735f7 100644
--- a/packages/quiver/lib/testing/src/runtime/checked_mode.dart
+++ b/packages/quiver/lib/testing/src/runtime/checked_mode.dart
@@ -14,11 +14,9 @@
 
 part of quiver.testing.runtime;
 
-/**
- * Asserts that the current runtime has checked mode enabled.
- *
- * Otherwise, throws [StateError].
- */
+/// Asserts that the current runtime has checked mode enabled.
+///
+/// Otherwise, throws [StateError].
 void assertCheckedMode() {
   if (_isCheckedMode == null) _isCheckedMode = _checkForCheckedMode();
 
@@ -33,10 +31,12 @@
   Object sentinal = new Object();
   try {
     var i = 1 as dynamic;
-    String string = i;
+    _takeString(i);
     throw sentinal;
   } catch (e) {
     if (e == sentinal) return false;
   }
   return true;
 }
+
+void _takeString(String value) {}
diff --git a/packages/quiver/lib/testing/src/time/time.dart b/packages/quiver/lib/testing/src/time/time.dart
index 01049cf..46cc41f 100644
--- a/packages/quiver/lib/testing/src/time/time.dart
+++ b/packages/quiver/lib/testing/src/time/time.dart
@@ -14,15 +14,11 @@
 
 part of quiver.testing.time;
 
-/**
- * Returns the current test time in microseconds.
- */
+/// Returns the current test time in microseconds.
 typedef int Now();
 
-/**
- * A [Stopwatch] implementation that gets the current time in microseconds
- * via a user-supplied function.
- */
+/// A [Stopwatch] implementation that gets the current time in microseconds
+/// via a user-supplied function.
 class FakeStopwatch implements Stopwatch {
   Now _now;
   int frequency;
diff --git a/packages/quiver/lib/testing/time.dart b/packages/quiver/lib/testing/time.dart
index a06f656..1e1384d 100644
--- a/packages/quiver/lib/testing/time.dart
+++ b/packages/quiver/lib/testing/time.dart
@@ -12,9 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-/**
- * Testing support for dart:core time functionality.
- */
+/// Testing support for dart:core time functionality.
 library quiver.testing.time;
 
 part 'src/time/time.dart';
diff --git a/packages/quiver/pubspec.yaml b/packages/quiver/pubspec.yaml
index 5948275..9bb53ff 100644
--- a/packages/quiver/pubspec.yaml
+++ b/packages/quiver/pubspec.yaml
@@ -1,5 +1,5 @@
 name: quiver
-version: 0.21.4
+version: 0.25.0
 authors:
 - Justin Fagnani <justinfagnani@google.com>
 - Yegor Jbanov <yjbanov@google.com>
@@ -11,12 +11,13 @@
 - Günter Zöchbauer <guenter@gzoechbauer.com>
 - Sean Eagan <seaneagan1@gmail.com>
 - Victor Berchet <victor@suumit.com>
+- Wil Pirino <willyp@google.com>
 description: A set of utility libraries for Dart
 homepage: https://github.com/google/quiver-dart
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.21.0 <2.0.0'
 dependencies:
   matcher: '>=0.10.0 <0.13.0'
 dev_dependencies:
   path: '>=1.0.0 <2.0.0'
-  test: '>=0.12.0 <0.13.0'
+  test: '>=0.12.20 <=0.13.0'
diff --git a/packages/quiver/test/all_tests.dart b/packages/quiver/test/all_tests.dart
index 7777148..95863e0 100644
--- a/packages/quiver/test/all_tests.dart
+++ b/packages/quiver/test/all_tests.dart
@@ -23,7 +23,6 @@
 import 'iterables/all_tests.dart' as iterables;
 import 'mirrors_test.dart' as mirrors;
 import 'pattern/all_tests.dart' as pattern;
-import 'streams/all_tests.dart' as streams;
 import 'strings_test.dart' as strings;
 import 'testing/all_tests.dart' as testing;
 import 'time/all_tests.dart' as time;
@@ -38,7 +37,6 @@
   iterables.main();
   mirrors.main();
   pattern.main();
-  streams.main();
   strings.main();
   testing.main();
   time.main();
diff --git a/packages/quiver/test/async/all_tests.dart b/packages/quiver/test/async/all_tests.dart
index f615ff6..aafec7f 100644
--- a/packages/quiver/test/async/all_tests.dart
+++ b/packages/quiver/test/async/all_tests.dart
@@ -14,20 +14,28 @@
 
 library quiver.async.all_tests;
 
+import 'collect_test.dart' as collect;
+import 'concat_test.dart' as concat;
 import 'countdown_timer_test.dart' as countdown_timer;
 import 'create_timer_test.dart' as create_timer;
+import 'enumerate_test.dart' as enumerate;
 import 'future_group_test.dart' as future_group;
 import 'future_stream_test.dart' as future_stream;
 import 'iteration_test.dart' as iteration;
 import 'metronome_test.dart' as metronome;
+import 'stream_buffer_test.dart' as stream_buffer;
 import 'stream_router_test.dart' as stream_router;
 
 main() {
+  collect.main();
+  concat.main();
   countdown_timer.main();
   create_timer.main();
+  enumerate.main();
   future_group.main();
   future_stream.main();
   metronome.main();
   iteration.main();
+  stream_buffer.main();
   stream_router.main();
 }
diff --git a/packages/quiver/test/streams/collect_test.dart b/packages/quiver/test/async/collect_test.dart
similarity index 91%
rename from packages/quiver/test/streams/collect_test.dart
rename to packages/quiver/test/async/collect_test.dart
index a806fd8..a2dc91f 100644
--- a/packages/quiver/test/streams/collect_test.dart
+++ b/packages/quiver/test/async/collect_test.dart
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-library quiver.streams.collect_test;
+library quiver.async.collect_test;
 
 import 'dart:async';
 import 'dart:math';
 
 import 'package:test/test.dart';
-import 'package:quiver/streams.dart';
+import 'package:quiver/async.dart';
 
 main() {
   group('collect', () {
@@ -26,7 +26,7 @@
         () => collect([]).toList().then((events) => expect(events, isEmpty)));
 
     test('should produce events for future completions in input order', () {
-      var futures = new Iterable.generate(
+      var futures = new Iterable<Future>.generate(
           5, (int i) => i.isEven ? new Future.value(i) : new Future.error(i));
       var events = [];
       var done = new Completer();
@@ -39,7 +39,8 @@
       });
     });
 
-    test('should only advance iterator once '
+    test(
+        'should only advance iterator once '
         'event for previous future is sent', () {
       var eventCount = 0;
       var maxParallel = 0;
diff --git a/packages/quiver/test/streams/concat_test.dart b/packages/quiver/test/async/concat_test.dart
similarity index 90%
rename from packages/quiver/test/streams/concat_test.dart
rename to packages/quiver/test/async/concat_test.dart
index 7c05b0c..3b70bfd 100644
--- a/packages/quiver/test/streams/concat_test.dart
+++ b/packages/quiver/test/async/concat_test.dart
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-library quiver.streams.concat_test;
+library quiver.async.concat_test;
 
 import 'dart:async';
 
 import 'package:test/test.dart';
-import 'package:quiver/streams.dart';
+import 'package:quiver/async.dart';
 
 main() {
   group('concat', () {
@@ -68,15 +68,13 @@
     });
 
     test('should forward pause, resume, and cancel to current stream', () {
-      var wasPaused = false,
-          wasResumed = false,
-          wasCanceled = false;
+      var wasPaused = false, wasResumed = false, wasCanceled = false;
       var controller = new StreamController<String>(
           onPause: () => wasPaused = true,
           onResume: () => wasResumed = true,
           onCancel: () {
-        wasCanceled = true;
-      });
+            wasCanceled = true;
+          });
       var concatenated = concat([controller.stream]);
       var subscription = concatenated.listen(null);
       controller.add('a');
@@ -95,14 +93,13 @@
     });
 
     test('should forward iteration error and stop', () {
-      var data = [],
-          errors = [];
+      var data = [], errors = [];
       var badIteration =
           ['e', 'this should not get thrown'].map((message) => throw message);
-      var concatenated = concat(badIteration);
+      var concatenated = concat(badIteration as Iterable<Stream>);
       var completer = new Completer();
-      concatenated
-          .listen(data.add, onError: errors.add, onDone: completer.complete);
+      concatenated.listen(data.add,
+          onError: errors.add, onDone: completer.complete);
       return completer.future.then((_) {
         expect(data, []);
         expect(errors, ['e']);
diff --git a/packages/quiver/test/async/countdown_timer_test.dart b/packages/quiver/test/async/countdown_timer_test.dart
index ea6b8f6..500dd99 100644
--- a/packages/quiver/test/async/countdown_timer_test.dart
+++ b/packages/quiver/test/async/countdown_timer_test.dart
@@ -28,9 +28,10 @@
         var stopwatch = new FakeStopwatch(
             () => 1000 * clock.now().millisecondsSinceEpoch, 1000000);
 
-        var timings = new CountdownTimer(
-            new Duration(milliseconds: 500), new Duration(milliseconds: 100),
-            stopwatch: stopwatch).map((c) => c.remaining.inMilliseconds);
+        var timings = new CountdownTimer(const Duration(milliseconds: 500),
+                const Duration(milliseconds: 100),
+                stopwatch: stopwatch)
+            .map((c) => c.remaining.inMilliseconds);
 
         List<int> result;
         timings.toList().then((list) {
@@ -41,5 +42,11 @@
         expect(result, [400, 300, 200, 100, 0]);
       });
     });
+
+    test('should set increment to the initialized value', () {
+      var timer = new CountdownTimer(
+          const Duration(milliseconds: 321), const Duration(milliseconds: 123));
+      expect(timer.increment, const Duration(milliseconds: 123));
+    });
   });
 }
diff --git a/packages/quiver/test/streams/enumerate_test.dart b/packages/quiver/test/async/enumerate_test.dart
similarity index 93%
rename from packages/quiver/test/streams/enumerate_test.dart
rename to packages/quiver/test/async/enumerate_test.dart
index 8c8490a..5bd6d45 100644
--- a/packages/quiver/test/streams/enumerate_test.dart
+++ b/packages/quiver/test/async/enumerate_test.dart
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-library quiver.streams.enumerate_test;
+library quiver.async.enumerate_test;
 
 import 'dart:async';
 
 import 'package:test/test.dart';
-import 'package:quiver/streams.dart';
+import 'package:quiver/async.dart';
 
 main() {
   group('enumerate', () {
diff --git a/packages/quiver/test/streams/streambuffer_test.dart b/packages/quiver/test/async/stream_buffer_test.dart
similarity index 81%
rename from packages/quiver/test/streams/streambuffer_test.dart
rename to packages/quiver/test/async/stream_buffer_test.dart
index d2a74b7..f2dd7b8 100644
--- a/packages/quiver/test/streams/streambuffer_test.dart
+++ b/packages/quiver/test/async/stream_buffer_test.dart
@@ -12,17 +12,21 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-library quiver.streams.streambuffer_test;
+library quiver.async.stream_buffer_test;
 
 import 'dart:async';
 import 'package:test/test.dart';
-import 'package:quiver/streams.dart';
+import 'package:quiver/async.dart';
 
 void main() {
   group("StreamBuffer", () {
     test("returns orderly overlaps", () {
-      StreamBuffer<int> buf = new StreamBuffer();
-      new Stream.fromIterable([[1], [2, 3, 4], [5, 6, 7, 8]]).pipe(buf);
+      StreamBuffer<List<int>> buf = new StreamBuffer();
+      new Stream.fromIterable([
+        [1],
+        [2, 3, 4],
+        [5, 6, 7, 8]
+      ]).pipe(buf);
       return Future.wait([buf.read(2), buf.read(4), buf.read(2)]).then((vals) {
         expect(vals[0], equals([1, 2]));
         expect(vals[1], equals([3, 4, 5, 6]));
@@ -33,8 +37,13 @@
     });
 
     test("respects pausing of stream", () {
-      StreamBuffer<int> buf = new StreamBuffer()..limit = 2;
-      new Stream.fromIterable([[1], [2], [3], [4]]).pipe(buf);
+      StreamBuffer<List<int>> buf = new StreamBuffer()..limit = 2;
+      new Stream.fromIterable([
+        [1],
+        [2],
+        [3],
+        [4]
+      ]).pipe(buf);
       return buf.read(2).then((val) {
         expect(val, [1, 2]);
       }).then((_) {
@@ -45,8 +54,11 @@
     });
 
     test("throws when reading too much", () {
-      StreamBuffer<int> buf = new StreamBuffer()..limit = 1;
-      new Stream.fromIterable([[1], [2]]).pipe(buf);
+      StreamBuffer<List<int>> buf = new StreamBuffer()..limit = 1;
+      new Stream.fromIterable([
+        [1],
+        [2]
+      ]).pipe(buf);
       try {
         buf.read(2);
       } catch (e) {
diff --git a/packages/quiver/test/async/stream_router_test.dart b/packages/quiver/test/async/stream_router_test.dart
index 5356c67..c0fdea4 100644
--- a/packages/quiver/test/async/stream_router_test.dart
+++ b/packages/quiver/test/async/stream_router_test.dart
@@ -60,17 +60,16 @@
       var controller = new StreamController<int>(sync: true);
       var router = new StreamRouter<int>(controller.stream);
       // toList() will only complete when the child streams are closed
-      var future = Future
-          .wait([
+      var future = Future.wait([
         router.route((e) => e % 2 == 0).toList(),
         router.route((e) => e % 2 == 1).toList(),
-      ])
-          .then((l) {
-        expect(l, [[4], [5]]);
+      ]).then((l) {
+        expect(l, [
+          [4],
+          [5]
+        ]);
       });
-      controller
-        ..add(4)
-        ..add(5);
+      controller..add(4)..add(5);
       router.close();
       return future;
     });
diff --git a/packages/quiver/test/check_test.dart b/packages/quiver/test/check_test.dart
index 8257cbd..6a48307 100644
--- a/packages/quiver/test/check_test.dart
+++ b/packages/quiver/test/check_test.dart
@@ -23,8 +23,10 @@
       test('simple', () => checkArgument(true));
       test('null message', () => checkArgument(true, message: null));
       test('string message', () => checkArgument(true, message: 'foo'));
-      test('function message', () =>
-          checkArgument(true, message: () => fail("Shouldn't be called")));
+      test(
+          'function message',
+          () =>
+              checkArgument(true, message: () => fail("Shouldn't be called")));
     });
 
     group('failure', () {
@@ -41,14 +43,21 @@
       test('no message',
           () => checkArgumentShouldFail(() => checkArgument(false)));
 
-      test('failure and simple string message', () => checkArgumentShouldFail(
-          () => checkArgument(false, message: 'message'), 'message'));
+      test(
+          'failure and simple string message',
+          () => checkArgumentShouldFail(
+              () => checkArgument(false, message: 'message'), 'message'));
 
-      test('failure and null message', () =>
-          checkArgumentShouldFail(() => checkArgument(false, message: null)));
-      test('failure and object as message', () =>
-          checkArgumentShouldFail(() => checkArgument(false, message: 5), '5'));
-      test('failure and message closure returns object',
+      test(
+          'failure and null message',
+          () => checkArgumentShouldFail(
+              () => checkArgument(false, message: null)));
+      test(
+          'failure and object as message',
+          () => checkArgumentShouldFail(
+              () => checkArgument(false, message: 5), '5'));
+      test(
+          'failure and message closure returns object',
           () => checkArgumentShouldFail(
               () => checkArgument(false, message: () => 5), '5'));
 
@@ -84,13 +93,17 @@
 
       test('no message', () => checkStateShouldFail(() => checkState(false)));
 
-      test('failure and simple string message', () => checkStateShouldFail(
-          () => checkState(false, message: 'message'), 'message'));
+      test(
+          'failure and simple string message',
+          () => checkStateShouldFail(
+              () => checkState(false, message: 'message'), 'message'));
 
       test('failure and null message',
           () => checkStateShouldFail(() => checkState(false, message: null)));
-      test('message closure returns null', () =>
-          checkStateShouldFail(() => checkState(false, message: () => null)));
+      test(
+          'message closure returns null',
+          () => checkStateShouldFail(
+              () => checkState(false, message: () => null)));
 
       test('failure and message function', () {
         int five = 5;
@@ -105,8 +118,11 @@
     group('success', () {
       test('simple', () => expect(checkNotNull(''), ''));
       test('string message', () => expect(checkNotNull(5, message: 'foo'), 5));
-      test('function message', () => expect(checkNotNull(true,
-          message: () => fail("Shouldn't be called")), true));
+      test(
+          'function message',
+          () => expect(
+              checkNotNull(true, message: () => fail("Shouldn't be called")),
+              true));
     });
 
     group('failure', () {
@@ -124,14 +140,20 @@
       test(
           'no message', () => checkNotNullShouldFail(() => checkNotNull(null)));
 
-      test('simple failure message', () => checkNotNullShouldFail(
-          () => checkNotNull(null, message: 'message'), 'message'));
+      test(
+          'simple failure message',
+          () => checkNotNullShouldFail(
+              () => checkNotNull(null, message: 'message'), 'message'));
 
-      test('null message', () =>
-          checkNotNullShouldFail(() => checkNotNull(null, message: null)));
+      test(
+          'null message',
+          () =>
+              checkNotNullShouldFail(() => checkNotNull(null, message: null)));
 
-      test('message closure returns null', () => checkNotNullShouldFail(
-          () => checkNotNull(null, message: () => null)));
+      test(
+          'message closure returns null',
+          () => checkNotNullShouldFail(
+              () => checkNotNull(null, message: () => null)));
 
       test('failure and message function', () {
         int five = 5;
@@ -160,11 +182,14 @@
           fail('Should have thrown a RangeError');
         } catch (e) {
           expect(e, isRangeError);
-          expect(e.message, expectedMessage == null
-              ? 'index $index not valid for list of size $size'
-              : expectedMessage);
+          expect(
+              e.message,
+              expectedMessage == null
+                  ? 'index $index not valid for list of size $size'
+                  : expectedMessage);
         }
       }
+
       test('negative size', () => checkListIndexShouldFail(0, -1));
       test('negative index', () => checkListIndexShouldFail(-1, 1));
       test('index too high', () => checkListIndexShouldFail(1, 1));
diff --git a/packages/quiver/test/collection/all_tests.dart b/packages/quiver/test/collection/all_tests.dart
index 2af508c..602fc3f 100644
--- a/packages/quiver/test/collection/all_tests.dart
+++ b/packages/quiver/test/collection/all_tests.dart
@@ -23,7 +23,7 @@
 import 'delegates/list_test.dart' as list;
 import 'delegates/map_test.dart' as map;
 import 'delegates/queue_test.dart' as queue;
-import 'delegates/set_test.dart' as set;
+import 'delegates/set_test.dart' as setTest;
 
 main() {
   bimap.main();
@@ -34,6 +34,6 @@
   list.main();
   map.main();
   queue.main();
-  set.main();
+  setTest.main();
   treeset.main();
 }
diff --git a/packages/quiver/test/collection/bimap_test.dart b/packages/quiver/test/collection/bimap_test.dart
index 5786350..125bc69 100644
--- a/packages/quiver/test/collection/bimap_test.dart
+++ b/packages/quiver/test/collection/bimap_test.dart
@@ -26,12 +26,8 @@
 
   group('HashBiMap', () {
     BiMap<String, int> map;
-    String k1 = 'k1',
-        k2 = 'k2',
-        k3 = 'k3';
-    int v1 = 1,
-        v2 = 2,
-        v3 = 3;
+    String k1 = 'k1', k2 = 'k2', k3 = 'k3';
+    int v1 = 1, v2 = 2, v3 = 3;
 
     setUp(() {
       map = new HashBiMap();
diff --git a/packages/quiver/test/collection/collection_test.dart b/packages/quiver/test/collection/collection_test.dart
index c5fc143..80b8412 100644
--- a/packages/quiver/test/collection/collection_test.dart
+++ b/packages/quiver/test/collection/collection_test.dart
@@ -69,4 +69,17 @@
       expect(setsEqual(new Set(), new Set.from([1])), isFalse);
     });
   });
+
+  group('indexOf', () {
+    test('returns the first matching index', () {
+      expect(indexOf<int>([1, 12, 19, 20, 24], (n) => n % 2 == 0), 1);
+      expect(indexOf<String>(['a', 'b', 'a'], (s) => s == 'a'), 0);
+    });
+
+    test('returns -1 when there is no match', () {
+      expect(indexOf<int>([1, 3, 7], (n) => n % 2 == 0), -1);
+      expect(indexOf<String>(['a', 'b'], (s) => s == 'e'), -1);
+      expect(indexOf<bool>([], (_) => true), -1);
+    });
+  });
 }
diff --git a/packages/quiver/test/collection/delegates/set_test.dart b/packages/quiver/test/collection/delegates/set_test.dart
index ec910b3..ff4ad22 100644
--- a/packages/quiver/test/collection/delegates/set_test.dart
+++ b/packages/quiver/test/collection/delegates/set_test.dart
@@ -63,7 +63,7 @@
           equals(['b']));
       expect(delegatingSet.difference(new Set<String>.from(['cc'])),
           equals(['a', 'b']));
-    }, skip: "Test failing: Caught type 'LinkedHashSet<String>' is not a subtype of type 'HashSet<String>' of 'result'.");
+    });
 
     test('intersection', () {
       expect(delegatingSet.intersection(new Set<String>.from(['a', 'dd'])),
diff --git a/packages/quiver/test/collection/lru_map_test.dart b/packages/quiver/test/collection/lru_map_test.dart
index c4b478b..803597b 100644
--- a/packages/quiver/test/collection/lru_map_test.dart
+++ b/packages/quiver/test/collection/lru_map_test.dart
@@ -26,20 +26,13 @@
       lruMap = new LruMap();
       expect(lruMap, hasLength(0));
 
-      lruMap.addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap.addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
       expect(lruMap, hasLength(3));
     });
 
     test('accessing keys causes them to be promoted', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.keys.toList(), ['C', 'B', 'A']);
 
@@ -52,22 +45,16 @@
     });
 
     test('new keys are added at the beginning', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       lruMap['D'] = 'Delta';
       expect(lruMap.keys.toList(), ['D', 'C', 'B', 'A']);
     });
 
     test('setting values on existing keys works, and promotes the key', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       lruMap['B'] = 'Bravo';
       expect(lruMap.keys.toList(), ['B', 'C', 'A']);
@@ -75,65 +62,54 @@
     });
 
     test('the least recently used key is evicted when capacity hit', () {
-      lruMap = new LruMap(maximumSize: 3)..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap(maximumSize: 3)
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       lruMap['D'] = 'Delta';
       expect(lruMap.keys.toList(), ['D', 'C', 'B']);
     });
 
     test('setting maximum size evicts keys until the size is met', () {
-      lruMap = new LruMap(maximumSize: 5)..addAll({
+      lruMap = new LruMap(maximumSize: 5)
+        ..addAll({
           'A': 'Alpha',
           'B': 'Beta',
           'C': 'Charlie',
           'D': 'Delta',
           'E': 'Epsilon'
-      });
+        });
 
       lruMap.maximumSize = 3;
       expect(lruMap.keys.toList(), ['E', 'D', 'C']);
     });
 
     test('accessing the `keys` collection does not affect position', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.keys.toList(), ['C', 'B', 'A']);
 
-      lruMap.keys.forEach((_){});
-      lruMap.keys.forEach((_){});
+      lruMap.keys.forEach((_) {});
+      lruMap.keys.forEach((_) {});
 
       expect(lruMap.keys.toList(), ['C', 'B', 'A']);
     });
 
     test('accessing the `values` collection does not affect position', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.values.toList(), ['Charlie', 'Beta', 'Alpha']);
 
-      lruMap.values.forEach((_){});
-      lruMap.values.forEach((_){});
+      lruMap.values.forEach((_) {});
+      lruMap.values.forEach((_) {});
 
       expect(lruMap.values.toList(), ['Charlie', 'Beta', 'Alpha']);
     });
 
     test('clearing removes all keys and values', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.isNotEmpty, isTrue);
       expect(lruMap.keys.isNotEmpty, isTrue);
@@ -147,22 +123,16 @@
     });
 
     test('`containsKey` returns true if the key is in the map', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.containsKey('A'), isTrue);
       expect(lruMap.containsKey('D'), isFalse);
     });
 
     test('`containsValue` returns true if the value is in the map', () {
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.containsValue('Alpha'), isTrue);
       expect(lruMap.containsValue('Delta'), isFalse);
@@ -172,11 +142,8 @@
       final keys = [];
       final values = [];
 
-      lruMap = new LruMap()..addAll({
-        'A': 'Alpha',
-        'B': 'Beta',
-        'C': 'Charlie'
-      });
+      lruMap = new LruMap()
+        ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
 
       expect(lruMap.keys.toList(), ['C', 'B', 'A']);
       expect(lruMap.values.toList(), ['Charlie', 'Beta', 'Alpha']);
@@ -194,11 +161,8 @@
 
     group('`remove`', () {
       setUp(() {
-        lruMap = new LruMap()..addAll({
-          'A': 'Alpha',
-          'B': 'Beta',
-          'C': 'Charlie'
-        });
+        lruMap = new LruMap()
+          ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
       });
 
       test('returns the value associated with a key, if it exists', () {
@@ -227,11 +191,8 @@
 
     group('`putIfAbsent`', () {
       setUp(() {
-        lruMap = new LruMap()..addAll({
-          'A': 'Alpha',
-          'B': 'Beta',
-          'C': 'Charlie'
-        });
+        lruMap = new LruMap()
+          ..addAll({'A': 'Alpha', 'B': 'Beta', 'C': 'Charlie'});
       });
 
       test('adds an item if it does not exist, and moves it to the MRU', () {
diff --git a/packages/quiver/test/collection/multimap_test.dart b/packages/quiver/test/collection/multimap_test.dart
index 19e5ed6..dd94220 100644
--- a/packages/quiver/test/collection/multimap_test.dart
+++ b/packages/quiver/test/collection/multimap_test.dart
@@ -25,14 +25,50 @@
     });
   });
 
+  group('Multimap.fromIterable', () {
+    test('should default to the identity for key and value', () {
+      var map = new Multimap<int, int>.fromIterable([1, 2, 1]);
+      expect(map.asMap(), {
+        1: [1, 1],
+        2: [2],
+      });
+    });
+
+    test('should allow setting value', () {
+      var i = 0;
+      var map = new Multimap<int, String>.fromIterable([1, 2, 1],
+          value: (x) => '$x:${i++}');
+      expect(map.asMap(), {
+        1: ['1:0', '1:2'],
+        2: ['2:1'],
+      });
+    });
+
+    test('should allow setting key', () {
+      var map =
+          new Multimap<String, int>.fromIterable([1, 2, 1], key: (x) => '($x)');
+      expect(map.asMap(), {
+        '(1)': [1, 1],
+        '(2)': [2],
+      });
+    });
+
+    test('should allow setting both key and value', () {
+      var i = 0;
+      var map = new Multimap<int, String>.fromIterable([1, 2, 1],
+          key: (x) => -x, value: (x) => '$x:${i++}');
+      expect(map.asMap(), {
+        -1: ['1:0', '1:2'],
+        -2: ['2:1'],
+      });
+    });
+  });
+
   group('Multimap asMap() view', () {
     var mmap;
     var map;
     setUp(() {
-      mmap = new Multimap()
-        ..add('k1', 'v1')
-        ..add('k1', 'v2')
-        ..add('k2', 'v3');
+      mmap = new Multimap()..add('k1', 'v1')..add('k1', 'v2')..add('k2', 'v3');
       map = mmap.asMap();
     });
 
@@ -59,10 +95,12 @@
     test('forEach should iterate over all key-value pairs', () {
       var results = [];
       map.forEach((k, v) => results.add(new Pair(k, v)));
-      expect(results, unorderedEquals([
-          new Pair('k1', ['v1', 'v2']),
-          new Pair('k2', ['v3'])
-      ]));
+      expect(
+          results,
+          unorderedEquals([
+            new Pair('k1', ['v1', 'v2']),
+            new Pair('k2', ['v3'])
+          ]));
     });
 
     test('isEmpty should return whether the map contains key-value pairs', () {
@@ -78,7 +116,11 @@
     });
 
     test('addAll(Map m) should throw UnsupportedError', () {
-      expect(() => map.addAll({'k1': [1, 2, 3]}), throwsUnsupportedError);
+      expect(
+          () => map.addAll({
+                'k1': [1, 2, 3]
+              }),
+          throwsUnsupportedError);
     });
 
     test('putIfAbsent() should throw UnsupportedError', () {
@@ -103,10 +145,7 @@
     test('should return the number of keys as length', () {
       var map = new ListMultimap<String, String>();
       expect(map.length, 0);
-      map
-        ..add('k1', 'v1')
-        ..add('k1', 'v2')
-        ..add('k2', 'v3');
+      map..add('k1', 'v1')..add('k1', 'v2')..add('k2', 'v3');
       expect(map.length, 2);
     });
 
@@ -166,6 +205,14 @@
       expect(map['k'], ['v1', 'v1']);
     });
 
+    test(
+        'should support adding duplicate values for a key when initialized '
+        'from an iterable', () {
+      var map = new ListMultimap<String, String>.fromIterable(['k', 'k'],
+          value: (x) => 'v1');
+      expect(map['k'], ['v1', 'v1']);
+    });
+
     test('should support adding multiple keys', () {
       var map = new ListMultimap<String, String>()
         ..add('k1', 'v1')
@@ -283,56 +330,64 @@
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.remove', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].remove('v1');
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeAt', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].removeAt(0);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeAt', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].removeLast();
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeRange', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].removeRange(0, 1);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeWhere', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].removeWhere((_) => true);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.replaceRange', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].replaceRange(0, 1, []);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.retainWhere', () {
       var map = new ListMultimap<String, String>()..add('k1', 'v1');
       map['k1'].retainWhere((_) => false);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.clear', () {
       var map = new ListMultimap<String, String>()
         ..add('k1', 'v1')
@@ -466,8 +521,13 @@
         ..add('k1', 'v2')
         ..add('k2', 'v3')
         ..forEach((k, v) => s.add(new Pair(k, v)));
-      expect(s, unorderedEquals(
-          [new Pair('k1', 'v1'), new Pair('k1', 'v2'), new Pair('k2', 'v3')]));
+      expect(
+          s,
+          unorderedEquals([
+            new Pair('k1', 'v1'),
+            new Pair('k1', 'v2'),
+            new Pair('k2', 'v3')
+          ]));
     });
 
     test('should support iteration over all {key, Iterable<value>} pairs', () {
@@ -519,10 +579,7 @@
     test('should return the number of keys as length', () {
       var map = new SetMultimap<String, String>();
       expect(map.length, 0);
-      map
-        ..add('k1', 'v1')
-        ..add('k1', 'v2')
-        ..add('k2', 'v3');
+      map..add('k1', 'v1')..add('k1', 'v2')..add('k2', 'v3');
       expect(map.length, 2);
     });
 
@@ -566,6 +623,14 @@
       expect(map['k'], ['v1']);
     });
 
+    test(
+        'should not support adding duplicate values for a key when '
+        'initialized from an iterable', () {
+      var map = new SetMultimap<String, String>.fromIterable(['k', 'k'],
+          value: (x) => 'v1');
+      expect(map['k'], ['v1']);
+    });
+
     test('should support adding multiple keys', () {
       var map = new SetMultimap<String, String>()
         ..add('k1', 'v1')
@@ -690,14 +755,16 @@
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.remove', () {
       var map = new SetMultimap<String, String>()..add('k1', 'v1');
       map['k1'].remove('v1');
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeAll', () {
       var map = new SetMultimap<String, String>()
         ..add('k1', 'v1')
@@ -706,28 +773,32 @@
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.removeWhere', () {
       var map = new SetMultimap<String, String>()..add('k1', 'v1');
       map['k1'].removeWhere((_) => true);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.retainAll', () {
       var map = new SetMultimap<String, String>()..add('k1', 'v1');
       map['k1'].retainAll([]);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.retainWhere', () {
       var map = new SetMultimap<String, String>()..add('k1', 'v1');
       map['k1'].retainWhere((_) => false);
       expect(map.containsKey('k1'), false);
     });
 
-    test('should remove a key when all associated values are removed '
+    test(
+        'should remove a key when all associated values are removed '
         'via the underlying iterable.clear', () {
       var map = new SetMultimap<String, String>()..add('k1', 'v1');
       map['k1'].clear();
@@ -865,8 +936,13 @@
         ..add('k1', 'v2')
         ..add('k2', 'v3')
         ..forEach((k, v) => s.add(new Pair(k, v)));
-      expect(s, unorderedEquals(
-          [new Pair('k1', 'v1'), new Pair('k1', 'v2'), new Pair('k2', 'v3')]));
+      expect(
+          s,
+          unorderedEquals([
+            new Pair('k1', 'v1'),
+            new Pair('k1', 'v2'),
+            new Pair('k2', 'v3')
+          ]));
     });
 
     test('should support iteration over all {key, Iterable<value>} pairs', () {
@@ -881,8 +957,9 @@
       expect(map['k2'], unorderedEquals(['v3']));
     });
 
-    test('should support operations on empty map views without breaking '
-         'delegate synchronization', () {
+    test(
+        'should support operations on empty map views without breaking '
+        'delegate synchronization', () {
       var mmap = new SetMultimap<String, String>();
       Set x = mmap['k1'];
       Set y = mmap['k1'];
@@ -898,9 +975,10 @@
   final x;
   final y;
   Pair(this.x, this.y);
-  bool operator ==(Pair other) {
+  bool operator ==(other) {
     if (x != other.x) return false;
     return equals(y).matches(other.y, {});
   }
+
   String toString() => "($x, $y)";
 }
diff --git a/packages/quiver/test/collection/treeset_test.dart b/packages/quiver/test/collection/treeset_test.dart
index 9e23cc7..526f239 100644
--- a/packages/quiver/test/collection/treeset_test.dart
+++ b/packages/quiver/test/collection/treeset_test.dart
@@ -190,8 +190,8 @@
 
           it = tree.fromIterator(30, inclusive: false);
           expect(it.current, isNull, reason: "iteration starts with null");
-          expect(
-              it.movePrevious(), isTrue, reason: "moveNext() from spot works");
+          expect(it.movePrevious(), isTrue,
+              reason: "moveNext() from spot works");
           expect(it.current, equals(21));
         });
 
@@ -216,14 +216,14 @@
         test("inserted endpoint, non-inclusive, reversed, works backward", () {
           var it = tree.fromIterator(10, inclusive: false, reversed: true);
           expect(it.current, isNull, reason: "iteration starts with null");
-          expect(
-              it.movePrevious(), isTrue, reason: "moveNext() from spot works");
+          expect(it.movePrevious(), isTrue,
+              reason: "moveNext() from spot works");
           expect(it.current, equals(15));
 
           it = tree.fromIterator(30, inclusive: false, reversed: true);
           expect(it.current, isNull, reason: "iteration starts with null");
-          expect(
-              it.movePrevious(), isFalse, reason: "moveNext() from spot works");
+          expect(it.movePrevious(), isFalse,
+              reason: "moveNext() from spot works");
         });
       });
 
@@ -313,21 +313,30 @@
         sortedTestSet = new TreeSet()..addAll(nonSortedTestSet);
       });
 
-      test("union with non sorted set", () =>
-          expect(tree.union(nonSortedTestSet).toList(), equals(expectedUnion)));
-      test("union with sorted set", () =>
-          expect(tree.union(sortedTestSet).toList(), equals(expectedUnion)));
-      test("intersection with non sorted set", () => expect(
-          tree.intersection(nonSortedTestSet).toList(),
-          equals(expectedIntersection)));
-      test("intersection with sorted set", () => expect(
-          tree.intersection(sortedTestSet).toList(),
-          equals(expectedIntersection)));
-      test("difference with non sorted set", () => expect(
-          tree.difference(nonSortedTestSet).toList(),
-          equals(expectedDifference)));
-      test("difference with sorted set", () => expect(
-          tree.difference(sortedTestSet).toList(), equals(expectedDifference)));
+      test(
+          "union with non sorted set",
+          () => expect(
+              tree.union(nonSortedTestSet).toList(), equals(expectedUnion)));
+      test(
+          "union with sorted set",
+          () => expect(
+              tree.union(sortedTestSet).toList(), equals(expectedUnion)));
+      test(
+          "intersection with non sorted set",
+          () => expect(tree.intersection(nonSortedTestSet).toList(),
+              equals(expectedIntersection)));
+      test(
+          "intersection with sorted set",
+          () => expect(tree.intersection(sortedTestSet).toList(),
+              equals(expectedIntersection)));
+      test(
+          "difference with non sorted set",
+          () => expect(tree.difference(nonSortedTestSet).toList(),
+              equals(expectedDifference)));
+      test(
+          "difference with sorted set",
+          () => expect(tree.difference(sortedTestSet).toList(),
+              equals(expectedDifference)));
     });
 
     group("AVL implementaiton", () {
diff --git a/packages/quiver/test/core/optional_test.dart b/packages/quiver/test/core/optional_test.dart
index 0072ba1..df61566 100644
--- a/packages/quiver/test/core/optional_test.dart
+++ b/packages/quiver/test/core/optional_test.dart
@@ -70,25 +70,29 @@
     test('transform should return transformed value or absent', () {
       expect(new Optional<int>.fromNullable(7).transform((a) => a + 1),
           equals(new Optional<int>.of(8)));
-      expect(new Optional<int>.fromNullable(null)
-          .transform((a) => a + 1).isPresent, isFalse);
+      expect(
+          new Optional<int>.fromNullable(null)
+              .transform((a) => a + 1)
+              .isPresent,
+          isFalse);
     });
 
     test('hashCode should allow optionals to be in hash sets', () {
-      expect(new Set.from([
-        new Optional<int>.of(7),
-        new Optional<int>.of(8),
-        new Optional<int>.absent()
-      ]), equals(new Set.from([
-        new Optional<int>.of(7),
-        new Optional<int>.of(8),
-        new Optional<int>.absent()
-      ])));
-      expect(new Set.from([
-        new Optional<int>.of(7),
-        new Optional<int>.of(8)
-      ]), isNot(equals(
-          new Set.from([new Optional<int>.of(7), new Optional<int>.of(9)]))));
+      expect(
+          new Set.from([
+            new Optional<int>.of(7),
+            new Optional<int>.of(8),
+            new Optional<int>.absent()
+          ]),
+          equals(new Set.from([
+            new Optional<int>.of(7),
+            new Optional<int>.of(8),
+            new Optional<int>.absent()
+          ])));
+      expect(
+          new Set.from([new Optional<int>.of(7), new Optional<int>.of(8)]),
+          isNot(equals(new Set.from(
+              [new Optional<int>.of(7), new Optional<int>.of(9)]))));
     });
 
     test('== should compare by value', () {
@@ -106,5 +110,22 @@
       expect(new Optional<int>.fromNullable(null).toString(),
           equals('Optional { absent }'));
     });
+
+    test('length when absent should return 0', () {
+      expect(const Optional.absent().length, equals(0));
+    });
+
+    test('length when present should return 1', () {
+      expect(new Optional<int>.of(1).length, equals(1));
+    });
+
+    test('expand should behave as equivalent iterable', () {
+      final optionals = <Optional<int>>[
+        new Optional<int>.of(1),
+        const Optional.absent(),
+        new Optional<int>.of(2)
+      ].expand((i) => i);
+      expect(optionals, orderedEquals([1, 2]));
+    });
   });
 }
diff --git a/packages/quiver/test/io_test.dart b/packages/quiver/test/io_test.dart
index a194f8b..9f33565 100644
--- a/packages/quiver/test/io_test.dart
+++ b/packages/quiver/test/io_test.dart
@@ -28,7 +28,7 @@
       var string = '箙、靫';
       var encoded = UTF8.encoder.convert(string);
       var data = [encoded.sublist(0, 3), encoded.sublist(3)];
-      var stream = new Stream.fromIterable(data);
+      var stream = new Stream<List<int>>.fromIterable(data);
       byteStreamToString(stream).then((decoded) {
         expect(decoded, string);
       });
@@ -38,7 +38,7 @@
       var string = 'blåbærgrød';
       var encoded = LATIN1.encoder.convert(string);
       var data = [encoded.sublist(0, 4), encoded.sublist(4)];
-      var stream = new Stream.fromIterable(data);
+      var stream = new Stream<List<int>>.fromIterable(data);
       byteStreamToString(stream, encoding: LATIN1).then((decoded) {
         expect(decoded, string);
       });
@@ -114,8 +114,13 @@
         files.add(e);
         return new Future.value(!e.path.endsWith('dir2'));
       }).then((_) {
-        expect(files.map((e) => e.path), unorderedEquals(
-            ["$testPath/dir", "$testPath/dir/file", "$testPath/dir2",]));
+        expect(
+            files.map((e) => e.path),
+            unorderedEquals([
+              "$testPath/dir",
+              "$testPath/dir/file",
+              "$testPath/dir2",
+            ]));
       });
     });
 
diff --git a/packages/quiver/test/iterables/concat_test.dart b/packages/quiver/test/iterables/concat_test.dart
index 8745066..003ea7d 100644
--- a/packages/quiver/test/iterables/concat_test.dart
+++ b/packages/quiver/test/iterables/concat_test.dart
@@ -24,11 +24,20 @@
     });
 
     test('should handle single input iterables', () {
-      expect(concat([[1, 2, 3]]), [1, 2, 3]);
+      expect(
+          concat([
+            [1, 2, 3]
+          ]),
+          [1, 2, 3]);
     });
 
     test('should chain multiple input iterables', () {
-      expect(concat([[1, 2, 3], [-1, -2, -3]]), [1, 2, 3, -1, -2, -3]);
+      expect(
+          concat([
+            [1, 2, 3],
+            [-1, -2, -3]
+          ]),
+          [1, 2, 3, -1, -2, -3]);
     });
 
     test('should throw for null input', () {
@@ -36,7 +45,13 @@
     });
 
     test('should throw if any input is null', () {
-      expect(() => concat([[1, 2], null, [3, 4]]).toList(), throws);
+      expect(
+          () => concat([
+                [1, 2],
+                null,
+                [3, 4]
+              ]).toList(),
+          throws);
     });
 
     test('should reflectchanges in the inputs', () {
diff --git a/packages/quiver/test/iterables/enumerate_test.dart b/packages/quiver/test/iterables/enumerate_test.dart
index cc87047..eda5cdd 100644
--- a/packages/quiver/test/iterables/enumerate_test.dart
+++ b/packages/quiver/test/iterables/enumerate_test.dart
@@ -32,7 +32,7 @@
     test("should add indices to its argument", () {
       var e = enumerate(['a', 'b', 'c']);
       expect(e.map((v) => v.index), [0, 1, 2]);
-      expect(e.map((v) => v.index), [ 0, 1, 2 ],
+      expect(e.map((v) => v.index), [0, 1, 2],
           reason: 'should enumerate to the same values a second time');
     });
 
diff --git a/packages/quiver/test/iterables/merge_test.dart b/packages/quiver/test/iterables/merge_test.dart
index efc1eea..ee2ab3a 100644
--- a/packages/quiver/test/iterables/merge_test.dart
+++ b/packages/quiver/test/iterables/merge_test.dart
@@ -33,7 +33,12 @@
     });
 
     test("should merge single-element iterables", () {
-      expect(merge([['a'], ['b']]), ['a', 'b']);
+      expect(
+          merge([
+            ['a'],
+            ['b']
+          ]),
+          ['a', 'b']);
     });
 
     test("should output the union of elements in both iterables", () {
@@ -44,7 +49,7 @@
     test("should honor the comparator", () {
       var a = ['c', 'b', 'a'];
       expect(merge([a, a], (x, y) => -x.compareTo(y)),
-          [ 'c', 'c', 'b', 'b', 'a', 'a' ]);
+          ['c', 'c', 'b', 'b', 'a', 'a']);
     });
 
     test("should merge empty iterables with non-empty ones", () {
@@ -78,10 +83,18 @@
       var b = ['b', 'e', 'h', 'k'];
       var c = ['c', 'f', 'i', 'l'];
       var expected = [
-        'a', 'b', 'c',
-        'd', 'e', 'f',
-        'g', 'h', 'i',
-        'j', 'k', 'l'
+        'a',
+        'b',
+        'c',
+        'd',
+        'e',
+        'f',
+        'g',
+        'h',
+        'i',
+        'j',
+        'k',
+        'l'
       ];
       expect(merge([a, b, c]), expected);
       expect(merge([a, c, b]), expected);
diff --git a/packages/quiver/test/iterables/partition_test.dart b/packages/quiver/test/iterables/partition_test.dart
index c581e17..903f125 100644
--- a/packages/quiver/test/iterables/partition_test.dart
+++ b/packages/quiver/test/iterables/partition_test.dart
@@ -44,7 +44,8 @@
       expect(it.current, isNull);
     });
 
-    test('should return partitions of correct size if '
+    test(
+        'should return partitions of correct size if '
         'partition size > input size', () {
       var it = partition([1, 2, 3, 4, 5], 3).iterator;
       expect(it.moveNext(), isTrue);
diff --git a/packages/quiver/test/iterables/zip_test.dart b/packages/quiver/test/iterables/zip_test.dart
index 49a30f5..8835bc0 100644
--- a/packages/quiver/test/iterables/zip_test.dart
+++ b/packages/quiver/test/iterables/zip_test.dart
@@ -24,13 +24,40 @@
     });
 
     test("should zip equal length lists", () {
-      expect(zip([[1, 2, 3], ['a', 'b', 'c']]), [[1, 'a'], [2, 'b'], [3, 'c']]);
-      expect(zip([[1, 2], ['a', 'b'], [2, 4]]), [[1, 'a', 2], [2, 'b', 4]]);
+      expect(
+          zip([
+            [1, 2, 3],
+            ['a', 'b', 'c']
+          ]),
+          [
+            [1, 'a'],
+            [2, 'b'],
+            [3, 'c']
+          ]);
+      expect(
+          zip([
+            [1, 2],
+            ['a', 'b'],
+            [2, 4]
+          ]),
+          [
+            [1, 'a', 2],
+            [2, 'b', 4]
+          ]);
     });
 
     test("should stop at the end of the shortest iterable", () {
-      expect(zip([[1, 2], ['a', 'b'], []]), []);
-      expect(zip([range(2), range(4)]), [[0, 0], [1, 1]]);
+      expect(
+          zip([
+            [1, 2],
+            ['a', 'b'],
+            []
+          ]),
+          []);
+      expect(zip([range(2), range(4)]), [
+        [0, 0],
+        [1, 1]
+      ]);
     });
   });
 }
diff --git a/packages/quiver/test/mirrors_test.dart b/packages/quiver/test/mirrors_test.dart
index f8304ba..f69571e 100644
--- a/packages/quiver/test/mirrors_test.dart
+++ b/packages/quiver/test/mirrors_test.dart
@@ -76,7 +76,7 @@
     test('should be callable', () {
       var i = 2;
       var mirror = reflect(i);
-      var method = new Method(mirror, const Symbol('+'));
+      var method = new Method(mirror, const Symbol('+')) as dynamic;
       expect(method(3), 5);
     });
 
@@ -84,7 +84,7 @@
       // this test will fail when named argument support is added
       var i = [1, 2];
       var mirror = reflect(i);
-      var method = new Method(mirror, const Symbol('toList'));
+      var method = new Method(mirror, const Symbol('toList')) as dynamic;
       expect(method(growable: false), [1, 2]);
     });
   });
diff --git a/packages/quiver/test/pattern/glob_test.dart b/packages/quiver/test/pattern/glob_test.dart
index 47f825a..2923583 100644
--- a/packages/quiver/test/pattern/glob_test.dart
+++ b/packages/quiver/test/pattern/glob_test.dart
@@ -20,8 +20,7 @@
 main() {
   group('Glob', () {
     test('should match "*" against sequences of word chars', () {
-      expectGlob("*.html",
-          matches: [
+      expectGlob("*.html", matches: [
         "a.html",
         "_-\a.html",
         r"^$*?.html",
@@ -30,8 +29,11 @@
         "\u21ad.html",
         "♥.html",
         "\u2665.html"
-      ],
-          nonMatches: ["a.htm", "a.htmlx", "/a.html"]);
+      ], nonMatches: [
+        "a.htm",
+        "a.htmlx",
+        "/a.html"
+      ]);
       expectGlob("foo.*",
           matches: ["foo.html"],
           nonMatches: ["afoo.html", "foo/a.html", "foo.html/a"]);
diff --git a/packages/quiver/test/streams/all_tests.dart b/packages/quiver/test/streams/all_tests.dart
deleted file mode 100644
index 3ae437c..0000000
--- a/packages/quiver/test/streams/all_tests.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.streams.all_tests;
-
-import 'collect_test.dart' as collect;
-import 'concat_test.dart' as concat;
-import 'enumerate_test.dart' as enumerate;
-import 'streambuffer_test.dart' as streambuffer;
-
-main() {
-  collect.main();
-  concat.main();
-  enumerate.main();
-  streambuffer.main();
-}
diff --git a/packages/quiver/test/strings_test.dart b/packages/quiver/test/strings_test.dart
index 836a901..335e0f3 100644
--- a/packages/quiver/test/strings_test.dart
+++ b/packages/quiver/test/strings_test.dart
@@ -15,7 +15,7 @@
 library quiver.strings;
 
 import 'package:quiver/strings.dart';
-import 'package:test/test.dart' hide isEmpty;
+import 'package:test/test.dart' hide isEmpty, isNotEmpty;
 
 main() {
   group('isBlank', () {
@@ -48,39 +48,43 @@
     });
   });
 
-  group('flip', () {
-    test('should flip characters in a string', () {
-      expect(flip('ab'), 'ba');
+  group('isNotEmpty', () {
+    test('should consider null to be empty', () {
+      expect(isNotEmpty(null), isFalse);
+    });
+    test('should consider the empty string to be empty', () {
+      expect(isNotEmpty(''), isFalse);
+    });
+    test('should consider whitespace string to be not empty', () {
+      expect(isNotEmpty(' '), isTrue);
+    });
+    test('should consider non-whitespace string to be not empty', () {
+      expect(isNotEmpty('hello'), isTrue);
+    });
+  });
+
+  group('isDigit', () {
+    test('should return true for standard digits', () {
+      for (var i = 0; i <= 9; i++) {
+        expect(isDigit('$i'.codeUnitAt(0)), isTrue);
+      }
+    });
+    test('should return false for non-digits', () {
+      expect(isDigit('a'.codeUnitAt(0)), isFalse);
+      expect(isDigit(' '.codeUnitAt(0)), isFalse);
+      expect(isDigit('%'.codeUnitAt(0)), isFalse);
+    });
+  });
+
+  group('reverse', () {
+    test('should reverse characters in a string', () {
+      expect(reverse('ab'), 'ba');
     });
     test('should return null as null', () {
-      expect(flip(null), null);
+      expect(reverse(null), null);
     });
     test('should return empty string as empty string', () {
-      expect(flip(''), '');
-    });
-  });
-
-  group('nullToEmpty', () {
-    test('should turn null to empty string', () {
-      expect(nullToEmpty(null), '');
-    });
-    test('should leave non-null string unchanged', () {
-      expect(nullToEmpty('hi!'), 'hi!');
-    });
-    test('should leave empty string unchanged', () {
-      expect(nullToEmpty(''), '');
-    });
-  });
-
-  group('emptyToNull', () {
-    test('should turn empty string to null', () {
-      expect(emptyToNull(''), null);
-    });
-    test('should leave non-null string unchanged', () {
-      expect(emptyToNull('hi!'), 'hi!');
-    });
-    test('should leave null as null', () {
-      expect(emptyToNull(null), null);
+      expect(reverse(''), '');
     });
   });
 
@@ -88,7 +92,8 @@
     test('should repeat a non-empty string', () {
       expect(repeat('ab', 3), 'ababab');
     });
-    test('should repeat flipped non-empty string '
+    test(
+        'should repeat flipped non-empty string '
         'on negative number of times', () {
       expect(repeat('ab', -3), 'bababa');
     });
@@ -161,94 +166,6 @@
     });
   });
 
-  group('padLeft', () {
-    test('should return the input if length greater than width', () {
-      expect(padLeft('abc', 2, '0'), 'abc');
-      expect(padLeft('abc', 3, '0'), 'abc');
-    });
-
-    test('should pad on the left if length less than width', () {
-      expect(padLeft('abc', 4, '0'), '0abc');
-      expect(padLeft('abc', 6, '0'), '000abc');
-    });
-
-    test('should use multi-character fills', () {
-      expect(padLeft('abc', 4, '012345'), '0abc');
-      expect(padLeft('abc', 6, '012345'), '012abc');
-      expect(padLeft('abc', 8, '012'), '01201abc');
-    });
-
-    test('should handle null and empty inputs', () {
-      expect(padLeft(null, 4, '012345'), '0123');
-      expect(padLeft('', 4, '012345'), '0123');
-      expect(padLeft(null, 4, '012'), '0120');
-      expect(padLeft('', 4, '012'), '0120');
-    });
-  });
-
-  group('padRight', () {
-    test('should return the input if length greater than width', () {
-      expect(padRight('abc', 2, '0'), 'abc');
-      expect(padRight('abc', 3, '0'), 'abc');
-    });
-
-    test('should pad on the right if length less than width', () {
-      expect(padRight('abc', 4, '0'), 'abc0');
-      expect(padRight('abc', 6, '0'), 'abc000');
-    });
-
-    test('should use multi-character fills', () {
-      expect(padRight('abc', 4, '012345'), 'abc5');
-      expect(padRight('abc', 6, '012345'), 'abc345');
-      expect(padRight('abc', 8, '012'), 'abc12012');
-    });
-
-    test('should handle null and empty inputs', () {
-      expect(padRight(null, 4, '012345'), '2345');
-      expect(padRight('', 4, '012345'), '2345');
-      expect(padRight(null, 4, '012'), '2012');
-      expect(padRight('', 4, '012'), '2012');
-    });
-  });
-
-  group('trimLeft', () {
-    test('should trim whitespace from the left', () {
-      expect(trimLeft(''), '');
-      expect(trimLeft(' '), '');
-      expect(trimLeft('  abc  '), 'abc  ');
-      expect(trimLeft('  abc def  '), 'abc def  ');
-      expect(trimLeft('\t\vabc  '), 'abc  ');
-      // these are some of the whitespace chars not defined for RexExps
-      expect(trimLeft('\u000Aabc  '), 'abc  ');
-      expect(trimLeft('\u000Dabc  '), 'abc  ');
-      expect(trimLeft('\u0085abc  '), 'abc  ');
-      expect(trimLeft('\u1680abc  '), 'abc  ');
-    });
-
-    test('should throw on null', () {
-      expect(() => trimLeft(null), throws);
-    });
-  });
-
-  group('trimRight', () {
-    test('should trim whitespace from the right', () {
-      expect(trimRight(''), '');
-      expect(trimRight(' '), '');
-      expect(trimRight('  abc  '), '  abc');
-      expect(trimRight('  abc def  '), '  abc def');
-      expect(trimRight('  abc\t\v'), '  abc');
-      // these are some of the whitespace chars not defined for RexExps
-      expect(trimRight('  abc\u000A'), '  abc');
-      expect(trimRight('  abc\u000D'), '  abc');
-      expect(trimRight('  abc\u0085'), '  abc');
-      expect(trimRight('  abc\u1680'), '  abc');
-    });
-
-    test('should throw on null', () {
-      expect(() => trimRight(null), throws);
-    });
-  });
-
   group('center', () {
     test('should return the input if length greater than width', () {
       expect(center('abc', 2, '0'), 'abc');
diff --git a/packages/quiver/test/testing/async/fake_async_test.dart b/packages/quiver/test/testing/async/fake_async_test.dart
index 4f20fb0..17209e6 100644
--- a/packages/quiver/test/testing/async/fake_async_test.dart
+++ b/packages/quiver/test/testing/async/fake_async_test.dart
@@ -172,6 +172,7 @@
                 scheduleMicrotask(() => microtaskCalls++);
               }
             }
+
             scheduleMicrotasks();
             new Timer.periodic(elapseBy ~/ 5, (_) {
               timerCalls++;
@@ -208,14 +209,14 @@
 
         test('should add event before advancing time', () {
           return new Future(() => new FakeAsync().run((async) {
-            var controller = new StreamController();
-            var ret = controller.stream.first.then((_) {
-              expect(async.getClock(initialTime).now(), initialTime);
-            });
-            controller.add(null);
-            async.elapse(const Duration(minutes: 1));
-            return ret;
-          }));
+                var controller = new StreamController();
+                var ret = controller.stream.first.then((_) {
+                  expect(async.getClock(initialTime).now(), initialTime);
+                });
+                controller.add(null);
+                async.elapse(const Duration(minutes: 1));
+                return ret;
+              }));
         });
 
         test('should increase negative duration timers to zero duration', () {
@@ -286,9 +287,12 @@
         test('should work with Future.timeout', () {
           new FakeAsync().run((async) {
             var completer = new Completer();
-            var timed = completer.future.timeout(elapseBy ~/ 2);
-            expect(timed, throwsA(new isInstanceOf<TimeoutException>()));
+            TimeoutException timeout;
+            completer.future.timeout(elapseBy ~/ 2).catchError((err) {
+              timeout = err;
+            });
             async.elapse(elapseBy);
+            expect(timeout, new isInstanceOf<TimeoutException>());
             completer.complete();
           });
         });
@@ -303,10 +307,10 @@
             StreamSubscription subscription;
             var periodic =
                 new Stream.periodic(const Duration(minutes: 1), (i) => i);
-            subscription = periodic.listen(events.add, cancelOnError: true);
+            subscription = periodic.listen(events.add);
             async.elapse(const Duration(minutes: 3));
-            subscription.cancel();
             expect(events, [0, 1, 2]);
+            subscription.cancel();
           });
         });
 
@@ -316,16 +320,15 @@
             var errors = [];
             var controller = new StreamController();
             var timed = controller.stream.timeout(const Duration(minutes: 2));
-            var subscription = timed.listen(events.add,
-                onError: errors.add, cancelOnError: true);
+            var subscription = timed.listen(events.add, onError: errors.add);
             controller.add(0);
             async.elapse(const Duration(minutes: 1));
             expect(events, [0]);
             async.elapse(const Duration(minutes: 1));
-            subscription.cancel();
             expect(errors, hasLength(1));
             expect(errors.first, new isInstanceOf<TimeoutException>());
-            return controller.close();
+            subscription.cancel();
+            controller.close();
           });
         });
       });
@@ -370,7 +373,7 @@
           new Future(() {
             log.add(2);
           });
-          new Timer.periodic(new Duration(seconds: 1), (_) {
+          new Timer.periodic(const Duration(seconds: 1), (_) {
             log.add(2);
           });
           async.flushMicrotasks();
@@ -402,10 +405,10 @@
       test('should run collateral periodic timers', () {
         new FakeAsync().run((async) {
           final log = [];
-          new Future.delayed(new Duration(seconds: 2), () {
+          new Future.delayed(const Duration(seconds: 2), () {
             log.add('delayed');
           });
-          new Timer.periodic(new Duration(seconds: 1), (_) {
+          new Timer.periodic(const Duration(seconds: 1), (_) {
             log.add('periodic');
           });
           expect(log, hasLength(0), reason: 'should not flush until asked to');
@@ -433,14 +436,17 @@
         new FakeAsync().run((async) {
           int count = 0;
           createTimer() {
-            new Future.delayed(new Duration(minutes: 30), () {
+            new Future.delayed(const Duration(minutes: 30), () {
               count++;
               createTimer();
             });
           }
+
           createTimer();
-          expect(() => async.flushTimers(
-                  timeout: new Duration(hours: 2), flushPeriodicTimers: false),
+          expect(
+              () => async.flushTimers(
+                  timeout: const Duration(hours: 2),
+                  flushPeriodicTimers: false),
               throwsStateError);
           expect(count, 4);
         });
@@ -449,10 +455,10 @@
       test('should timeout periodic timers', () {
         new FakeAsync().run((async) {
           int count = 0;
-          new Timer.periodic(new Duration(minutes: 30), (Timer timer) {
+          new Timer.periodic(const Duration(minutes: 30), (Timer timer) {
             count++;
           });
-          expect(() => async.flushTimers(timeout: new Duration(hours: 1)),
+          expect(() => async.flushTimers(timeout: const Duration(hours: 1)),
               throwsStateError);
           expect(count, 2);
         });
@@ -461,13 +467,13 @@
       test('should flush periodic timers', () {
         new FakeAsync().run((async) {
           int count = 0;
-          new Timer.periodic(new Duration(minutes: 30), (Timer timer) {
+          new Timer.periodic(const Duration(minutes: 30), (Timer timer) {
             if (count == 3) {
               timer.cancel();
             }
             count++;
           });
-          async.flushTimers(timeout: new Duration(hours: 20));
+          async.flushTimers(timeout: const Duration(hours: 20));
           expect(count, 4);
         });
       });
@@ -477,7 +483,7 @@
           final log = [];
           int count = 0;
           createTimer() {
-            new Future.delayed(new Duration(minutes: 30), () {
+            new Future.delayed(const Duration(minutes: 30), () {
               log.add(count);
               count++;
               if (count < 4) {
@@ -485,9 +491,10 @@
               }
             });
           }
+
           createTimer();
-          async.elapse(new Duration(hours: 1));
-          async.flushTimers(timeout: new Duration(hours: 1));
+          async.elapse(const Duration(hours: 1));
+          async.flushTimers(timeout: const Duration(hours: 1));
           expect(count, 4);
         });
       });
@@ -509,12 +516,12 @@
       test('it should report the number of pending periodic timers', () {
         new FakeAsync().run((async) {
           expect(async.periodicTimerCount, 0);
-          Timer timer = new Timer.periodic(new Duration(minutes: 30),
-              (Timer timer) { });
+          Timer timer =
+              new Timer.periodic(const Duration(minutes: 30), (Timer timer) {});
           expect(async.periodicTimerCount, 1);
-          new Timer.periodic(new Duration(minutes: 20), (Timer timer) { });
+          new Timer.periodic(const Duration(minutes: 20), (Timer timer) {});
           expect(async.periodicTimerCount, 2);
-          async.elapse(new Duration(minutes: 20));
+          async.elapse(const Duration(minutes: 20));
           expect(async.periodicTimerCount, 2);
           timer.cancel();
           expect(async.periodicTimerCount, 1);
@@ -524,16 +531,37 @@
       test('it should report the number of pending non periodic timers', () {
         new FakeAsync().run((async) {
           expect(async.nonPeriodicTimerCount, 0);
-          Timer timer = new Timer(new Duration(minutes: 30), () { });
+          Timer timer = new Timer(const Duration(minutes: 30), () {});
           expect(async.nonPeriodicTimerCount, 1);
-          new Timer(new Duration(minutes: 20), () { });
+          new Timer(const Duration(minutes: 20), () {});
           expect(async.nonPeriodicTimerCount, 2);
-          async.elapse(new Duration(minutes: 25));
+          async.elapse(const Duration(minutes: 25));
           expect(async.nonPeriodicTimerCount, 1);
           timer.cancel();
           expect(async.nonPeriodicTimerCount, 0);
         });
       });
     });
+
+    group('timers', () {
+      test('should behave like real timers', () {
+        return new FakeAsync().run((async) {
+          var timeout = const Duration(minutes: 1);
+          int counter = 0;
+          var timer;
+          timer = new Timer(timeout, () {
+            counter++;
+            expect(timer.isActive, isFalse,
+                reason: "is not active while executing callback");
+          });
+          expect(timer.isActive, isTrue,
+              reason: "is active before executing callback");
+          async.elapse(timeout);
+          expect(counter, equals(1), reason: "timer executed");
+          expect(timer.isActive, isFalse,
+              reason: "is not active after executing callback");
+        });
+      });
+    });
   });
 }
diff --git a/packages/quiver/test/testing/equality/equality_test.dart b/packages/quiver/test/testing/equality/equality_test.dart
index ef89ee7..dea3cb2 100644
--- a/packages/quiver/test/testing/equality/equality_test.dart
+++ b/packages/quiver/test/testing/equality/equality_test.dart
@@ -42,7 +42,10 @@
 
     test('Test null group name yields error', () {
       try {
-        expect({'null': [reference], null: [reference]}, areEqualityGroups);
+        expect({
+          'null': [reference],
+          null: [reference]
+        }, areEqualityGroups);
         fail('Should fail with null group name');
       } catch (e) {
         expect(e.toString(), contains('Group name must not be null'));
@@ -60,33 +63,43 @@
 
     test('Test after adding multiple instances at once with a null', () {
       try {
-        expect(
-            {'bad group': [reference, equalObject1, null]}, areEqualityGroups);
+        expect({
+          'bad group': [reference, equalObject1, null]
+        }, areEqualityGroups);
         fail('Should fail with null group');
       } catch (e) {
-        expect(e.toString(), contains("$reference [group 'bad group', item 1]"
-            " must be equal to null [group 'bad group', item 3]"));
+        expect(
+            e.toString(),
+            contains("$reference [group 'bad group', item 1]"
+                " must be equal to null [group 'bad group', item 3]"));
       }
     });
 
     test('Test adding non-equal objects only in single group.', () {
       try {
-        expect(
-            {'not equal': [equalObject1, notEqualObject1]}, areEqualityGroups);
+        expect({
+          'not equal': [equalObject1, notEqualObject1]
+        }, areEqualityGroups);
         fail("Should get not equal to equal object error");
       } catch (e) {
-        expect(e.toString(), contains("$equalObject1 [group 'not equal', item"
-            " 1] must be equal to $notEqualObject1 [group 'not equal'"
-            ", item 2]"));
+        expect(
+            e.toString(),
+            contains("$equalObject1 [group 'not equal', item"
+                " 1] must be equal to $notEqualObject1 [group 'not equal'"
+                ", item 2]"));
       }
     });
 
-    test('Test with no equals or not equals objects. This checks'
+    test(
+        'Test with no equals or not equals objects. This checks'
         ' proper handling of null, incompatible class and reflexive tests', () {
-      expect({'single object': [reference]}, areEqualityGroups);
+      expect({
+        'single object': [reference]
+      }, areEqualityGroups);
     });
 
-    test('Test after populating equal objects. This checks proper'
+    test(
+        'Test after populating equal objects. This checks proper'
         ' handling of equality and verifies hashCode for valid objects', () {
       expect({
         'all equal': [reference, equalObject1, equalObject2]
@@ -97,7 +110,9 @@
         () {
       Object obj = new _NonReflexiveObject();
       try {
-        expect({'non-reflexive': [obj]}, areEqualityGroups);
+        expect({
+          'non-reflexive': [obj]
+        }, areEqualityGroups);
         fail("Should get non-reflexive error");
       } catch (e) {
         expect(e.toString(), contains("$obj must be equal to itself"));
@@ -107,30 +122,42 @@
     test('Test proper handling of case where hashcode is not idempotent', () {
       Object obj = new _InconsistentHashCodeObject(1, 2);
       try {
-        expect({'non-reflexive': [obj]}, areEqualityGroups);
+        expect({
+          'non-reflexive': [obj]
+        }, areEqualityGroups);
         fail("Should get non-reflexive error");
       } catch (e) {
-        expect(e.toString(), contains(
-            "the implementation of hashCode of $obj must be idempotent"));
+        expect(
+            e.toString(),
+            contains(
+                "the implementation of hashCode of $obj must be idempotent"));
       }
     });
 
-    test('Test proper handling where an object incorrectly tests for an '
+    test(
+        'Test proper handling where an object incorrectly tests for an '
         'incompatible class', () {
       Object obj = new _InvalidEqualsIncompatibleClassObject();
       try {
-        expect({'equals method broken': [obj]}, areEqualityGroups);
+        expect({
+          'equals method broken': [obj]
+        }, areEqualityGroups);
         fail("Should get equal to incompatible class error");
       } catch (e) {
-        expect(e.toString(), contains("$obj must not be equal to an "
-            "arbitrary object of another class"));
+        expect(
+            e.toString(),
+            contains("$obj must not be equal to an "
+                "arbitrary object of another class"));
       }
     });
 
-    test('Test proper handling where an object is not equal to one the user '
+    test(
+        'Test proper handling where an object is not equal to one the user '
         'has said should be equal', () {
       try {
-        expect({'non-equal': [reference, notEqualObject1]}, areEqualityGroups);
+        expect({
+          'non-equal': [reference, notEqualObject1]
+        }, areEqualityGroups);
         fail("Should get not equal to equal object error");
       } catch (e) {
         expect(
@@ -140,30 +167,40 @@
       }
     });
 
-    test('Test for an invalid hashCode method, i.e., one that returns '
+    test(
+        'Test for an invalid hashCode method, i.e., one that returns '
         'different value for objects that are equal according to the equals '
         'method', () {
       Object a = new _InvalidHashCodeObject(1, 2);
       Object b = new _InvalidHashCodeObject(1, 2);
       try {
-        expect({'invalid hashcode': [a, b]}, areEqualityGroups);
+        expect({
+          'invalid hashcode': [a, b]
+        }, areEqualityGroups);
         fail("Should get invalid hashCode error");
       } catch (e) {
-        expect(e.toString(), contains("the hashCode (${a.hashCode}) of $a"
-            " [group 'invalid hashcode', item 1] must be equal to the"
-            " hashCode (${b.hashCode}) of $b"));
+        expect(
+            e.toString(),
+            contains("the hashCode (${a.hashCode}) of $a"
+                " [group 'invalid hashcode', item 1] must be equal to the"
+                " hashCode (${b.hashCode}) of $b"));
       }
     });
 
     test('Symmetry Broken', () {
       try {
         expect({
-          'broken symmetry': [named('foo')..addPeers(['bar']), named('bar')]
+          'broken symmetry': [
+            named('foo')..addPeers(['bar']),
+            named('bar')
+          ]
         }, areEqualityGroups);
         fail("should fail because symmetry is broken");
       } catch (e) {
-        expect(e.toString(), contains("bar [group 'broken symmetry', item 2] "
-            "must be equal to foo [group 'broken symmetry', item 1]"));
+        expect(
+            e.toString(),
+            contains("bar [group 'broken symmetry', item 2] "
+                "must be equal to foo [group 'broken symmetry', item 1]"));
       }
     });
 
@@ -178,9 +215,11 @@
         }, areEqualityGroups);
         fail("should fail because transitivity is broken");
       } catch (e) {
-        expect(e.toString(), contains("bar [group 'transitivity broken', "
-            "item 2] must be equal to baz [group 'transitivity "
-            "broken', item 3]"));
+        expect(
+            e.toString(),
+            contains("bar [group 'transitivity broken', "
+                "item 2] must be equal to baz [group 'transitivity "
+                "broken', item 3]"));
       }
     });
 
@@ -192,8 +231,10 @@
         fail('should fail because of unequal objects in the same equality '
             'group');
       } catch (e) {
-        expect(e.toString(), contains("foo [group 'unequal objects', item 1] "
-            "must be equal to bar [group 'unequal objects', item 2]"));
+        expect(
+            e.toString(),
+            contains("foo [group 'unequal objects', item 1] "
+                "must be equal to bar [group 'unequal objects', item 2]"));
       }
     });
 
@@ -211,17 +252,19 @@
         }, areEqualityGroups);
         fail('should fail because transitivity is broken');
       } catch (e) {
-        expect(e.toString(), contains("bar [group 'transitivity one', item 2]"
-            " must not be equal to x [group 'transitivity two',"
-            " item 2]"));
+        expect(
+            e.toString(),
+            contains("bar [group 'transitivity one', item 2]"
+                " must not be equal to x [group 'transitivity two',"
+                " item 2]"));
       }
     });
 
     test('EqualityGroups', () {
       expect({
         'valid groups one': [
-          named('foo').addPeers(['bar']),
-          named('bar').addPeers(['foo'])
+          named('foo')..addPeers(['bar']),
+          named('bar')..addPeers(['foo'])
         ],
         'valid groups two': [named('baz'), named('baz')]
       }, areEqualityGroups);
@@ -238,10 +281,8 @@
   int get hashCode => super.hashCode;
 }
 
-/**
- * Test class with valid equals and hashCode methods. Testers created
- * with instances of this class should always pass.
- */
+/// Test class with valid equals and hashCode methods. Testers created
+/// with instances of this class should always pass.
 class _ValidTestObject {
   int aspect1;
   int aspect2;
@@ -354,5 +395,6 @@
   @override
   int get hashCode => 0;
 
-  @override String toString() => name;
+  @override
+  String toString() => name;
 }
diff --git a/packages/quiver/test/time/clock_test.dart b/packages/quiver/test/time/clock_test.dart
index bf6a55c..08c026a 100644
--- a/packages/quiver/test/time/clock_test.dart
+++ b/packages/quiver/test/time/clock_test.dart
@@ -43,8 +43,12 @@
       expect(
           new DateTime.now().difference(new Clock().now()).inMilliseconds.abs(),
           lessThan(epsilon));
-      expect(new DateTime.now().difference(const Clock().now()).inMilliseconds
-          .abs(), lessThan(epsilon));
+      expect(
+          new DateTime.now()
+              .difference(const Clock().now())
+              .inMilliseconds
+              .abs(),
+          lessThan(epsilon));
     });
 
     test('should return time provided by custom TimeFunction', () {
@@ -61,31 +65,35 @@
     });
 
     test('should return time Duration ago', () {
-      expect(subject.agoBy(new Duration(days: 366)), new DateTime(2012));
+      expect(subject.agoBy(const Duration(days: 366)), new DateTime(2012));
     });
 
     test('should return time Duration from now', () {
-      expect(subject.fromNowBy(new Duration(days: 365)), new DateTime(2014));
+      expect(subject.fromNowBy(const Duration(days: 365)), new DateTime(2014));
     });
 
     test('should return time parts ago', () {
-      expect(subject.ago(
-          days: 1,
-          hours: 1,
-          minutes: 1,
-          seconds: 1,
-          milliseconds: 1,
-          microseconds: 1000), new DateTime(2012, 12, 30, 22, 58, 58, 998));
+      expect(
+          subject.ago(
+              days: 1,
+              hours: 1,
+              minutes: 1,
+              seconds: 1,
+              milliseconds: 1,
+              microseconds: 1000),
+          new DateTime(2012, 12, 30, 22, 58, 58, 998));
     });
 
     test('should return time parts from now', () {
-      expect(subject.fromNow(
-          days: 1,
-          hours: 1,
-          minutes: 1,
-          seconds: 1,
-          milliseconds: 1,
-          microseconds: 1000), new DateTime(2013, 1, 2, 1, 1, 1, 2));
+      expect(
+          subject.fromNow(
+              days: 1,
+              hours: 1,
+              minutes: 1,
+              seconds: 1,
+              milliseconds: 1,
+              microseconds: 1000),
+          new DateTime(2013, 1, 2, 1, 1, 1, 2));
     });
 
     test('should return time micros ago', () {
diff --git a/packages/quiver/tool/travis.sh b/packages/quiver/tool/travis.sh
index ecf6577..d7d809c 100755
--- a/packages/quiver/tool/travis.sh
+++ b/packages/quiver/tool/travis.sh
@@ -13,6 +13,16 @@
 testing_libs=$(find lib/testing -maxdepth 1 -type f -name '*.dart')
 dartanalyzer $DARTANALYZER_FLAGS $libs $testing_libs test/all_tests.dart
 
+# Verify that dartfmt has been run
+if [[ "$TRAVIS_DART_VERSION" == "stable" ]]; then
+  # Only test on stable to avoid CI failure due to diffs between stable and dev.
+  echo "Checking dartfmt..."
+  if [[ $(dartfmt -n --set-exit-if-changed lib/ test/) ]]; then
+    echo "Failed dartfmt check: run dartfmt -w lib/ test/"
+    exit 1
+  fi
+fi
+
 # Run the tests.
 echo "Running tests..."
 pub run test:test
diff --git a/packages/quiver_iterables/.gitattributes b/packages/quiver_iterables/.gitattributes
deleted file mode 100644
index b0a6c1c..0000000
--- a/packages/quiver_iterables/.gitattributes
+++ /dev/null
@@ -1,2 +0,0 @@
-# Ensure line-endings are normalized to LF
-* text=auto
diff --git a/packages/quiver_iterables/.gitignore b/packages/quiver_iterables/.gitignore
deleted file mode 100644
index dcc1376..0000000
--- a/packages/quiver_iterables/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-# Pub
-.packages
-.pub
-build/
-packages
-pubspec.lock
-
-# IDE
-.idea
-.project
-.settings
-*.iml
-
-# Temp files
-*~
diff --git a/packages/quiver_iterables/.travis.yml b/packages/quiver_iterables/.travis.yml
deleted file mode 100644
index a4a70c4..0000000
--- a/packages/quiver_iterables/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: dart
-sudo: false
-dart:
-  - stable
-  - dev
-script: ./tool/travis.sh
-env:
-  - DARTANALYZER_FLAGS=--fatal-warnings
diff --git a/packages/quiver_iterables/CHANGELOG.md b/packages/quiver_iterables/CHANGELOG.md
deleted file mode 100644
index 824135d..0000000
--- a/packages/quiver_iterables/CHANGELOG.md
+++ /dev/null
@@ -1,2 +0,0 @@
-#### 1.0.0-dev.1
-   * Split from `quiver-dart`
diff --git a/packages/quiver_iterables/CONTRIBUTING.md b/packages/quiver_iterables/CONTRIBUTING.md
deleted file mode 100644
index a1368e8..0000000
--- a/packages/quiver_iterables/CONTRIBUTING.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# How to contribute
-
-### Sign our Contributor License Agreement (CLA)
-
-Even for small changes, we ask that you please sign the CLA electronically
-[here](https://developers.google.com/open-source/cla/individual).
-The CLA is necessary because you own the copyright to your changes, even
-after your contribution becomes part of our codebase, so we need your permission
-to use and distribute your code. You can find more details
-[here](https://code.google.com/p/dart/wiki/Contributing). You'll only need to
-do this once.
-
-### Contribution Guidelines
-
-We welcome your pull requests, issue reports and enhancement requests. To make
-the process as smooth as possible, we request the following:
-
-   * Sign the [CLA](https://cla.developers.google.com/about/google-individual)
-     (see above) before sending your pull request. It's quick, we promise!
-   * Have test cases for your changes and ensure that the existing ones pass in
-     checked mode.
-   * Run your changes through `dartfmt`. Follow the installation instructions
-     in the [dart_style](https://github.com/dart-lang/dart_style) README for
-     more info.
-   * Squash your commits into a single commit with a good description. You can
-     use `git rebase -i` for this. For more details on rebasing, check out
-     Atlassian's
-     [tutorial](https://www.atlassian.com/git/tutorials/rewriting-history).
-   * During code review, go ahead and pile up commits addressing review
-     comments. Once you get an LGTM (looks good to me) on the review, we'll ask
-     you to squash your commits one last time, then we'll be good to merge!
diff --git a/packages/quiver_iterables/LICENSE b/packages/quiver_iterables/LICENSE
deleted file mode 100644
index 7a4a3ea..0000000
--- a/packages/quiver_iterables/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor 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, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
\ No newline at end of file
diff --git a/packages/quiver_iterables/README.md b/packages/quiver_iterables/README.md
deleted file mode 100644
index d9c4dc4..0000000
--- a/packages/quiver_iterables/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-Quiver Iterables
-================
-
-A collection of utilities for generating and manipulating Dart Iterables.
-
-[![Build Status](https://travis-ci.org/QuiverDart/quiver_iterables.svg?branch=master)](https://travis-ci.org/QuiverDart/quiver_iterables)
-[![Coverage Status](https://img.shields.io/coveralls/QuiverDart/quiver_iterables.svg)](https://coveralls.io/r/QuiverDart/quiver_iterables)
-
-## Documentation
-
-[API Docs](http://www.dartdocs.org/documentation/quiver_iterables/latest)
-
-`concat`, `count`, `cycle`, `enumerate`, `merge`, `partition`, `range`, and
-`zip` create, transform, or combine Iterables in different ways, similar to
-Python's itertools.
-
-`min`, `max`, and `extent` retrieve the minimum and maximum elements from an
-iterable.
-
-`GeneratingIterable` is an easy way to create lazy iterables that produce
-elements by calling a function. A common use-case is to traverse properties in
-an object graph, like the parent relationship in a tree.
-
-`InfiniteIterable` is a base class for Iterables that throws on operations that
-require a finite length.
diff --git a/packages/quiver_iterables/lib/iterables.dart b/packages/quiver_iterables/lib/iterables.dart
deleted file mode 100644
index 26130bd..0000000
--- a/packages/quiver_iterables/lib/iterables.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables;
-
-import 'dart:collection';
-
-part 'src/concat.dart';
-part 'src/count.dart';
-part 'src/cycle.dart';
-part 'src/enumerate.dart';
-part 'src/infinite_iterable.dart';
-part 'src/merge.dart';
-part 'src/min_max.dart';
-part 'src/partition.dart';
-part 'src/generating_iterable.dart';
-part 'src/range.dart';
-part 'src/zip.dart';
diff --git a/packages/quiver_iterables/lib/src/concat.dart b/packages/quiver_iterables/lib/src/concat.dart
deleted file mode 100644
index e32c269..0000000
--- a/packages/quiver_iterables/lib/src/concat.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns the concatentation of the input iterables.
-///
-/// The returned iterable is a lazily-evaluated view on the input iterables.
-Iterable concat(Iterable<Iterable> iterables) => iterables.expand((x) => x);
diff --git a/packages/quiver_iterables/lib/src/count.dart b/packages/quiver_iterables/lib/src/count.dart
deleted file mode 100644
index 093423a..0000000
--- a/packages/quiver_iterables/lib/src/count.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns an infinite [Iterable] of [num]s, starting from [start] and
-/// increasing by [step].
-Iterable<num> count([num start = 0, num step = 1]) sync* {
-  while (true) {
-    yield start;
-    start += step;
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/cycle.dart b/packages/quiver_iterables/lib/src/cycle.dart
deleted file mode 100644
index 7f1614d..0000000
--- a/packages/quiver_iterables/lib/src/cycle.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns an [Iterable] that infinitely cycles through the elements of
-/// [iterable]. If [iterable] is empty, the returned Iterable will also be empty.
-Iterable cycle(Iterable iterable) => new _Cycle(iterable);
-
-class _Cycle<T> extends InfiniteIterable<T> {
-  final Iterable<T> _iterable;
-
-  _Cycle(this._iterable);
-
-  Iterator<T> get iterator => new _CycleIterator(_iterable);
-
-  bool get isEmpty => _iterable.isEmpty;
-
-  bool get isNotEmpty => _iterable.isNotEmpty;
-
-  // TODO(justin): add methods that can be answered by the wrapped iterable
-}
-
-class _CycleIterator<T> implements Iterator<T> {
-  final Iterable<T> _iterable;
-  Iterator<T> _iterator;
-
-  _CycleIterator(_iterable)
-      : _iterable = _iterable,
-        _iterator = _iterable.iterator;
-
-  T get current => _iterator.current;
-
-  bool moveNext() {
-    if (!_iterator.moveNext()) {
-      _iterator = _iterable.iterator;
-      return _iterator.moveNext();
-    }
-    return true;
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/enumerate.dart b/packages/quiver_iterables/lib/src/enumerate.dart
deleted file mode 100644
index b0f8e40..0000000
--- a/packages/quiver_iterables/lib/src/enumerate.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns an [Iterable] of [IndexedValue]s where the nth value holds the nth
-/// element of [iterable] and its index.
-Iterable<IndexedValue> enumerate(Iterable iterable) =>
-    new EnumerateIterable(iterable);
-
-class IndexedValue<V> {
-  final int index;
-  final V value;
-
-  IndexedValue(this.index, this.value);
-
-  operator ==(o) => o is IndexedValue && o.index == index && o.value == value;
-  int get hashCode => index * 31 + value.hashCode;
-  String toString() => '($index, $value)';
-}
-
-/// An [Iterable] of [IndexedValue]s where the nth value holds the nth
-/// element of [iterable] and its index. See [enumerate].
-// This was inspired by MappedIterable internal to Dart collections.
-class EnumerateIterable<V> extends IterableBase<IndexedValue<V>> {
-  final Iterable<V> _iterable;
-
-  EnumerateIterable(this._iterable);
-
-  Iterator<IndexedValue<V>> get iterator =>
-      new EnumerateIterator<V>(_iterable.iterator);
-
-  // Length related functions are independent of the mapping.
-  int get length => _iterable.length;
-  bool get isEmpty => _iterable.isEmpty;
-
-  // Index based lookup can be done before transforming.
-  IndexedValue<V> get first => new IndexedValue<V>(0, _iterable.first);
-  IndexedValue<V> get last => new IndexedValue<V>(length - 1, _iterable.last);
-  IndexedValue<V> get single => new IndexedValue<V>(0, _iterable.single);
-  IndexedValue<V> elementAt(int index) =>
-      new IndexedValue<V>(index, _iterable.elementAt(index));
-}
-
-/// The [Iterator] returned by [EnumerateIterable.iterator].
-class EnumerateIterator<V> extends Iterator<IndexedValue<V>> {
-  final Iterator<V> _iterator;
-  int _index = 0;
-  IndexedValue<V> _current;
-
-  EnumerateIterator(this._iterator);
-
-  IndexedValue<V> get current => _current;
-
-  bool moveNext() {
-    if (_iterator.moveNext()) {
-      _current = new IndexedValue(_index++, _iterator.current);
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/generating_iterable.dart b/packages/quiver_iterables/lib/src/generating_iterable.dart
deleted file mode 100644
index 13041a6..0000000
--- a/packages/quiver_iterables/lib/src/generating_iterable.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-Iterable generate(initial(), next(o)) => new GeneratingIterable(initial, next);
-
-/// An Iterable who's first value is [object] and who's subsequent values are
-/// generated by passing the current value to the [next] function.
-///
-/// The class is useful for creating lazy iterables from object hierarchies and
-/// graphs.
-///
-/// It's important that for the given initial value and next function that the
-/// sequence of items eventually terminates. Otherwise calling methods that
-/// expect a finite sequence, like `length` or `last`, will cause an infinite
-/// loop.
-///
-/// Example:
-///
-///     class Node {
-///       Node parent;
-///
-///       /// An iterable of node and all ancestors up to the root.
-///       Iterable<Node> ancestors =
-///           new GeneratingIterable<Node>(() => this, (n) => n.parent);
-///
-///       /// An iterable of the root and the path of nodes to this. The
-///       /// reverse of ancestors.
-///       Iterable<Node> path = ancestors.toList().reversed();
-///     }
-///
-class GeneratingIterable<T> extends IterableBase<T> {
-  final initial;
-  final next;
-
-  GeneratingIterable(T this.initial(), T this.next(T o));
-
-  @override
-  Iterator<T> get iterator => new _GeneratingIterator(initial(), next);
-}
-
-class _GeneratingIterator<T> implements Iterator<T> {
-  final next;
-  T object;
-  bool started = false;
-
-  _GeneratingIterator(T this.object, T this.next(T o));
-
-  @override
-  T get current => started ? object : null;
-
-  @override
-  bool moveNext() {
-    if (object == null) return false;
-    if (started) {
-      object = next(object);
-    } else {
-      started = true;
-    }
-    return object != null;
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/infinite_iterable.dart b/packages/quiver_iterables/lib/src/infinite_iterable.dart
deleted file mode 100644
index 69085ea..0000000
--- a/packages/quiver_iterables/lib/src/infinite_iterable.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// A base class for [Iterable]s of infinite length that throws
-/// [UnsupportedError] for methods that would require the Iterable to terminate.
-abstract class InfiniteIterable<T> extends IterableBase<T> {
-  bool get isEmpty => false;
-
-  bool get isNotEmpty => true;
-
-  T get last => throw new UnsupportedError('last');
-
-  int get length => throw new UnsupportedError('length');
-
-  T get single => throw new StateError('single');
-
-  bool every(bool f(T element)) => throw new UnsupportedError('every');
-
-  bool fold(initialValue, combine(previousValue, T element)) =>
-      throw new UnsupportedError('fold');
-
-  void forEach(void f(T element)) => throw new UnsupportedError('forEach');
-
-  String join([String separator = '']) => throw new UnsupportedError('join');
-
-  T lastWhere(bool test(T value), {T orElse()}) =>
-      throw new UnsupportedError('lastWhere');
-
-  T reduce(T combine(T value, T element)) =>
-      throw new UnsupportedError('reduce');
-
-  List<T> toList({bool growable: true}) => throw new UnsupportedError('toList');
-
-  Set<T> toSet() => throw new UnsupportedError('toSet');
-}
diff --git a/packages/quiver_iterables/lib/src/merge.dart b/packages/quiver_iterables/lib/src/merge.dart
deleted file mode 100644
index 99466e3..0000000
--- a/packages/quiver_iterables/lib/src/merge.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns the result of merging an [Iterable] of [Iterable]s, according to
-/// the order specified by the [compare] function. This function assumes the
-/// provided iterables are already sorted according to the provided [compare]
-/// function. It will not check for this condition or sort the iterables.
-///
-/// The compare function must act as a [Comparator]. If [compare] is omitted,
-/// [Comparable.compare] is used.
-///
-/// If any of the [iterables] contain null elements, an exception will be
-/// thrown.
-Iterable merge(Iterable<Iterable> iterables,
-        [Comparator compare = Comparable.compare]) =>
-    (iterables.isEmpty) ? const [] : new _Merge(iterables, compare);
-
-class _Merge extends IterableBase {
-  final Iterable<Iterable> _iterables;
-  final Comparator _compare;
-
-  _Merge(this._iterables, this._compare);
-
-  Iterator get iterator => new _MergeIterator(
-      _iterables.map((i) => i.iterator).toList(growable: false), _compare);
-
-  String toString() => this.toList().toString();
-}
-
-/// Like [Iterator] but one element ahead.
-class _IteratorPeeker {
-  final Iterator _iterator;
-  bool _hasCurrent;
-
-  _IteratorPeeker(Iterator iterator)
-      : _iterator = iterator,
-        _hasCurrent = iterator.moveNext();
-
-  moveNext() {
-    _hasCurrent = _iterator.moveNext();
-  }
-
-  get current => _iterator.current;
-}
-
-class _MergeIterator implements Iterator {
-  final List<_IteratorPeeker> _peekers;
-  final Comparator _compare;
-  var _current;
-
-  _MergeIterator(List<Iterator> iterators, this._compare)
-      : _peekers = iterators.map((i) => new _IteratorPeeker(i)).toList();
-
-  bool moveNext() {
-    // Pick the peeker that's peeking at the puniest piece
-    _IteratorPeeker minIter = null;
-    for (var p in _peekers) {
-      if (p._hasCurrent) {
-        if (minIter == null || _compare(p.current, minIter.current) < 0) {
-          minIter = p;
-        }
-      }
-    }
-
-    if (minIter == null) {
-      return false;
-    }
-    _current = minIter.current;
-    minIter.moveNext();
-    return true;
-  }
-
-  get current => _current;
-}
diff --git a/packages/quiver_iterables/lib/src/min_max.dart b/packages/quiver_iterables/lib/src/min_max.dart
deleted file mode 100644
index 41ef95a..0000000
--- a/packages/quiver_iterables/lib/src/min_max.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns the maximum value in [i], according to the order specified by the
-/// [compare] function, or `null` if [i] is empty.
-///
-/// The compare function must act as a [Comparator]. If [compare] is omitted,
-/// [Comparable.compare] is used. If [i] contains null elements, an exception
-/// will be thrown.
-///
-dynamic max(Iterable i, [Comparator compare = Comparable.compare]) =>
-    i.isEmpty ? null : i.reduce((a, b) => compare(a, b) > 0 ? a : b);
-
-/// Returns the minimum value in [i], according to the order specified by the
-/// [compare] function, or `null` if [i] is empty.
-///
-/// The compare function must act as a [Comparator]. If [compare] is omitted,
-/// [Comparable.compare] is used. If [i] contains null elements, an exception
-/// will be thrown.
-dynamic min(Iterable i, [Comparator compare = Comparable.compare]) =>
-    i.isEmpty ? null : i.reduce((a, b) => compare(a, b) < 0 ? a : b);
-
-/// Returns the minimum and maximum values in [i], according to the order
-/// specified by the [compare] function, in an [Extent] instance. Always returns
-/// an [Extent], but [Extent.min] and [Extent.max] may be `null` if [i] is empty.
-///
-/// The compare function must act as a [Comparator]. If [compare] is omitted,
-/// [Comparable.compare] is used. If [i] contains null elements, an exception
-/// will be thrown.
-///
-/// If [i] is empty, an [Extent] is returned with [:null:] values for [:min:] and
-/// [:max:], since there are no valid values for them.
-Extent extent(Iterable i, [Comparator compare = Comparable.compare]) {
-  var iterator = i.iterator;
-  var hasNext = iterator.moveNext();
-  if (!hasNext) return new Extent(null, null);
-  var max = iterator.current;
-  var min = iterator.current;
-  while (iterator.moveNext()) {
-    if (compare(max, iterator.current) < 0) max = iterator.current;
-    if (compare(min, iterator.current) > 0) min = iterator.current;
-  }
-  return new Extent(min, max);
-}
-
-class Extent {
-  final min;
-  final max;
-  Extent(this.min, this.max);
-}
diff --git a/packages/quiver_iterables/lib/src/partition.dart b/packages/quiver_iterables/lib/src/partition.dart
deleted file mode 100644
index 626c587..0000000
--- a/packages/quiver_iterables/lib/src/partition.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Partitions the input iterable into lists of the specified size.
-Iterable<List> partition(Iterable iterable, int size) {
-  if (size <= 0) throw new ArgumentError(size);
-  return _partition(iterable, size);
-}
-
-Iterable<List> _partition(Iterable iterable, int size) sync* {
-  if (iterable.isEmpty) return;
-  var iterator = iterable.iterator;
-  iterator.moveNext();
-  var first = iterator.current;
-  while (true) {
-    var part = [first];
-    for (var i = 0; i < size - 1; i++) {
-      if (!iterator.moveNext()) {
-        yield part;
-        return;
-      }
-      part.add(iterator.current);
-    }
-    yield part;
-    if (iterator.moveNext()) {
-      first = iterator.current;
-    } else {
-      return;
-    }
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/range.dart b/packages/quiver_iterables/lib/src/range.dart
deleted file mode 100644
index bb45a89..0000000
--- a/packages/quiver_iterables/lib/src/range.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns an [Iterable] sequence of [num]s.
-///
-/// If only one argument is provided, [start_or_stop] is the upper bound for the
-/// sequence. If two or more arguments are provided, [stop] is the upper bound.
-///
-/// The sequence starts at 0 if one argument is provided, or [start_or_stop] if
-/// two or more arguments are provided. The sequence increments by 1, or [step]
-/// if provided. [step] can be negative, in which case the sequence counts down
-/// from the starting point and [stop] must be less than the starting point so
-/// that it becomes the lower bound.
-Iterable<num> range(num start_or_stop, [num stop, num step]) {
-  var start = (stop == null) ? 0 : start_or_stop;
-  stop = (stop == null) ? start_or_stop : stop;
-  step = (step == null) ? 1 : step;
-  if (step == 0) {
-    throw new ArgumentError("step cannot be 0");
-  }
-  if ((step > 0) && (stop < start)) {
-    throw new ArgumentError("if step is positive,"
-        " stop must be greater than start");
-  }
-  if ((step < 0) && (stop > start)) {
-    throw new ArgumentError("if step is negative,"
-        " stop must be less than start");
-  }
-  return _range(start, stop, step);
-}
-
-Iterable<num> _range(num start, num stop, num step) sync* {
-  while (step < 0 ? start > stop : start < stop) {
-    yield start;
-    start += step;
-  }
-}
diff --git a/packages/quiver_iterables/lib/src/zip.dart b/packages/quiver_iterables/lib/src/zip.dart
deleted file mode 100644
index 6e8d81b..0000000
--- a/packages/quiver_iterables/lib/src/zip.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-part of quiver.iterables;
-
-/// Returns an [Iterable] of [List]s where the nth element in the returned
-/// iterable contains the nth element from every Iterable in [iterables]. The
-/// returned Iterable is as long as the shortest Iterable in the argument. If
-/// [iterables] is empty, it returns an empty list.
-Iterable<List> zip(Iterable<Iterable> iterables) sync* {
-  if (iterables.isEmpty) return;
-  var iterators = iterables.map((i) => i.iterator).toList(growable: false);
-  while (true) {
-    var zipped = new List(iterators.length);
-    for (var i = 0; i < zipped.length; i++) {
-      if (!iterators[i].moveNext()) return;
-      zipped[i] = iterators[i].current;
-    }
-    yield zipped;
-  }
-}
diff --git a/packages/quiver_iterables/pubspec.yaml b/packages/quiver_iterables/pubspec.yaml
deleted file mode 100644
index 9a69d2a..0000000
--- a/packages/quiver_iterables/pubspec.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: quiver_iterables
-version: 1.0.0
-authors:
-- Justin Fagnani <justinfagnani@google.com>
-- Yegor Jbanov <yjbanov@google.com>
-- Chris Bracken <cbracken@google.com>
-- Alexandre Ardhuin <alexandre.ardhuin@gmail.com>
-- David Morgan <davidmorgan@google.com>
-- John McDole <codefu@google.com>
-- Matan Lurey <matanl@google.com>
-- Günter Zöchbauer <guenter@gzoechbauer.com>
-- Sean Eagan <seaneagan1@gmail.com>
-- Victor Berchet <victor@suumit.com>
-description: Utilities for working with iterables
-homepage: https://github.com/QuiverDart/quiver_iterables
-environment:
-  sdk: '>=1.9.0 <2.0.0'
-dev_dependencies:
-  test: '>=0.12.0 <0.13.0'
diff --git a/packages/quiver_iterables/test/all_tests.dart b/packages/quiver_iterables/test/all_tests.dart
deleted file mode 100644
index f023455..0000000
--- a/packages/quiver_iterables/test/all_tests.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'concat_test.dart' as concat_test;
-import 'count_test.dart' as count_test;
-import 'cycle_test.dart' as cycle_test;
-import 'enumerate_test.dart' as enumerate_test;
-import 'generating_iterable_test.dart' as generating_iterable_test;
-import 'merge_test.dart' as merge_test;
-import 'min_max_test.dart' as min_max_test;
-import 'partition_test.dart' as partition_test;
-import 'range_test.dart' as range_test;
-import 'zip_test.dart' as zip_test;
-
-main() {
-  concat_test.main();
-  count_test.main();
-  cycle_test.main();
-  enumerate_test.main();
-  generating_iterable_test.main();
-  merge_test.main();
-  min_max_test.main();
-  partition_test.main();
-  range_test.main();
-  zip_test.main();
-}
diff --git a/packages/quiver_iterables/test/concat_test.dart b/packages/quiver_iterables/test/concat_test.dart
deleted file mode 100644
index 788fbda..0000000
--- a/packages/quiver_iterables/test/concat_test.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.concat_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('concat', () {
-    test('should handle empty input iterables', () {
-      expect(concat([]), isEmpty);
-    });
-
-    test('should handle single input iterables', () {
-      expect(
-          concat([
-            [1, 2, 3]
-          ]),
-          [1, 2, 3]);
-    });
-
-    test('should chain multiple input iterables', () {
-      expect(
-          concat([
-            [1, 2, 3],
-            [-1, -2, -3]
-          ]),
-          [1, 2, 3, -1, -2, -3]);
-    });
-
-    test('should throw for null input', () {
-      expect(() => concat(null), throws);
-    });
-
-    test('should throw if any input is null', () {
-      expect(
-          () => concat([
-                [1, 2],
-                null,
-                [3, 4]
-              ]).toList(),
-          throws);
-    });
-
-    test('should reflectchanges in the inputs', () {
-      var a = [1, 2];
-      var b = [4, 5];
-      var ab = concat([a, b]);
-      expect(ab, [1, 2, 4, 5]);
-      a.add(3);
-      b.add(6);
-      expect(ab, [1, 2, 3, 4, 5, 6]);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/count_test.dart b/packages/quiver_iterables/test/count_test.dart
deleted file mode 100644
index aa40be3..0000000
--- a/packages/quiver_iterables/test/count_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.count_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('count', () {
-    test("should create an infinite sequence starting at 0 given no args", () {
-      expect(count().first, 0);
-      expect(count().take(5), [0, 1, 2, 3, 4]);
-    });
-
-    test("should create an infinite sequence starting from start", () {
-      expect(count(3).first, 3);
-      expect(count(3).take(5), [3, 4, 5, 6, 7]);
-    });
-
-    test("should create an infinite sequence stepping by step", () {
-      expect(count(3, 2).first, 3);
-      expect(count(3, 2).take(5), [3, 5, 7, 9, 11]);
-      expect(count(3.5, 2).first, 3.5);
-      expect(count(3.5, .5).take(5), [3.5, 4, 4.5, 5, 5.5]);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/cycle_test.dart b/packages/quiver_iterables/test/cycle_test.dart
deleted file mode 100644
index 4890c7f..0000000
--- a/packages/quiver_iterables/test/cycle_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.cycle_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('cycle', () {
-    test("should create an empty iterable given an empty iterable", () {
-      expect(cycle([]), []);
-      expect(cycle([]).isEmpty, true);
-      expect(cycle([]).isNotEmpty, false);
-    });
-
-    test("should cycle its argument", () {
-      expect(cycle([1, 2, 3]).take(7), [1, 2, 3, 1, 2, 3, 1]);
-      expect(cycle([1, 2, 3]).isEmpty, false);
-      expect(cycle([1, 2, 3]).isNotEmpty, true);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/enumerate_test.dart b/packages/quiver_iterables/test/enumerate_test.dart
deleted file mode 100644
index 96b79ba..0000000
--- a/packages/quiver_iterables/test/enumerate_test.dart
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.enumerate_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('enumerate', () {
-    test("should add indices to its argument", () {
-      var e = enumerate(['a', 'b', 'c']);
-      expect(e.map((v) => v.index), [0, 1, 2]);
-      expect(e.map((v) => v.value), ['a', 'b', 'c']);
-    });
-
-    test("should return an empty iterable given an empty iterable", () {
-      expect(enumerate([]), []);
-    });
-
-    test("should add indices to its argument", () {
-      var e = enumerate(['a', 'b', 'c']);
-      expect(e.map((v) => v.index), [0, 1, 2]);
-      expect(e.map((v) => v.index), [0, 1, 2],
-          reason: 'should enumerate to the same values a second time');
-    });
-
-    test("first", () {
-      var e = enumerate(['a', 'b', 'c']);
-      expect(e.first.value, 'a');
-      expect(e.first.index, 0);
-      expect(e.first.value, 'a');
-    });
-
-    test("last", () {
-      var e = enumerate(['a', 'b', 'c']);
-      expect(e.last.value, 'c');
-      expect(e.last.index, 2);
-      expect(e.last.value, 'c');
-    });
-
-    test("single", () {
-      var e = enumerate(['a']);
-      expect(e.single.value, 'a');
-      expect(e.single.index, 0);
-      expect(e.single.value, 'a');
-
-      expect(() => enumerate([1, 2]).single, throws);
-    });
-
-    test("length", () {
-      expect(enumerate([7, 8, 9]).length, 3);
-    });
-
-    test("elementAt", () {
-      var list = ['a', 'b', 'c'];
-      var e = enumerate(list);
-      for (int i = 2; i >= 0; i--) {
-        expect(e.elementAt(i).value, list[i]);
-        expect(e.elementAt(i).index, i);
-      }
-    });
-
-    test("equals and hashcode", () {
-      var list = ['a', 'b', 'c'];
-      var e1 = enumerate(list);
-      var e2 = enumerate(list);
-      for (int i = 0; i < 2; i++) {
-        expect(e1.elementAt(i), e2.elementAt(i));
-        expect(e1.elementAt(i).hashCode, e1.elementAt(i).hashCode);
-        expect(identical(e1.elementAt(i), e2.elementAt(i)), isFalse);
-      }
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/generating_iterable_test.dart b/packages/quiver_iterables/test/generating_iterable_test.dart
deleted file mode 100644
index 34b8f69..0000000
--- a/packages/quiver_iterables/test/generating_iterable_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.property_iterable_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('GeneratingIterable', () {
-    test("should create an empty iterable for a null start object", () {
-      var iterable = new GeneratingIterable(() => null, (n) => null);
-      expect(iterable, []);
-    });
-
-    test("should create one-item empty iterable when next returns null", () {
-      var iterable = new GeneratingIterable(() => "Hello", (n) => null);
-      expect(iterable, ["Hello"]);
-    });
-
-    test("should add items until next returns null", () {
-      var parent = new Node();
-      var node = new Node()..parent = parent;
-      var iterable = new GeneratingIterable<Node>(() => node, (n) => n.parent);
-      expect(iterable, [node, parent]);
-    });
-  });
-}
-
-class Node {
-  Node parent;
-}
diff --git a/packages/quiver_iterables/test/merge_test.dart b/packages/quiver_iterables/test/merge_test.dart
deleted file mode 100644
index 793cd6e..0000000
--- a/packages/quiver_iterables/test/merge_test.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.merge_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('merge', () {
-    test("should merge no iterables into empty iterable", () {
-      expect(merge([]), []);
-    });
-
-    test("should merge empty iterables into empty iterable", () {
-      expect(merge([[]]), []);
-      expect(merge([[], []]), []);
-      expect(merge([[], [], []]), []);
-      for (int i = 4; i <= 10; i++) {
-        expect(merge(new List.filled(i, const [])), []);
-      }
-    });
-
-    test("should merge single-element iterables", () {
-      expect(
-          merge([
-            ['a'],
-            ['b']
-          ]),
-          ['a', 'b']);
-    });
-
-    test("should output the union of elements in both iterables", () {
-      var a = ['a', 'b', 'c'];
-      expect(merge([a, a]), ['a', 'a', 'b', 'b', 'c', 'c']);
-    });
-
-    test("should honor the comparator", () {
-      var a = ['c', 'b', 'a'];
-      expect(merge([a, a], (x, y) => -x.compareTo(y)),
-          ['c', 'c', 'b', 'b', 'a', 'a']);
-    });
-
-    test("should merge empty iterables with non-empty ones", () {
-      var a = ['a', 'b', 'c'];
-      expect(merge([a, []]), ['a', 'b', 'c']);
-      expect(merge([[], a]), ['a', 'b', 'c']);
-    });
-
-    test("should throw on null elements", () {
-      var a = ['a', null, 'c'];
-      var b = ['a', 'b', 'c'];
-      expect(() => merge([a, b]).forEach((e) {}), throws);
-      expect(() => merge([b, a]).forEach((e) {}), throws);
-    });
-
-    test("should handle zig-zag case", () {
-      var a = ['a', 'a', 'd', 'f'];
-      var b = ['b', 'c', 'g', 'g'];
-      expect(merge([a, b]), ['a', 'a', 'b', 'c', 'd', 'f', 'g', 'g']);
-    });
-
-    test("should handle max(a) < min(b) case", () {
-      var a = <String>['a', 'b'];
-      var b = <String>['c', 'd'];
-      expect(max(a).compareTo(min(b)) < 0, isTrue); // test the test
-      expect(merge([a, b]), ['a', 'b', 'c', 'd']);
-    });
-
-    test("should handle three-way zig-zag case", () {
-      var a = ['a', 'd', 'g', 'j'];
-      var b = ['b', 'e', 'h', 'k'];
-      var c = ['c', 'f', 'i', 'l'];
-      var expected = [
-        'a',
-        'b',
-        'c',
-        'd',
-        'e',
-        'f',
-        'g',
-        'h',
-        'i',
-        'j',
-        'k',
-        'l'
-      ];
-      expect(merge([a, b, c]), expected);
-      expect(merge([a, c, b]), expected);
-      expect(merge([b, a, c]), expected);
-      expect(merge([b, c, a]), expected);
-      expect(merge([c, a, b]), expected);
-      expect(merge([c, b, a]), expected);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/min_max_test.dart b/packages/quiver_iterables/test/min_max_test.dart
deleted file mode 100644
index aeb0edd..0000000
--- a/packages/quiver_iterables/test/min_max_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.min_max_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('max', () {
-    test('should return the maximum element', () {
-      expect(max([2, 5, 1, 4]), 5);
-    });
-
-    test('should return null if the iterable is empty', () {
-      expect(max([]), null);
-    });
-  });
-
-  group('min', () {
-    test('should return the minimum element', () {
-      expect(min([2, 5, 1, 4]), 1);
-    });
-
-    test('should return null if the iterable is empty', () {
-      expect(min([]), null);
-    });
-  });
-
-  group('extent', () {
-    test('should return the max and min elements', () {
-      var ext = extent([2, 5, 1, 4]);
-      expect(ext.min, 1);
-      expect(ext.max, 5);
-    });
-
-    test('should return the single element', () {
-      var ext = extent([2]);
-      expect(ext.min, 2);
-      expect(ext.max, 2);
-    });
-
-    test('should return null if the iterable is empty', () {
-      var ext = extent([]);
-      expect(ext.min, null);
-      expect(ext.max, null);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/partition_test.dart b/packages/quiver_iterables/test/partition_test.dart
deleted file mode 100644
index 088b150..0000000
--- a/packages/quiver_iterables/test/partition_test.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.partition_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('partition', () {
-    test('should throw when size is <= 0', () {
-      expect(() => partition([1, 2, 3], 0), throwsArgumentError);
-      expect(() => partition([1, 2, 3], -1), throwsArgumentError);
-    });
-
-    test('should return an empty list for empty input iterable', () {
-      expect(partition([], 5), equals([]));
-    });
-
-    test('should return one partition if partition size < input size', () {
-      var it = partition([1, 2, 3], 5).iterator;
-      expect(it.moveNext(), isTrue);
-      expect(it.current, equals([1, 2, 3]));
-      expect(it.moveNext(), isFalse);
-      expect(it.current, isNull);
-    });
-
-    test('should return one partition if partition size == input size', () {
-      var it = partition([1, 2, 3, 4, 5], 5).iterator;
-      expect(it.moveNext(), isTrue);
-      expect(it.current, equals([1, 2, 3, 4, 5]));
-      expect(it.moveNext(), isFalse);
-      expect(it.current, isNull);
-    });
-
-    test(
-        'should return partitions of correct size if '
-        'partition size > input size', () {
-      var it = partition([1, 2, 3, 4, 5], 3).iterator;
-      expect(it.moveNext(), isTrue);
-      expect(it.current, equals([1, 2, 3]));
-      expect(it.moveNext(), isTrue);
-      expect(it.current, equals([4, 5]));
-      expect(it.moveNext(), isFalse);
-      expect(it.current, isNull);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/range_test.dart b/packages/quiver_iterables/test/range_test.dart
deleted file mode 100644
index f181a26..0000000
--- a/packages/quiver_iterables/test/range_test.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.range_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('range', () {
-    test("should create an empty iterator if stop is 0", () {
-      expect(range(0), []);
-    });
-
-    test("should create a sequence from 0 to stop - 1", () {
-      expect(range(10), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
-    });
-
-    test("should start sequences at start_or_stop", () {
-      expect(range(1, 11), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-    });
-
-    test("should create an empty iterator if start and stop are equal", () {
-      expect(range(1, 1), []);
-    });
-
-    test("should step by step", () {
-      expect(range(0, 10, 2), [0, 2, 4, 6, 8]);
-      expect(range(0, 10, 3), [0, 3, 6, 9]);
-    });
-
-    test("should step by a negative step", () {
-      expect(range(10, 0, -1), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]);
-      expect(range(0, -8, -1), [0, -1, -2, -3, -4, -5, -6, -7]);
-      expect(range(0, -10, -3), [0, -3, -6, -9]);
-    });
-
-    test("should throw with a bad range", () {
-      expect(() => range(10, 0), throws);
-    });
-
-    test("should throw with a bad step", () {
-      expect(() => range(0, 10, -1), throws);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/test/zip_test.dart b/packages/quiver_iterables/test/zip_test.dart
deleted file mode 100644
index 4a3bcd6..0000000
--- a/packages/quiver_iterables/test/zip_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-library quiver.iterables.zip_test;
-
-import 'package:test/test.dart';
-import 'package:quiver_iterables/iterables.dart';
-
-main() {
-  group('zip', () {
-    test("should create an empty iterable if given no iterables", () {
-      expect(zip([]), []);
-    });
-
-    test("should zip equal length lists", () {
-      expect(
-          zip([
-            [1, 2, 3],
-            ['a', 'b', 'c']
-          ]),
-          [
-        [1, 'a'],
-        [2, 'b'],
-        [3, 'c']
-      ]);
-      expect(
-          zip([
-            [1, 2],
-            ['a', 'b'],
-            [2, 4]
-          ]),
-          [
-        [1, 'a', 2],
-        [2, 'b', 4]
-      ]);
-    });
-
-    test("should stop at the end of the shortest iterable", () {
-      expect(
-          zip([
-            [1, 2],
-            ['a', 'b'],
-            []
-          ]),
-          []);
-      expect(zip([range(2), range(4)]), [
-        [0, 0],
-        [1, 1]
-      ]);
-    });
-  });
-}
diff --git a/packages/quiver_iterables/tool/travis.sh b/packages/quiver_iterables/tool/travis.sh
deleted file mode 100755
index 61c101b..0000000
--- a/packages/quiver_iterables/tool/travis.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# Copyright (c) 2015, Google Inc. 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.
-
-# Fast fail the script on failures.
-set -e
-
-# Verify that the libraries are error and warning-free.
-echo "Running dartanalyzer..."
-libs=$(find lib -maxdepth 1 -type f -name '*.dart')
-dartanalyzer $DARTANALYZER_FLAGS $libs test/all_tests.dart
-
-# Run the tests.
-echo "Running tests..."
-pub run test:test
-
-# Gather and send coverage data.
-if [ "$REPO_TOKEN" ] && [ "$TRAVIS_DART_VERSION" = "stable" ]; then
-  echo "Collecting coverage..."
-  pub global activate dart_coveralls
-  pub global run dart_coveralls report \
-    --token $REPO_TOKEN \
-    --retry 2 \
-    --exclude-test-files \
-    test/all_tests.dart
-fi
diff --git a/packages/smoke/.gitignore b/packages/smoke/.gitignore
deleted file mode 100644
index aa97ee1..0000000
--- a/packages/smoke/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-pubspec.lock
-.pub
-packages
-.idea
-/build/
diff --git a/packages/smoke/.status b/packages/smoke/.status
deleted file mode 100644
index 9a4bb95..0000000
--- a/packages/smoke/.status
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Don't run any test-like files that show up in packages directories. It
-# shouldn't be necessary to run "pub install" in these packages, but if you do
-# it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
-
-[ $runtime == vm && $mode == debug]
-test/codegen/end_to_end_test: Skip  # Times out
-test/codegen/recorder_test: Skip  # Times out
-
-[ $browser ]
-build/test/codegen/end_to_end_test: Skip # Uses dart:io.
-build/test/codegen/recorder_test: Skip # Uses dart:io.
-test/codegen/end_to_end_test: Skip # Uses dart:io.
-test/codegen/recorder_test: Skip # Uses dart:io.
diff --git a/packages/smoke/AUTHORS b/packages/smoke/AUTHORS
deleted file mode 100644
index 0617765..0000000
--- a/packages/smoke/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/packages/smoke/CHANGELOG.md b/packages/smoke/CHANGELOG.md
deleted file mode 100644
index ba83d54..0000000
--- a/packages/smoke/CHANGELOG.md
+++ /dev/null
@@ -1,53 +0,0 @@
-#### 0.3.6
-  * Update to analyzer '^0.27.0' and update to the test package.
-
-#### 0.3.5
-  * Update to analyzer '<0.27.0'
-
-#### 0.3.4
-  * Add excludeOverriden to QueryOptions which removes declarations that were
-    overriden within the class hierarchy.
-
-#### 0.3.3+1
-  * Update logging package to `<0.12.0`.
-
-#### 0.3.3
-  * Update to analyzer `<0.26.0`.
-
-#### 0.3.2
-  * Work around an issue running Dart analyzer on the generated code, if the
-    `dynamic` type appeared in the output. Smoke will now use `Object` instead.
-
-#### 0.3.1+1
-  * Updated dependency versions.
-
-#### 0.3.1
-  * Add canAcceptNArgs method.
-
-#### 0.3.0
-  * Change SUPPORTED_ARGS limit for minArgs and maxArgs method from 3 to 15.
-
-#### 0.2.1+1
-  * Fix toString calls on Type instances.
-
-#### 0.2.0+3
-  * Widen the constraint on analyzer.
-
-#### 0.2.0+2
-  * Widen the constraint on barback.
-
-#### 0.2.0+1
-  * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
-    class.
-
-#### 0.2.0
-  * Static configuration can be modified, so code generators can split the
-    static configuration in pieces.
-  * **breaking change**: for codegen call `writeStaticConfiguration` instead of
-    `writeInitCall`.
-
-#### 0.1.0
-  * Initial release: introduces the smoke API, a mirror based implementation, a
-    statically configured implementation that can be declared by hand or be
-    generated by tools, and libraries that help generate the static
-    configurations.
diff --git a/packages/smoke/LICENSE b/packages/smoke/LICENSE
deleted file mode 100644
index 95987ba..0000000
--- a/packages/smoke/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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/packages/smoke/PATENTS b/packages/smoke/PATENTS
deleted file mode 100644
index e120963..0000000
--- a/packages/smoke/PATENTS
+++ /dev/null
@@ -1,23 +0,0 @@
-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/packages/smoke/README.md b/packages/smoke/README.md
deleted file mode 100644
index 685e1c5..0000000
--- a/packages/smoke/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Smoke (and mirrors)
-===================
-
-Smoke is a package that exposes a reduced reflective system API. This API
-includes accessing objects in a dynamic fashion (read properties, write
-properties, and call methods), inspecting types (for example, whether a
-method exists), and symbol/string convertion.
-
-The package provides a default implementation of this API that uses the system's
-mirrors, but additionally provides mechanisms for statically generating code
-that can replace the mirror-based implementation.
-
-The intention of this package is to allow frameworks to use mirrors in a way
-that will not impose on their users. The idea is that users will not worry about
-how to preserve symbols when compiling with dart2js (for instance, using the
-[MirrorsUsed][] annotation). Instead, this package provides the building
-blocks to autogenerate whatever is needed for dart2js to be happy and to
-generate reasonable code.
-
-Note this package alone doesn't know how to generate everything, but it provides
-a simple API that different frameworks can use to define what needs to be
-generated.
-
-
-Smoke reflective API
-====================
-
-Use `package:smoke/smoke.dart` in your framework to read and write objects and
-to inspect type information. Read the Dart-docs for more details.
-
-Code Generation
-===============
-
-Use `package:smoke/codegen/generator.dart` and
-`package:smoke/codegen/recorder.dart` in your transformer to create a static
-initialization that can be used by smoke. The test under
-`test/codegen/end_to_end_test.dart` is a good illustrating example to learn how
-to use these APIs.
-
-[MirrorsUsed]: https://api.dartlang.org/apidocs/channels/stable/#dart-mirrors.MirrorsUsed
diff --git a/packages/smoke/codereview.settings b/packages/smoke/codereview.settings
deleted file mode 100644
index c24df00..0000000
--- a/packages/smoke/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: https://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/smoke/commit/
-CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/packages/smoke/lib/codegen/generator.dart b/packages/smoke/lib/codegen/generator.dart
deleted file mode 100644
index a332db8..0000000
--- a/packages/smoke/lib/codegen/generator.dart
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Library to generate code that can initialize the `StaticConfiguration` in
-/// `package:smoke/static.dart`.
-///
-/// This library doesn't have any specific logic to extract information from
-/// Dart source code. To extract code using the analyzer, take a look at the
-/// `smoke.codegen.recorder` library.
-library smoke.codegen.generator;
-
-import 'dart:collection' show SplayTreeMap, SplayTreeSet;
-
-import 'package:smoke/src/common.dart' show compareLists, compareMaps;
-
-/// Collects the necessary information and generates code to initialize a
-/// `StaticConfiguration`. After setting up the generator by calling
-/// [addGetter], [addSetter], [addSymbol], and [addDeclaration], you can
-/// retrieve the generated code using the following three methods:
-///
-///   * [writeImports] writes a list of imports directives,
-///   * [writeTopLevelDeclarations] writes additional declarations used to
-///     represent mixin classes by name in the generated code.
-///   * [writeStaticConfiguration] writes the actual code that allocates the
-///     static configuration.
-///
-/// You'd need to include all three in your generated code, since the
-/// initialization code refers to symbols that are only available from the
-/// generated imports or the generated top-level declarations.
-class SmokeCodeGenerator {
-  // Note: we use SplayTreeSet/Map here and below to keep generated code sorted.
-  /// Names used as getters via smoke.
-  final Set<String> _getters = new SplayTreeSet();
-
-  /// Names used as setters via smoke.
-  final Set<String> _setters = new SplayTreeSet();
-
-  /// Subclass relations needed to run smoke queries.
-  final Map<TypeIdentifier, TypeIdentifier> _parents = new SplayTreeMap();
-
-  /// Declarations requested via `smoke.getDeclaration or `smoke.query`.
-  final Map<TypeIdentifier, Map<String, _DeclarationCode>> _declarations =
-      new SplayTreeMap();
-
-  /// Static methods used on each type.
-  final Map<TypeIdentifier, Set<String>> _staticMethods = new SplayTreeMap();
-
-  /// Names that are used both as strings and symbols.
-  final Set<String> _names = new SplayTreeSet();
-
-  /// Prefixes associated with imported libraries.
-  final Map<String, String> _libraryPrefix = {};
-
-  /// Register that [name] is used as a getter in the code.
-  void addGetter(String name) {
-    _getters.add(name);
-  }
-
-  /// Register that [name] is used as a setter in the code.
-  void addSetter(String name) {
-    _setters.add(name);
-  }
-
-  /// Register that [name] might be needed as a symbol.
-  void addSymbol(String name) {
-    _names.add(name);
-  }
-
-  /// Register that `cls.name` is used as a static method in the code.
-  void addStaticMethod(TypeIdentifier cls, String name) {
-    var methods =
-        _staticMethods.putIfAbsent(cls, () => new SplayTreeSet<String>());
-    _addLibrary(cls.importUrl);
-    methods.add(name);
-  }
-
-  int _mixins = 0;
-
-  /// Creates a new type to represent a mixin. Use [comment] to help users
-  /// figure out what mixin is being represented.
-  TypeIdentifier createMixinType([String comment = '']) =>
-      new TypeIdentifier(null, '_M${_mixins++}', comment);
-
-  /// Register that we care to know that [child] extends [parent].
-  void addParent(TypeIdentifier child, TypeIdentifier parent) {
-    var existing = _parents[child];
-    if (existing != null) {
-      if (existing == parent) return;
-      throw new StateError('$child already has a different parent associated'
-          '($existing instead of $parent)');
-    }
-    _addLibrary(child.importUrl);
-    _addLibrary(parent.importUrl);
-    _parents[child] = parent;
-  }
-
-  /// Register a declaration of a field, property, or method. Note that one and
-  /// only one of [isField], [isMethod], or [isProperty] should be set at a
-  /// given time.
-  void addDeclaration(TypeIdentifier cls, String name, TypeIdentifier type,
-      {bool isField: false, bool isProperty: false, bool isMethod: false,
-      bool isFinal: false, bool isStatic: false,
-      List<ConstExpression> annotations: const []}) {
-    final count = (isField ? 1 : 0) + (isProperty ? 1 : 0) + (isMethod ? 1 : 0);
-    if (count != 1) {
-      throw new ArgumentError('Declaration must be one (and only one) of the '
-          'following: a field, a property, or a method.');
-    }
-    var kind = isField ? 'FIELD' : isProperty ? 'PROPERTY' : 'METHOD';
-    _declarations.putIfAbsent(
-        cls, () => new SplayTreeMap<String, _DeclarationCode>());
-    _addLibrary(cls.importUrl);
-    var map = _declarations[cls];
-
-    for (var exp in annotations) {
-      for (var lib in exp.librariesUsed) {
-        _addLibrary(lib);
-      }
-    }
-
-    _addLibrary(type.importUrl);
-    var decl =
-        new _DeclarationCode(name, type, kind, isFinal, isStatic, annotations);
-    if (map.containsKey(name) && map[name] != decl) {
-      throw new StateError('$type.$name already has a different declaration'
-          ' (${map[name]} instead of $decl).');
-    }
-    map[name] = decl;
-  }
-
-  /// Register that we might try to read declarations of [type], even if no
-  /// declaration exists. This informs the smoke system that querying for a
-  /// member in this class might be intentional and not an error.
-  void addEmptyDeclaration(TypeIdentifier type) {
-    _addLibrary(type.importUrl);
-    _declarations.putIfAbsent(
-        type, () => new SplayTreeMap<String, _DeclarationCode>());
-  }
-
-  /// Writes to [buffer] a line for each import that is needed by the generated
-  /// code. The code added by [writeStaticConfiguration] depends on these
-  /// imports.
-  void writeImports(StringBuffer buffer) {
-    DEFAULT_IMPORTS.forEach((i) => buffer.writeln(i));
-    _libraryPrefix.forEach((url, prefix) {
-      buffer.writeln("import '$url' as $prefix;");
-    });
-  }
-
-  /// Writes to [buffer] top-level declarations that are used by the code
-  /// generated in [writeStaticConfiguration]. These are typically declarations
-  /// of empty classes that are then used as placeholders for mixin
-  /// superclasses.
-  void writeTopLevelDeclarations(StringBuffer buffer) {
-    var types = new Set()
-      ..addAll(_parents.keys)
-      ..addAll(_parents.values)
-      ..addAll(_declarations.keys)
-      ..addAll(_declarations.values.expand((m) => m.values.map((d) => d.type)))
-      ..removeWhere((t) => t.importUrl != null);
-    for (var type in types) {
-      buffer.write('abstract class ${type.name} {}');
-      if (type.comment != null) buffer.write(' // ${type.comment}');
-      buffer.writeln();
-    }
-  }
-
-  /// Appends to [buffer] code that will create smoke's static configuration.
-  /// For example, the code might be of the form:
-  ///
-  ///    new StaticConfiguration(
-  ///      getters: {
-  ///         #i: (o) => o.i,
-  ///         ...
-  ///      names: {
-  ///         #i: "i",
-  ///      })
-  ///
-  /// Callers of this code can assign this expression to a variable, and should
-  /// generate code that invokes `useGeneratedCode`.
-  ///
-  /// The optional [indent] argument is used for formatting purposes. All
-  /// entries in each map (getters, setters, names, declarations, parents) are
-  /// sorted alphabetically.
-  ///
-  /// **Note**: this code assumes that imports from [writeImports] and top-level
-  /// declarations from [writeTopLevelDeclarations] are included in the same
-  /// library where this code will live.
-  void writeStaticConfiguration(StringBuffer buffer, [int indent = 2]) {
-    final spaces = ' ' * (indent + 4);
-    var args = {};
-
-    if (_getters.isNotEmpty) {
-      args['getters'] = _getters.map((n) => '${_symbol(n)}: (o) => o.$n');
-    }
-    if (_setters.isNotEmpty) {
-      args['setters'] =
-          _setters.map((n) => '${_symbol(n)}: (o, v) { o.$n = v; }');
-    }
-
-    if (_parents.isNotEmpty) {
-      var parentsMap = [];
-      _parents.forEach((child, parent) {
-        var parent = _parents[child];
-        parentsMap.add('${child.asCode(_libraryPrefix)}: '
-            '${parent.asCode(_libraryPrefix)}');
-      });
-      args['parents'] = parentsMap;
-    }
-
-    if (_declarations.isNotEmpty) {
-      var declarations = [];
-      _declarations.forEach((type, members) {
-        final sb = new StringBuffer()
-          ..write(type.asCode(_libraryPrefix))
-          ..write(': ');
-        if (members.isEmpty) {
-          sb.write('{}');
-        } else {
-          sb.write('{\n');
-          members.forEach((name, decl) {
-            var decl = members[name].asCode(_libraryPrefix);
-            sb.write('${spaces}    ${_symbol(name)}: $decl,\n');
-          });
-          sb.write('${spaces}  }');
-        }
-        declarations.add(sb.toString());
-      });
-      args['declarations'] = declarations;
-    }
-
-    if (_staticMethods.isNotEmpty) {
-      var methods = [];
-      _staticMethods.forEach((type, members) {
-        var className = type.asCode(_libraryPrefix);
-        final sb = new StringBuffer()
-          ..write(className)
-          ..write(': ');
-        if (members.isEmpty) {
-          sb.write('{}');
-        } else {
-          sb.write('{\n');
-          for (var name in members) {
-            sb.write('${spaces}    ${_symbol(name)}: $className.$name,\n');
-          }
-          sb.write('${spaces}  }');
-        }
-        methods.add(sb.toString());
-      });
-      args['staticMethods'] = methods;
-    }
-
-    if (_names.isNotEmpty) {
-      args['names'] = _names.map((n) => "${_symbol(n)}: r'$n'");
-    }
-
-    buffer
-      ..writeln('new StaticConfiguration(')
-      ..write('${spaces}checkedMode: false');
-
-    args.forEach((name, mapContents) {
-      buffer.writeln(',');
-      // TODO(sigmund): use const map when Type can be keys (dartbug.com/17123)
-      buffer.writeln('${spaces}$name: {');
-      for (var entry in mapContents) {
-        buffer.writeln('${spaces}  $entry,');
-      }
-      buffer.write('${spaces}}');
-    });
-    buffer.write(')');
-  }
-
-  /// Adds a library that needs to be imported.
-  void _addLibrary(String url) {
-    if (url == null || url == 'dart:core') return;
-    _libraryPrefix.putIfAbsent(url, () => 'smoke_${_libraryPrefix.length}');
-  }
-}
-
-/// Information used to generate code that allocates a `Declaration` object.
-class _DeclarationCode extends ConstExpression {
-  final String name;
-  final TypeIdentifier type;
-  final String kind;
-  final bool isFinal;
-  final bool isStatic;
-  final List<ConstExpression> annotations;
-
-  _DeclarationCode(this.name, this.type, this.kind, this.isFinal, this.isStatic,
-      this.annotations);
-
-  List<String> get librariesUsed => []
-    ..addAll(type.librariesUsed)
-    ..addAll(annotations.expand((a) => a.librariesUsed));
-
-  String asCode(Map<String, String> libraryPrefixes) {
-    var sb = new StringBuffer();
-    sb.write('const Declaration(${_symbol(name)}, '
-        '${type.asCode(libraryPrefixes)}');
-    if (kind != 'FIELD') sb.write(', kind: $kind');
-    if (isFinal) sb.write(', isFinal: true');
-    if (isStatic) sb.write(', isStatic: true');
-    if (annotations != null && annotations.isNotEmpty) {
-      sb.write(', annotations: const [');
-      bool first = true;
-      for (var e in annotations) {
-        if (!first) sb.write(', ');
-        first = false;
-        sb.write(e.asCode(libraryPrefixes));
-      }
-      sb.write(']');
-    }
-    sb.write(')');
-    return sb.toString();
-  }
-
-  String toString() =>
-      '(decl: $type.$name - $kind, $isFinal, $isStatic, $annotations)';
-  operator ==(other) => other is _DeclarationCode &&
-      name == other.name &&
-      type == other.type &&
-      kind == other.kind &&
-      isFinal == other.isFinal &&
-      isStatic == other.isStatic &&
-      compareLists(annotations, other.annotations);
-  int get hashCode => name.hashCode + (31 * type.hashCode);
-}
-
-/// A constant expression that can be used as an annotation.
-abstract class ConstExpression {
-
-  /// Returns the library URLs that needs to be imported for this
-  /// [ConstExpression] to be a valid annotation.
-  List<String> get librariesUsed;
-
-  /// Return a string representation of the code in this expression.
-  /// [libraryPrefixes] describes what prefix has been associated with each
-  /// import url mentioned in [libraryUsed].
-  String asCode(Map<String, String> libraryPrefixes);
-
-  ConstExpression();
-
-  /// Create a string expression of the form `'string'`, where [string] is
-  /// normalized so we can correctly wrap it in single quotes.
-  factory ConstExpression.string(String string) {
-    var value = string.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
-    return new CodeAsConstExpression("'$value'");
-  }
-
-  /// Create an expression of the form `prefix.variable_name`.
-  factory ConstExpression.identifier(String importUrl, String name) =>
-      new TopLevelIdentifier(importUrl, name);
-
-  /// Create an expression of the form `prefix.Constructor(v1, v2, p3: v3)`.
-  factory ConstExpression.constructor(String importUrl, String name,
-          List<ConstExpression> positionalArgs,
-          Map<String, ConstExpression> namedArgs) =>
-      new ConstructorExpression(importUrl, name, positionalArgs, namedArgs);
-}
-
-/// A constant expression written as a String. Used when the code is self
-/// contained and it doesn't depend on any imported libraries.
-class CodeAsConstExpression extends ConstExpression {
-  String code;
-  List<String> get librariesUsed => const [];
-
-  CodeAsConstExpression(this.code);
-
-  String asCode(Map<String, String> libraryPrefixes) => code;
-
-  String toString() => '(code: $code)';
-  operator ==(other) => other is CodeAsConstExpression && code == other.code;
-  int get hashCode => code.hashCode;
-}
-
-/// Describes a reference to some symbol that is exported from a library. This
-/// is typically used to refer to a type or a top-level variable from that
-/// library.
-class TopLevelIdentifier extends ConstExpression {
-  final String importUrl;
-  final String name;
-  TopLevelIdentifier(this.importUrl, this.name);
-
-  List<String> get librariesUsed => [importUrl];
-  String asCode(Map<String, String> libraryPrefixes) {
-    if (importUrl == 'dart:core' || importUrl == null) {
-      // TODO(jmesserly): analyzer doesn't consider `dynamic` to be a constant,
-      // so use Object as a workaround:
-      // https://code.google.com/p/dart/issues/detail?id=22989
-      return name == 'dynamic' ? 'Object' : name;
-    }
-    return '${libraryPrefixes[importUrl]}.$name';
-  }
-
-  String toString() => '(identifier: $importUrl, $name)';
-  operator ==(other) => other is TopLevelIdentifier &&
-      name == other.name &&
-      importUrl == other.importUrl;
-  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
-}
-
-/// Represents an expression that invokes a const constructor.
-class ConstructorExpression extends ConstExpression {
-  final String importUrl;
-  final String name;
-  final List<ConstExpression> positionalArgs;
-  final Map<String, ConstExpression> namedArgs;
-  ConstructorExpression(
-      this.importUrl, this.name, this.positionalArgs, this.namedArgs);
-
-  List<String> get librariesUsed => [importUrl]
-    ..addAll(positionalArgs.expand((e) => e.librariesUsed))
-    ..addAll(namedArgs.values.expand((e) => e.librariesUsed));
-
-  String asCode(Map<String, String> libraryPrefixes) {
-    var sb = new StringBuffer();
-    sb.write('const ');
-    if (importUrl != 'dart:core' && importUrl != null) {
-      sb.write('${libraryPrefixes[importUrl]}.');
-    }
-    sb.write('$name(');
-    bool first = true;
-    for (var e in positionalArgs) {
-      if (!first) sb.write(', ');
-      first = false;
-      sb.write(e.asCode(libraryPrefixes));
-    }
-    namedArgs.forEach((name, value) {
-      if (!first) sb.write(', ');
-      first = false;
-      sb.write('$name: ');
-      sb.write(value.asCode(libraryPrefixes));
-    });
-    sb.write(')');
-    return sb.toString();
-  }
-
-  String toString() => '(ctor: $importUrl, $name, $positionalArgs, $namedArgs)';
-  operator ==(other) => other is ConstructorExpression &&
-      name == other.name &&
-      importUrl == other.importUrl &&
-      compareLists(positionalArgs, other.positionalArgs) &&
-      compareMaps(namedArgs, other.namedArgs);
-  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
-}
-
-/// Describes a type identifier, with the library URL where the type is defined.
-// TODO(sigmund): consider adding support for imprecise TypeIdentifiers, which
-// may be used by tools that want to generate code without using the analyzer
-// (they can syntactically tell the type comes from one of N imports).
-class TypeIdentifier extends TopLevelIdentifier
-    implements Comparable<TypeIdentifier> {
-  final String comment;
-  TypeIdentifier(importUrl, typeName, [this.comment])
-      : super(importUrl, typeName);
-
-  // We implement [Comparable] to sort out entries in the generated code.
-  int compareTo(TypeIdentifier other) {
-    if (importUrl == null && other.importUrl != null) return 1;
-    if (importUrl != null && other.importUrl == null) return -1;
-    var c1 = importUrl == null ? 0 : importUrl.compareTo(other.importUrl);
-    return c1 != 0 ? c1 : name.compareTo(other.name);
-  }
-
-  String toString() => '(type-identifier: $importUrl, $name, $comment)';
-  bool operator ==(other) => other is TypeIdentifier &&
-      importUrl == other.importUrl &&
-      name == other.name &&
-      comment == other.comment;
-  int get hashCode => super.hashCode;
-}
-
-/// Default set of imports added by [SmokeCodeGenerator].
-const DEFAULT_IMPORTS = const [
-  "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;",
-  "import 'package:smoke/static.dart' show "
-      "useGeneratedCode, StaticConfiguration;",
-];
-
-_symbol(String name) {
-  if (!_publicSymbolPattern.hasMatch(name)) {
-    throw new StateError('invalid symbol name: "$name"');
-  }
-  return _literalSymbolPattern.hasMatch(name)
-      ? '#$name'
-      : "const Symbol('$name')";
-}
-
-// TODO(sigmund): is this included in some library we can import? I derived the
-// definitions below from sdk/lib/internal/symbol.dart.
-
-/// Reserved words in Dart.
-const String _reservedWordRE =
-    r'(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|'
-    r'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|'
-    r'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|'
-    r'v(?:ar|oid)|w(?:hile|ith))';
-
-/// Public identifier: a valid identifier (not a reserved word) that doesn't
-/// start with '_'.
-const String _publicIdentifierRE =
-    r'(?!' '$_reservedWordRE' r'\b(?!\$))[a-zA-Z$][\w$]*';
-
-/// Pattern that matches operators only.
-final RegExp _literalSymbolPattern =
-    new RegExp('^(?:$_publicIdentifierRE(?:\$|[.](?!\$)))+?\$');
-
-/// Operator names allowed as symbols. The name of the oeprators is the same as
-/// the operator itself except for unary minus, where the name is "unary-".
-const String _operatorRE =
-    r'(?:[\-+*/%&|^]|\[\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
-
-/// Pattern that matches public symbols.
-final RegExp _publicSymbolPattern = new RegExp(
-    '^(?:$_operatorRE\$|$_publicIdentifierRE(?:=?\$|[.](?!\$)))+?\$');
diff --git a/packages/smoke/lib/codegen/recorder.dart b/packages/smoke/lib/codegen/recorder.dart
deleted file mode 100644
index 8a9ebf1..0000000
--- a/packages/smoke/lib/codegen/recorder.dart
+++ /dev/null
@@ -1,405 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Records accesses to Dart program declarations and generates code that will
-/// allow to do the same accesses at runtime using `package:smoke/static.dart`.
-/// Internally, this library relies on the `analyzer` to extract data from the
-/// program, and then uses [SmokeCodeGenerator] to produce the code needed by
-/// the smoke system.
-///
-/// This library only uses the analyzer to consume data previously produced by
-/// running the resolver. This library does not provide any hooks to integrate
-/// running the analyzer itself. See `package:code_transformers` to integrate
-/// the analyzer into pub transformers.
-library smoke.codegen.recorder;
-
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'generator.dart';
-
-typedef String ImportUrlResolver(LibraryElement lib);
-
-/// A recorder that tracks how elements are accessed in order to generate code
-/// that replicates those accesses with the smoke runtime.
-class Recorder {
-  /// Underlying code generator.
-  SmokeCodeGenerator generator;
-
-  /// Function that provides the import url for a library element. This may
-  /// internally use the resolver to resolve the import url.
-  ImportUrlResolver importUrlFor;
-
-  Recorder(this.generator, this.importUrlFor);
-
-  /// Stores mixins that have been recorded and associates a type identifier
-  /// with them. Mixins don't have an associated identifier in the code, so we
-  /// generate a unique identifier for them and use it throughout the code.
-  Map<TypeIdentifier, Map<ClassElement, TypeIdentifier>> _mixins = {};
-
-  /// Adds the superclass information of [type] (including intermediate mixins).
-  /// This will not generate data for direct subtypes of Object, as that is
-  /// considered redundant information.
-  void lookupParent(ClassElement type) {
-    var parent = type.supertype;
-    var mixins = type.mixins;
-    if (parent == null && mixins.isEmpty) return; // type is Object
-    var baseType = parent.element;
-    var baseId = _typeFor(baseType);
-    if (mixins.isNotEmpty) {
-      _mixins.putIfAbsent(baseId, () => {});
-      for (var m in mixins) {
-        var mixinType = m.element;
-        var mixinId = _mixins[baseId].putIfAbsent(mixinType, () {
-          var comment = '${baseId.name} & ${mixinType.name}';
-          return generator.createMixinType(comment);
-        });
-        if (!baseType.type.isObject) generator.addParent(mixinId, baseId);
-        baseType = mixinType;
-        baseId = mixinId;
-        _mixins.putIfAbsent(mixinId, () => {});
-      }
-    }
-    if (!baseType.type.isObject) generator.addParent(_typeFor(type), baseId);
-  }
-
-  TypeIdentifier _typeFor(Element type) => new TypeIdentifier(
-      type.library == null ? 'dart:core' : importUrlFor(type.library),
-      type.displayName);
-
-  /// Adds any declaration and superclass information that is needed to answer a
-  /// query on [type] that matches [options]. Also adds symbols, getters, and
-  /// setters if [includeAccessors] is true. If [results] is not null, it will
-  /// be filled up with the members that match the query.
-  void runQuery(ClassElement type, QueryOptions options,
-      {bool includeAccessors: true, List results}) {
-    if (type.type.isObject) return; // We don't include Object in query results.
-    var id = _typeFor(type);
-    var parent = type.supertype != null ? type.supertype.element : null;
-    if (options.includeInherited &&
-        parent != null &&
-        parent != options.includeUpTo) {
-      lookupParent(type);
-      runQuery(parent, options, includeAccessors: includeAccessors);
-      var parentId = _typeFor(parent);
-      for (var m in type.mixins) {
-        var mixinClass = m.element;
-        var mixinId = _mixins[parentId][mixinClass];
-        _runQueryInternal(
-            mixinClass, mixinId, options, includeAccessors, results);
-        parentId = mixinId;
-      }
-    }
-    _runQueryInternal(type, id, options, includeAccessors, results);
-  }
-
-  /// Helper for [runQuery]. This runs the query only on a specific [type],
-  /// which could be a class or a mixin labeled by [id].
-  // TODO(sigmund): currently we materialize mixins in smoke/static.dart,
-  // we should consider to include the mixin declaration information directly,
-  // and remove the duplication we have for mixins today.
-  void _runQueryInternal(ClassElement type, TypeIdentifier id,
-      QueryOptions options, bool includeAccessors, List results) {
-    skipBecauseOfAnnotations(Element e) {
-      if (options.withAnnotations == null) return false;
-      return !_matchesAnnotation(e.metadata, options.withAnnotations);
-    }
-
-    if (options.includeFields) {
-      for (var f in type.fields) {
-        if (f.isStatic) continue;
-        if (f.isSynthetic) continue; // exclude getters
-        if (options.excludeFinal && f.isFinal) continue;
-        var name = f.displayName;
-        if (options.matches != null && !options.matches(name)) continue;
-        if (skipBecauseOfAnnotations(f)) continue;
-        if (results != null) results.add(f);
-        generator.addDeclaration(id, name, _typeFor(f.type.element),
-            isField: true,
-            isFinal: f.isFinal,
-            annotations: _copyAnnotations(f));
-        if (includeAccessors) _addAccessors(name, !f.isFinal);
-      }
-    }
-
-    if (options.includeProperties) {
-      for (var a in type.accessors) {
-        if (a is! PropertyAccessorElement) continue;
-        if (a.isStatic || !a.isGetter) continue;
-        var v = a.variable;
-        if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
-        if (options.excludeFinal && v.isFinal) continue;
-        var name = v.displayName;
-        if (options.matches != null && !options.matches(name)) continue;
-        if (skipBecauseOfAnnotations(a)) continue;
-        if (results != null) results.add(a);
-        generator.addDeclaration(id, name, _typeFor(a.type.returnType.element),
-            isProperty: true,
-            isFinal: v.isFinal,
-            annotations: _copyAnnotations(a));
-        if (includeAccessors) _addAccessors(name, !v.isFinal);
-      }
-    }
-
-    if (options.includeMethods) {
-      for (var m in type.methods) {
-        if (m.isStatic) continue;
-        var name = m.displayName;
-        if (options.matches != null && !options.matches(name)) continue;
-        if (skipBecauseOfAnnotations(m)) continue;
-        if (results != null) results.add(m);
-        generator.addDeclaration(
-            id, name, new TypeIdentifier('dart:core', 'Function'),
-            isMethod: true, annotations: _copyAnnotations(m));
-        if (includeAccessors) _addAccessors(name, false);
-      }
-    }
-  }
-
-  /// Adds the declaration of [name] if it was found in [type]. If [recursive]
-  /// is true, then we continue looking up [name] in the parent classes until we
-  /// find it or we reach [includeUpTo] or Object. Returns whether the
-  /// declaration was found.  When a declaration is found, add also a symbol,
-  /// getter, and setter if [includeAccessors] is true.
-  bool lookupMember(ClassElement type, String name, {bool recursive: false,
-          bool includeAccessors: true, ClassElement includeUpTo}) =>
-      _lookupMemberInternal(
-          type, _typeFor(type), name, recursive, includeAccessors, includeUpTo);
-
-  /// Helper for [lookupMember] that walks up the type hierarchy including mixin
-  /// classes.
-  bool _lookupMemberInternal(ClassElement type, TypeIdentifier id, String name,
-      bool recursive, bool includeAccessors, ClassElement includeUpTo) {
-    // Exclude members from [Object].
-    if (type.type.isObject) return false;
-    generator.addEmptyDeclaration(id);
-    for (var f in type.fields) {
-      if (f.displayName != name) continue;
-      if (f.isSynthetic) continue; // exclude getters
-      generator.addDeclaration(id, name, _typeFor(f.type.element),
-          isField: true,
-          isFinal: f.isFinal,
-          isStatic: f.isStatic,
-          annotations: _copyAnnotations(f));
-      if (includeAccessors && !f.isStatic) _addAccessors(name, !f.isFinal);
-      return true;
-    }
-
-    for (var a in type.accessors) {
-      if (a is! PropertyAccessorElement) continue;
-      // TODO(sigmund): support setters without getters.
-      if (!a.isGetter) continue;
-      if (a.displayName != name) continue;
-      var v = a.variable;
-      if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
-      generator.addDeclaration(id, name, _typeFor(a.type.returnType.element),
-          isProperty: true,
-          isFinal: v.isFinal,
-          isStatic: a.isStatic,
-          annotations: _copyAnnotations(a));
-      if (includeAccessors && !v.isStatic) _addAccessors(name, !v.isFinal);
-      return true;
-    }
-
-    for (var m in type.methods) {
-      if (m.displayName != name) continue;
-      generator.addDeclaration(
-          id, name, new TypeIdentifier('dart:core', 'Function'),
-          isMethod: true,
-          isStatic: m.isStatic,
-          annotations: _copyAnnotations(m));
-      if (includeAccessors) {
-        if (m.isStatic) {
-          generator.addStaticMethod(id, name);
-          generator.addSymbol(name);
-        } else {
-          _addAccessors(name, false);
-        }
-      }
-      return true;
-    }
-
-    if (recursive) {
-      lookupParent(type);
-      var parent = type.supertype != null ? type.supertype.element : null;
-      if (parent == null || parent == includeUpTo) return false;
-      var parentId = _typeFor(parent);
-      for (var m in type.mixins) {
-        var mixinClass = m.element;
-        var mixinId = _mixins[parentId][mixinClass];
-        if (_lookupMemberInternal(
-            mixinClass, mixinId, name, false, includeAccessors, includeUpTo)) {
-          return true;
-        }
-        parentId = mixinId;
-      }
-      return _lookupMemberInternal(
-          parent, parentId, name, true, includeAccessors, includeUpTo);
-    }
-    return false;
-  }
-
-  /// Add information so smoke can invoke the static method [type].[name].
-  void addStaticMethod(ClassElement type, String name) {
-    generator.addStaticMethod(_typeFor(type), name);
-  }
-
-  /// Adds [name] as a symbol, a getter, and optionally a setter in [generator].
-  _addAccessors(String name, bool includeSetter) {
-    generator.addSymbol(name);
-    generator.addGetter(name);
-    if (includeSetter) generator.addSetter(name);
-  }
-
-  /// Copy metadata associated with the declaration of [target].
-  List<ConstExpression> _copyAnnotations(Element target) {
-    var node = target.computeNode();
-    // [node] is the initialization expression, we walk up to get to the actual
-    // member declaration where the metadata is attached to.
-    while (node is! ClassMember) node = node.parent;
-    return node.metadata.map(_convertAnnotation).toList();
-  }
-
-  /// Converts annotations into [ConstExpression]s supported by the codegen
-  /// library.
-  ConstExpression _convertAnnotation(Annotation annotation) {
-    var element = annotation.element;
-    if (element is ConstructorElement) {
-      if (!element.name.isEmpty) {
-        throw new UnimplementedError(
-            'named constructors are not implemented in smoke.codegen.recorder');
-      }
-
-      var positionalArgs = [];
-      var namedArgs = {};
-      for (var arg in annotation.arguments.arguments) {
-        if (arg is NamedExpression) {
-          namedArgs[arg.name.label.name] = _convertExpression(arg.expression);
-        } else {
-          positionalArgs.add(_convertExpression(arg));
-        }
-      }
-
-      return new ConstructorExpression(importUrlFor(element.library),
-          element.enclosingElement.name, positionalArgs, namedArgs);
-    }
-
-    if (element is PropertyAccessorElement) {
-      return new TopLevelIdentifier(
-          importUrlFor(element.library), element.name);
-    }
-
-    throw new UnsupportedError('unsupported annotation $annotation');
-  }
-
-  /// Converts [expression] into a [ConstExpression].
-  ConstExpression _convertExpression(Expression expression) {
-    if (expression is StringLiteral) {
-      return new ConstExpression.string(expression.stringValue);
-    }
-
-    if (expression is BooleanLiteral ||
-        expression is DoubleLiteral ||
-        expression is IntegerLiteral ||
-        expression is NullLiteral) {
-      return new CodeAsConstExpression("${(expression as dynamic).value}");
-    }
-
-    if (expression is Identifier) {
-      var element = expression.bestElement;
-      if (element == null || !element.isPublic) {
-        throw new UnsupportedError('private constants are not supported');
-      }
-
-      var url = importUrlFor(element.library);
-      if (element is ClassElement) {
-        return new TopLevelIdentifier(url, element.name);
-      }
-
-      if (element is PropertyAccessorElement) {
-        var variable = element.variable;
-        if (variable is FieldElement) {
-          var cls = variable.enclosingElement;
-          return new TopLevelIdentifier(url, '${cls.name}.${variable.name}');
-        } else if (variable is TopLevelVariableElement) {
-          return new TopLevelIdentifier(url, variable.name);
-        }
-      }
-    }
-
-    throw new UnimplementedError('expression convertion not implemented in '
-        'smoke.codegen.recorder (${expression.runtimeType} $expression)');
-  }
-}
-
-/// Returns whether [metadata] contains any annotation that is either equal to
-/// an annotation in [queryAnnotations] or whose type is a subclass of a type
-/// listed in [queryAnnotations]. This is equivalent to the check done in
-/// `src/common.dart#matchesAnnotation`, except that this is applied to
-/// static metadata as it was provided by the analyzer.
-bool _matchesAnnotation(
-    Iterable<ElementAnnotation> metadata, Iterable<Element> queryAnnotations) {
-  for (var meta in metadata) {
-    var element = meta.element;
-    var exp;
-    var type;
-    if (element is PropertyAccessorElement) {
-      exp = element.variable;
-      type = exp.evaluationResult.value.type;
-    } else if (element is ConstructorElement) {
-      exp = element;
-      type = element.enclosingElement.type;
-    } else {
-      throw new UnimplementedError('Unsupported annotation: ${meta}');
-    }
-    for (var queryMeta in queryAnnotations) {
-      if (exp == queryMeta) return true;
-      if (queryMeta is ClassElement && type.isSubtypeOf(queryMeta.type)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-/// Options equivalent to `smoke.dart#QueryOptions`, except that type
-/// information and annotations are denoted by resolver's elements.
-class QueryOptions {
-  /// Whether to include fields (default is true).
-  final bool includeFields;
-
-  /// Whether to include getters and setters (default is true). Note that to
-  /// include fields you also need to enable [includeFields].
-  final bool includeProperties;
-
-  /// Whether to include symbols from the given type and its superclasses
-  /// (except [Object]).
-  final bool includeInherited;
-
-  /// If [includeInherited], walk up the type hierarchy up to this type
-  /// (defaults to [Object]).
-  final ClassElement includeUpTo;
-
-  /// Whether to include final fields and getter-only properties.
-  final bool excludeFinal;
-
-  /// Whether to include methods (default is false).
-  final bool includeMethods;
-
-  /// If [withAnnotation] is not null, then it should be a list of types, so
-  /// only symbols that are annotated with instances of those types are
-  /// included.
-  final List<Element> withAnnotations;
-
-  /// If [matches] is not null, then only those fields, properties, or methods
-  /// that match will be included.
-  final NameMatcher matches;
-
-  const QueryOptions({this.includeFields: true, this.includeProperties: true,
-      this.includeInherited: true, this.includeUpTo: null,
-      this.excludeFinal: false, this.includeMethods: false,
-      this.withAnnotations: null, this.matches: null});
-}
-
-/// Predicate that tells whether [name] should be included in query results.
-typedef bool NameMatcher(String name);
diff --git a/packages/smoke/lib/mirrors.dart b/packages/smoke/lib/mirrors.dart
deleted file mode 100644
index ef018aa..0000000
--- a/packages/smoke/lib/mirrors.dart
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Implementation of the smoke services using mirrors.
-library smoke.mirrors;
-
-import 'dart:mirrors';
-import 'package:smoke/smoke.dart';
-import 'package:logging/logging.dart';
-import 'src/common.dart';
-
-/// Set up the smoke package to use a mirror-based implementation. To tune what
-/// is preserved by `dart:mirrors`, use a @MirrorsUsed annotation and include
-/// 'smoke.mirrors' in your override arguments.
-useMirrors() {
-  configure(new ReflectiveObjectAccessorService(),
-      new ReflectiveTypeInspectorService(),
-      new ReflectiveSymbolConverterService());
-}
-
-var _logger = new Logger('smoke.mirrors');
-
-/// Implements [ObjectAccessorService] using mirrors.
-class ReflectiveObjectAccessorService implements ObjectAccessorService {
-  read(Object object, Symbol name) => reflect(object).getField(name).reflectee;
-
-  void write(Object object, Symbol name, value) {
-    reflect(object).setField(name, value);
-  }
-
-  invoke(receiver, Symbol methodName, List args,
-      {Map namedArgs, bool adjust: false}) {
-    var receiverMirror;
-    var method;
-    if (receiver is Type && methodName != #toString) {
-      receiverMirror = reflectType(receiver);
-      method = receiverMirror.declarations[methodName];
-    } else {
-      receiverMirror = reflect(receiver);
-      method = _findMethod(receiverMirror.type, methodName);
-    }
-    if (method != null && adjust) {
-      var required = 0;
-      var optional = 0;
-      for (var p in method.parameters) {
-        if (p.isOptional) {
-          if (!p.isNamed) optional++;
-        } else {
-          required++;
-        }
-      }
-      args = adjustList(args, required, required + optional);
-    }
-    return receiverMirror.invoke(methodName, args, namedArgs).reflectee;
-  }
-}
-
-/// Implements [TypeInspectorService] using mirrors.
-class ReflectiveTypeInspectorService implements TypeInspectorService {
-  bool isSubclassOf(Type type, Type supertype) {
-    if (type == supertype || supertype == Object) return true;
-    // TODO(sigmund): change to mirror.isSubclassOf when it gets implemented in
-    // dart2js. (dartbug.com/12439)
-    var mirror = reflectClass(type);
-    var top = reflectClass(supertype);
-    while (mirror != _objectType) {
-      mirror = _safeSuperclass(mirror);
-      if (mirror == top) return true;
-    }
-    return false;
-  }
-
-  bool hasGetter(Type type, Symbol name) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return false;
-    while (mirror != _objectType) {
-      final members = mirror.declarations;
-      if (members.containsKey(name)) return true;
-      mirror = _safeSuperclass(mirror);
-    }
-    return false;
-  }
-
-  bool hasSetter(Type type, Symbol name) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return false;
-    var setterName = _setterName(name);
-    while (mirror != _objectType) {
-      final members = mirror.declarations;
-      var declaration = members[name];
-      if (declaration is VariableMirror && !declaration.isFinal) return true;
-      if (members.containsKey(setterName)) return true;
-      mirror = _safeSuperclass(mirror);
-    }
-    return false;
-  }
-
-  bool hasInstanceMethod(Type type, Symbol name) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return false;
-    while (mirror != _objectType) {
-      final m = mirror.declarations[name];
-      if (m is MethodMirror && m.isRegularMethod && !m.isStatic) return true;
-      mirror = _safeSuperclass(mirror);
-    }
-    return false;
-  }
-
-  bool hasStaticMethod(Type type, Symbol name) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return false;
-    final m = mirror.declarations[name];
-    return m is MethodMirror && m.isRegularMethod && m.isStatic;
-  }
-
-  Declaration getDeclaration(Type type, Symbol name) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return null;
-
-    var declaration;
-    while (mirror != _objectType) {
-      final members = mirror.declarations;
-      if (members.containsKey(name)) {
-        declaration = members[name];
-        break;
-      }
-      mirror = _safeSuperclass(mirror);
-    }
-    if (declaration == null) {
-      _logger.severe("declaration doesn't exists ($type.$name).");
-      return null;
-    }
-    return new _MirrorDeclaration(mirror, declaration);
-  }
-
-  List<Declaration> query(Type type, QueryOptions options) {
-    var mirror = reflectType(type);
-    if (mirror is! ClassMirror) return null;
-    return _query(mirror, options);
-  }
-
-  List<Declaration> _query(ClassMirror cls, QueryOptions options) {
-    final visitParent = options.includeInherited && cls.superclass != null &&
-        // TODO(sigmund): use _toType(cls.superclass) != options.includeUpTo
-        // when dartbug.com/16925 gets fixed (_toType fails in dart2js if
-        // applied to classes with type-arguments).
-        cls.superclass != reflectClass(options.includeUpTo);
-    var result = visitParent ? _query(cls.superclass, options) : [];
-    for (var member in cls.declarations.values) {
-      if (member is! VariableMirror && member is! MethodMirror) continue;
-      if (member.isStatic || member.isPrivate) continue;
-      var name = member.simpleName;
-      if (member is VariableMirror) {
-        if (!options.includeFields) continue;
-        if (options.excludeFinal && member.isFinal) continue;
-      }
-
-      // TODO(sigmund): what if we have a setter but no getter?
-      if (member is MethodMirror && member.isSetter) continue;
-      if (member is MethodMirror && member.isConstructor) continue;
-
-      if (member is MethodMirror && member.isGetter) {
-        if (!options.includeProperties) continue;
-        if (options.excludeFinal && !_hasSetter(cls, member)) continue;
-      }
-
-      if (member is MethodMirror && member.isRegularMethod) {
-        if (!options.includeMethods) continue;
-      }
-
-      if (options.matches != null && !options.matches(name)) continue;
-
-      var annotations = member.metadata.map((m) => m.reflectee).toList();
-      if (options.withAnnotations != null &&
-          !matchesAnnotation(annotations, options.withAnnotations)) {
-        continue;
-      }
-
-      var declaration = new _MirrorDeclaration(cls, member);
-
-      if (options.excludeOverriden) {
-        result.retainWhere((value) => declaration.name != value.name);
-      }
-
-      // TODO(sigmund): should we cache parts of this declaration so we don't
-      // compute them twice?  For example, this chould be `new Declaration(name,
-      // type, ...)` and we could reuse what we computed above to implement the
-      // query filtering.  Note, when I tried to eagerly compute everything, I
-      // run into trouble with type (`type = _toType(member.type)`), dart2js
-      // failed when the underlying types had type-arguments (see
-      // dartbug.com/16925).
-      result.add(declaration);
-    }
-
-    return result;
-  }
-}
-
-/// Implements [SymbolConverterService] using mirrors.
-class ReflectiveSymbolConverterService implements SymbolConverterService {
-  String symbolToName(Symbol symbol) => MirrorSystem.getName(symbol);
-  Symbol nameToSymbol(String name) => new Symbol(name);
-}
-
-// TODO(jmesserly): workaround for:
-// https://code.google.com/p/dart/issues/detail?id=10029
-Symbol _setterName(Symbol getter) =>
-    new Symbol('${MirrorSystem.getName(getter)}=');
-
-ClassMirror _safeSuperclass(ClassMirror type) {
-  try {
-    var t = type.superclass;
-    // TODO(sigmund): workaround for darbug.com/17779.
-    // Interceptor is leaked by dart2js. It has the same methods as Object
-    // (including noSuchMethod), and our code above assumes that it doesn't
-    // exist. Most queries exclude Object, so they should exclude Interceptor
-    // too. We don't check for t.simpleName == #Interceptor because depending on
-    // dart2js optimizations it may be #Interceptor or #num/Interceptor.
-    // Checking for a private library seems to reliably filter this out.
-    if (t != null && t.owner != null && t.owner.isPrivate) {
-      t = _objectType;
-    }
-    return t;
-  } on UnsupportedError catch (_) {
-    // Note: dart2js throws UnsupportedError when the type is not reflectable.
-    return _objectType;
-  }
-}
-
-MethodMirror _findMethod(ClassMirror type, Symbol name) {
-  do {
-    var member = type.declarations[name];
-    if (member is MethodMirror) return member;
-    type = type.superclass;
-  } while (type != null);
-  return null;
-}
-
-// When recursively looking for symbols up the type-hierarchy it's generally a
-// good idea to stop at Object, since we know it doesn't have what we want.
-// TODO(jmesserly): This is also a workaround for what appears to be a V8
-// bug introduced between Chrome 31 and 32. After 32
-// JsClassMirror.declarations on Object calls
-// JsClassMirror.typeVariables, which tries to get the _jsConstructor's
-// .prototype["<>"]. This ends up getting the "" property instead, maybe
-// because "<>" doesn't exist, and gets ";" which then blows up because
-// the code later on expects a List of ints.
-final _objectType = reflectClass(Object);
-
-bool _hasSetter(ClassMirror cls, MethodMirror getter) {
-  var mirror = cls.declarations[_setterName(getter.simpleName)];
-  return mirror is MethodMirror && mirror.isSetter;
-}
-
-Type _toType(TypeMirror t) {
-  // TODO(sigmund): this line can go away after dartbug.com/16962
-  if (t == _objectType) return Object;
-  if (t is ClassMirror) return t.reflectedType;
-  if (t == null || t.qualifiedName != #dynamic) {
-    _logger.warning('unknown type ($t).');
-  }
-  return dynamic;
-}
-
-class _MirrorDeclaration implements Declaration {
-  final ClassMirror _cls;
-  final _original;
-
-  _MirrorDeclaration(this._cls, DeclarationMirror this._original);
-
-  Symbol get name => _original.simpleName;
-
-  DeclarationKind get kind => isField ? FIELD : isProperty ? PROPERTY : METHOD;
-
-  bool get isField => _original is VariableMirror;
-
-  bool get isProperty =>
-      _original is MethodMirror && !_original.isRegularMethod;
-
-  bool get isMethod => !isField && !isProperty;
-
-  /// If this is a property, whether it's read only (final fields or properties
-  /// with no setter).
-  bool get isFinal => (_original is VariableMirror && _original.isFinal) ||
-      (_original is MethodMirror &&
-          _original.isGetter &&
-          !_hasSetter(_cls, _original));
-
-  /// If this is a property, it's declared type (including dynamic if it's not
-  /// declared). For methods, the returned type.
-  Type get type {
-    if (_original is MethodMirror && _original.isRegularMethod) {
-      return Function;
-    }
-    var typeMirror =
-        _original is VariableMirror ? _original.type : _original.returnType;
-    return _toType(typeMirror);
-  }
-
-  /// Whether this symbol is static.
-  bool get isStatic => _original.isStatic;
-
-  /// List of annotations in this declaration.
-  List get annotations => _original.metadata.map((a) => a.reflectee).toList();
-
-  int get hashCode => name.hashCode;
-  operator ==(other) => other is Declaration &&
-      name == other.name &&
-      kind == other.kind &&
-      isFinal == other.isFinal &&
-      type == other.type &&
-      isStatic == other.isStatic &&
-      compareLists(annotations, other.annotations);
-  String toString() => (new StringBuffer()
-    ..write('(mirror-based-declaration ')
-    ..write(name)
-    ..write(
-        isField ? ' (field) ' : (isProperty ? ' (property) ' : ' (method) '))
-    ..write(isFinal ? 'final ' : '')
-    ..write(isStatic ? 'static ' : '')
-    ..write(annotations)
-    ..write(')')).toString();
-}
diff --git a/packages/smoke/lib/smoke.dart b/packages/smoke/lib/smoke.dart
deleted file mode 100644
index 0fd9f3c..0000000
--- a/packages/smoke/lib/smoke.dart
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Collects services that can be used to access objects dynamically, inspect
-/// type information, and convert between symbols and strings.
-library smoke;
-
-import 'src/implementation.dart' as implementation;
-
-export 'src/common.dart' show minArgs, maxArgs, canAcceptNArgs, SUPPORTED_ARGS;
-import 'src/common.dart' show compareLists;
-
-/// Configures this library to use [objectAccessor] for all read/write/invoke
-/// APIs, [typeInspector] for all type query APIs, and [symbolConverter] for all
-/// symbol convertion operations.
-///
-/// This function doesn't need to be called during development, but frameworks
-/// should autogenerate a call to this function when running in deployment.
-void configure(ObjectAccessorService objectAccessor,
-    TypeInspectorService typeInspector,
-    SymbolConverterService symbolConverter) {
-  implementation.objectAccessor = objectAccessor;
-  implementation.typeInspector = typeInspector;
-  implementation.symbolConverter = symbolConverter;
-}
-
-/// Return the value of [field] in [object].
-read(Object object, Symbol field) =>
-    implementation.objectAccessor.read(object, field);
-
-/// Update the [value] of [field] in [object].
-void write(Object object, Symbol field, value) =>
-    implementation.objectAccessor.write(object, field, value);
-
-/// Invoke [method] in [receiver] with [args]. The [receiver] can be either an
-/// object (to invoke instance methods) or a type (to invoke static methods).
-/// This function optionally [adjust]s the list of arguments to match the number
-/// of formal parameters by either adding nulls for missing arguments, or by
-/// truncating the list.
-invoke(receiver, Symbol method, List args,
-    {Map namedArgs, bool adjust: false}) => implementation.objectAccessor
-    .invoke(receiver, method, args, namedArgs: namedArgs, adjust: adjust);
-
-/// Tells whether [type] is transitively a subclass of [supertype].
-bool isSubclassOf(Type type, Type supertype) =>
-    implementation.typeInspector.isSubclassOf(type, supertype);
-
-// TODO(sigmund): consider adding also:
-// * isImplementationOf(type, subtype) to tells whether [type] declares that it
-//   implements the [supertype] interface.
-// * isSubtypeOf(type, subtype): Tells whether [type]'s interface is a sybtype
-//   of [supertype]. That is, whether it is a subclass or if [type] implements
-//   [supertype].
-
-/// Tells whether [type] has a field or getter for [field].
-bool hasGetter(Type type, Symbol field) =>
-    implementation.typeInspector.hasGetter(type, field);
-
-/// Tells whether [type] has a field or setter for [field].
-bool hasSetter(Type type, Symbol field) =>
-    implementation.typeInspector.hasSetter(type, field);
-
-/// Tells whether [type] or a superclass (other than [Object]) defines
-/// `noSuchMethod`.
-bool hasNoSuchMethod(Type type) => hasInstanceMethod(type, #noSuchMethod);
-
-/// Tells whether [type] has or a superclass contains a specific instance
-/// [method] (excluding methods in [Object]).
-bool hasInstanceMethod(Type type, Symbol method) =>
-    implementation.typeInspector.hasInstanceMethod(type, method);
-
-/// Tells whether [type] has a specific static [method].
-bool hasStaticMethod(Type type, Symbol method) =>
-    implementation.typeInspector.hasStaticMethod(type, method);
-
-/// Get the declaration associated with field [name] found in [type] or a
-/// superclass of [type].
-Declaration getDeclaration(Type type, Symbol name) =>
-    implementation.typeInspector.getDeclaration(type, name);
-
-/// Retrieve all symbols of [type] that match [options].
-List<Declaration> query(Type type, QueryOptions options) =>
-    implementation.typeInspector.query(type, options);
-
-/// Returns the name associated with a [symbol].
-String symbolToName(Symbol symbol) =>
-    implementation.symbolConverter.symbolToName(symbol);
-
-/// Returns the symbol associated with a [name].
-Symbol nameToSymbol(String name) =>
-    implementation.symbolConverter.nameToSymbol(name);
-
-/// Establishes the parameters for [query] to search for symbols in a type
-/// hierarchy. For now only public instance symbols can be queried (no private,
-/// no static).
-class QueryOptions {
-  /// Whether to include fields (default is true).
-  final bool includeFields;
-
-  /// Whether to include getters and setters (default is true). Note that to
-  /// include fields you also need to enable [includeFields].
-  final bool includeProperties;
-
-  /// Whether to include symbols from the given type and its superclasses
-  /// (except [Object]).
-  final bool includeInherited;
-
-  /// If [includeInherited], walk up the type hierarchy up to this type
-  /// (defaults to [Object]).
-  final Type includeUpTo;
-
-  /// Whether to include final fields and getter-only properties.
-  final bool excludeFinal;
-
-  /// Whether to include symbols that are overriden within the subclass
-  /// (default is false).
-  final bool excludeOverriden;
-
-  /// Whether to include methods (default is false).
-  final bool includeMethods;
-
-  /// If [withAnnotation] is not null, then it should be a list of types, so
-  /// only symbols that are annotated with instances of those types are
-  /// included.
-  final List withAnnotations;
-
-  /// If [matches] is not null, then include only those fields, properties, or
-  /// methods that match the predicate.
-  final NameMatcher matches;
-
-  const QueryOptions({this.includeFields: true, this.includeProperties: true,
-      this.includeInherited: true, this.includeUpTo: Object,
-      this.excludeFinal: false, this.excludeOverriden: false,
-      this.includeMethods: false, this.withAnnotations: null,
-      this.matches: null});
-
-  String toString() => (new StringBuffer()
-    ..write('(options:')
-    ..write(includeFields ? 'fields ' : '')
-    ..write(includeProperties ? 'properties ' : '')
-    ..write(includeMethods ? 'methods ' : '')
-    ..write(includeInherited ? 'inherited ' : '_')
-    ..write(excludeFinal ? 'no finals ' : '')
-    ..write(excludeOverriden ? 'no overriden ': '')
-    ..write('annotations: $withAnnotations')
-    ..write(matches != null ? 'with matcher' : '')
-    ..write(')')).toString();
-}
-
-/// Used to filter query results based on a predicate on [name]. Returns true if
-/// [name] should be included in the query results.
-typedef bool NameMatcher(Symbol name);
-
-/// Information associated with a symbol declaration (like a property or
-/// method).
-class Declaration {
-  /// Name of the property or method
-  final Symbol name;
-
-  /// Kind of declaration (field, property, or method).
-  final DeclarationKind kind;
-
-  /// Whether the symbol is a field (and not a getter/setter property).
-  bool get isField => kind == FIELD;
-
-  /// Whether the symbol is a getter/setter and not a field.
-  bool get isProperty => kind == PROPERTY;
-
-  /// Whether the symbol is a method.
-  bool get isMethod => kind == METHOD;
-
-  /// For fields, whether they are final, for properties, whether they are
-  /// read-only (they have no setter).
-  final bool isFinal;
-
-  /// If this is a field or property, it's declared type (including dynamic if
-  /// it's not declared). For methods, the returned type.
-  final Type type;
-
-  /// Whether this symbol is static.
-  final bool isStatic;
-
-  /// List of annotations in this declaration.
-  final List annotations;
-
-  const Declaration(this.name, this.type, {this.kind: FIELD,
-      this.isFinal: false, this.isStatic: false, this.annotations: const []});
-
-  int get hashCode => name.hashCode;
-  operator ==(other) => other is Declaration &&
-      name == other.name &&
-      kind == other.kind &&
-      isFinal == other.isFinal &&
-      type == other.type &&
-      isStatic == other.isStatic &&
-      compareLists(annotations, other.annotations);
-
-  String toString() {
-    return (new StringBuffer()
-      ..write('(declaration ')
-      ..write(name)
-      ..write(isProperty ? ' (property) ' : ' (method) ')
-      ..write(isFinal ? 'final ' : '')
-      ..write(isStatic ? 'static ' : '')
-      ..write(annotations)
-      ..write(')')).toString();
-  }
-}
-
-/// Enumeration for declaration kinds (field, property, or method)
-class DeclarationKind {
-  final int kind;
-  const DeclarationKind(this.kind);
-}
-
-/// Declaration kind used to denote a raw field.
-const FIELD = const DeclarationKind(0);
-
-/// Declaration kind used to denote a getter/setter.
-const PROPERTY = const DeclarationKind(1);
-
-/// Declaration kind used to denote a method.
-const METHOD = const DeclarationKind(2);
-
-/// A service that provides a way to implement simple operations on objects like
-/// read, write, and invoke.
-abstract class ObjectAccessorService {
-  /// Return the value of [field] in [object].
-  read(Object object, Symbol field);
-
-  /// Update the [value] of [field] in [object].
-  void write(Object object, Symbol field, value);
-
-  /// Invoke [method] in [object] with [args]. It optionally [adjust]s the list
-  /// of arguments to match the number of formal parameters by either adding
-  /// nulls for missing arguments, or by truncating the list.
-  invoke(Object object, Symbol method, List args,
-      {Map namedArgs, bool adjust: false});
-}
-
-/// A service that provides partial inspection into Dart types.
-abstract class TypeInspectorService {
-  /// Tells whether [type] is transitively a subclass of [supertype].
-  bool isSubclassOf(Type type, Type supertype);
-
-  /// Tells whether [type] has a field or getter for [name].
-  bool hasGetter(Type type, Symbol name);
-
-  /// Tells whether [type] has a field or setter for [name].
-  bool hasSetter(Type type, Symbol name);
-
-  /// Tells whether [type] has a specific instance [method].
-  bool hasInstanceMethod(Type type, Symbol method);
-
-  /// Tells whether [type] has a specific static [method].
-  bool hasStaticMethod(Type type, Symbol method);
-
-  /// Get the declaration associated with field [name] in [type].
-  Declaration getDeclaration(Type type, Symbol name);
-
-  /// Retrieve all symbols of [type] that match [options].
-  List<Declaration> query(Type type, QueryOptions options);
-}
-
-/// A service that converts between [Symbol]s and [String]s.
-abstract class SymbolConverterService {
-  /// Returns the name associated with a [symbol].
-  String symbolToName(Symbol symbol);
-
-  /// Returns the symbol associated with a [name].
-  Symbol nameToSymbol(String name);
-}
diff --git a/packages/smoke/lib/src/common.dart b/packages/smoke/lib/src/common.dart
deleted file mode 100644
index 5cec74c..0000000
--- a/packages/smoke/lib/src/common.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Some common utilities used by other libraries in this package.
-library smoke.src.common;
-
-import 'package:smoke/smoke.dart' as smoke show isSubclassOf;
-
-/// Returns [input] adjusted to be within [min] and [max] length. Truncating it
-/// if it's longer, or padding it with nulls if it's shorter. The returned list
-/// is a new copy if any modification is needed, otherwise [input] is returned.
-List adjustList(List input, int min, int max) {
-  if (input.length < min) {
-    return new List(min)..setRange(0, input.length, input);
-  }
-
-  if (input.length > max) {
-    return new List(max)..setRange(0, max, input);
-  }
-  return input;
-}
-
-/// Returns whether [metadata] contains any annotation that is either equal to
-/// an annotation in [queryAnnotations] or whose type is listed in
-/// [queryAnnotations].
-bool matchesAnnotation(Iterable metadata, Iterable queryAnnotations) {
-  for (var meta in metadata) {
-    for (var queryMeta in queryAnnotations) {
-      if (meta == queryMeta) return true;
-      if (queryMeta is Type &&
-          smoke.isSubclassOf(meta.runtimeType, queryMeta)) return true;
-    }
-  }
-  return false;
-}
-
-/// Number of arguments supported by [minArgs] and [maxArgs].
-const SUPPORTED_ARGS = 15;
-
-typedef _Func0();
-typedef _Func1(a);
-typedef _Func2(a, b);
-typedef _Func3(a, b, c);
-typedef _Func4(a, b, c, d);
-typedef _Func5(a, b, c, d, e);
-typedef _Func6(a, b, c, d, e, f);
-typedef _Func7(a, b, c, d, e, f, g);
-typedef _Func8(a, b, c, d, e, f, g, h);
-typedef _Func9(a, b, c, d, e, f, g, h, i);
-typedef _Func10(a, b, c, d, e, f, g, h, i, j);
-typedef _Func11(a, b, c, d, e, f, g, h, i, j, k);
-typedef _Func12(a, b, c, d, e, f, g, h, i, j, k, l);
-typedef _Func13(a, b, c, d, e, f, g, h, i, j, k, l, m);
-typedef _Func14(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
-typedef _Func15(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
-
-/// Returns the minimum number of arguments that [f] takes as input, in other
-/// words, the total number of required arguments of [f]. If [f] expects more
-/// than [SUPPORTED_ARGS], this function returns `SUPPORTED_ARGS + 1`.
-///
-/// For instance, the current implementation only supports calculating the
-/// number of arguments between `0` and `3`. If the function takes `4` or more,
-/// this function automatically returns `4`.
-int minArgs(Function f) {
-  if (f is _Func0) return 0;
-  if (f is _Func1) return 1;
-  if (f is _Func2) return 2;
-  if (f is _Func3) return 3;
-  if (f is _Func4) return 4;
-  if (f is _Func5) return 5;
-  if (f is _Func6) return 6;
-  if (f is _Func7) return 7;
-  if (f is _Func8) return 8;
-  if (f is _Func9) return 9;
-  if (f is _Func10) return 10;
-  if (f is _Func11) return 11;
-  if (f is _Func12) return 12;
-  if (f is _Func13) return 13;
-  if (f is _Func14) return 14;
-  if (f is _Func15) return 15;
-  return SUPPORTED_ARGS + 1;
-}
-
-/// Returns the maximum number of arguments that [f] takes as input, which is
-/// the total number of required and optional arguments of [f]. If
-/// [f] may take more than [SUPPORTED_ARGS] required arguments, this function
-/// returns `-1`. However, if it takes less required arguments, but more than
-/// [SUPPORTED_ARGS] arguments including optional arguments, the result will be
-/// [SUPPORTED_ARGS].
-///
-/// For instance, the current implementation only supports calculating the
-/// number of arguments between `0` and [SUPPORTED_ARGS].  If the function
-/// takes more than [SUPPORTED_ARGS] mandatory arguments, this function
-/// returns `-1`, but if the funtion takes
-/// `8` mandatory arguments and `10` optional arguments, this function returns
-/// [SUPPORTED_ARGS].
-int maxArgs(Function f) {
-  // We could perform a full modified binary search but we really only care
-  // about performance for functions with fewer than 4 arguments.
-  if (f is! _Func2) {
-    if (f is _Func1) return 1;
-    if (f is _Func0) return 0;
-    if (f is! _Func4 && f is _Func3) return 3;
-    // Fall through to the slow case as the function has has maxArgs > 3.
-  } else if (f is! _Func4) {
-    return f is _Func3 ? 3 : 2;
-  }
-
-  if (f is _Func15) return 15;
-  if (f is _Func14) return 14;
-  if (f is _Func13) return 13;
-  if (f is _Func12) return 12;
-  if (f is _Func11) return 11;
-  if (f is _Func10) return 10;
-  if (f is _Func9) return 9;
-  if (f is _Func8) return 8;
-  if (f is _Func7) return 7;
-  if (f is _Func6) return 6;
-  if (f is _Func5) return 5;
-  if (f is _Func4) return 4;
-  if (f is _Func3) return 3;
-  if (f is _Func2) return 2;
-  if (f is _Func1) return 1;
-  if (f is _Func0) return 0;
-  return -1;
-}
-
-/// Returns whether [f] can accept [n] arguments.
-/// This is equivalent to
-/// `n >= minArgs(f) && n <= maxArgs(f)`
-/// when [f] accepts at most [SUPPORTED_ARGS].
-bool canAcceptNArgs(Function f, int n) {
-  switch (n) {
-    case 0:
-      return f is _Func0;
-    case 1:
-      return f is _Func1;
-    case 2:
-      return f is _Func2;
-    case 3:
-      return f is _Func3;
-    case 4:
-      return f is _Func4;
-    case 5:
-      return f is _Func5;
-    case 6:
-      return f is _Func6;
-    case 7:
-      return f is _Func7;
-    case 8:
-      return f is _Func8;
-    case 9:
-      return f is _Func9;
-    case 10:
-      return f is _Func10;
-    case 11:
-      return f is _Func11;
-    case 12:
-      return f is _Func12;
-    case 13:
-      return f is _Func13;
-    case 14:
-      return f is _Func14;
-    case 15:
-      return f is _Func15;
-  }
-  return false;
-}
-
-/// Shallow comparison of two lists.
-bool compareLists(List a, List b, {bool unordered: false}) {
-  if (a == null && b != null) return false;
-  if (a != null && b == null) return false;
-  if (a.length != b.length) return false;
-  if (unordered) {
-    var countMap = {};
-    for (var x in b) {
-      var count = countMap[x];
-      if (count == null) count = 0;
-      countMap[x] = count + 1;
-    }
-    for (var x in a) {
-      var count = countMap[x];
-      if (count == null) return false;
-      if (count == 1) {
-        countMap.remove(x);
-      } else {
-        countMap[x] = count - 1;
-      }
-    }
-    return countMap.isEmpty;
-  } else {
-    for (int i = 0; i < a.length; i++) {
-      if (a[i] != b[i]) return false;
-    }
-  }
-  return true;
-}
-
-/// Shallow comparison of two maps.
-bool compareMaps(Map a, Map b) {
-  if (a == null && b != null) return false;
-  if (a != null && b == null) return false;
-  if (a.length != b.length) return false;
-  for (var k in a.keys) {
-    if (!b.containsKey(k) || a[k] != b[k]) return false;
-  }
-  return true;
-}
diff --git a/packages/smoke/lib/src/default_transformer.dart b/packages/smoke/lib/src/default_transformer.dart
deleted file mode 100644
index 5c634a2..0000000
--- a/packages/smoke/lib/src/default_transformer.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Transformer that replaces the default mirror-based implementation of smoke,
-/// so that during deploy smoke doesn't include any dependency on dart:mirrors.
-library smoke.src.default_transformer;
-
-import 'dart:async';
-import 'package:barback/barback.dart';
-
-/// Replaces the default mirror-based implementation of smoke in
-/// `pacakge:smoke/implementation.dart`, so that during deploy smoke doesn't
-/// include any dependency on dart:mirrors.
-// TODO(sigmund): include tests that run this transformation automatically.
-class DefaultTransformer extends Transformer {
-  DefaultTransformer.asPlugin();
-
-  /// Only apply to `lib/src/implementation.dart`.
-  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
-  // is dropped.
-  Future<bool> isPrimary(idOrAsset) {
-    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
-    return new Future.value(
-        id.package == 'smoke' && id.path == 'lib/src/implementation.dart');
-  }
-
-  Future apply(Transform transform) {
-    var id = transform.primaryInput.id;
-    return transform.primaryInput.readAsString().then((code) {
-      // Note: this rewrite is highly-coupled with how implementation.dart is
-      // written. Make sure both are updated in sync.
-      transform.addOutput(new Asset.fromString(id, code
-          .replaceAll(
-              new RegExp('new Reflective[^;]*;'), 'throwNotConfiguredError();')
-          .replaceAll("import 'package:smoke/mirrors.dart';", '')));
-    });
-  }
-}
-
-/** Transformer phases which should be applied to the smoke package. */
-List<List<Transformer>> get phasesForSmoke =>
-    [[new DefaultTransformer.asPlugin()]];
diff --git a/packages/smoke/lib/src/implementation.dart b/packages/smoke/lib/src/implementation.dart
deleted file mode 100644
index 51d8b9c..0000000
--- a/packages/smoke/lib/src/implementation.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A library that is used to select the default implementation of smoke. During
-/// development we use a default mirror-based implementation, for deployment we
-/// let the main program set programatically what implementation to use (likely
-/// one based on static code generation).
-library smoke.src.implementation;
-
-// IMPORTANT NOTE: This file is edited by a transformer in this package
-// (default_transformer.dart), so any edits here should be coordinated with
-// changes there.
-
-import 'package:smoke/mirrors.dart';
-import 'package:smoke/smoke.dart';
-
-/// Implementation of [ObjectAccessorService] in use, initialized lazily so it
-/// can be replaced at deployment time with an efficient alternative.
-ObjectAccessorService objectAccessor = new ReflectiveObjectAccessorService();
-
-/// Implementation of [TypeInspectorService] in use, initialized lazily so it
-/// can be replaced at deployment time with an efficient alternative.
-TypeInspectorService typeInspector = new ReflectiveTypeInspectorService();
-
-/// Implementation of [SymbolConverterService] in use, initialized lazily so it
-/// can be replaced at deployment time with an efficient alternative.
-SymbolConverterService symbolConverter = new ReflectiveSymbolConverterService();
-
-throwNotConfiguredError() {
-  throw new Exception('The "smoke" library has not been configured. '
-      'Make sure you import and configure one of the implementations ('
-      'package:smoke/mirrors.dart or package:smoke/static.dart).');
-}
diff --git a/packages/smoke/lib/static.dart b/packages/smoke/lib/static.dart
deleted file mode 100644
index 2b5d065..0000000
--- a/packages/smoke/lib/static.dart
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Static implementation of smoke services using code-generated data.
-library smoke.static;
-
-import 'dart:math' as math;
-
-import 'package:smoke/smoke.dart';
-
-import 'src/common.dart';
-
-typedef T Getter<T>(object);
-typedef void Setter<T>(object, value);
-
-class StaticConfiguration {
-  /// Maps symbol to a function that reads that symbol of an object. For
-  /// instance, `#i: (o) => o.i`.
-  final Map<Symbol, Getter> getters;
-
-  /// Maps symbol to a function that updates that symbol of an object. For
-  /// instance, `#i: (o, v) { o.i = v; }`.
-  final Map<Symbol, Setter> setters;
-
-  /// Maps a type to its super class. For example, String: Object.
-  final Map<Type, Type> parents;
-
-  /// For each type, a map of declarations per symbol (property or method).
-  final Map<Type, Map<Symbol, Declaration>> declarations;
-
-  /// Static methods for each type.
-  // TODO(sigmund): should we add static getters & setters too?
-  final Map<Type, Map<Symbol, Function>> staticMethods;
-
-  /// A map from symbol to strings.
-  final Map<Symbol, String> names;
-
-  /// A map from strings to symbols (the reverse of [names]).
-  final Map<String, Symbol> _symbols = {};
-
-  /// Whether to check for missing declarations, otherwise, return default
-  /// values (for example a missing parent class can be treated as Object)
-  final bool checkedMode;
-
-  StaticConfiguration({Map<Symbol, Getter> getters, Map<Symbol, Setter> setters,
-      Map<Type, Type> parents, Map<Type, Map<Symbol, Declaration>> declarations,
-      Map<Type, Map<Symbol, Function>> staticMethods, Map<Symbol, String> names,
-      this.checkedMode: true})
-      : getters = getters != null ? getters : {},
-        setters = setters != null ? setters : {},
-        parents = parents != null ? parents : {},
-        declarations = declarations != null ? declarations : {},
-        staticMethods = staticMethods != null ? staticMethods : {},
-        names = names != null ? names : {} {
-    this.names.forEach((k, v) {
-      _symbols[v] = k;
-    });
-  }
-
-  void addAll(StaticConfiguration other) {
-    getters.addAll(other.getters);
-    setters.addAll(other.setters);
-    parents.addAll(other.parents);
-    _nestedAddAll(declarations, other.declarations);
-    _nestedAddAll(staticMethods, other.staticMethods);
-    names.addAll(other.names);
-    other.names.forEach((k, v) {
-      _symbols[v] = k;
-    });
-  }
-
-  static _nestedAddAll(Map a, Map b) {
-    for (var key in b.keys) {
-      a.putIfAbsent(key, () => {});
-      a[key].addAll(b[key]);
-    }
-  }
-}
-
-/// Set up the smoke package to use a static implementation based on the given
-/// [configuration].
-useGeneratedCode(StaticConfiguration configuration) {
-  configure(new GeneratedObjectAccessorService(configuration),
-      new GeneratedTypeInspectorService(configuration),
-      new GeneratedSymbolConverterService(configuration));
-}
-
-/// Implements [ObjectAccessorService] using a static configuration.
-class GeneratedObjectAccessorService implements ObjectAccessorService {
-  final StaticConfiguration _configuration;
-  Map<Symbol, Getter> get _getters => _configuration.getters;
-  Map<Symbol, Setter> get _setters => _configuration.setters;
-  Map<Type, Map<Symbol, Function>> get _staticMethods =>
-      _configuration.staticMethods;
-
-  GeneratedObjectAccessorService(this._configuration);
-
-  read(Object object, Symbol name) {
-    var getter = _getters[name];
-    if (getter == null) {
-      throw new MissingCodeException('getter "$name" in $object');
-    }
-    return getter(object);
-  }
-
-  void write(Object object, Symbol name, value) {
-    var setter = _setters[name];
-    if (setter == null) {
-      throw new MissingCodeException('setter "$name" in $object');
-    }
-    setter(object, value);
-  }
-
-  invoke(object, Symbol name, List args, {Map namedArgs, bool adjust: false}) {
-    var method;
-    if (object is Type && name != #toString) {
-      var classMethods = _staticMethods[object];
-      method = classMethods == null ? null : classMethods[name];
-    } else {
-      var getter = _getters[name];
-      method = getter == null ? null : getter(object);
-    }
-    if (method == null) {
-      throw new MissingCodeException('method "$name" in $object');
-    }
-    var tentativeError;
-    if (adjust) {
-      var min = minArgs(method);
-      if (min > SUPPORTED_ARGS) {
-        tentativeError = 'we tried to adjust the arguments for calling "$name"'
-            ', but we couldn\'t determine the exact number of arguments it '
-            'expects (it is more than $SUPPORTED_ARGS).';
-        // The argument list might be correct, so we still invoke the function
-        // and let the user see the error.
-        args = adjustList(args, min, math.max(min, args.length));
-      } else {
-        var max = maxArgs(method);
-        args = adjustList(args, min, max >= 0 ? max : args.length);
-      }
-    }
-    if (namedArgs != null) {
-      throw new UnsupportedError(
-          'smoke.static doesn\'t support namedArguments in invoke');
-    }
-    try {
-      return Function.apply(method, args);
-    } on NoSuchMethodError catch (_) {
-      // TODO(sigmund): consider whether this should just be in a logger or if
-      // we should wrap `e` as a new exception (what's the best way to let users
-      // know about this tentativeError?)
-      if (tentativeError != null) print(tentativeError);
-      rethrow;
-    }
-  }
-}
-
-/// Implements [TypeInspectorService] using a static configuration.
-class GeneratedTypeInspectorService implements TypeInspectorService {
-  final StaticConfiguration _configuration;
-
-  Map<Type, Type> get _parents => _configuration.parents;
-  Map<Type, Map<Symbol, Declaration>> get _declarations =>
-      _configuration.declarations;
-  bool get _checkedMode => _configuration.checkedMode;
-
-  GeneratedTypeInspectorService(this._configuration);
-
-  bool isSubclassOf(Type type, Type supertype) {
-    if (type == supertype || supertype == Object) return true;
-    while (type != Object) {
-      var parentType = _parents[type];
-      if (parentType == supertype) return true;
-      if (parentType == null) {
-        if (!_checkedMode) return false;
-        throw new MissingCodeException('superclass of "$type" ($parentType)');
-      }
-      type = parentType;
-    }
-    return false;
-  }
-
-  bool hasGetter(Type type, Symbol name) {
-    var decl = _findDeclaration(type, name);
-    // No need to check decl.isProperty because methods are also automatically
-    // considered getters (auto-closures).
-    return decl != null && !decl.isStatic;
-  }
-
-  bool hasSetter(Type type, Symbol name) {
-    var decl = _findDeclaration(type, name);
-    return decl != null && !decl.isMethod && !decl.isFinal && !decl.isStatic;
-  }
-
-  bool hasInstanceMethod(Type type, Symbol name) {
-    var decl = _findDeclaration(type, name);
-    return decl != null && decl.isMethod && !decl.isStatic;
-  }
-
-  bool hasStaticMethod(Type type, Symbol name) {
-    final map = _declarations[type];
-    if (map == null) {
-      if (!_checkedMode) return false;
-      throw new MissingCodeException('declarations for $type');
-    }
-    final decl = map[name];
-    return decl != null && decl.isMethod && decl.isStatic;
-  }
-
-  Declaration getDeclaration(Type type, Symbol name) {
-    var decl = _findDeclaration(type, name);
-    if (decl == null) {
-      if (!_checkedMode) return null;
-      throw new MissingCodeException('declaration for $type.$name');
-    }
-    return decl;
-  }
-
-  List<Declaration> query(Type type, QueryOptions options) {
-    var result = [];
-    if (options.includeInherited) {
-      var superclass = _parents[type];
-      if (superclass == null) {
-        if (_checkedMode) {
-          throw new MissingCodeException('superclass of "$type"');
-        }
-      } else if (superclass != options.includeUpTo) {
-        result = query(superclass, options);
-      }
-    }
-    var map = _declarations[type];
-    if (map == null) {
-      if (!_checkedMode) return result;
-      throw new MissingCodeException('declarations for $type');
-    }
-    for (var decl in map.values) {
-      if (!options.includeFields && decl.isField) continue;
-      if (!options.includeProperties && decl.isProperty) continue;
-      if (options.excludeFinal && decl.isFinal) continue;
-      if (!options.includeMethods && decl.isMethod) continue;
-      if (options.matches != null && !options.matches(decl.name)) continue;
-      if (options.withAnnotations != null &&
-          !matchesAnnotation(decl.annotations, options.withAnnotations)) {
-        continue;
-      }
-      if (options.excludeOverriden) {
-        result.retainWhere((value) => decl.name != value.name);
-      }
-      result.add(decl);
-    }
-    return result;
-  }
-
-  Declaration _findDeclaration(Type type, Symbol name) {
-    while (type != Object) {
-      final declarations = _declarations[type];
-      if (declarations != null) {
-        final declaration = declarations[name];
-        if (declaration != null) return declaration;
-      }
-      var parentType = _parents[type];
-      if (parentType == null) {
-        if (!_checkedMode) return null;
-        throw new MissingCodeException('superclass of "$type"');
-      }
-      type = parentType;
-    }
-    return null;
-  }
-}
-
-/// Implements [SymbolConverterService] using a static configuration.
-class GeneratedSymbolConverterService implements SymbolConverterService {
-  final StaticConfiguration _configuration;
-  Map<Symbol, String> get _names => _configuration.names;
-  Map<String, Symbol> get _symbols => _configuration._symbols;
-
-  GeneratedSymbolConverterService(this._configuration);
-
-  String symbolToName(Symbol symbol) => _names[symbol];
-  Symbol nameToSymbol(String name) => _symbols[name];
-}
-
-/// Exception thrown when trynig to access something that should be there, but
-/// the code generator didn't include it.
-class MissingCodeException implements Exception {
-  final String description;
-  MissingCodeException(this.description);
-
-  String toString() => 'Missing $description. '
-      'Code generation for the smoke package seems incomplete.';
-}
diff --git a/packages/smoke/lib/static_debug.dart b/packages/smoke/lib/static_debug.dart
deleted file mode 100644
index a51b13e..0000000
--- a/packages/smoke/lib/static_debug.dart
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Static implementation of smoke services that uses code-generated data and
-/// verifies that the results match what we would get with a mirror-based
-/// implementation.
-library smoke.static_debug;
-
-export 'package:smoke/static.dart' show StaticConfiguration, Getter, Setter;
-import 'package:smoke/static.dart';
-import 'package:smoke/mirrors.dart';
-import 'package:smoke/smoke.dart';
-
-import 'src/common.dart' show compareLists;
-
-/// Set up the smoke package to use a static implementation based on the given
-/// [configuration].
-useGeneratedCode(StaticConfiguration configuration) {
-  configure(new _DebugObjectAccessorService(configuration),
-      new _DebugTypeInspectorService(configuration),
-      new _DebugSymbolConverterService(configuration));
-}
-
-/// Implements [ObjectAccessorService] using a static configuration.
-class _DebugObjectAccessorService implements ObjectAccessorService {
-  GeneratedObjectAccessorService _static;
-  ReflectiveObjectAccessorService _mirrors;
-
-  _DebugObjectAccessorService(StaticConfiguration configuration)
-      : _static = new GeneratedObjectAccessorService(configuration),
-        _mirrors = new ReflectiveObjectAccessorService();
-
-  read(Object object, Symbol name) => _check('read', [
-    object,
-    name
-  ], _static.read(object, name), _mirrors.read(object, name));
-
-  // Note: we can't verify operations with side-effects like write or invoke.
-  void write(Object object, Symbol name, value) =>
-      _static.write(object, name, value);
-
-  invoke(object, Symbol name, List args, {Map namedArgs, bool adjust: false}) =>
-      _static.invoke(object, name, args, namedArgs: namedArgs, adjust: adjust);
-}
-
-/// Implements [TypeInspectorService] using a static configuration.
-class _DebugTypeInspectorService implements TypeInspectorService {
-  GeneratedTypeInspectorService _static;
-  ReflectiveTypeInspectorService _mirrors;
-
-  _DebugTypeInspectorService(StaticConfiguration configuration)
-      : _static = new GeneratedTypeInspectorService(configuration),
-        _mirrors = new ReflectiveTypeInspectorService();
-
-  bool isSubclassOf(Type type, Type supertype) => _check('isSubclassOf', [
-    type,
-    supertype
-  ], _static.isSubclassOf(type, supertype),
-      _mirrors.isSubclassOf(type, supertype));
-
-  bool hasGetter(Type type, Symbol name) => _check('hasGetter', [
-    type,
-    name
-  ], _static.hasGetter(type, name), _mirrors.hasGetter(type, name));
-
-  bool hasSetter(Type type, Symbol name) => _check('hasSetter', [
-    type,
-    name
-  ], _static.hasSetter(type, name), _mirrors.hasSetter(type, name));
-
-  bool hasInstanceMethod(Type type, Symbol name) => _check('hasInstanceMethod',
-      [type, name], _static.hasInstanceMethod(type, name),
-      _mirrors.hasInstanceMethod(type, name));
-
-  bool hasStaticMethod(Type type, Symbol name) => _check('hasStaticMethod', [
-    type,
-    name
-  ], _static.hasStaticMethod(type, name), _mirrors.hasStaticMethod(type, name));
-
-  Declaration getDeclaration(Type type, Symbol name) => _check('getDeclaration',
-      [
-    type,
-    name
-  ], _static.getDeclaration(type, name), _mirrors.getDeclaration(type, name));
-
-  List<Declaration> query(Type type, QueryOptions options) => _check('query', [
-    type,
-    options
-  ], _static.query(type, options), _mirrors.query(type, options));
-}
-
-/// Implements [SymbolConverterService] using a static configuration.
-class _DebugSymbolConverterService implements SymbolConverterService {
-  GeneratedSymbolConverterService _static;
-  ReflectiveSymbolConverterService _mirrors;
-
-  _DebugSymbolConverterService(StaticConfiguration configuration)
-      : _static = new GeneratedSymbolConverterService(configuration),
-        _mirrors = new ReflectiveSymbolConverterService();
-
-  String symbolToName(Symbol symbol) => _check('symbolToName', [symbol],
-      _static.symbolToName(symbol), _mirrors.symbolToName(symbol));
-
-  Symbol nameToSymbol(String name) => _check('nameToSymbol', [name],
-      _static.nameToSymbol(name), _mirrors.nameToSymbol(name));
-}
-
-_check(String operation, List arguments, staticResult, mirrorResult) {
-  if (staticResult == mirrorResult) return staticResult;
-  if (staticResult is List &&
-      mirrorResult is List &&
-      compareLists(staticResult, mirrorResult, unordered: true)) {
-    return staticResult;
-  }
-  print('warning: inconsistent result on $operation(${arguments.join(', ')})\n'
-      'smoke.mirrors result: $mirrorResult\n'
-      'smoke.static result:  $staticResult\n');
-  return staticResult;
-}
diff --git a/packages/smoke/pubspec.yaml b/packages/smoke/pubspec.yaml
deleted file mode 100644
index 58f0a80..0000000
--- a/packages/smoke/pubspec.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: smoke
-version: 0.3.6
-author: Polymer.dart Authors <web-ui-dev@dartlang.org>
-homepage: https://github.com/dart-lang/smoke
-description: >
-  A restricted reflective system that uses mirrors at development time, but that
-  can be replaced with non-reflective calls using code generation. See README.md
-  for mode details.
-dependencies:
-  barback: ">=0.9.0 <0.16.0"
-  logging: ">=0.9.0 <0.12.0"
-  analyzer: "^0.27.0"
-# TODO(sigmund): once we have some easier way to do global app-level
-# transformers, we might want to remove this transformer here and only apply it
-# in apps that need it.
-transformers:
-- smoke/src/default_transformer:
-    $include: lib/src/implementation.dart
-dev_dependencies:
-  test: "^0.12.0"
-  path: "^1.0.0"
-  code_transformers: "^0.3.0"
-environment:
-  sdk: ">=1.12.0 <2.0.0"
diff --git a/packages/smoke/test/args_test.dart b/packages/smoke/test/args_test.dart
deleted file mode 100644
index 4b5b089..0000000
--- a/packages/smoke/test/args_test.dart
+++ /dev/null
@@ -1,635 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests for [minArgs] and [maxArgs].
-library smoke.test.args_test;
-
-import 'package:smoke/smoke.dart'
-    show minArgs, maxArgs, canAcceptNArgs, SUPPORTED_ARGS;
-import 'package:test/test.dart';
-
-main() {
-  var a = new A();
-  var instanceMethods = [
-    a.m1,
-    a.m2,
-    a.m3,
-    a.m4,
-    a.m5,
-    a.m6,
-    a.m7,
-    a.m8,
-    a.m9,
-    a.m10,
-    a.m11,
-    a.m12,
-    a.m13,
-    a.m14,
-    a.m15,
-    a.m16,
-    a.m17,
-    a.m18,
-    a.m19,
-    a.m20,
-    a.m21,
-    a.m22,
-    a.m23,
-    a.m24,
-    a.m25,
-    a.m26,
-    a.m27,
-    a.m28,
-    a.m29,
-    a.m30,
-    a.m31,
-    a.m32,
-    a.m33,
-    a.m34,
-    a.m35,
-    a.m36,
-    a.m37,
-    a.m38,
-    a.m39,
-    a.m40,
-    a.m41,
-    a.m42,
-    a.m43,
-    a.m44,
-    a.m45,
-    a.m46,
-    a.m47,
-    a.m48,
-    a.m49,
-    a.m50,
-    a.m51,
-    a.m52,
-    a.m53,
-    a.m54,
-    a.m55,
-    a.m56,
-    a.m57
-  ];
-  group('instance methods', () => checkMethods(instanceMethods));
-  group('static methods', () => checkMethods(staticMethods));
-  group('closures', () => checkMethods(closures));
-  group('top level methods', () => checkMethods(topLevelMethods));
-}
-
-checkMethods(List methods) {
-  test('min args', () {
-    expect(methods.map((m) => minArgs(m)), expectedMin);
-  });
-
-  test('max args', () {
-    expect(methods.map((m) => maxArgs(m)), expectedMax);
-  });
-
-  test('can accept n arguments', () {
-    for (var m in methods) {
-      for (int n = 0; n < SUPPORTED_ARGS; n++) {
-        expect(canAcceptNArgs(m, n), n >= minArgs(m) && n <= maxArgs(m));
-      }
-    }
-  });
-}
-
-class A {
-  // required args only
-  static s1() {}
-  static s2(p1) {}
-  static s3(p1, p2) {}
-  static s4(p1, p2, p3) {}
-  static s5(p1, p2, p3, p4) {}
-  static s6(p1, p2, p3, p4, p5) {}
-
-  // optional args only
-  static s7([o1]) {}
-  static s8([o1, o2]) {}
-  static s9([o1, o2, o3]) {}
-  static s10([o1, o2, o3, o4]) {}
-  static s11([o1, o2, o3, o4, o5]) {}
-
-  // 1 required, some optional
-  static s12(p1, [o2]) {}
-  static s13(p1, [o2, o3]) {}
-  static s14(p1, [o2, o3, o4]) {}
-  static s15(p1, [o2, o3, o4, o5]) {}
-
-  // 2 required, some optional
-  static s16(p1, p2, [o3]) {}
-  static s17(p1, p2, [o3, o4]) {}
-  static s18(p1, p2, [o3, o4, o5]) {}
-
-  // 3 required, some optional
-  static s19(p1, p2, p3, [o4]) {}
-  static s20(p1, p2, p3, [o4, o5]) {}
-
-  // 4 required, some optional
-  static s21(p1, p2, p3, p4, [o5]) {}
-
-  // >5 arguments, required args only.
-  static s22(p1, p2, p3, p4, p5, p6) {}
-  static s23(p1, p2, p3, p4, p5, p6, p7) {}
-  static s24(p1, p2, p3, p4, p5, p6, p7, p8) {}
-  static s25(p1, p2, p3, p4, p5, p6, p7, p8, p9) {}
-  static s26(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {}
-  static s27(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {}
-  static s28(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {}
-  static s29(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {}
-  static s30(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) {}
-  static s31(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) {
-  }
-  static s32(
-      p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) {}
-  static s33(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
-      p16, p17) {}
-
-  // >5 arguments, all but one required.
-  static s34(p1, p2, p3, p4, p5, [o6]) {}
-  static s35(p1, p2, p3, p4, p5, p6, [o7]) {}
-  static s36(p1, p2, p3, p4, p5, p6, p7, [o8]) {}
-  static s37(p1, p2, p3, p4, p5, p6, p7, p8, [o9]) {}
-  static s38(p1, p2, p3, p4, p5, p6, p7, p8, p9, [o10]) {}
-  static s39(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, [o11]) {}
-  static s40(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, [o12]) {}
-  static s41(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, [o13]) {}
-  static s42(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, [o14]) {}
-  static s43(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14,
-      [o15]) {}
-  static s44(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
-      [o16]) {}
-  static s45(
-      p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-      [o17]) {}
-
-  // >5 arguments, 5 required.
-  static s46(p1, p2, p3, p4, p5, [o6]) {}
-  static s47(p1, p2, p3, p4, p5, [o6, o7]) {}
-  static s48(p1, p2, p3, p4, p5, [o6, o7, o8]) {}
-  static s49(p1, p2, p3, p4, p5, [o6, o7, o8, o9]) {}
-  static s50(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10]) {}
-  static s51(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11]) {}
-  static s52(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12]) {}
-  static s53(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13]) {}
-  static s54(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14]) {}
-  static s55(p1, p2, p3, p4, p5,
-      [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15]) {}
-  static s56(p1, p2, p3, p4, p5,
-      [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16]) {}
-  static s57(p1, p2, p3, p4, p5,
-      [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17]) {}
-
-  m1() {}
-  m2(p1) {}
-  m3(p1, p2) {}
-  m4(p1, p2, p3) {}
-  m5(p1, p2, p3, p4) {}
-  m6(p1, p2, p3, p4, p5) {}
-  m7([o1]) {}
-  m8([o1, o2]) {}
-  m9([o1, o2, o3]) {}
-  m10([o1, o2, o3, o4]) {}
-  m11([o1, o2, o3, o4, o5]) {}
-  m12(p1, [o2]) {}
-  m13(p1, [o2, o3]) {}
-  m14(p1, [o2, o3, o4]) {}
-  m15(p1, [o2, o3, o4, o5]) {}
-  m16(p1, p2, [o3]) {}
-  m17(p1, p2, [o3, o4]) {}
-  m18(p1, p2, [o3, o4, o5]) {}
-  m19(p1, p2, p3, [o4]) {}
-  m20(p1, p2, p3, [o4, o5]) {}
-  m21(p1, p2, p3, p4, [o5]) {}
-
-  // >5 arguments, required args only.
-  m22(p1, p2, p3, p4, p5, p6) {}
-  m23(p1, p2, p3, p4, p5, p6, p7) {}
-  m24(p1, p2, p3, p4, p5, p6, p7, p8) {}
-  m25(p1, p2, p3, p4, p5, p6, p7, p8, p9) {}
-  m26(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {}
-  m27(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {}
-  m28(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {}
-  m29(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {}
-  m30(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) {}
-  m31(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) {}
-  m32(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) {}
-  m33(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-      p17) {}
-
-  // >5 arguments, all but one required.
-  m34(p1, p2, p3, p4, p5, [o6]) {}
-  m35(p1, p2, p3, p4, p5, p6, [o7]) {}
-  m36(p1, p2, p3, p4, p5, p6, p7, [o8]) {}
-  m37(p1, p2, p3, p4, p5, p6, p7, p8, [o9]) {}
-  m38(p1, p2, p3, p4, p5, p6, p7, p8, p9, [o10]) {}
-  m39(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, [o11]) {}
-  m40(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, [o12]) {}
-  m41(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, [o13]) {}
-  m42(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, [o14]) {}
-  m43(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, [o15]) {}
-  m44(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, [o16]) {
-  }
-  m45(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-      [o17]) {}
-
-  // >5 arguments, 5 required.
-  m46(p1, p2, p3, p4, p5, [o6]) {}
-  m47(p1, p2, p3, p4, p5, [o6, o7]) {}
-  m48(p1, p2, p3, p4, p5, [o6, o7, o8]) {}
-  m49(p1, p2, p3, p4, p5, [o6, o7, o8, o9]) {}
-  m50(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10]) {}
-  m51(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11]) {}
-  m52(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12]) {}
-  m53(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13]) {}
-  m54(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14]) {}
-  m55(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15]) {}
-  m56(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16]) {
-  }
-  m57(p1, p2, p3, p4, p5,
-      [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17]) {}
-}
-
-t1() {}
-t2(p1) {}
-t3(p1, p2) {}
-t4(p1, p2, p3) {}
-t5(p1, p2, p3, p4) {}
-t6(p1, p2, p3, p4, p5) {}
-t7([o1]) {}
-t8([o1, o2]) {}
-t9([o1, o2, o3]) {}
-t10([o1, o2, o3, o4]) {}
-t11([o1, o2, o3, o4, o5]) {}
-t12(p1, [o2]) {}
-t13(p1, [o2, o3]) {}
-t14(p1, [o2, o3, o4]) {}
-t15(p1, [o2, o3, o4, o5]) {}
-t16(p1, p2, [o3]) {}
-t17(p1, p2, [o3, o4]) {}
-t18(p1, p2, [o3, o4, o5]) {}
-t19(p1, p2, p3, [o4]) {}
-t20(p1, p2, p3, [o4, o5]) {}
-t21(p1, p2, p3, p4, [o5]) {}
-
-// >5 arguments, required args only.
-t22(p1, p2, p3, p4, p5, p6) {}
-t23(p1, p2, p3, p4, p5, p6, p7) {}
-t24(p1, p2, p3, p4, p5, p6, p7, p8) {}
-t25(p1, p2, p3, p4, p5, p6, p7, p8, p9) {}
-t26(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {}
-t27(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {}
-t28(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {}
-t29(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {}
-t30(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) {}
-t31(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) {}
-t32(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) {}
-t33(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-    p17) {}
-
-// >5 arguments, all but one required.
-t34(p1, p2, p3, p4, p5, [o6]) {}
-t35(p1, p2, p3, p4, p5, p6, [o7]) {}
-t36(p1, p2, p3, p4, p5, p6, p7, [o8]) {}
-t37(p1, p2, p3, p4, p5, p6, p7, p8, [o9]) {}
-t38(p1, p2, p3, p4, p5, p6, p7, p8, p9, [o10]) {}
-t39(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, [o11]) {}
-t40(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, [o12]) {}
-t41(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, [o13]) {}
-t42(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, [o14]) {}
-t43(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, [o15]) {}
-t44(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, [o16]) {}
-t45(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-    [o17]) {}
-
-// >5 arguments, 5 required.
-t46(p1, p2, p3, p4, p5, [o6]) {}
-t47(p1, p2, p3, p4, p5, [o6, o7]) {}
-t48(p1, p2, p3, p4, p5, [o6, o7, o8]) {}
-t49(p1, p2, p3, p4, p5, [o6, o7, o8, o9]) {}
-t50(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10]) {}
-t51(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11]) {}
-t52(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12]) {}
-t53(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13]) {}
-t54(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14]) {}
-t55(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15]) {}
-t56(p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16]) {}
-t57(p1, p2, p3, p4, p5,
-    [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17]) {}
-
-List closures = [
-  () {},
-  (p1) {},
-  (p1, p2) {},
-  (p1, p2, p3) {},
-  (p1, p2, p3, p4) {},
-  (p1, p2, p3, p4, p5) {},
-  ([o1]) {},
-  ([o1, o2]) {},
-  ([o1, o2, o3]) {},
-  ([o1, o2, o3, o4]) {},
-  ([o1, o2, o3, o4, o5]) {},
-  (p1, [o2]) {},
-  (p1, [o2, o3]) {},
-  (p1, [o2, o3, o4]) {},
-  (p1, [o2, o3, o4, o5]) {},
-  (p1, p2, [o3]) {},
-  (p1, p2, [o3, o4]) {},
-  (p1, p2, [o3, o4, o5]) {},
-  (p1, p2, p3, [o4]) {},
-  (p1, p2, p3, [o4, o5]) {},
-  (p1, p2, p3, p4, [o5]) {},
-
-  // >5 arguments, required args only.
-  (p1, p2, p3, p4, p5, p6) {},
-  (p1, p2, p3, p4, p5, p6, p7) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17) {
-  },
-
-  // >5 arguments, all but one required.
-  (p1, p2, p3, p4, p5, [o6]) {},
-  (p1, p2, p3, p4, p5, p6, [o7]) {},
-  (p1, p2, p3, p4, p5, p6, p7, [o8]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, [o9]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, [o10]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, [o11]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, [o12]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, [o13]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, [o14]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, [o15]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, [o16]) {},
-  (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
-      [o17]) {},
-
-  // >5 arguments, 5 required.
-  (p1, p2, p3, p4, p5, [o6]) {},
-  (p1, p2, p3, p4, p5, [o6, o7]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15]) {},
-  (p1, p2, p3, p4, p5, [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16]) {},
-  (p1, p2, p3, p4, p5,
-      [o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17]) {}
-];
-
-List staticMethods = [
-  A.s1,
-  A.s2,
-  A.s3,
-  A.s4,
-  A.s5,
-  A.s6,
-  A.s7,
-  A.s8,
-  A.s9,
-  A.s10,
-  A.s11,
-  A.s12,
-  A.s13,
-  A.s14,
-  A.s15,
-  A.s16,
-  A.s17,
-  A.s18,
-  A.s19,
-  A.s20,
-  A.s21,
-  A.s22,
-  A.s23,
-  A.s24,
-  A.s25,
-  A.s26,
-  A.s27,
-  A.s28,
-  A.s29,
-  A.s30,
-  A.s31,
-  A.s32,
-  A.s33,
-  A.s34,
-  A.s35,
-  A.s36,
-  A.s37,
-  A.s38,
-  A.s39,
-  A.s40,
-  A.s41,
-  A.s42,
-  A.s43,
-  A.s44,
-  A.s45,
-  A.s46,
-  A.s47,
-  A.s48,
-  A.s49,
-  A.s50,
-  A.s51,
-  A.s52,
-  A.s53,
-  A.s54,
-  A.s55,
-  A.s56,
-  A.s57
-];
-
-List topLevelMethods = [
-  t1,
-  t2,
-  t3,
-  t4,
-  t5,
-  t6,
-  t7,
-  t8,
-  t9,
-  t10,
-  t11,
-  t12,
-  t13,
-  t14,
-  t15,
-  t16,
-  t17,
-  t18,
-  t19,
-  t20,
-  t21,
-  t22,
-  t23,
-  t24,
-  t25,
-  t26,
-  t27,
-  t28,
-  t29,
-  t30,
-  t31,
-  t32,
-  t33,
-  t34,
-  t35,
-  t36,
-  t37,
-  t38,
-  t39,
-  t40,
-  t41,
-  t42,
-  t43,
-  t44,
-  t45,
-  t46,
-  t47,
-  t48,
-  t49,
-  t50,
-  t51,
-  t52,
-  t53,
-  t54,
-  t55,
-  t56,
-  t57
-];
-
-const MIN_NOT_KNOWN = SUPPORTED_ARGS + 1;
-List expectedMin = const [
-  0,
-  1,
-  2,
-  3,
-  4,
-  5, // required only
-  0,
-  0,
-  0,
-  0,
-  0, // optional only
-  1,
-  1,
-  1,
-  1, // 1 required
-  2,
-  2,
-  2, // 2 required
-  3,
-  3, // 3 required
-  4, // 4 required
-  // >5 arguments, required args only.
-  6,
-  7,
-  8,
-  9,
-  10,
-  11,
-  12,
-  13,
-  14,
-  15,
-  MIN_NOT_KNOWN,
-  MIN_NOT_KNOWN,
-  // >5 arguments, 1 optional argument.
-  5,
-  6,
-  7,
-  8,
-  9,
-  10,
-  11,
-  12,
-  13,
-  14,
-  15,
-  MIN_NOT_KNOWN,
-  // >5 arguments, 5 required
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5,
-  5
-];
-
-const MAX_NOT_KNOWN = -1;
-List expectedMax = const [
-  0,
-  1,
-  2,
-  3,
-  4,
-  5, // required only
-  1,
-  2,
-  3,
-  4,
-  5, // optional only
-  2,
-  3,
-  4,
-  5, // 1 required
-  3,
-  4,
-  5, // 2 required
-  4,
-  5, // 3 required
-  5, // 4 required
-  // >5 arguments, required args only.
-  6,
-  7,
-  8,
-  9,
-  10,
-  11,
-  12,
-  13,
-  14,
-  15,
-  MAX_NOT_KNOWN,
-  MAX_NOT_KNOWN,
-  // >5 arguments, 1 optional argument.
-  6,
-  7,
-  8,
-  9,
-  10,
-  11,
-  12,
-  13,
-  14,
-  15,
-  15,
-  MAX_NOT_KNOWN,
-  // >5 arguments, 5 required
-  6,
-  7,
-  8,
-  9,
-  10,
-  11,
-  12,
-  13,
-  14,
-  15,
-  15,
-  15
-];
diff --git a/packages/smoke/test/codegen/common.dart b/packages/smoke/test/codegen/common.dart
deleted file mode 100644
index b595816..0000000
--- a/packages/smoke/test/codegen/common.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.codegen.common;
-
-import 'package:smoke/codegen/generator.dart';
-import 'package:test/test.dart';
-
-checkResults(SmokeCodeGenerator generator,
-    {List<String> imports: const [], String topLevel: '', String initCall}) {
-  var allImports = []
-    ..addAll(DEFAULT_IMPORTS)
-    ..addAll(imports)
-    ..add('');
-  var genImports = new StringBuffer();
-  generator.writeImports(genImports);
-  expect(genImports.toString(), allImports.join('\n'));
-
-  var genTopLevel = new StringBuffer();
-  generator.writeTopLevelDeclarations(genTopLevel);
-  expect(genTopLevel.toString(), topLevel);
-
-  var indentedCode = initCall.replaceAll("\n", "\n  ").trim();
-  var genInitCall = new StringBuffer();
-  genInitCall.write('  useGeneratedCode(');
-  generator.writeStaticConfiguration(genInitCall);
-  genInitCall.writeln(');');
-  expect(genInitCall.toString(), '  $indentedCode\n');
-}
diff --git a/packages/smoke/test/codegen/end_to_end_test.dart b/packages/smoke/test/codegen/end_to_end_test.dart
deleted file mode 100644
index 174d61a..0000000
--- a/packages/smoke/test/codegen/end_to_end_test.dart
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// And end-to-end test that generates code and checks that the output matches
-/// the code in `static_test.dart`. Techincally we could run the result in an
-/// isolate, but instead we decided to split that up in two tests. This test
-/// ensures that we generate the code as it was written in static_test, and
-/// separately static_test ensures that the smoke.static library behaves as
-/// expected.
-library smoke.test.codegen.end_to_end_test;
-
-import 'dart:io';
-
-import 'package:analyzer/src/generated/element.dart';
-import 'package:smoke/codegen/generator.dart';
-import 'package:smoke/codegen/recorder.dart';
-import 'package:test/test.dart';
-import 'package:path/path.dart' as path;
-
-import 'testing_resolver_utils.dart' show initAnalyzer;
-
-void main([List<String> args]) {
-  final updateStaticTest =
-      args != null && args.length > 0 && args[0] == '--update_static_test';
-
-  test('static_test is up to date', () {
-    var scriptPath = path.fromUri(Platform.script);
-    var testDir = path.dirname(path.dirname(scriptPath));
-    var commonPath = path.join(testDir, 'common.dart');
-    var testCode = new File('$commonPath').readAsStringSync();
-    var lib = initAnalyzer({'common.dart': testCode}).libraryFor('common.dart');
-    var generator = new SmokeCodeGenerator();
-    var recorder = new Recorder(generator, _resolveImportUrl);
-
-    lookupMember(String className, String memberName, bool recursive) {
-      recorder.lookupMember(lib.getType(className), memberName,
-          recursive: recursive, includeAccessors: false);
-    }
-
-    runQuery(String className, QueryOptions options) {
-      recorder.runQuery(lib.getType(className), options,
-          includeAccessors: false);
-    }
-
-    // Record all getters and setters we use in the tests.
-    [
-      'i',
-      'j',
-      'j2',
-      'inc0',
-      'inc1',
-      'inc2',
-      'toString'
-    ].forEach(generator.addGetter);
-    ['i', 'j2'].forEach(generator.addSetter);
-
-    // Record static methods used in the tests
-    recorder.addStaticMethod(lib.getType('A'), 'staticInc');
-
-    // Record symbol convertions.
-    generator.addSymbol('i');
-
-    /// Record all parent-class relations that we explicitly request.
-    [
-      'AnnotB',
-      'A',
-      'B',
-      'D',
-      'H'
-    ].forEach((className) => recorder.lookupParent(lib.getType(className)));
-
-    // Record members for which we implicitly request their declaration in
-    // has-getter and has-setter tests.
-    lookupMember('A', 'i', true);
-    lookupMember('A', 'j2', true);
-    lookupMember('A', 'inc2', true);
-    lookupMember('B', 'a', true);
-    lookupMember('B', 'f', true);
-    lookupMember('D', 'i', true);
-    lookupMember('E', 'y', true);
-
-    // Record also lookups for non-exisiting members.
-    lookupMember('B', 'i', true);
-    lookupMember('E', 'x', true);
-    lookupMember('E', 'z', true);
-
-    // Record members for which we explicitly request their declaration.
-    lookupMember('B', 'a', false);
-    lookupMember('B', 'w', false);
-    lookupMember('A', 'inc1', false);
-    lookupMember('F', 'staticMethod', false);
-    lookupMember('G', 'b', false);
-    lookupMember('G', 'd', false);
-
-    // Lookups from no-such-method test.
-    lookupMember('A', 'noSuchMethod', true);
-    lookupMember('E', 'noSuchMethod', true);
-    lookupMember('E2', 'noSuchMethod', true);
-
-    // Lookups from has-instance-method and has-static-method tests.
-    lookupMember('A', 'inc0', true);
-    lookupMember('A', 'inc3', true);
-    lookupMember('C', 'inc', true);
-    lookupMember('D', 'inc', true);
-    lookupMember('D', 'inc0', true);
-    lookupMember('F', 'staticMethod', true);
-    lookupMember('F2', 'staticMethod', true);
-
-    // Record all queries done by the test.
-    runQuery('A', new QueryOptions());
-    runQuery('D', new QueryOptions(includeInherited: true));
-
-    var vars = lib.definingCompilationUnit.topLevelVariables;
-    expect(vars[0].name, 'a1');
-    expect(vars[1].name, 'a2');
-
-    runQuery('H', new QueryOptions(
-        includeInherited: true,
-        withAnnotations: [vars[0], vars[1], lib.getType('Annot')]));
-
-    runQuery('K', new QueryOptions(
-        includeInherited: true, withAnnotations: [lib.getType('AnnotC')]));
-
-    runQuery('L', new QueryOptions(includeMethods: true));
-    runQuery('L2', new QueryOptions(
-        includeInherited: true, includeMethods: true));
-
-    var code = _createEntrypoint(generator);
-    var staticTestFile = new File(path.join(testDir, 'static_test.dart'));
-    var existingCode = staticTestFile.readAsStringSync();
-    if (!updateStaticTest) {
-      expect(code, existingCode);
-    } else if (code == existingCode) {
-      print('static_test.dart is already up to date');
-    } else {
-      staticTestFile.writeAsStringSync(code);
-      print('static_test.dart has been updated.');
-    }
-  }, skip: 'https://github.com/dart-lang/smoke/issues/26');
-}
-
-String _createEntrypoint(SmokeCodeGenerator generator) {
-  var sb = new StringBuffer()
-    ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------')
-    ..writeln('/// To update this test file, call:')
-    ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test')
-    ..writeln('/// --------------------------------------------------------')
-    ..writeln('\nlibrary smoke.test.static_test;\n')
-    ..writeln("import 'package:unittest/unittest.dart';");
-
-  generator.writeImports(sb);
-  sb.writeln("import 'common.dart' as common show main;\n");
-  generator.writeTopLevelDeclarations(sb);
-  sb.write('\nfinal configuration = ');
-  generator.writeStaticConfiguration(sb, 0);
-
-  sb
-    ..writeln(';\n')
-    ..writeln('main() {')
-    ..writeln('  setUp(() => useGeneratedCode(configuration));')
-    ..writeln('  common.main();')
-    ..writeln('}');
-  return sb.toString();
-}
-
-String _resolveImportUrl(LibraryElement lib) {
-  if (lib.isDartCore) return 'dart:core';
-  if (lib.displayName == 'smoke.test.common') return 'common.dart';
-  return 'unknown.dart';
-}
diff --git a/packages/smoke/test/codegen/generator_test.dart b/packages/smoke/test/codegen/generator_test.dart
deleted file mode 100644
index 3d3110f..0000000
--- a/packages/smoke/test/codegen/generator_test.dart
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.codegen.generator_test;
-
-import 'package:smoke/codegen/generator.dart';
-import 'package:test/test.dart';
-
-import 'common.dart' show checkResults;
-
-main() {
-  test('getters', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addGetter('i');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    getters: {\n'
-        '      #i: (o) => o.i,\n'
-        '    }));\n');
-
-    generator.addGetter('foo');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    getters: {\n'
-        '      #foo: (o) => o.foo,\n'
-        '      #i: (o) => o.i,\n'
-        '    }));\n');
-  });
-
-  test('setters', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addSetter('i');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    setters: {\n'
-        '      #i: (o, v) { o.i = v; },\n'
-        '    }));\n');
-
-    generator.addSetter('foo');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    setters: {\n'
-        '      #foo: (o, v) { o.foo = v; },\n'
-        '      #i: (o, v) { o.i = v; },\n'
-        '    }));\n');
-  });
-
-  test('names/symbols', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addSymbol('i');
-    generator.addSymbol('foo');
-    generator.addSymbol('a.b.c');
-    generator.addSymbol('a.b.[]');
-    generator.addSymbol('[]');
-    generator.addSymbol('+');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    names: {\n'
-        '      const Symbol(\'+\'): r\'+\',\n'
-        '      const Symbol(\'[]\'): r\'[]\',\n'
-        '      const Symbol(\'a.b.[]\'): r\'a.b.[]\',\n'
-        '      #a.b.c: r\'a.b.c\',\n'
-        '      #foo: r\'foo\',\n'
-        '      #i: r\'i\',\n'
-        '    }));\n');
-  });
-
-  group('invalid symbols', () {
-    var invalidError =
-        predicate((e) => e is StateError && '$e'.contains("invalid symbol"));
-    test('traling period', () {
-      var generator = new SmokeCodeGenerator();
-      generator.addSymbol('a.');
-      var sb = new StringBuffer();
-      expect(
-          () => generator.writeStaticConfiguration(sb), throwsA(invalidError));
-    });
-
-    test('operator in the middle', () {
-      var generator = new SmokeCodeGenerator();
-      generator.addSymbol('a.[].b');
-      var sb = new StringBuffer();
-      expect(
-          () => generator.writeStaticConfiguration(sb), throwsA(invalidError));
-    });
-  });
-
-  test('getters, setters, and names', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addGetter('i');
-    generator.addSetter('i');
-    generator.addSetter('foo');
-    generator.addSymbol('foo');
-    checkResults(generator,
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    getters: {\n'
-        '      #i: (o) => o.i,\n'
-        '    },\n'
-        '    setters: {\n'
-        '      #foo: (o, v) { o.foo = v; },\n'
-        '      #i: (o, v) { o.i = v; },\n'
-        '    },\n'
-        '    names: {\n'
-        '      #foo: r\'foo\',\n'
-        '    }));\n');
-  });
-
-  test('parents', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addParent(
-        new TypeIdentifier('a.dart', 'A'), new TypeIdentifier('b.dart', 'B'));
-    generator.addParent(
-        new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A'));
-    checkResults(generator,
-        imports: ["import 'a.dart' as smoke_0;", "import 'b.dart' as smoke_1;"],
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    parents: {\n'
-        '      smoke_0.A: smoke_1.B,\n'
-        '      smoke_0.C: smoke_0.A,\n'
-        '    }));\n');
-  });
-
-  test('declarations', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
-        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'bar',
-        new TypeIdentifier('dart:core', 'Function'),
-        isMethod: true,
-        annotations: [
-      new ConstExpression.constructor(
-          null, 'Annotation', [new ConstExpression.string("hi")], const {})
-    ]);
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), '[]',
-        new TypeIdentifier('dart:core', 'Function'), isMethod: true);
-    var symbol = "const Symbol('[]')";
-    var details = "$symbol, Function, kind: METHOD";
-    checkResults(generator,
-        imports: ["import 'a.dart' as smoke_0;"],
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    declarations: {\n'
-        '      smoke_0.A: {\n'
-        '        $symbol: const Declaration($details),\n'
-        '        #bar: const Declaration(#bar, Function, kind: METHOD, '
-        'annotations: const [const Annotation(\'hi\')]),\n'
-        '        #foo: const Declaration(#foo, int, isFinal: true),\n'
-        '      },\n'
-        '    }));\n');
-  });
-
-  test('staticMethod', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addStaticMethod(new TypeIdentifier('a.dart', 'A'), 'm1');
-    checkResults(generator,
-        imports: ["import 'a.dart' as smoke_0;"],
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    staticMethods: {\n'
-        '      smoke_0.A: {\n'
-        '        #m1: smoke_0.A.m1,\n'
-        '      },\n'
-        '    }));\n');
-  });
-
-  test('repeated entries appear only once', () {
-    var generator = new SmokeCodeGenerator();
-    generator.addGetter('a');
-    generator.addGetter('a');
-    generator.addSetter('b');
-    generator.addSetter('b');
-    generator.addSymbol('d');
-    generator.addSymbol('d');
-    generator.addSymbol('c');
-    generator.addSymbol('c');
-    generator.addSymbol('c');
-
-    generator.addParent(
-        new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A'));
-    generator.addParent(
-        new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A'));
-    generator.addParent(
-        new TypeIdentifier('a.dart', 'C'), new TypeIdentifier('a.dart', 'A'));
-
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
-        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
-        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
-    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
-        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
-
-    checkResults(generator,
-        imports: ["import 'a.dart' as smoke_0;",],
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    getters: {\n'
-        '      #a: (o) => o.a,\n'
-        '    },\n'
-        '    setters: {\n'
-        '      #b: (o, v) { o.b = v; },\n'
-        '    },\n'
-        '    parents: {\n'
-        '      smoke_0.C: smoke_0.A,\n'
-        '    },\n'
-        '    declarations: {\n'
-        '      smoke_0.A: {\n'
-        '        #foo: const Declaration(#foo, int, isFinal: true),\n'
-        '      },\n'
-        '    },\n'
-        '    names: {\n'
-        '      #c: r\'c\',\n'
-        '      #d: r\'d\',\n'
-        '    }));\n');
-  });
-}
diff --git a/packages/smoke/test/codegen/recorder_test.dart b/packages/smoke/test/codegen/recorder_test.dart
deleted file mode 100644
index f4c777a..0000000
--- a/packages/smoke/test/codegen/recorder_test.dart
+++ /dev/null
@@ -1,780 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.codegen.recorder_test;
-
-import 'package:analyzer/src/generated/element.dart';
-import 'package:smoke/codegen/generator.dart';
-import 'package:smoke/codegen/recorder.dart';
-import 'package:test/test.dart';
-
-import 'common.dart' show checkResults;
-import 'testing_resolver_utils.dart' show initAnalyzer;
-
-main() {
-  var provider = initAnalyzer(_SOURCES);
-  var generator;
-  var recorder;
-  setUp(() {
-    generator = new SmokeCodeGenerator();
-    recorder = new Recorder(generator, resolveImportUrl);
-  });
-
-  group('parents', () {
-    test('simple subclassing', () {
-      var lib = provider.libraryFor('/a.dart');
-      recorder.lookupParent(lib.getType('A'));
-      recorder.lookupParent(lib.getType('C'));
-
-      checkResults(generator,
-          imports: [
-        "import '/a.dart' as smoke_0;",
-        "import '/b.dart' as smoke_1;",
-      ],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.A: smoke_1.B,\n'
-          '      smoke_0.C: smoke_0.A,\n'
-          '    }));\n');
-    });
-
-    test('single mixin', () {
-      var lib = provider.libraryFor('/a.dart');
-      recorder.lookupParent(lib.getType('E'));
-
-      checkResults(generator,
-          imports: ["import '/a.dart' as smoke_0;",],
-          topLevel: 'abstract class _M0 {} // A & D1\n',
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.E: _M0,\n'
-          '      _M0: smoke_0.A,\n'
-          '    }));\n');
-    });
-
-    test('multiple mixins', () {
-      var lib = provider.libraryFor('/a.dart');
-      recorder.lookupParent(lib.getType('F'));
-
-      checkResults(generator,
-          imports: ["import '/a.dart' as smoke_0;",],
-          topLevel: 'abstract class _M0 {} // A & D1\n'
-          'abstract class _M1 {} // _M0 & D2\n'
-          'abstract class _M2 {} // _M1 & D3\n',
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.F: _M2,\n'
-          '      _M0: smoke_0.A,\n'
-          '      _M1: _M0,\n'
-          '      _M2: _M1,\n'
-          '    }));\n');
-    });
-
-    test('same as common_test', () {
-      var lib = provider.libraryFor('/common.dart');
-      recorder.lookupParent(lib.getType('Annot'));
-      recorder.lookupParent(lib.getType('AnnotB'));
-      recorder.lookupParent(lib.getType('A'));
-      recorder.lookupParent(lib.getType('B'));
-      recorder.lookupParent(lib.getType('C'));
-      recorder.lookupParent(lib.getType('D'));
-      recorder.lookupParent(lib.getType('E'));
-      recorder.lookupParent(lib.getType('E2'));
-      recorder.lookupParent(lib.getType('F'));
-      recorder.lookupParent(lib.getType('F2'));
-      recorder.lookupParent(lib.getType('G'));
-      recorder.lookupParent(lib.getType('H'));
-      var coreLib =
-          lib.visibleLibraries.firstWhere((l) => l.displayName == 'dart.core');
-      recorder.lookupParent(coreLib.getType('int'));
-      recorder.lookupParent(coreLib.getType('num'));
-
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          topLevel: 'abstract class _M0 {} // C & A\n',
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.AnnotB: smoke_0.Annot,\n'
-          '      smoke_0.D: _M0,\n'
-          '      smoke_0.E2: smoke_0.E,\n'
-          '      smoke_0.F2: smoke_0.F,\n'
-          '      smoke_0.H: smoke_0.G,\n'
-          '      int: num,\n'
-          '      _M0: smoke_0.C,\n'
-          '    }));\n');
-    });
-  });
-
-  test('add static method, no declaration', () {
-    var lib = provider.libraryFor('/common.dart');
-    recorder.addStaticMethod(lib.getType('A'), 'sM');
-    checkResults(generator,
-        imports: ["import '/common.dart' as smoke_0;",],
-        initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-        '    checkedMode: false,\n'
-        '    staticMethods: {\n'
-        '      smoke_0.A: {\n'
-        '        #sM: smoke_0.A.sM,\n'
-        '      },\n'
-        '    }));\n');
-  });
-
-  group('lookup member', () {
-    var lib;
-    setUp(() {
-      lib = provider.libraryFor('/common.dart');
-    });
-
-    test('missing declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'q', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {},\n'
-          '    }));\n');
-    });
-
-    test('field declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'i', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('sattic field declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'sI', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #sI: const Declaration(#sI, int, isStatic: true),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('property declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'j2', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('static property declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'sJ', includeAccessors: false);
-      final details = 'kind: PROPERTY, isFinal: true, isStatic: true';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #sJ: const Declaration(#sJ, int, $details),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('field and property of dynamic type', () {
-      recorder.lookupMember(lib.getType('I'), 'i1', includeAccessors: false);
-      recorder.lookupMember(lib.getType('I'), 'i2', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.I: {\n'
-          '        #i1: const Declaration(#i1, Object),\n'
-          '        #i2: const Declaration(#i2, Object, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('property of concrete type', () {
-      recorder.lookupMember(lib.getType('I'), 'i3', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.I: {\n'
-          '        #i3: const Declaration(#i3, smoke_0.G, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('method declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'inc0', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('static method declaration', () {
-      recorder.lookupMember(lib.getType('A'), 'sM', includeAccessors: false);
-      const details = 'kind: METHOD, isStatic: true';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #sM: const Declaration(#sM, Function, $details),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('inherited field - not recursive', () {
-      recorder.lookupMember(lib.getType('D'), 'i', includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.D: {},\n'
-          '    }));\n');
-    });
-
-    test('inherited field - recursive', () {
-      recorder.lookupMember(lib.getType('D'), 'i',
-          recursive: true, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          topLevel: 'abstract class _M0 {} // C & A\n',
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.D: _M0,\n'
-          '      _M0: smoke_0.C,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.D: {},\n'
-          '      _M0: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('inherited field - recursive deep', () {
-      recorder.lookupMember(lib.getType('J3'), 'i',
-          recursive: true, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.J2: smoke_0.J1,\n'
-          '      smoke_0.J3: smoke_0.J2,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.J1: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '      },\n'
-          '      smoke_0.J2: {},\n'
-          '      smoke_0.J3: {},\n'
-          '    }));\n');
-    });
-
-    test('inherited field - recursive - includeUpTo', () {
-      recorder.lookupMember(lib.getType('J3'), 'i',
-          recursive: true,
-          includeAccessors: false,
-          includeUpTo: lib.getType('J1'));
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.J2: smoke_0.J1,\n'
-          '      smoke_0.J3: smoke_0.J2,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.J2: {},\n'
-          '      smoke_0.J3: {},\n'
-          '    }));\n');
-    });
-  });
-
-  group('query', () {
-    test('default query', () {
-      var options = new QueryOptions();
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('A'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '        #j: const Declaration(#j, int),\n'
-          '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('only fields', () {
-      var options = new QueryOptions(includeProperties: false);
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('A'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '        #j: const Declaration(#j, int),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('only properties', () {
-      var options = new QueryOptions(includeFields: false);
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('A'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('fields, properties, and and methods', () {
-      var options = new QueryOptions(includeMethods: true);
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('A'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
-          '        #inc1: const Declaration(#inc1, Function, kind: METHOD),\n'
-          '        #inc2: const Declaration(#inc2, Function, kind: METHOD),\n'
-          '        #j: const Declaration(#j, int),\n'
-          '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('exclude inherited', () {
-      var options = new QueryOptions(includeInherited: false);
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('D'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.D: {\n'
-          '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('include inherited', () {
-      var options = new QueryOptions(includeInherited: true);
-      var lib = provider.libraryFor('/common.dart');
-      recorder.runQuery(lib.getType('D'), options, includeAccessors: false);
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          topLevel: 'abstract class _M0 {} // C & A\n',
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.D: _M0,\n'
-          '      _M0: smoke_0.C,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.C: {\n'
-          '        #b: const Declaration(#b, smoke_0.B),\n'
-          '        #x: const Declaration(#x, int),\n'
-          '        #y: const Declaration(#y, String),\n'
-          '      },\n'
-          '      smoke_0.D: {\n'
-          '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '      },\n'
-          '      _M0: {\n'
-          '        #i: const Declaration(#i, int),\n'
-          '        #j: const Declaration(#j, int),\n'
-          '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('exact annotation', () {
-      var lib = provider.libraryFor('/common.dart');
-      var vars = lib.definingCompilationUnit.topLevelVariables;
-      expect(vars[0].name, 'a1');
-      var options =
-          new QueryOptions(includeInherited: true, withAnnotations: [vars[0]]);
-      recorder.runQuery(lib.getType('H'), options, includeAccessors: false);
-      final annot = 'annotations: const [smoke_0.a1]';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.H: smoke_0.G,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.G: {\n'
-          '        #b: const Declaration(#b, int, $annot),\n'
-          '      },\n'
-          '      smoke_0.H: {\n'
-          '        #f: const Declaration(#f, int, $annot),\n'
-          '        #g: const Declaration(#g, int, $annot),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('type annotation', () {
-      var lib = provider.libraryFor('/common.dart');
-      var options = new QueryOptions(
-          includeInherited: true, withAnnotations: [lib.getType('Annot')]);
-      recorder.runQuery(lib.getType('H'), options, includeAccessors: false);
-      final a1Annot = 'annotations: const [smoke_0.a1]';
-      final a3Annot = 'annotations: const [smoke_0.a3]';
-      final exprAnnot = 'annotations: const [const smoke_0.Annot(1)]';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    parents: {\n'
-          '      smoke_0.H: smoke_0.G,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.G: {\n'
-          '        #b: const Declaration(#b, int, $a1Annot),\n'
-          '      },\n'
-          '      smoke_0.H: {\n'
-          '        #f: const Declaration(#f, int, $a1Annot),\n'
-          '        #g: const Declaration(#g, int, $a1Annot),\n'
-          '        #i: const Declaration(#i, int, $a3Annot),\n'
-          '        #j: const Declaration(#j, int, $exprAnnot),\n'
-          '      },\n'
-          '    }));\n');
-    });
-
-    test('type annotation with named arguments', () {
-      var lib = provider.libraryFor('/common.dart');
-      var options = new QueryOptions(
-          includeInherited: true, withAnnotations: [lib.getType('AnnotC')]);
-      recorder.runQuery(lib.getType('K'), options, includeAccessors: false);
-      final kAnnot = 'annotations: const [const smoke_0.AnnotC(named: true)]';
-      final k2Annot = 'annotations: const [const smoke_0.AnnotC()]';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.K: {\n'
-          '        #k: const Declaration(#k, int, $kAnnot),\n'
-          '        #k2: const Declaration(#k2, int, $k2Annot),\n'
-          '      },\n'
-          '    }));\n');
-    });
-  });
-
-  group('with accessors', () {
-    test('lookup member', () {
-      var lib = provider.libraryFor('/common.dart');
-      recorder.lookupMember(lib.getType('I'), 'i1');
-      recorder.lookupMember(lib.getType('I'), 'i2');
-      recorder.lookupMember(lib.getType('I'), 'i3');
-      recorder.lookupMember(lib.getType('I'), 'm4');
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    getters: {\n'
-          '      #i1: (o) => o.i1,\n'
-          '      #i2: (o) => o.i2,\n'
-          '      #i3: (o) => o.i3,\n'
-          '      #m4: (o) => o.m4,\n'
-          '    },\n'
-          '    setters: {\n' // #i3 is final
-          '      #i1: (o, v) { o.i1 = v; },\n'
-          '      #i2: (o, v) { o.i2 = v; },\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.I: {\n'
-          '        #i1: const Declaration(#i1, Object),\n'
-          '        #i2: const Declaration(#i2, Object, kind: PROPERTY),\n'
-          '        #i3: const Declaration(#i3, smoke_0.G, kind: PROPERTY, '
-          'isFinal: true),\n'
-          '        #m4: const Declaration(#m4, Function, kind: METHOD),\n'
-          '      },\n'
-          '    },\n'
-          '    names: {\n'
-          '      #i1: r\'i1\',\n'
-          '      #i2: r\'i2\',\n'
-          '      #i3: r\'i3\',\n'
-          '      #m4: r\'m4\',\n'
-          '    }));\n');
-    });
-
-    test('static members', () {
-      var lib = provider.libraryFor('/common.dart');
-      recorder.lookupMember(lib.getType('A'), 'sI');
-      recorder.lookupMember(lib.getType('A'), 'sJ');
-      recorder.lookupMember(lib.getType('A'), 'sM');
-      final pDetails = 'kind: PROPERTY, isFinal: true, isStatic: true';
-      const mDetails = 'kind: METHOD, isStatic: true';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    declarations: {\n'
-          '      smoke_0.A: {\n'
-          '        #sI: const Declaration(#sI, int, isStatic: true),\n'
-          '        #sJ: const Declaration(#sJ, int, $pDetails),\n'
-          '        #sM: const Declaration(#sM, Function, $mDetails),\n'
-          '      },\n'
-          '    },\n'
-          '    staticMethods: {\n'
-          '      smoke_0.A: {\n'
-          '        #sM: smoke_0.A.sM,\n'
-          '      },\n'
-          '    },\n'
-          '    names: {\n'
-          '      #sM: r\'sM\',\n'
-          '    }));\n');
-    });
-
-    test('query', () {
-      var lib = provider.libraryFor('/common.dart');
-      var options = new QueryOptions(
-          includeInherited: true, withAnnotations: [lib.getType('Annot')]);
-      recorder.runQuery(lib.getType('H'), options);
-      final a1Annot = 'annotations: const [smoke_0.a1]';
-      final a3Annot = 'annotations: const [smoke_0.a3]';
-      final exprAnnot = 'annotations: const [const smoke_0.Annot(1)]';
-      checkResults(generator,
-          imports: ["import '/common.dart' as smoke_0;",],
-          initCall: 'useGeneratedCode(new StaticConfiguration(\n'
-          '    checkedMode: false,\n'
-          '    getters: {\n'
-          '      #b: (o) => o.b,\n'
-          '      #f: (o) => o.f,\n'
-          '      #g: (o) => o.g,\n'
-          '      #i: (o) => o.i,\n'
-          '      #j: (o) => o.j,\n'
-          '    },\n'
-          '    setters: {\n' // #i3 is final
-          '      #b: (o, v) { o.b = v; },\n'
-          '      #f: (o, v) { o.f = v; },\n'
-          '      #g: (o, v) { o.g = v; },\n'
-          '      #i: (o, v) { o.i = v; },\n'
-          '      #j: (o, v) { o.j = v; },\n'
-          '    },\n'
-          '    parents: {\n'
-          '      smoke_0.H: smoke_0.G,\n'
-          '    },\n'
-          '    declarations: {\n'
-          '      smoke_0.G: {\n'
-          '        #b: const Declaration(#b, int, $a1Annot),\n'
-          '      },\n'
-          '      smoke_0.H: {\n'
-          '        #f: const Declaration(#f, int, $a1Annot),\n'
-          '        #g: const Declaration(#g, int, $a1Annot),\n'
-          '        #i: const Declaration(#i, int, $a3Annot),\n'
-          '        #j: const Declaration(#j, int, $exprAnnot),\n'
-          '      },\n'
-          '    },\n'
-          '    names: {\n'
-          '      #b: r\'b\',\n'
-          '      #f: r\'f\',\n'
-          '      #g: r\'g\',\n'
-          '      #i: r\'i\',\n'
-          '      #j: r\'j\',\n'
-          '    }));\n');
-    });
-  });
-}
-
-const _SOURCES = const {
-  '/a.dart': '''
-      library a;
-      import '/b.dart';
-
-      class Annot { const Annot(); }
-      const annot = const Annot();
-
-      class A extends B {}
-      class C extends A {}
-      class D1 {
-        int d1;
-      }
-      class D2 {
-        int d2;
-      }
-      class D3 {
-        int d3;
-      }
-      class E extends A with D1 {
-        int e1;
-      }
-      class F extends A with D1, D2, D3 {
-        int f1;
-      }
-      ''',
-  '/b.dart': '''
-      library b;
-
-      class B {}
-      ''',
-  '/common.dart': '''
-      library common;
-
-      class A {
-        int i = 42;
-        int j = 44;
-        int get j2 => j;
-        void set j2(int v) { j = v; }
-        void inc0() { i++; }
-        void inc1(int v) { i = i + (v == null ? -10 : v); }
-        void inc2([int v]) { i = i + (v == null ? -10 : v); }
-        static int sI;
-        static int get sJ => 0;
-        static void sM() {}
-      }
-
-      class B {
-        final int f = 3;
-        int _w;
-        int get w => _w;
-        set w(int v) { _w = v; }
-
-        String z;
-        A a;
-
-        B(this._w, this.z, this.a);
-      }
-
-      class C {
-        int x;
-        String y;
-        B b;
-
-        inc(int n) {
-          x = x + n;
-        }
-        dec(int n) {
-          x = x - n;
-        }
-
-        C(this.x, this.y, this.b);
-      }
-
-
-      class D extends C with A {
-        int get x2 => x;
-        int get i2 => i;
-
-        D(x, y, b) : super(x, y, b);
-      }
-
-      class E {
-        set x(int v) { }
-        int get y => 1;
-
-        noSuchMethod(i) => y;
-      }
-
-      class E2 extends E {}
-
-      class F {
-        static int staticMethod(A a) => a.i;
-      }
-
-      class F2 extends F {}
-
-      class Annot { const Annot(int ignore); }
-      class AnnotB extends Annot { const AnnotB(); }
-      class AnnotC { const AnnotC({bool named: false}); }
-      const a1 = const Annot(0);
-      const a2 = 32;
-      const a3 = const AnnotB();
-
-
-      class G {
-        int a;
-        @a1 int b;
-        int c;
-        @a2 int d;
-      }
-
-      class H extends G {
-        int e;
-        @a1 int f;
-        @a1 int g;
-        @a2 int h;
-        @a3 int i;
-        @Annot(1) int j;
-      }
-
-      class I {
-        dynamic i1;
-        get i2 => null;
-        set i2(v) {}
-        G get i3;
-        G m4() {};
-      }
-
-      class J1 {
-        int i;
-      }
-      class J2 extends J1 {
-      }
-      class J3 extends J2 {
-      }
-
-      class K {
-        @AnnotC(named: true) int k;
-        @AnnotC() int k2;
-      }
-      '''
-};
-
-resolveImportUrl(LibraryElement lib) =>
-    lib.isDartCore ? 'dart:core' : '/${lib.displayName}.dart';
diff --git a/packages/smoke/test/codegen/testing_resolver_utils.dart b/packages/smoke/test/codegen/testing_resolver_utils.dart
deleted file mode 100644
index a2e62dc..0000000
--- a/packages/smoke/test/codegen/testing_resolver_utils.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Utility functions to test the code generation tools with the resolver.
-// Note, this is just for simple tests, so we restricted the logic to only
-// support root-relative imports. For more sophisticated stuff, you should be
-// using the test helpers in `package:code_transformers`.
-library smoke.test.codegen.testing_resolver_utils;
-
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
-import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
-
-class LibraryProvider {
-  final AnalysisContext _analyzer;
-  final Map<String, Source> _allSources;
-  LibraryProvider(this._analyzer, this._allSources);
-  LibraryElement libraryFor(String uri) =>
-      _analyzer.computeLibraryElement(_allSources[uri]);
-}
-
-LibraryProvider initAnalyzer(Map<String, String> contents) {
-  AnalysisEngine.instance.processRequiredPlugins();
-  var analyzer = AnalysisEngine.instance.createAnalysisContext();
-  var options = new AnalysisOptionsImpl()
-    ..cacheSize = 256
-    ..preserveComments = false
-    ..analyzeFunctionBodies = false;
-  analyzer.analysisOptions = options;
-  var sdk = new DirectoryBasedDartSdk(new JavaFile(testingDartSdkDirectory));
-  sdk.context.analysisOptions = options;
-  var changes = new ChangeSet();
-  var allSources = {};
-  contents.forEach((url, code) {
-    var source = new _SimpleSource(url, code, allSources);
-    allSources[url] = source;
-    changes.addedSource(source);
-  });
-  analyzer.applyChanges(changes);
-
-  analyzer.sourceFactory = new SourceFactory(
-      [new DartUriResolver(sdk), new _SimpleUriResolver(allSources)]);
-
-  return new LibraryProvider(analyzer, allSources);
-}
-
-class _SimpleUriResolver implements UriResolver {
-  final Map<String, Source> allSources;
-  _SimpleUriResolver(this.allSources);
-
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) => allSources['$uri'];
-
-  Source fromEncoding(UriKind kind, Uri uri) =>
-      throw new UnimplementedError('fromEncoding not implemented');
-
-  Uri restoreAbsolute(Source source) =>
-      throw new UnimplementedError('restoreAbsolute not implemented');
-}
-
-class _SimpleSource extends Source {
-  final Uri uri;
-  final String path;
-  final String rawContents;
-  final Map<String, Source> allSources;
-
-  _SimpleSource(this.path, this.rawContents, this.allSources)
-      : uri = Uri.parse('file:///path');
-
-  operator ==(other) =>
-      other is _SimpleSource && rawContents == other.rawContents;
-  int get hashCode => rawContents.hashCode;
-
-  bool exists() => true;
-  String get encoding => '$uriKind/$path';
-  String get fullName => path;
-  TimestampedData<String> get contents =>
-      new TimestampedData<String>(modificationStamp, rawContents);
-
-  int get modificationStamp => 1;
-  String get shortName => path;
-  UriKind get uriKind => UriKind.FILE_URI;
-  final bool isInSystemLibrary = false;
-
-  // Since this is just for simple tests we just restricted this mock
-  // to root-relative imports. For more sophisticated stuff, you should be
-  // using the test helpers in `package:code_transformers`.
-  Source resolveRelative(Uri uri) {
-    if (uri.path.startsWith('/')) return allSources['${uri.path}'];
-    throw new UnimplementedError('relative URIs not supported: $uri');
-  }
-
-  // Since this is just for simple tests we just restricted this mock
-  // to root-relative imports. For more sophisticated stuff, you should be
-  // using the test helpers in `package:code_transformers`.
-  Uri resolveRelativeUri(Uri uri) {
-    if (!uri.path.startsWith('/')) {
-      throw new UnimplementedError('relative URIs not supported: $uri');
-    }
-    return uri;
-  }
-
-  void getContentsToReceiver(Source_ContentReceiver receiver) {
-    receiver.accept(rawContents, modificationStamp);
-  }
-}
diff --git a/packages/smoke/test/common.dart b/packages/smoke/test/common.dart
deleted file mode 100644
index 6c511b2..0000000
--- a/packages/smoke/test/common.dart
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Common test code that is run by 3 tests: mirrors_test.dart,
-/// mirrors_used_test.dart, and static_test.dart.
-library smoke.test.common;
-
-import 'package:smoke/smoke.dart' as smoke;
-import 'package:test/test.dart';
-
-main() {
-  test('read value', () {
-    var a = new A();
-    expect(smoke.read(a, #i), 42);
-    expect(smoke.read(a, #j), 44);
-    expect(smoke.read(a, #j2), 44);
-  });
-
-  test('write value', () {
-    var a = new A();
-    smoke.write(a, #i, 43);
-    expect(a.i, 43);
-    smoke.write(a, #j2, 46);
-    expect(a.j, 46);
-    expect(a.j2, 46);
-    expect(smoke.read(a, #j), 46);
-    expect(smoke.read(a, #j2), 46);
-  });
-
-  test('invoke', () {
-    var a = new A();
-
-    smoke.invoke(a, #inc0, []);
-    expect(a.i, 43);
-    expect(smoke.read(a, #i), 43);
-    expect(() => smoke.invoke(a, #inc0, [2]), throws);
-    expect(a.i, 43);
-    expect(() => smoke.invoke(a, #inc0, [1, 2, 3]), throws);
-    expect(a.i, 43);
-
-    // TODO(jakemac): Restore this once http://dartbug.com/22917 is fixed.
-    // expect(() => smoke.invoke(a, #inc1, []), throws);
-    expect(a.i, 43);
-    smoke.invoke(a, #inc1, [4]);
-    expect(a.i, 47);
-
-    smoke.invoke(a, #inc2, []);
-    expect(a.i, 37);
-    smoke.invoke(a, #inc2, [4]);
-    expect(a.i, 41);
-
-    expect(() => smoke.invoke(a, #inc1, [4, 5]), throws);
-    expect(a.i, 41);
-  });
-
-  test('static invoke', () {
-    A.staticValue = 42;
-    smoke.invoke(A, #staticInc, []);
-    expect(A.staticValue, 43);
-  });
-
-  test('read and invoke function', () {
-    var a = new A();
-    expect(a.i, 42);
-    var f = smoke.read(a, #inc1);
-    f(4);
-    expect(a.i, 46);
-    Function.apply(f, [4]);
-    expect(a.i, 50);
-  });
-
-  test('invoke with adjust', () {
-    var a = new A();
-    smoke.invoke(a, #inc0, [], adjust: true);
-    expect(a.i, 43);
-    smoke.invoke(a, #inc0, [2], adjust: true);
-    expect(a.i, 44);
-    smoke.invoke(a, #inc0, [1, 2, 3], adjust: true);
-    expect(a.i, 45);
-
-    smoke.invoke(a, #inc1, [], adjust: true); // treat as null (-10)
-    expect(a.i, 35);
-    smoke.invoke(a, #inc1, [4], adjust: true);
-    expect(a.i, 39);
-
-    smoke.invoke(a, #inc2, [], adjust: true); // default is null (-10)
-    expect(a.i, 29);
-    smoke.invoke(a, #inc2, [4, 5], adjust: true);
-    expect(a.i, 33);
-  });
-
-  test('has getter', () {
-    expect(smoke.hasGetter(A, #i), isTrue);
-    expect(smoke.hasGetter(A, #j2), isTrue);
-    expect(smoke.hasGetter(A, #inc2), isTrue);
-    expect(smoke.hasGetter(B, #a), isTrue);
-    expect(smoke.hasGetter(B, #i), isFalse);
-    expect(smoke.hasGetter(B, #f), isTrue);
-    expect(smoke.hasGetter(D, #i), isTrue);
-
-    expect(smoke.hasGetter(E, #x), isFalse);
-    expect(smoke.hasGetter(E, #y), isTrue);
-    expect(smoke.hasGetter(E, #z), isFalse); // don't consider noSuchMethod
-  });
-
-  test('has setter', () {
-    expect(smoke.hasSetter(A, #i), isTrue);
-    expect(smoke.hasSetter(A, #j2), isTrue);
-    expect(smoke.hasSetter(A, #inc2), isFalse);
-    expect(smoke.hasSetter(B, #a), isTrue);
-    expect(smoke.hasSetter(B, #i), isFalse);
-    expect(smoke.hasSetter(B, #f), isFalse);
-    expect(smoke.hasSetter(D, #i), isTrue);
-
-    // TODO(sigmund): should we support declaring a setter with no getter?
-    // expect(smoke.hasSetter(E, #x), isTrue);
-    expect(smoke.hasSetter(E, #y), isFalse);
-    expect(smoke.hasSetter(E, #z), isFalse); // don't consider noSuchMethod
-  });
-
-  test('no such method', () {
-    expect(smoke.hasNoSuchMethod(A), isFalse);
-    expect(smoke.hasNoSuchMethod(E), isTrue);
-    expect(smoke.hasNoSuchMethod(E2), isTrue);
-    expect(smoke.hasNoSuchMethod(int), isFalse);
-  });
-
-  test('has instance method', () {
-    expect(smoke.hasInstanceMethod(A, #inc0), isTrue);
-    expect(smoke.hasInstanceMethod(A, #inc3), isFalse);
-    expect(smoke.hasInstanceMethod(C, #inc), isTrue);
-    expect(smoke.hasInstanceMethod(D, #inc), isTrue);
-    expect(smoke.hasInstanceMethod(D, #inc0), isTrue);
-    expect(smoke.hasInstanceMethod(F, #staticMethod), isFalse);
-    expect(smoke.hasInstanceMethod(F2, #staticMethod), isFalse);
-  });
-
-  test('has static method', () {
-    expect(smoke.hasStaticMethod(A, #inc0), isFalse);
-    expect(smoke.hasStaticMethod(C, #inc), isFalse);
-    expect(smoke.hasStaticMethod(D, #inc), isFalse);
-    expect(smoke.hasStaticMethod(D, #inc0), isFalse);
-    expect(smoke.hasStaticMethod(F, #staticMethod), isTrue);
-    expect(smoke.hasStaticMethod(F2, #staticMethod), isFalse);
-  });
-
-  test('get declaration', () {
-    var d = smoke.getDeclaration(B, #a);
-    expect(d.name, #a);
-    expect(d.isField, isTrue);
-    expect(d.isProperty, isFalse);
-    expect(d.isMethod, isFalse);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isFalse);
-    expect(d.annotations, []);
-    expect(d.type, A);
-
-    d = smoke.getDeclaration(B, #w);
-    expect(d.name, #w);
-    expect(d.isField, isFalse);
-    expect(d.isProperty, isTrue);
-    expect(d.isMethod, isFalse);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isFalse);
-    expect(d.annotations, []);
-    expect(d.type, int);
-
-    d = smoke.getDeclaration(A, #inc1);
-    expect(d.name, #inc1);
-    expect(d.isField, isFalse);
-    expect(d.isProperty, isFalse);
-    expect(d.isMethod, isTrue);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isFalse);
-    expect(d.annotations, []);
-    expect(d.type, Function);
-
-    d = smoke.getDeclaration(F, #staticMethod);
-    expect(d.name, #staticMethod);
-    expect(d.isField, isFalse);
-    expect(d.isProperty, isFalse);
-    expect(d.isMethod, isTrue);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isTrue);
-    expect(d.annotations, []);
-    expect(d.type, Function);
-
-    d = smoke.getDeclaration(G, #b);
-    expect(d.name, #b);
-    expect(d.isField, isTrue);
-    expect(d.isProperty, isFalse);
-    expect(d.isMethod, isFalse);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isFalse);
-    expect(d.annotations, [const Annot()]);
-    expect(d.type, int);
-
-    d = smoke.getDeclaration(G, #d);
-    expect(d.name, #d);
-    expect(d.isField, isTrue);
-    expect(d.isProperty, isFalse);
-    expect(d.isMethod, isFalse);
-    expect(d.isFinal, isFalse);
-    expect(d.isStatic, isFalse);
-    expect(d.annotations, [32]);
-    expect(d.type, int);
-  });
-
-  test('isSuperclass', () {
-    expect(smoke.isSubclassOf(D, C), isTrue);
-    expect(smoke.isSubclassOf(H, G), isTrue);
-    expect(smoke.isSubclassOf(H, H), isTrue);
-    expect(smoke.isSubclassOf(H, Object), isTrue);
-    expect(smoke.isSubclassOf(B, Object), isTrue);
-    expect(smoke.isSubclassOf(A, Object), isTrue);
-    expect(smoke.isSubclassOf(AnnotB, Annot), isTrue);
-
-    expect(smoke.isSubclassOf(D, A), isFalse);
-    expect(smoke.isSubclassOf(H, B), isFalse);
-    expect(smoke.isSubclassOf(B, A), isFalse);
-    expect(smoke.isSubclassOf(Object, A), isFalse);
-  });
-
-  group('query', () {
-    _checkQuery(result, names) {
-      expect(result.map((e) => e.name), unorderedEquals(names));
-    }
-
-    test('default', () {
-      var options = new smoke.QueryOptions();
-      var res = smoke.query(A, options);
-      _checkQuery(res, [#i, #j, #j2]);
-    });
-
-    test('only fields', () {
-      var options = new smoke.QueryOptions(includeProperties: false);
-      var res = smoke.query(A, options);
-      _checkQuery(res, [#i, #j]);
-      expect(res[0].isField, true);
-    });
-
-    test('only properties', () {
-      var options = new smoke.QueryOptions(includeFields: false);
-      var res = smoke.query(A, options);
-      _checkQuery(res, [#j2]);
-      expect(res[0].isProperty, true);
-    });
-
-    test('properties and methods', () {
-      var options = new smoke.QueryOptions(includeMethods: true);
-      var res = smoke.query(A, options);
-      _checkQuery(res, [#i, #j, #j2, #inc0, #inc1, #inc2]);
-    });
-
-    test('inherited properties and fields', () {
-      var options = new smoke.QueryOptions(includeInherited: true);
-      var res = smoke.query(D, options);
-      _checkQuery(res, [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
-    });
-
-    test('inherited fields only', () {
-      var options = new smoke.QueryOptions(
-          includeInherited: true, includeProperties: false);
-      var res = smoke.query(D, options);
-      _checkQuery(res, [#x, #y, #b, #i, #j]);
-    });
-
-    test('exact annotation', () {
-      var options = new smoke.QueryOptions(
-          includeInherited: true, withAnnotations: const [a1]);
-      var res = smoke.query(H, options);
-      _checkQuery(res, [#b, #f, #g]);
-
-      options = new smoke.QueryOptions(
-          includeInherited: true, withAnnotations: const [a2]);
-      res = smoke.query(H, options);
-      _checkQuery(res, [#d, #h]);
-
-      options = new smoke.QueryOptions(
-          includeInherited: true, withAnnotations: const [a1, a2]);
-      res = smoke.query(H, options);
-      _checkQuery(res, [#b, #d, #f, #g, #h]);
-    });
-
-    test('type annotation', () {
-      var options = new smoke.QueryOptions(
-          includeInherited: true, withAnnotations: const [Annot]);
-      var res = smoke.query(H, options);
-      _checkQuery(res, [#b, #f, #g, #i]);
-    });
-
-    test('mixed annotations (type and exact)', () {
-      var options = new smoke.QueryOptions(
-          includeInherited: true, withAnnotations: const [a2, Annot]);
-      var res = smoke.query(H, options);
-      _checkQuery(res, [#b, #d, #f, #g, #h, #i]);
-    });
-
-    test('overriden symbols', () {
-      var options = new smoke.QueryOptions(
-          excludeOverriden: true, includeInherited: true, includeMethods: true);
-      var res = smoke.query(L2, options);
-      _checkQuery(res, [#m, #incM, #n]);
-      // Check that the concrete #m is there
-      var overriden = res.firstWhere((value) => value.name == #m);
-      expect(overriden.isFinal, false);
-      expect(overriden.isField, true);
-    });
-
-    test('symbol to name', () {
-      expect(smoke.symbolToName(#i), 'i');
-    });
-
-    test('name to symbol', () {
-      expect(smoke.nameToSymbol('i'), #i);
-    });
-  });
-
-  test('invoke Type instance methods', () {
-    var a = new A();
-    expect(
-        smoke.invoke(a.runtimeType, #toString, []), a.runtimeType.toString());
-  });
-}
-
-class A {
-  int i = 42;
-  int j = 44;
-  int get j2 => j;
-  void set j2(int v) {
-    j = v;
-  }
-  void inc0() {
-    i++;
-  }
-  void inc1(int v) {
-    i = i + (v == null ? -10 : v);
-  }
-  void inc2([int v]) {
-    i = i + (v == null ? -10 : v);
-  }
-
-  static int staticValue = 42;
-  static void staticInc() {
-    staticValue++;
-  }
-}
-
-class B {
-  final int f = 3;
-  int _w;
-  int get w => _w;
-  set w(int v) {
-    _w = v;
-  }
-
-  String z;
-  A a;
-
-  B(this._w, this.z, this.a);
-}
-
-class C {
-  int x;
-  String y;
-  B b;
-
-  inc(int n) {
-    x = x + n;
-  }
-  dec(int n) {
-    x = x - n;
-  }
-
-  C(this.x, this.y, this.b);
-}
-
-class D extends C with A {
-  int get x2 => x;
-  int get i2 => i;
-
-  D(x, y, b) : super(x, y, b);
-}
-
-class E {
-  set x(int v) {}
-  int get y => 1;
-
-  noSuchMethod(i) => y;
-}
-
-class E2 extends E {}
-
-class F {
-  static int staticMethod(A a) => a.i;
-}
-
-class F2 extends F {}
-
-class Annot {
-  const Annot();
-}
-class AnnotB extends Annot {
-  const AnnotB();
-}
-class AnnotC {
-  const AnnotC({bool named: false});
-}
-const a1 = const Annot();
-const a2 = 32;
-const a3 = const AnnotB();
-
-class G {
-  int a;
-  @a1 int b;
-  int c;
-  @a2 int d;
-}
-
-class H extends G {
-  int e;
-  @a1 int f;
-  @a1 int g;
-  @a2 int h;
-  @a3 int i;
-}
-
-class K {
-  @AnnotC(named: true) int k;
-  @AnnotC() int k2;
-}
-
-abstract class L {
-  int get m;
-  incM();
-}
-
-class L2 extends L {
-  int m;
-  incM() { ++m; }
-  int n;
-}
diff --git a/packages/smoke/test/common_utils_test.dart b/packages/smoke/test/common_utils_test.dart
deleted file mode 100644
index e9818c9..0000000
--- a/packages/smoke/test/common_utils_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.common_utils;
-
-import 'package:smoke/src/common.dart';
-import 'package:test/test.dart';
-
-main() {
-  test('adjustList', () {
-    expect(adjustList([1, 2, 3], 1, 2), [1, 2]);
-    expect(adjustList([1, 2, 3], 1, 3), [1, 2, 3]);
-    expect(adjustList([1, 2, 3], 1, 4), [1, 2, 3]);
-    expect(adjustList([1, 2, 3], 4, 4), [1, 2, 3, null]);
-    expect(adjustList([], 1, 4), [null]);
-  });
-
-  test('compareLists ordered', () {
-    expect(compareLists([1, 1, 1], [1, 2, 3]), isFalse);
-    expect(compareLists([2, 3, 1], [1, 2, 3]), isFalse);
-    expect(compareLists([1, 2, 3], [1, 2, 3]), isTrue);
-  });
-
-  test('compareLists unordered', () {
-    expect(compareLists([1, 1, 1], [1, 2, 3], unordered: true), isFalse);
-    expect(compareLists([2, 3, 1], [1, 2, 3], unordered: true), isTrue);
-    expect(
-        compareLists([1, 1, 2, 3, 4, 2], [2, 2, 1, 1, 3, 4], unordered: true),
-        isTrue);
-    expect(
-        compareLists([1, 4, 2, 3, 1, 2], [2, 2, 1, 1, 3, 4], unordered: true),
-        isTrue);
-    expect(
-        compareLists([1, 1, 2, 3, 4, 1], [2, 2, 1, 1, 3, 4], unordered: true),
-        isFalse);
-  });
-}
diff --git a/packages/smoke/test/mirrors_test.dart b/packages/smoke/test/mirrors_test.dart
deleted file mode 100644
index ad93c87..0000000
--- a/packages/smoke/test/mirrors_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.mirrors_test;
-
-import 'package:smoke/mirrors.dart';
-import 'package:test/test.dart';
-import 'common.dart' as common show main;
-
-main() {
-  setUp(useMirrors);
-  common.main();
-}
diff --git a/packages/smoke/test/mirrors_used_test.dart b/packages/smoke/test/mirrors_used_test.dart
deleted file mode 100644
index c2f542e..0000000
--- a/packages/smoke/test/mirrors_used_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library smoke.test.mirrors_test;
-
-import 'package:smoke/mirrors.dart';
-import 'package:test/test.dart';
-import 'common.dart' hide main;
-import 'common.dart' as common show main;
-
-@MirrorsUsed(
-    targets: const [A, B, C, D, E, E2, F, F2, G, H, L, L2, Type],
-    override: 'smoke.mirrors')
-import 'dart:mirrors';
-
-main() {
-  setUp(useMirrors);
-  common.main();
-}
diff --git a/packages/smoke/test/piece1.dart b/packages/smoke/test/piece1.dart
deleted file mode 100644
index 9680563..0000000
--- a/packages/smoke/test/piece1.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Part of the static_in_pieces_test
-library smoke.test.piece1;
-
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
-import 'common.dart' as smoke_0;
-
-final configuration = new StaticConfiguration(
-    checkedMode: false,
-    getters: {#j: (o) => o.j, #j2: (o) => o.j2,},
-    setters: {},
-    parents: {smoke_0.H: smoke_0.G,},
-    declarations: {
-  smoke_0.H: {
-    #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
-    #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
-    #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
-    #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
-  },
-},
-    staticMethods: {smoke_0.A: {#staticInc: smoke_0.A.staticInc,},},
-    names: {});
diff --git a/packages/smoke/test/piece2.dart b/packages/smoke/test/piece2.dart
deleted file mode 100644
index e08aaac..0000000
--- a/packages/smoke/test/piece2.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Part of the static_in_pieces_test
-library smoke.test.piece2;
-
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
-import 'common.dart' as smoke_0;
-
-final configuration = new StaticConfiguration(
-    checkedMode: false, getters: {#j2: (o) => o.j2,}, setters: {
-  #j2: (o, v) {
-    o.j2 = v;
-  },
-},
-    parents: {},
-    declarations: {
-  smoke_0.A: {},
-  smoke_0.B: {#a: const Declaration(#a, smoke_0.A),},
-  smoke_0.K: {
-    #k: const Declaration(#k, int,
-        annotations: const [const smoke_0.AnnotC(named: true)]),
-    #k2: const Declaration(#k2, int,
-        annotations: const [const smoke_0.AnnotC()]),
-  },
-},
-    staticMethods: {smoke_0.A: {#staticInc: smoke_0.A.staticInc,},},
-    names: {#i: r'i',});
diff --git a/packages/smoke/test/static_in_pieces_test.dart b/packages/smoke/test/static_in_pieces_test.dart
deleted file mode 100644
index b0682d7..0000000
--- a/packages/smoke/test/static_in_pieces_test.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests that a static configuration can be loaded in pieces, even with
-/// deferred imports.
-library smoke.test.static_in_pieces_test;
-
-import 'package:test/test.dart';
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
-import 'piece1.dart' as p1;
-import 'piece2.dart' deferred as p2;
-import 'common.dart' as smoke_0;
-import 'common.dart' as common show main;
-
-abstract class _M0 {} // C & A
-
-final configuration = new StaticConfiguration(
-    checkedMode: false,
-    getters: {
-  #i: (o) => o.i,
-  #inc0: (o) => o.inc0,
-  #inc1: (o) => o.inc1,
-  #inc2: (o) => o.inc2,
-  #toString: (o) => o.toString,
-},
-    setters: {
-  #i: (o, v) {
-    o.i = v;
-  },
-},
-    parents: {
-  smoke_0.AnnotB: smoke_0.Annot,
-  smoke_0.D: _M0,
-  smoke_0.E2: smoke_0.E,
-  smoke_0.F2: smoke_0.F,
-  _M0: smoke_0.C,
-},
-    declarations: {
-  smoke_0.A: {
-    #i: const Declaration(#i, int),
-    #inc0: const Declaration(#inc0, Function, kind: METHOD),
-    #inc1: const Declaration(#inc1, Function, kind: METHOD),
-    #inc2: const Declaration(#inc2, Function, kind: METHOD),
-    #j: const Declaration(#j, int),
-    #j2: const Declaration(#j2, int, kind: PROPERTY),
-  },
-  smoke_0.B: {
-    #f: const Declaration(#f, int, isFinal: true),
-    #w: const Declaration(#w, int, kind: PROPERTY),
-  },
-  smoke_0.C: {
-    #b: const Declaration(#b, smoke_0.B),
-    #inc: const Declaration(#inc, Function, kind: METHOD),
-    #x: const Declaration(#x, int),
-    #y: const Declaration(#y, String),
-  },
-  smoke_0.D: {
-    #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
-    #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
-  },
-  smoke_0.E: {
-    #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
-    #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
-  },
-  smoke_0.E2: {},
-  smoke_0.F: {
-    #staticMethod: const Declaration(#staticMethod, Function,
-        kind: METHOD, isStatic: true),
-  },
-  smoke_0.F2: {},
-  smoke_0.G: {
-    #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
-    #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
-  },
-  smoke_0.L: {
-    #incM: const Declaration(#incM, Function, kind: METHOD),
-    #m: const Declaration(#m, int, kind: PROPERTY, isFinal: true),
-  },
-  smoke_0.L2: {
-    #incM: const Declaration(#incM, Function, kind: METHOD),
-    #m: const Declaration(#m, int),
-    #n: const Declaration(#n, int),
-  },
-  _M0: {
-    #i: const Declaration(#i, int),
-    #inc: const Declaration(#inc, Function, kind: METHOD),
-    #inc0: const Declaration(#inc0, Function, kind: METHOD),
-    #j: const Declaration(#j, int),
-    #j2: const Declaration(#j2, int, kind: PROPERTY),
-  },
-},
-    staticMethods: {},
-    names: {});
-
-main() {
-  useGeneratedCode(configuration);
-
-  test('smoke', () async {
-    expect(configuration.getters[#j], isNull);
-
-    configuration.addAll(p1.configuration);
-    expect(configuration.getters[#j], isNotNull);
-
-    await p2.loadLibrary();
-
-    expect(configuration.names[#i], isNull);
-    configuration.addAll(p2.configuration);
-    expect(configuration.names[#i], 'i');
-  });
-  
-  common.main();
-}
diff --git a/packages/smoke/test/static_test.dart b/packages/smoke/test/static_test.dart
deleted file mode 100644
index 9078225..0000000
--- a/packages/smoke/test/static_test.dart
+++ /dev/null
@@ -1,116 +0,0 @@
-/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------
-/// To update this test file, call:
-/// > dart codegen/end_to_end_test.dart --update_static_test
-/// --------------------------------------------------------
-
-library smoke.test.static_test;
-
-import 'package:test/test.dart';
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
-import 'common.dart' as smoke_0;
-import 'common.dart' as common show main;
-
-abstract class _M0 {} // C & A
-
-final configuration = new StaticConfiguration(
-    checkedMode: false,
-    getters: {
-      #i: (o) => o.i,
-      #inc0: (o) => o.inc0,
-      #inc1: (o) => o.inc1,
-      #inc2: (o) => o.inc2,
-      #j: (o) => o.j,
-      #j2: (o) => o.j2,
-      #toString: (o) => o.toString,
-    },
-    setters: {
-      #i: (o, v) { o.i = v; },
-      #j2: (o, v) { o.j2 = v; },
-    },
-    parents: {
-      smoke_0.AnnotB: smoke_0.Annot,
-      smoke_0.D: _M0,
-      smoke_0.E2: smoke_0.E,
-      smoke_0.F2: smoke_0.F,
-      smoke_0.H: smoke_0.G,
-      smoke_0.L2: smoke_0.L,
-      _M0: smoke_0.C,
-    },
-    declarations: {
-      smoke_0.A: {
-        #i: const Declaration(#i, int),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #inc1: const Declaration(#inc1, Function, kind: METHOD),
-        #inc2: const Declaration(#inc2, Function, kind: METHOD),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-      },
-      smoke_0.B: {
-        #a: const Declaration(#a, smoke_0.A),
-        #f: const Declaration(#f, int, isFinal: true),
-        #w: const Declaration(#w, int, kind: PROPERTY),
-      },
-      smoke_0.C: {
-        #b: const Declaration(#b, smoke_0.B),
-        #inc: const Declaration(#inc, Function, kind: METHOD),
-        #x: const Declaration(#x, int),
-        #y: const Declaration(#y, String),
-      },
-      smoke_0.D: {
-        #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
-        #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
-      },
-      smoke_0.E: {
-        #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
-        #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
-      },
-      smoke_0.E2: {},
-      smoke_0.F: {
-        #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
-      },
-      smoke_0.F2: {},
-      smoke_0.G: {
-        #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
-        #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
-      },
-      smoke_0.H: {
-        #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
-        #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
-        #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
-        #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
-      },
-      smoke_0.K: {
-        #k: const Declaration(#k, int, annotations: const [const smoke_0.AnnotC(named: true)]),
-        #k2: const Declaration(#k2, int, annotations: const [const smoke_0.AnnotC()]),
-      },
-      smoke_0.L: {
-        #incM: const Declaration(#incM, Function, kind: METHOD),
-        #m: const Declaration(#m, int, kind: PROPERTY, isFinal: true),
-      },
-      smoke_0.L2: {
-        #incM: const Declaration(#incM, Function, kind: METHOD),
-        #m: const Declaration(#m, int),
-        #n: const Declaration(#n, int),
-      },
-      _M0: {
-        #i: const Declaration(#i, int),
-        #inc: const Declaration(#inc, Function, kind: METHOD),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-      },
-    },
-    staticMethods: {
-      smoke_0.A: {
-        #staticInc: smoke_0.A.staticInc,
-      },
-    },
-    names: {
-      #i: r'i',
-    });
-
-main() {
-  setUp(() => useGeneratedCode(configuration));
-  common.main();
-}
diff --git a/packages/source_maps/.analysis_options b/packages/source_maps/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/source_maps/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/source_maps/.gitignore b/packages/source_maps/.gitignore
index 388eff0..7dbf035 100644
--- a/packages/source_maps/.gitignore
+++ b/packages/source_maps/.gitignore
@@ -3,6 +3,7 @@
 .pub/
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/packages/source_maps/.status b/packages/source_maps/.status
deleted file mode 100644
index befa7dd..0000000
--- a/packages/source_maps/.status
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Skip non-test files ending with "_test".
-packages/*: Skip
-*/packages/*: Skip
-*/*/packages/*: Skip
-*/*/*/packages/*: Skip
-*/*/*/*packages/*: Skip
-*/*/*/*/*packages/*: Skip
-
-# Only run tests from the build directory, since we don't care about the
-# difference between transformed an untransformed code.
-test/*: Skip
-
-[ $compiler == dart2js || $compiler == dart2dart ]
-build/test/vlq_test: RuntimeError # A VLQ test checks for large numbers that
-                                  # overflow in JS (numbers slightly larger than
-                                  # 32 bits where we do bitwise operations).
diff --git a/packages/source_maps/.test_config b/packages/source_maps/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/packages/source_maps/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/packages/source_maps/CHANGELOG.md b/packages/source_maps/CHANGELOG.md
index 3066293..a7c1b06 100644
--- a/packages/source_maps/CHANGELOG.md
+++ b/packages/source_maps/CHANGELOG.md
@@ -1,3 +1,38 @@
+## 0.10.4
+* Implement `highlight` in `SourceMapFileSpan`.
+* Require version `^1.3.0` of `source_span`.
+
+## 0.10.3
+ * Add `addMapping` and `containsMapping` members to `MappingBundle`.
+
+## 0.10.2
+ * Support for extended source map format.
+ * Polish `MappingBundle.spanFor` handling of URIs that have a suffix that
+   exactly match a source map in the MappingBundle.
+
+## 0.10.1+5
+ * Fix strong mode warning in test.
+
+## 0.10.1+4
+
+* Extend `MappingBundle.spanFor` to accept requests for output files that
+  don't have source maps.
+
+## 0.10.1+3
+
+* Add `MappingBundle` class that handles extended source map format that
+  supports source maps for multiple output files in a single mapper.
+  Extend `Mapping.spanFor` API to accept a uri parameter that is optional
+  for normal source maps but required for MappingBundle source maps.
+
+## 0.10.1+2
+
+* Fix more strong mode warnings.
+
+## 0.10.1+1
+
+* Fix all strong mode warnings.
+
 ## 0.10.1
 
 * Add a `mapUrl` named argument to `parse` and `parseJson`. This argument is
diff --git a/packages/source_maps/lib/builder.dart b/packages/source_maps/lib/builder.dart
index 091e220..c8596fe 100644
--- a/packages/source_maps/lib/builder.dart
+++ b/packages/source_maps/lib/builder.dart
@@ -60,7 +60,7 @@
 }
 
 /// An entry in the source map builder.
-class Entry implements Comparable {
+class Entry implements Comparable<Entry> {
   /// Span denoting the original location in the input source file
   final SourceLocation source;
 
diff --git a/packages/source_maps/lib/parser.dart b/packages/source_maps/lib/parser.dart
index a9fcff5..3b65e89 100644
--- a/packages/source_maps/lib/parser.dart
+++ b/packages/source_maps/lib/parser.dart
@@ -25,22 +25,44 @@
 // TODO(tjblasi): Ignore the first line of [jsonMap] if the JSON safety string
 // `)]}'` begins the string representation of the map.
 Mapping parse(String jsonMap, {Map<String, Map> otherMaps, mapUrl}) =>
-  parseJson(JSON.decode(jsonMap), otherMaps: otherMaps, mapUrl: mapUrl);
+    parseJson(JSON.decode(jsonMap), otherMaps: otherMaps, mapUrl: mapUrl);
 
-/// Parses a source map directly from a json map object.
+/// Parses a source map or source map bundle directly from a json string.
+///
+/// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of
+/// the source map file itself. If it's passed, any URLs in the source
+/// map will be interpreted as relative to this URL when generating spans.
+Mapping parseExtended(String jsonMap, {Map<String, Map> otherMaps, mapUrl}) =>
+    parseJsonExtended(JSON.decode(jsonMap),
+        otherMaps: otherMaps, mapUrl: mapUrl);
+
+/// Parses a source map or source map bundle.
+///
+/// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of
+/// the source map file itself. If it's passed, any URLs in the source
+/// map will be interpreted as relative to this URL when generating spans.
+Mapping parseJsonExtended(/*List|Map*/ json,
+    {Map<String, Map> otherMaps, mapUrl}) {
+  if (json is List) {
+    return new MappingBundle.fromJson(json, mapUrl: mapUrl);
+  }
+  return parseJson(json as Map);
+}
+
+/// Parses a source map
 ///
 /// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of
 /// the source map file itself. If it's passed, any URLs in the source
 /// map will be interpreted as relative to this URL when generating spans.
 Mapping parseJson(Map map, {Map<String, Map> otherMaps, mapUrl}) {
   if (map['version'] != 3) {
-    throw new ArgumentError(
-        'unexpected source map version: ${map["version"]}. '
+    throw new ArgumentError('unexpected source map version: ${map["version"]}. '
         'Only version 3 is supported.');
   }
 
   if (map.containsKey('sections')) {
-    if (map.containsKey('mappings') || map.containsKey('sources') ||
+    if (map.containsKey('mappings') ||
+        map.containsKey('sources') ||
         map.containsKey('names')) {
       throw new FormatException('map containing "sections" '
           'cannot contain "mappings", "sources", or "names".');
@@ -51,16 +73,21 @@
   return new SingleMapping.fromJson(map, mapUrl: mapUrl);
 }
 
-
 /// A mapping parsed out of a source map.
 abstract class Mapping {
   /// Returns the span associated with [line] and [column].
-  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files});
+  ///
+  /// [uri] is the optional location of the output file to find the span for
+  /// to disambiguate cases where a mapping may have different mappings for
+  /// different output files.
+  SourceMapSpan spanFor(int line, int column,
+      {Map<String, SourceFile> files, String uri});
 
   /// Returns the span associated with [location].
   SourceMapSpan spanForLocation(SourceLocation location,
       {Map<String, SourceFile> files}) {
-    return spanFor(location.line, location.column, files: files);
+    return spanFor(location.line, location.column,
+        uri: location.sourceUrl?.toString(), files: files);
   }
 }
 
@@ -116,35 +143,113 @@
   }
 
   int _indexFor(line, column) {
-    for(int i = 0; i < _lineStart.length; i++) {
+    for (int i = 0; i < _lineStart.length; i++) {
       if (line < _lineStart[i]) return i - 1;
       if (line == _lineStart[i] && column < _columnStart[i]) return i - 1;
     }
     return _lineStart.length - 1;
   }
 
-  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
+  SourceMapSpan spanFor(int line, int column,
+      {Map<String, SourceFile> files, String uri}) {
+    // TODO(jacobr): perhaps verify that targetUrl matches the actual uri
+    // or at least ends in the same file name.
     int index = _indexFor(line, column);
     return _maps[index].spanFor(
-        line - _lineStart[index], column - _columnStart[index], files: files);
+        line - _lineStart[index], column - _columnStart[index],
+        files: files);
   }
 
   String toString() {
     var buff = new StringBuffer("$runtimeType : [");
     for (int i = 0; i < _lineStart.length; i++) {
-      buff..write('(')
-          ..write(_lineStart[i])
-          ..write(',')
-          ..write(_columnStart[i])
-          ..write(':')
-          ..write(_maps[i])
-          ..write(')');
+      buff
+        ..write('(')
+        ..write(_lineStart[i])
+        ..write(',')
+        ..write(_columnStart[i])
+        ..write(':')
+        ..write(_maps[i])
+        ..write(')');
     }
     buff.write(']');
     return buff.toString();
   }
 }
 
+class MappingBundle extends Mapping {
+  Map<String, SingleMapping> _mappings = {};
+
+  MappingBundle() {}
+
+  MappingBundle.fromJson(List json, {String mapUrl}) {
+    for (var map in json) {
+      addMapping(parseJson(map, mapUrl: mapUrl) as SingleMapping);
+    }
+  }
+
+  addMapping(SingleMapping mapping) {
+    // TODO(jacobr): verify that targetUrl is valid uri instead of a windows
+    // path.
+    _mappings[mapping.targetUrl] = mapping;
+  }
+
+  /// Encodes the Mapping mappings as a json map.
+  List toJson() => _mappings.values.map((v) => v.toJson()).toList();
+
+  String toString() {
+    var buff = new StringBuffer();
+    for (var map in _mappings.values) {
+      buff.write(map.toString());
+    }
+    return buff.toString();
+  }
+
+  bool containsMapping(String url) => _mappings.containsKey(url);
+
+  SourceMapSpan spanFor(int line, int column,
+      {Map<String, SourceFile> files, String uri}) {
+    if (uri == null) {
+      throw new ArgumentError.notNull('uri');
+    }
+
+    // Find the longest suffix of the uri that matches the sourcemap
+    // where the suffix starts after a path segment boundary.
+    // We consider ":" and "/" as path segment boundaries so that
+    // "package:" uris can be handled with minimal special casing. Having a
+    // few false positive path segment boundaries is not a significant issue
+    // as we prefer the longest matching prefix.
+    // Using package:path `path.split` to find path segment boundaries would
+    // not generate all of the path segment boundaries we want for "package:"
+    // urls as "package:package_name" would be one path segment when we want
+    // "package" and "package_name" to be sepearate path segments.
+
+    bool onBoundary = true;
+    var separatorCodeUnits = ['/'.codeUnitAt(0), ':'.codeUnitAt(0)];
+    for (var i = 0; i < uri.length; ++i) {
+      if (onBoundary) {
+        var candidate = uri.substring(i);
+        if (_mappings.containsKey(candidate)) {
+          return _mappings[candidate]
+              .spanFor(line, column, files: files, uri: candidate);
+        }
+      }
+      onBoundary = separatorCodeUnits.contains(uri.codeUnitAt(i));
+    }
+
+    // Note: when there is no source map for an uri, this behaves like an
+    // identity function, returning the requested location as the result.
+
+    // Create a mock offset for the output location. We compute it in terms
+    // of the input line and column to minimize the chances that two different
+    // line and column locations are mapped to the same offset.
+    var offset = line * 1000000 + column;
+    var location = new SourceLocation(offset,
+        line: line, column: column, sourceUrl: Uri.parse(uri));
+    return new SourceMapSpan(location, location, "");
+  }
+}
+
 /// A map containing direct source mappings.
 class SingleMapping extends Mapping {
   /// Source urls used in the mapping, indexed by id.
@@ -167,8 +272,8 @@
   SingleMapping._(this.targetUrl, this.urls, this.names, this.lines)
       : _mapUrl = null;
 
-  factory SingleMapping.fromEntries(
-      Iterable<builder.Entry> entries, [String fileUrl]) {
+  factory SingleMapping.fromEntries(Iterable<builder.Entry> entries,
+      [String fileUrl]) {
     // The entries needs to be sorted by the target offsets.
     var sourceEntries = new List.from(entries)..sort();
     var lines = <TargetLineEntry>[];
@@ -182,7 +287,7 @@
     var names = new LinkedHashMap<String, int>();
 
     var lineNum;
-    var targetEntries;
+    List<TargetEntry> targetEntries;
     for (var sourceEntry in sourceEntries) {
       if (lineNum == null || sourceEntry.target.line > lineNum) {
         lineNum = sourceEntry.target.line;
@@ -196,14 +301,11 @@
         var sourceUrl = sourceEntry.source.sourceUrl;
         var urlId = urls.putIfAbsent(
             sourceUrl == null ? '' : sourceUrl.toString(), () => urls.length);
-        var srcNameId = sourceEntry.identifierName == null ? null :
-            names.putIfAbsent(sourceEntry.identifierName, () => names.length);
-        targetEntries.add(new TargetEntry(
-            sourceEntry.target.column,
-            urlId,
-            sourceEntry.source.line,
-            sourceEntry.source.column,
-            srcNameId));
+        var srcNameId = sourceEntry.identifierName == null
+            ? null
+            : names.putIfAbsent(sourceEntry.identifierName, () => names.length);
+        targetEntries.add(new TargetEntry(sourceEntry.target.column, urlId,
+            sourceEntry.source.line, sourceEntry.source.column, srcNameId));
       }
     }
     return new SingleMapping._(
@@ -212,8 +314,8 @@
 
   SingleMapping.fromJson(Map map, {mapUrl})
       : targetUrl = map['file'],
-        urls = map['sources'],
-        names = map['names'],
+        urls = new List<String>.from(map['sources']),
+        names = new List<String>.from(map['names']),
         sourceRoot = map['sourceRoot'],
         lines = <TargetLineEntry>[],
         _mapUrl = mapUrl is String ? Uri.parse(mapUrl) : mapUrl {
@@ -271,8 +373,8 @@
             throw new StateError(
                 'Invalid name id: $targetUrl, $line, $srcNameId');
           }
-          entries.add(new TargetEntry(column, srcUrlId, srcLine, srcColumn,
-              srcNameId));
+          entries.add(
+              new TargetEntry(column, srcUrlId, srcLine, srcColumn, srcNameId));
         }
       }
       if (tokenizer.nextKind.isNewSegment) tokenizer._consumeNewSegment();
@@ -326,8 +428,8 @@
       'version': 3,
       'sourceRoot': sourceRoot == null ? '' : sourceRoot,
       'sources': urls,
-      'names' : names,
-      'mappings' : buff.toString()
+      'names': names,
+      'mappings': buff.toString()
     };
     if (targetUrl != null) {
       result['file'] = targetUrl;
@@ -342,9 +444,9 @@
     return newValue;
   }
 
-  _segmentError(int seen, int line) => new StateError(
-      'Invalid entry in sourcemap, expected 1, 4, or 5'
-      ' values, but got $seen.\ntargeturl: $targetUrl, line: $line');
+  _segmentError(int seen, int line) =>
+      new StateError('Invalid entry in sourcemap, expected 1, 4, or 5'
+          ' values, but got $seen.\ntargeturl: $targetUrl, line: $line');
 
   /// Returns [TargetLineEntry] which includes the location in the target [line]
   /// number. In particular, the resulting entry is the last entry whose line
@@ -367,7 +469,8 @@
     return (index <= 0) ? null : entries[index - 1];
   }
 
-  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
+  SourceMapSpan spanFor(int line, int column,
+      {Map<String, SourceFile> files, String uri}) {
     var entry = _findColumn(line, column, _findLine(line));
     if (entry == null || entry.sourceUrlId == null) return null;
     var url = urls[entry.sourceUrlId];
@@ -402,17 +505,18 @@
 
   String toString() {
     return (new StringBuffer("$runtimeType : [")
-        ..write('targetUrl: ')
-        ..write(targetUrl)
-        ..write(', sourceRoot: ')
-        ..write(sourceRoot)
-        ..write(', urls: ')
-        ..write(urls)
-        ..write(', names: ')
-        ..write(names)
-        ..write(', lines: ')
-        ..write(lines)
-        ..write(']')).toString();
+          ..write('targetUrl: ')
+          ..write(targetUrl)
+          ..write(', sourceRoot: ')
+          ..write(sourceRoot)
+          ..write(', urls: ')
+          ..write(urls)
+          ..write(', names: ')
+          ..write(names)
+          ..write(', lines: ')
+          ..write(lines)
+          ..write(']'))
+        .toString();
   }
 
   String get debugString {
@@ -420,24 +524,24 @@
     for (var lineEntry in lines) {
       var line = lineEntry.line;
       for (var entry in lineEntry.entries) {
-        buff..write(targetUrl)
-            ..write(': ')
-            ..write(line)
-            ..write(':')
-            ..write(entry.column);
+        buff
+          ..write(targetUrl)
+          ..write(': ')
+          ..write(line)
+          ..write(':')
+          ..write(entry.column);
         if (entry.sourceUrlId != null) {
-          buff..write('   -->   ')
-              ..write(sourceRoot)
-              ..write(urls[entry.sourceUrlId])
-              ..write(': ')
-              ..write(entry.sourceLine)
-              ..write(':')
-              ..write(entry.sourceColumn);
+          buff
+            ..write('   -->   ')
+            ..write(sourceRoot)
+            ..write(urls[entry.sourceUrlId])
+            ..write(': ')
+            ..write(entry.sourceLine)
+            ..write(':')
+            ..write(entry.sourceColumn);
         }
         if (entry.sourceNameId != null) {
-          buff..write(' (')
-              ..write(names[entry.sourceNameId])
-              ..write(')');
+          buff..write(' (')..write(names[entry.sourceNameId])..write(')');
         }
         buff.write('\n');
       }
@@ -463,8 +567,11 @@
   final int sourceColumn;
   final int sourceNameId;
 
-  TargetEntry(this.column, [this.sourceUrlId, this.sourceLine,
-      this.sourceColumn, this.sourceNameId]);
+  TargetEntry(this.column,
+      [this.sourceUrlId,
+      this.sourceLine,
+      this.sourceColumn,
+      this.sourceNameId]);
 
   String toString() => '$runtimeType: '
       '($column, $sourceUrlId, $sourceLine, $sourceColumn, $sourceNameId)';
@@ -482,7 +589,7 @@
   // Iterator API is used by decodeVlq to consume VLQ entries.
   bool moveNext() => ++index < _length;
   String get current =>
-      (index >= 0 && index < _length) ?  _internal[index] : null;
+      (index >= 0 && index < _length) ? _internal[index] : null;
 
   bool get hasTokens => index < _length - 1 && _length > 0;
 
@@ -495,8 +602,13 @@
   }
 
   int _consumeValue() => decodeVlq(this);
-  void _consumeNewLine() { ++index; }
-  void _consumeNewSegment() { ++index; }
+  void _consumeNewLine() {
+    ++index;
+  }
+
+  void _consumeNewSegment() {
+    ++index;
+  }
 
   // Print the state of the iterator, with colors indicating the current
   // position.
diff --git a/packages/source_maps/lib/src/source_map_span.dart b/packages/source_maps/lib/src/source_map_span.dart
index b70bdfe..37107e1 100644
--- a/packages/source_maps/lib/src/source_map_span.dart
+++ b/packages/source_maps/lib/src/source_map_span.dart
@@ -17,7 +17,7 @@
   final bool isIdentifier;
 
   SourceMapSpan(SourceLocation start, SourceLocation end, String text,
-          {this.isIdentifier: false})
+      {this.isIdentifier: false})
       : super(start, end, text);
 
   /// Creates a [SourceMapSpan] for an identifier with value [text] starting at
@@ -26,13 +26,13 @@
   /// The [end] location is determined by adding [text] to [start].
   SourceMapSpan.identifier(SourceLocation start, String text)
       : this(
-          start,
-          new SourceLocation(start.offset + text.length,
-              sourceUrl: start.sourceUrl,
-              line: start.line,
-              column: start.column + text.length),
-          text,
-          isIdentifier: true);
+            start,
+            new SourceLocation(start.offset + text.length,
+                sourceUrl: start.sourceUrl,
+                line: start.line,
+                column: start.column + text.length),
+            text,
+            isIdentifier: true);
 }
 
 /// A wrapper aruond a [FileSpan] that implements [SourceMapSpan].
@@ -51,10 +51,11 @@
   SourceMapFileSpan(this._inner, {this.isIdentifier: false});
 
   int compareTo(SourceSpan other) => _inner.compareTo(other);
+  String highlight({color}) => _inner.highlight(color: color);
   SourceSpan union(SourceSpan other) => _inner.union(other);
   FileSpan expand(FileSpan other) => _inner.expand(other);
   String message(String message, {color}) =>
       _inner.message(message, color: color);
-  String toString() => _inner.toString()
-      .replaceAll("FileSpan", "SourceMapFileSpan");
+  String toString() =>
+      _inner.toString().replaceAll("FileSpan", "SourceMapFileSpan");
 }
diff --git a/packages/source_maps/pubspec.yaml b/packages/source_maps/pubspec.yaml
index fc0fe9b..1db777b 100644
--- a/packages/source_maps/pubspec.yaml
+++ b/packages/source_maps/pubspec.yaml
@@ -1,12 +1,11 @@
 name: source_maps
-version: 0.10.1
+version: 0.10.4
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://github.com/dart-lang/source_maps
 dependencies:
-  path: ^1.2.0
-  source_span: ^1.1.1
+  source_span: ^1.3.0
 environment:
   sdk: '>=1.8.0 <2.0.0'
 dev_dependencies:
-  unittest: '>=0.9.0 <0.12.0'
+  test: '>=0.12.0 <0.13.0'
diff --git a/packages/source_maps/test/builder_test.dart b/packages/source_maps/test/builder_test.dart
index ca0ca8d..dcc583c 100644
--- a/packages/source_maps/test/builder_test.dart
+++ b/packages/source_maps/test/builder_test.dart
@@ -5,7 +5,7 @@
 library test.source_maps_test;
 
 import 'dart:convert';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/source_maps.dart';
 import 'common.dart';
 
diff --git a/packages/source_maps/test/common.dart b/packages/source_maps/test/common.dart
index 73a8d40..3bc512c 100644
--- a/packages/source_maps/test/common.dart
+++ b/packages/source_maps/test/common.dart
@@ -7,7 +7,7 @@
 
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 /// Content of the source file
 const String INPUT = '''
diff --git a/packages/source_maps/test/end2end_test.dart b/packages/source_maps/test/end2end_test.dart
index 7dbc6bd..8caf2e9 100644
--- a/packages/source_maps/test/end2end_test.dart
+++ b/packages/source_maps/test/end2end_test.dart
@@ -4,7 +4,7 @@
 
 library test.end2end_test;
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
 import 'common.dart';
diff --git a/packages/source_maps/test/parser_test.dart b/packages/source_maps/test/parser_test.dart
index b14fdf4..2c24d1b 100644
--- a/packages/source_maps/test/parser_test.dart
+++ b/packages/source_maps/test/parser_test.dart
@@ -5,37 +5,71 @@
 library test.parser_test;
 
 import 'dart:convert';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
 import 'common.dart';
 
 const Map<String, dynamic> MAP_WITH_NO_SOURCE_LOCATION = const {
-    'version': 3,
-    'sourceRoot': '',
-    'sources': const ['input.dart'],
-    'names': const [],
-    'mappings': 'A',
-    'file': 'output.dart'
+  'version': 3,
+  'sourceRoot': '',
+  'sources': const ['input.dart'],
+  'names': const [],
+  'mappings': 'A',
+  'file': 'output.dart'
 };
 
 const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION = const {
-    'version': 3,
-    'sourceRoot': '',
-    'sources': const ['input.dart'],
-    'names': const [],
-    'mappings': 'AAAA',
-    'file': 'output.dart'
+  'version': 3,
+  'sourceRoot': '',
+  'sources': const ['input.dart'],
+  'names': const [],
+  'mappings': 'AAAA',
+  'file': 'output.dart'
 };
 
 const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME = const {
-    'version': 3,
-    'sourceRoot': '',
-    'sources': const ['input.dart'],
-    'names': const ['var'],
-    'mappings': 'AAAAA',
-    'file': 'output.dart'
+  'version': 3,
+  'sourceRoot': '',
+  'sources': const ['input.dart'],
+  'names': const ['var'],
+  'mappings': 'AAAAA',
+  'file': 'output.dart'
 };
 
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_1 = const {
+  'version': 3,
+  'sourceRoot': 'pkg/',
+  'sources': const ['input1.dart'],
+  'names': const ['var1'],
+  'mappings': 'AAAAA',
+  'file': 'output.dart'
+};
+
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_2 = const {
+  'version': 3,
+  'sourceRoot': 'pkg/',
+  'sources': const ['input2.dart'],
+  'names': const ['var2'],
+  'mappings': 'AAAAA',
+  'file': 'output2.dart'
+};
+
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME_3 = const {
+  'version': 3,
+  'sourceRoot': 'pkg/',
+  'sources': const ['input3.dart'],
+  'names': const ['var3'],
+  'mappings': 'AAAAA',
+  'file': '3/output.dart'
+};
+
+const List SOURCE_MAP_BUNDLE = const [
+  MAP_WITH_SOURCE_LOCATION_AND_NAME_1,
+  MAP_WITH_SOURCE_LOCATION_AND_NAME_2,
+  MAP_WITH_SOURCE_LOCATION_AND_NAME_3,
+];
+
 main() {
   test('parse', () {
     var mapping = parseJson(EXPECTED_MAP);
@@ -105,6 +139,12 @@
     inputMap['sourceRoot'] = '/pkg/';
     var mapping = parseJson(inputMap);
     expect(mapping.spanFor(0, 0).sourceUrl, Uri.parse("/pkg/input.dart"));
+    expect(
+        mapping
+            .spanForLocation(
+                new SourceLocation(0, sourceUrl: Uri.parse("ignored.dart")))
+            .sourceUrl,
+        Uri.parse("/pkg/input.dart"));
 
     var newSourceRoot = '/new/';
 
@@ -122,14 +162,183 @@
         Uri.parse("file:///path/to/pkg/input.dart"));
   });
 
+  group('parse with bundle', () {
+    var mapping =
+        parseJsonExtended(SOURCE_MAP_BUNDLE, mapUrl: "file:///path/to/map");
+
+    test('simple', () {
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: new Uri.file('/path/to/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: new Uri.file('/path/to/output2.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: new Uri.file('/path/to/3/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+
+      expect(
+          mapping.spanFor(0, 0, uri: "file:///path/to/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(
+          mapping.spanFor(0, 0, uri: "file:///path/to/output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(
+          mapping.spanFor(0, 0, uri: "file:///path/to/3/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+
+    test('package uris', () {
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('package:1/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('package:2/output2.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('package:3/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+
+      expect(mapping.spanFor(0, 0, uri: "package:1/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(mapping.spanFor(0, 0, uri: "package:2/output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(mapping.spanFor(0, 0, uri: "package:3/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+
+    test('unmapped path', () {
+      var span = mapping.spanFor(0, 0, uri: "unmapped_output.dart");
+      expect(span.sourceUrl, Uri.parse("unmapped_output.dart"));
+      expect(span.start.line, equals(0));
+      expect(span.start.column, equals(0));
+
+      span = mapping.spanFor(10, 5, uri: "unmapped_output.dart");
+      expect(span.sourceUrl, Uri.parse("unmapped_output.dart"));
+      expect(span.start.line, equals(10));
+      expect(span.start.column, equals(5));
+    });
+
+    test('missing path', () {
+      expect(() => mapping.spanFor(0, 0), throws);
+    });
+
+    test('incomplete paths', () {
+      expect(mapping.spanFor(0, 0, uri: "output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(mapping.spanFor(0, 0, uri: "output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(mapping.spanFor(0, 0, uri: "3/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+
+    test('parseExtended', () {
+      var mapping = parseExtended(JSON.encode(SOURCE_MAP_BUNDLE),
+          mapUrl: "file:///path/to/map");
+
+      expect(mapping.spanFor(0, 0, uri: "output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(mapping.spanFor(0, 0, uri: "output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(mapping.spanFor(0, 0, uri: "3/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+
+    test('build bundle incrementally', () {
+      var mapping = new MappingBundle();
+
+      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_1,
+          mapUrl: "file:///path/to/map"));
+      expect(mapping.spanFor(0, 0, uri: "output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+
+      expect(mapping.containsMapping("output2.dart"), isFalse);
+      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_2,
+          mapUrl: "file:///path/to/map"));
+      expect(mapping.containsMapping("output2.dart"), isTrue);
+      expect(mapping.spanFor(0, 0, uri: "output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+
+      expect(mapping.containsMapping("3/output.dart"), isFalse);
+      mapping.addMapping(parseJson(MAP_WITH_SOURCE_LOCATION_AND_NAME_3,
+          mapUrl: "file:///path/to/map"));
+      expect(mapping.containsMapping("3/output.dart"), isTrue);
+      expect(mapping.spanFor(0, 0, uri: "3/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+
+    // Test that the source map can handle cases where the uri passed in is
+    // not from the expected host but it is still unambiguous which source
+    // map should be used.
+    test('different paths', () {
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('http://localhost/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('http://localhost/output2.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(
+          mapping
+              .spanForLocation(new SourceLocation(0,
+                  sourceUrl: Uri.parse('http://localhost/3/output.dart')))
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+
+      expect(
+          mapping.spanFor(0, 0, uri: "http://localhost/output.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input1.dart"));
+      expect(
+          mapping.spanFor(0, 0, uri: "http://localhost/output2.dart").sourceUrl,
+          Uri.parse("file:///path/to/pkg/input2.dart"));
+      expect(
+          mapping
+              .spanFor(0, 0, uri: "http://localhost/3/output.dart")
+              .sourceUrl,
+          Uri.parse("file:///path/to/pkg/input3.dart"));
+    });
+  });
+
   test('parse and re-emit', () {
     for (var expected in [
-        EXPECTED_MAP,
-        MAP_WITH_NO_SOURCE_LOCATION,
-        MAP_WITH_SOURCE_LOCATION,
-        MAP_WITH_SOURCE_LOCATION_AND_NAME]) {
+      EXPECTED_MAP,
+      MAP_WITH_NO_SOURCE_LOCATION,
+      MAP_WITH_SOURCE_LOCATION,
+      MAP_WITH_SOURCE_LOCATION_AND_NAME
+    ]) {
       var mapping = parseJson(expected);
       expect(mapping.toJson(), equals(expected));
+
+      mapping = parseJsonExtended(expected);
+      expect(mapping.toJson(), equals(expected));
     }
+    // Invalid for this case
+    expect(() => parseJson(SOURCE_MAP_BUNDLE as dynamic), throws);
+
+    var mapping = parseJsonExtended(SOURCE_MAP_BUNDLE);
+    expect(mapping.toJson(), equals(SOURCE_MAP_BUNDLE));
   });
 }
diff --git a/packages/source_maps/test/printer_test.dart b/packages/source_maps/test/printer_test.dart
index e55ca9f..25036ee 100644
--- a/packages/source_maps/test/printer_test.dart
+++ b/packages/source_maps/test/printer_test.dart
@@ -5,7 +5,7 @@
 library test.printer_test;
 
 import 'dart:convert';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
 import 'common.dart';
diff --git a/packages/source_maps/test/refactor_test.dart b/packages/source_maps/test/refactor_test.dart
index 08b8965..03292d1 100644
--- a/packages/source_maps/test/refactor_test.dart
+++ b/packages/source_maps/test/refactor_test.dart
@@ -4,7 +4,7 @@
 
 library polymer.test.refactor_test;
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/refactor.dart';
 import 'package:source_maps/parser.dart' show parse, Mapping;
 import 'package:source_span/source_span.dart';
diff --git a/packages/source_maps/test/run.dart b/packages/source_maps/test/run.dart
index ec3c3ab..477da8a 100755
--- a/packages/source_maps/test/run.dart
+++ b/packages/source_maps/test/run.dart
@@ -5,9 +5,8 @@
 
 library test.run;
 
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
-import 'dart:io' show Options;
+import 'package:test/compact_vm_config.dart';
+import 'package:test/test.dart';
 
 import 'builder_test.dart' as builder_test;
 import 'end2end_test.dart' as end2end_test;
diff --git a/packages/source_maps/test/utils_test.dart b/packages/source_maps/test/utils_test.dart
index 79a7de7..cbbb40a 100644
--- a/packages/source_maps/test/utils_test.dart
+++ b/packages/source_maps/test/utils_test.dart
@@ -5,7 +5,7 @@
 /// Tests for the binary search utility algorithm.
 library test.utils_test;
 
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/src/utils.dart';
 
 main() {
diff --git a/packages/source_maps/test/vlq_test.dart b/packages/source_maps/test/vlq_test.dart
index 0abdc47..d1b543d 100644
--- a/packages/source_maps/test/vlq_test.dart
+++ b/packages/source_maps/test/vlq_test.dart
@@ -5,7 +5,7 @@
 library test.vlq_test;
 
 import 'dart:math';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:source_maps/src/vlq.dart';
 
 main() {
@@ -49,7 +49,9 @@
     expect(() => decodeVlq('igggggE'.split('').iterator), throws);
     expect(() => decodeVlq('jgggggE'.split('').iterator), throws);
     expect(() => decodeVlq('lgggggE'.split('').iterator), throws);
-  });
+  },
+      // This test uses integers so large they overflow in JS.
+      testOn: "dart-vm");
 }
 
 _checkEncodeDecode(int value) {
diff --git a/packages/source_span/.analysis_options b/packages/source_span/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/source_span/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/source_span/CHANGELOG.md b/packages/source_span/CHANGELOG.md
index ce71980..68eafaa 100644
--- a/packages/source_span/CHANGELOG.md
+++ b/packages/source_span/CHANGELOG.md
@@ -1,3 +1,40 @@
+# 1.4.0
+
+* The `new SourceFile()` constructor is deprecated. This constructed a source
+  file from a string's runes, rather than its code units, which runs counter to
+  the way Dart handles strings otherwise. The `new StringFile.fromString()`
+  constructor (see below) should be used instead.
+
+* The `new SourceFile.fromString()` constructor was added. This works like `new
+  SourceFile()`, except it uses code units rather than runes.
+
+* The current behavior when characters larger than `0xFFFF` are passed to `new
+  SourceFile.decoded()` is now considered deprecated.
+
+# 1.3.1
+
+* Properly highlight spans for lines that include tabs with
+  `SourceSpan.highlight()` and `SourceSpan.message()`.
+
+# 1.3.0
+
+* Add `SourceSpan.highlight()`, which returns just the highlighted text that
+  would be included in `SourceSpan.message()`.
+
+# 1.2.4
+
+* Fix a new strong mode error.
+
+# 1.2.3
+
+* Fix a bug where a point span at the end of a file without a trailing newline
+  would be printed incorrectly.
+
+# 1.2.2
+
+* Allow `SourceSpanException.message`, `SourceSpanFormatException.source`, and
+  `SourceSpanWithContext.context` to be overridden in strong mode.
+
 # 1.2.1
 
 * Fix the declared type of `FileSpan.start` and `FileSpan.end`. In 1.2.0 these
diff --git a/packages/source_span/lib/source_span.dart b/packages/source_span/lib/source_span.dart
index 9666dc2..6ed10a0 100644
--- a/packages/source_span/lib/source_span.dart
+++ b/packages/source_span/lib/source_span.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span;
-
 export "src/file.dart";
 export "src/location.dart";
 export "src/location_mixin.dart";
diff --git a/packages/source_span/lib/src/colors.dart b/packages/source_span/lib/src/colors.dart
index 274fc92..e934cde 100644
--- a/packages/source_span/lib/src/colors.dart
+++ b/packages/source_span/lib/src/colors.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Color constants used for generating messages.
-library source_span.colors;
-
 const String RED = '\u001b[31m';
 
 const String YELLOW = '\u001b[33m';
diff --git a/packages/source_span/lib/src/file.dart b/packages/source_span/lib/src/file.dart
index 37790ce..0217c2d 100644
--- a/packages/source_span/lib/src/file.dart
+++ b/packages/source_span/lib/src/file.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.file;
-
 import 'dart:math' as math;
 import 'dart:typed_data';
 
@@ -51,15 +49,28 @@
   /// previous result.
   int _cachedLine;
 
-  /// Creates a new source file from [text].
+  /// This constructor is deprecated.
   ///
-  /// [url] may be either a [String], a [Uri], or `null`.
+  /// Use [new SourceFile.fromString] instead.
+  @Deprecated("Will be removed in 2.0.0")
   SourceFile(String text, {url})
       : this.decoded(text.runes, url: url);
 
-  /// Creates a new source file from a list of decoded characters.
+  /// Creates a new source file from [text].
   ///
   /// [url] may be either a [String], a [Uri], or `null`.
+  SourceFile.fromString(String text, {url})
+      : this.decoded(text.codeUnits, url: url);
+
+  /// Creates a new source file from a list of decoded code units.
+  ///
+  /// [url] may be either a [String], a [Uri], or `null`.
+  ///
+  /// Currently, if [decodedChars] contains characters larger than `0xFFFF`,
+  /// they'll be treated as single characters rather than being split into
+  /// surrogate pairs. **This behavior is deprecated**. For
+  /// forwards-compatibility, callers should only pass in characters less than
+  /// or equal to `0xFFFF`.
   SourceFile.decoded(Iterable<int> decodedChars, {url})
       : url = url is String ? Uri.parse(url) : url,
         _decodedChars = new Uint32List.fromList(decodedChars.toList()) {
diff --git a/packages/source_span/lib/src/location.dart b/packages/source_span/lib/src/location.dart
index afb37c7..2d23db1 100644
--- a/packages/source_span/lib/src/location.dart
+++ b/packages/source_span/lib/src/location.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.location;
-
 import 'span.dart';
 
 // TODO(nweiz): Use SourceLocationMixin once we decide to cut a release with
diff --git a/packages/source_span/lib/src/location_mixin.dart b/packages/source_span/lib/src/location_mixin.dart
index 5aa0de5..653c2c4 100644
--- a/packages/source_span/lib/src/location_mixin.dart
+++ b/packages/source_span/lib/src/location_mixin.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.location_mixin;
-
 import 'location.dart';
 import 'span.dart';
 
diff --git a/packages/source_span/lib/src/span.dart b/packages/source_span/lib/src/span.dart
index 9f15048..599d668 100644
--- a/packages/source_span/lib/src/span.dart
+++ b/packages/source_span/lib/src/span.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.span;
-
 import 'location.dart';
 import 'span_mixin.dart';
 
@@ -55,6 +53,19 @@
   /// should be highlighted using the default color. If it's `false` or `null`,
   /// it indicates that the text shouldn't be highlighted.
   String message(String message, {color});
+
+  /// Prints the text associated with this span in a user-friendly way.
+  ///
+  /// This is identical to [message], except that it doesn't print the file
+  /// name, line number, column number, or message. If [length] is 0 and this
+  /// isn't a [SourceSpanWithContext], returns an empty string.
+  ///
+  /// [color] may either be a [String], a [bool], or `null`. If it's a string,
+  /// it indicates an ANSII terminal color escape that should be used to
+  /// highlight the span's text. If it's `true`, it indicates that the text
+  /// should be highlighted using the default color. If it's `false` or `null`,
+  /// it indicates that the text shouldn't be highlighted.
+  String highlight({color});
 }
 
 /// A base class for source spans with [start], [end], and [text] known at
diff --git a/packages/source_span/lib/src/span_exception.dart b/packages/source_span/lib/src/span_exception.dart
index 36f2488..6d3448b 100644
--- a/packages/source_span/lib/src/span_exception.dart
+++ b/packages/source_span/lib/src/span_exception.dart
@@ -2,21 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.span_exception;
-
 import 'span.dart';
 
 /// A class for exceptions that have source span information attached.
 class SourceSpanException implements Exception {
+  // This is a getter so that subclasses can override it.
   /// A message describing the exception.
-  final String message;
+  String get message => _message;
+  final String _message;
 
+  // This is a getter so that subclasses can override it.
   /// The span associated with this exception.
   ///
   /// This may be `null` if the source location can't be determined.
-  final SourceSpan span;
+  SourceSpan get span => _span;
+  final SourceSpan _span;
 
-  SourceSpanException(this.message, this.span);
+  SourceSpanException(this._message, this._span);
 
   /// Returns a string representation of [this].
   ///
@@ -34,10 +36,12 @@
 /// A [SourceSpanException] that's also a [FormatException].
 class SourceSpanFormatException extends SourceSpanException
     implements FormatException {
-  final source;
+  // This is a getter so that subclasses can override it.
+  dynamic get source => _source;
+  final _source;
 
   int get offset => span == null ? null : span.start.offset;
 
-  SourceSpanFormatException(String message, SourceSpan span, [this.source])
+  SourceSpanFormatException(String message, SourceSpan span, [this._source])
       : super(message, span);
 }
diff --git a/packages/source_span/lib/src/span_mixin.dart b/packages/source_span/lib/src/span_mixin.dart
index b4503fa..06e2024 100644
--- a/packages/source_span/lib/src/span_mixin.dart
+++ b/packages/source_span/lib/src/span_mixin.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.span_mixin;
-
 import 'dart:math' as math;
+
+import 'package:charcode/charcode.dart';
 import 'package:path/path.dart' as p;
 
 import 'colors.dart' as colors;
@@ -48,21 +48,27 @@
   }
 
   String message(String message, {color}) {
-    if (color == true) color = colors.RED;
-    if (color == false) color = null;
-
-    var line = start.line;
-    var column = start.column;
-
     var buffer = new StringBuffer();
-    buffer.write('line ${line + 1}, column ${column + 1}');
+    buffer.write('line ${start.line + 1}, column ${start.column + 1}');
     if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
     buffer.write(': $message');
 
-    if (length == 0 && this is! SourceSpanWithContext) return buffer.toString();
-    buffer.write("\n");
+    var highlight = this.highlight(color: color);
+    if (!highlight.isEmpty) {
+      buffer.writeln();
+      buffer.write(highlight);
+    }
 
-    var textLine;
+    return buffer.toString();
+  }
+
+  String highlight({color}) {
+    if (color == true) color = colors.RED;
+    if (color == false) color = null;
+
+    var column = start.column;
+    var buffer = new StringBuffer();
+    String textLine;
     if (this is SourceSpanWithContext) {
       var context = (this as SourceSpanWithContext).context;
       var lineStart = findLineStart(context, text, column);
@@ -72,7 +78,9 @@
       }
       var endIndex = context.indexOf('\n');
       textLine = endIndex == -1 ? context : context.substring(0, endIndex + 1);
-      column = math.min(column, textLine.length - 1);
+      column = math.min(column, textLine.length);
+    } else if (length == 0) {
+      return "";
     } else {
       textLine = text.split("\n").first;
       column = 0;
@@ -90,7 +98,15 @@
       buffer.write(textLine);
     }
     if (!textLine.endsWith('\n')) buffer.write('\n');
-    buffer.write(' ' * column);
+
+    for (var i = 0; i < column; i++) {
+      if (textLine.codeUnitAt(i) == $tab) {
+        buffer.writeCharCode($tab);
+      } else {
+        buffer.writeCharCode($space);
+      }
+    }
+
     if (color != null) buffer.write(color);
     buffer.write('^' * math.max(toColumn - column, 1));
     if (color != null) buffer.write(colors.NONE);
diff --git a/packages/source_span/lib/src/span_with_context.dart b/packages/source_span/lib/src/span_with_context.dart
index 0012e3f..a02d780 100644
--- a/packages/source_span/lib/src/span_with_context.dart
+++ b/packages/source_span/lib/src/span_with_context.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.span_with_context;
-
 import 'location.dart';
 import 'span.dart';
 import 'utils.dart';
 
 /// A class that describes a segment of source text with additional context.
 class SourceSpanWithContext extends SourceSpanBase {
+  // This is a getter so that subclasses can override it.
   /// Text around the span, which includes the line containing this span.
-  final String context;
+  String get context => _context;
+  final String _context;
 
   /// Creates a new span from [start] to [end] (exclusive) containing [text], in
   /// the given [context].
@@ -22,7 +22,7 @@
   /// [text] should start at `start.column` from the beginning of a line in
   /// [context].
   SourceSpanWithContext(
-      SourceLocation start, SourceLocation end, String text, this.context)
+          SourceLocation start, SourceLocation end, String text, this._context)
       : super(start, end, text) {
     if (!context.contains(text)) {
       throw new ArgumentError(
diff --git a/packages/source_span/lib/src/utils.dart b/packages/source_span/lib/src/utils.dart
index fa08957..6938547 100644
--- a/packages/source_span/lib/src/utils.dart
+++ b/packages/source_span/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library source_span.utils;
-
 /// Returns the minimum of [obj1] and [obj2] according to
 /// [Comparable.compareTo].
 Comparable min(Comparable obj1, Comparable obj2) =>
diff --git a/packages/source_span/pubspec.yaml b/packages/source_span/pubspec.yaml
index 4c703cd..46e3d52 100644
--- a/packages/source_span/pubspec.yaml
+++ b/packages/source_span/pubspec.yaml
@@ -1,11 +1,12 @@
 name: source_span
-version: 1.2.1
+version: 1.4.0
 author: Dart Team <misc@dartlang.org>
 description: A library for identifying source spans and locations.
 homepage: https://github.com/dart-lang/source_span
 dependencies:
+  charcode: '^1.0.0'
   path: '>=1.2.0 <2.0.0'
 environment:
-  sdk: '>=0.8.10+6 <2.0.0'
+  sdk: '>=1.8.0 <2.0.0'
 dev_dependencies:
   test: '>=0.12.0 <0.13.0'
diff --git a/packages/source_span/test/file_message_test.dart b/packages/source_span/test/file_message_test.dart
deleted file mode 100644
index 5935c58..0000000
--- a/packages/source_span/test/file_message_test.dart
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:test/test.dart';
-import 'package:source_span/source_span.dart';
-import 'package:source_span/src/colors.dart' as colors;
-
-main() {
-  var file;
-  setUp(() {
-    file = new SourceFile("""
-foo bar baz
-whiz bang boom
-zip zap zop
-""", url: "foo.dart");
-  });
-
-  test("points to the span in the source", () {
-    expect(file.span(4, 7).message("oh no"), equals("""
-line 1, column 5 of foo.dart: oh no
-foo bar baz
-    ^^^"""));
-  });
-
-  test("gracefully handles a missing source URL", () {
-    var span = new SourceFile("foo bar baz").span(4, 7);
-    expect(span.message("oh no"), equals("""
-line 1, column 5: oh no
-foo bar baz
-    ^^^"""));
-  });
-
-  test("highlights the first line of a multiline span", () {
-    expect(file.span(4, 20).message("oh no"), equals("""
-line 1, column 5 of foo.dart: oh no
-foo bar baz
-    ^^^^^^^^"""));
-  });
-
-  test("works for a point span", () {
-    expect(file.location(4).pointSpan().message("oh no"), equals("""
-line 1, column 5 of foo.dart: oh no
-foo bar baz
-    ^"""));
-  });
-
-  test("works for a point span at the end of a line", () {
-    expect(file.location(11).pointSpan().message("oh no"), equals("""
-line 1, column 12 of foo.dart: oh no
-foo bar baz
-           ^"""));
-  });
-
-  test("works for a point span at the end of the file", () {
-    expect(file.location(38).pointSpan().message("oh no"), equals("""
-line 3, column 12 of foo.dart: oh no
-zip zap zop
-           ^"""));
-  });
-
-  test("works for a point span in an empty file", () {
-    expect(new SourceFile("").location(0).pointSpan().message("oh no"),
-        equals("""
-line 1, column 1: oh no
-
-^"""));
-  });
-
-  test("works for a single-line file without a newline", () {
-    expect(new SourceFile("foo bar").span(0, 7).message("oh no"),
-        equals("""
-line 1, column 1: oh no
-foo bar
-^^^^^^^"""));
-  });
-
-  group("colors", () {
-    test("doesn't colorize if color is false", () {
-      expect(file.span(4, 7).message("oh no", color: false), equals("""
-line 1, column 5 of foo.dart: oh no
-foo bar baz
-    ^^^"""));
-    });
-
-    test("colorizes if color is true", () {
-      expect(file.span(4, 7).message("oh no", color: true), equals("""
-line 1, column 5 of foo.dart: oh no
-foo ${colors.RED}bar${colors.NONE} baz
-    ${colors.RED}^^^${colors.NONE}"""));
-    });
-
-    test("uses the given color if it's passed", () {
-      expect(file.span(4, 7).message("oh no", color: colors.YELLOW), equals("""
-line 1, column 5 of foo.dart: oh no
-foo ${colors.YELLOW}bar${colors.NONE} baz
-    ${colors.YELLOW}^^^${colors.NONE}"""));
-    });
-  });
-}
diff --git a/packages/source_span/test/highlight_test.dart b/packages/source_span/test/highlight_test.dart
new file mode 100644
index 0000000..74faed5
--- /dev/null
+++ b/packages/source_span/test/highlight_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_span/src/colors.dart' as colors;
+
+main() {
+  var file;
+  setUp(() {
+    file = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop
+""");
+  });
+
+  test("points to the span in the source", () {
+    expect(file.span(4, 7).highlight(), equals("""
+foo bar baz
+    ^^^"""));
+  });
+
+  test("gracefully handles a missing source URL", () {
+    var span = new SourceFile("foo bar baz").span(4, 7);
+    expect(span.highlight(), equals("""
+foo bar baz
+    ^^^"""));
+  });
+
+  test("highlights the first line of a multiline span", () {
+    expect(file.span(4, 20).highlight(), equals("""
+foo bar baz
+    ^^^^^^^^"""));
+  });
+
+  test("works for a point span", () {
+    expect(file.location(4).pointSpan().highlight(), equals("""
+foo bar baz
+    ^"""));
+  });
+
+  test("works for a point span at the end of a line", () {
+    expect(file.location(11).pointSpan().highlight(), equals("""
+foo bar baz
+           ^"""));
+  });
+
+  test("works for a point span at the end of the file", () {
+    expect(file.location(38).pointSpan().highlight(), equals("""
+zip zap zop
+           ^"""));
+  });
+
+  test("works for a point span at the end of the file with no trailing newline",
+      () {
+    file = new SourceFile("zip zap zop");
+    expect(file.location(11).pointSpan().highlight(), equals("""
+zip zap zop
+           ^"""));
+  });
+
+  test("works for a point span in an empty file", () {
+    expect(new SourceFile("").location(0).pointSpan().highlight(),
+        equals("""
+
+^"""));
+  });
+
+  test("works for a single-line file without a newline", () {
+    expect(new SourceFile("foo bar").span(0, 7).highlight(),
+        equals("""
+foo bar
+^^^^^^^"""));
+  });
+
+  test("emits tabs for tabs", () {
+    expect(new SourceFile(" \t \t\tfoo bar").span(5, 8).highlight(),
+        equals("""
+ \t \t\tfoo bar
+ \t \t\t^^^"""));
+  });
+
+  test("supports lines of preceding context", () {
+    var span = new SourceSpanWithContext(
+        new SourceLocation(5, line: 3, column: 5, sourceUrl: "foo.dart"),
+        new SourceLocation(12, line: 3, column: 12, sourceUrl: "foo.dart"),
+        "foo bar",
+        "previous\nlines\n-----foo bar-----\nfollowing line\n");
+
+    expect(span.highlight(color: colors.YELLOW), equals("""
+previous
+lines
+-----${colors.YELLOW}foo bar${colors.NONE}-----
+     ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
+  });
+
+  group("colors", () {
+    test("doesn't colorize if color is false", () {
+      expect(file.span(4, 7).highlight(color: false), equals("""
+foo bar baz
+    ^^^"""));
+    });
+
+    test("colorizes if color is true", () {
+      expect(file.span(4, 7).highlight(color: true), equals("""
+foo ${colors.RED}bar${colors.NONE} baz
+    ${colors.RED}^^^${colors.NONE}"""));
+    });
+
+    test("uses the given color if it's passed", () {
+      expect(file.span(4, 7).highlight(color: colors.YELLOW), equals("""
+foo ${colors.YELLOW}bar${colors.NONE} baz
+    ${colors.YELLOW}^^^${colors.NONE}"""));
+    });
+  });
+}
diff --git a/packages/source_span/test/span_test.dart b/packages/source_span/test/span_test.dart
index 113848a..f980f30 100644
--- a/packages/source_span/test/span_test.dart
+++ b/packages/source_span/test/span_test.dart
@@ -234,51 +234,19 @@
 ${colors.YELLOW}foo bar${colors.NONE}
 ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
     });
-  });
 
-  group("message() with context", () {
-    var spanWithContext;
-    setUp(() {
-      spanWithContext = new SourceSpanWithContext(
+    test("with context, underlines the right column", () {
+      var spanWithContext = new SourceSpanWithContext(
           new SourceLocation(5, sourceUrl: "foo.dart"),
           new SourceLocation(12, sourceUrl: "foo.dart"),
           "foo bar",
           "-----foo bar-----");
-    });
 
-    test("underlines under the right column", () {
       expect(spanWithContext.message("oh no", color: colors.YELLOW), equals("""
 line 1, column 6 of foo.dart: oh no
 -----${colors.YELLOW}foo bar${colors.NONE}-----
      ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
     });
-
-    test("underlines correctly when text appears twice", () {
-      var span = new SourceSpanWithContext(
-          new SourceLocation(9, column: 9, sourceUrl: "foo.dart"),
-          new SourceLocation(12, column: 12, sourceUrl: "foo.dart"),
-          "foo",
-          "-----foo foo-----");
-      expect(span.message("oh no", color: colors.YELLOW), equals("""
-line 1, column 10 of foo.dart: oh no
------foo ${colors.YELLOW}foo${colors.NONE}-----
-         ${colors.YELLOW}^^^${colors.NONE}"""));
-  });
-
-    test("supports lines of preceeding context", () {
-      var span = new SourceSpanWithContext(
-          new SourceLocation(5, line: 3, column: 5, sourceUrl: "foo.dart"),
-          new SourceLocation(12, line: 3, column: 12, sourceUrl: "foo.dart"),
-          "foo bar",
-          "previous\nlines\n-----foo bar-----\nfollowing line\n");
-
-      expect(span.message("oh no", color: colors.YELLOW), equals("""
-line 4, column 6 of foo.dart: oh no
-previous
-lines
------${colors.YELLOW}foo bar${colors.NONE}-----
-     ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
-    });
   });
 
   group("compareTo()", () {
diff --git a/packages/source_span/test/utils_test.dart b/packages/source_span/test/utils_test.dart
index 5d973f5..2a86cc0 100644
--- a/packages/source_span/test/utils_test.dart
+++ b/packages/source_span/test/utils_test.dart
@@ -45,11 +45,3 @@
     });
   });
 }
-
-_linearSearch(list, predicate) {
-  if (list.length == 0) return -1;
-  for (int i = 0; i < list.length; i++) {
-    if (predicate(list[i])) return i;
-  }
-  return list.length;
-}
diff --git a/packages/stack_trace/.travis.yml b/packages/stack_trace/.travis.yml
new file mode 100644
index 0000000..fff8494
--- /dev/null
+++ b/packages/stack_trace/.travis.yml
@@ -0,0 +1,22 @@
+language: dart
+sudo: false
+dart:
+  - dev
+  - stable
+  - 1.22.1
+  - 1.21.1
+dart_task:
+  - test: -p vm
+  - test: -p firefox
+  - test: -p dartium
+    install_dartium: true
+  - dartanalyzer
+matrix:
+  include:
+    # Only validate formatting using the dev release
+    # Formatted with 1.23.0+ which has (good) changes since 1.22.1
+    - dart: dev
+      dart_task: dartfmt
+cache:
+  directories:
+    - $HOME/.pub-cache
diff --git a/packages/stack_trace/CHANGELOG.md b/packages/stack_trace/CHANGELOG.md
index 624a934..cd78a9a 100644
--- a/packages/stack_trace/CHANGELOG.md
+++ b/packages/stack_trace/CHANGELOG.md
@@ -1,3 +1,90 @@
+## 1.8.0
+
+* Add a `Trace.original` field to provide access to the original `StackTrace`s
+  from which the `Trace` was created, and a matching constructor parameter to
+  `new Trace()`.
+
+## 1.7.4
+
+* Always run `onError` callbacks for `Chain.capture()` in the parent zone.
+
+## 1.7.3
+
+* Fix broken links in the README.
+
+## 1.7.2
+
+* `Trace.foldFrames()` and `Chain.foldFrames()` now remove the outermost folded
+  frame. This matches the behavior of `.terse` with core frames.
+
+* Fix bug parsing a friendly frame with spaces in the member name.
+
+* Fix bug parsing a friendly frame where the location is a data url.
+
+## 1.7.1
+
+* Make `Trace.parse()`, `Chain.parse()`, treat the VM's new causal asynchronous
+  stack traces as chains. Outside of a `Chain.capture()` block, `new
+  Chain.current()` will return a stack chain constructed from the asynchronous
+  stack traces.
+
+## 1.7.0
+
+* Add a `Chain.disable()` function that disables stack-chain tracking.
+
+* Fix a bug where `Chain.capture(..., when: false)` would throw if an error was
+  emitted without a stack trace.
+
+## 1.6.8
+
+* Add a note to the documentation of `Chain.terse` and `Trace.terse`.
+
+## 1.6.7
+
+* Fix a bug where `new Frame.caller()` returned the wrong depth of frame on
+  Dartium.
+
+## 1.6.6
+
+* `new Trace.current()` and `new Chain.current()` now skip an extra frame when
+  run in a JS context. This makes their return values match the VM context.
+
+## 1.6.5
+
+* Really fix strong mode warnings.
+
+## 1.6.4
+
+* Fix a syntax error introduced in 1.6.3.
+
+## 1.6.3
+
+* Make `Chain.capture()` generic. Its signature is now `T Chain.capture<T>(T
+  callback(), ...)`.
+
+## 1.6.2
+
+* Fix all strong mode warnings.
+
+## 1.6.1
+
+* Use `StackTrace.current` in Dart SDK 1.14 to get the current stack trace.
+
+## 1.6.0
+
+* Add a `when` parameter to `Chain.capture()`. This allows capturing to be
+  easily enabled and disabled based on whether the application is running in
+  debug/development mode or not.
+
+* Deprecate the `ChainHandler` typedef. This didn't provide any value over
+  directly annotating the function argument, and it made the documentation less
+  clear.
+
+## 1.5.1
+
+* Fix a crash in `Chain.foldFrames()` and `Chain.terse` when one of the chain's
+  traces has no frames.
+
 ## 1.5.0
 
 * `new Chain.parse()` now parses all the stack trace formats supported by `new
diff --git a/packages/stack_trace/README.md b/packages/stack_trace/README.md
index fe85adb..3f08374 100644
--- a/packages/stack_trace/README.md
+++ b/packages/stack_trace/README.md
@@ -7,7 +7,7 @@
 using `Trace.current`. Native [StackTrace]s can also be directly converted to
 human-readable strings using `Trace.format`.
 
-[StackTrace]: http://api.dartlang.org/docs/releases/latest/dart_core/StackTrace.html
+[StackTrace]: https://api.dartlang.org/stable/dart-core/StackTrace-class.html
 
 Here's an example native stack trace from debugging this library:
 
@@ -28,20 +28,20 @@
 
 and its human-readable representation:
 
-    dart:core-patch                             Object.noSuchMethod
+    dart:core-patch 1884:25                     Object.noSuchMethod
     pkg/stack_trace/lib/src/trace.dart 47:21    Trace.terse.<fn>
-    dart:collection                             IterableMixinWorkaround.reduce
-    dart:core-patch                             List.reduce
+    dart:collection 29:29                       IterableMixinWorkaround.reduce
+    dart:core-patch 1247:42                     List.reduce
     pkg/stack_trace/lib/src/trace.dart 40:35    Trace.terse
     pkg/stack_trace/lib/stack_trace.dart 24:28  format
     test.dart 21:29                             main.<fn>
-    dart:async                                  _CatchErrorFuture._sendError
-    dart:async                                  _FutureImpl._setErrorWithoutAsyncTrace
-    dart:async                                  _FutureImpl._setError
-    dart:async                                  _ThenFuture._sendValue
-    dart:async                                  _FutureImpl._handleValue.<fn>
-    dart:async                                  Timer.run.<fn>
-    dart:async-patch                            Timer.Timer.<fn>
+    dart:async 525:24                           _CatchErrorFuture._sendError
+    dart:async 393:26                           _FutureImpl._setErrorWithoutAsyncTrace
+    dart:async 378:31                           _FutureImpl._setError
+    dart:async 490:16                           _ThenFuture._sendValue
+    dart:async 349:28                           _FutureImpl._handleValue.<fn>
+    dart:async 2402:21                          Timer.run.<fn>
+    dart:async-patch 15:15                      Timer.Timer.<fn>
 
 You can further clean up the stack trace using `Trace.terse`. This folds
 together multiple stack frames from the Dart core libraries, so that only the
@@ -202,4 +202,4 @@
 
 That's a lot easier to understand!
 
-[Zone]: https://api.dartlang.org/apidocs/channels/stable/#dart-async.Zone
+[Zone]: https://api.dartlang.org/stable/dart-async/Zone-class.html
diff --git a/packages/stack_trace/analysis_options.yaml b/packages/stack_trace/analysis_options.yaml
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/stack_trace/analysis_options.yaml
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/stack_trace/lib/src/chain.dart b/packages/stack_trace/lib/src/chain.dart
index 2e07d4b..2d1349d 100644
--- a/packages/stack_trace/lib/src/chain.dart
+++ b/packages/stack_trace/lib/src/chain.dart
@@ -2,20 +2,22 @@
 // for 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 stack_trace.chain;
-
 import 'dart:async';
-import 'dart:collection';
 import 'dart:math' as math;
 
 import 'frame.dart';
+import 'lazy_chain.dart';
 import 'stack_zone_specification.dart';
 import 'trace.dart';
 import 'utils.dart';
 
 /// A function that handles errors in the zone wrapped by [Chain.capture].
+@Deprecated("Will be removed in stack_trace 2.0.0.")
 typedef void ChainHandler(error, Chain chain);
 
+/// An opaque key used to track the current [StackZoneSpecification].
+final _specKey = new Object();
+
 /// A chain of stack traces.
 ///
 /// A stack chain is a collection of one or more stack traces that collectively
@@ -37,7 +39,6 @@
 ///             "$stackChain");
 ///     });
 class Chain implements StackTrace {
-
   /// The stack traces that make up this chain.
   ///
   /// Like the frames in a stack trace, the traces are ordered from most local
@@ -46,11 +47,16 @@
   final List<Trace> traces;
 
   /// The [StackZoneSpecification] for the current zone.
-  static StackZoneSpecification get _currentSpec =>
-    Zone.current[#stack_trace.stack_zone.spec];
+  static StackZoneSpecification get _currentSpec => Zone.current[_specKey];
 
-  /// Runs [callback] in a [Zone] in which the current stack chain is tracked
-  /// and automatically associated with (most) errors.
+  /// If [when] is `true`, runs [callback] in a [Zone] in which the current
+  /// stack chain is tracked and automatically associated with (most) errors.
+  ///
+  /// If [when] is `false`, this does not track stack chains. Instead, it's
+  /// identical to [runZoned], except that it wraps any errors in [new
+  /// Chain.forTrace]—which will only wrap the trace unless there's a different
+  /// [Chain.capture] active. This makes it easy for the caller to only capture
+  /// stack chains in debug mode or during development.
   ///
   /// If [onError] is passed, any error in the zone that would otherwise go
   /// unhandled is passed to it, along with the [Chain] associated with that
@@ -64,7 +70,23 @@
   /// considered unhandled.
   ///
   /// If [callback] returns a value, it will be returned by [capture] as well.
-  static capture(callback(), {ChainHandler onError}) {
+  static T capture<T>(T callback(),
+      {void onError(error, Chain chain), bool when: true}) {
+    if (!when) {
+      var newOnError;
+      if (onError != null) {
+        newOnError = (error, stackTrace) {
+          onError(
+              error,
+              stackTrace == null
+                  ? new Chain.current()
+                  : new Chain.forTrace(stackTrace));
+        };
+      }
+
+      return runZoned(callback, onError: newOnError);
+    }
+
     var spec = new StackZoneSpecification(onError);
     return runZoned(() {
       try {
@@ -73,9 +95,20 @@
         // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
         return Zone.current.handleUncaughtError(error, stackTrace);
       }
-    }, zoneSpecification: spec.toSpec(), zoneValues: {
-      #stack_trace.stack_zone.spec: spec
-    });
+    },
+        zoneSpecification: spec.toSpec(),
+        zoneValues: {_specKey: spec, StackZoneSpecification.disableKey: false});
+  }
+
+  /// If [when] is `true` and this is called within a [Chain.capture] zone, runs
+  /// [callback] in a [Zone] in which chain capturing is disabled.
+  ///
+  /// If [callback] returns a value, it will be returned by [disable] as well.
+  static/*=T*/ disable/*<T>*/(/*=T*/ callback(), {bool when: true}) {
+    var zoneValues =
+        when ? {_specKey: null, StackZoneSpecification.disableKey: true} : null;
+
+    return runZoned(callback, zoneValues: zoneValues);
   }
 
   /// Returns [futureOrStream] unmodified.
@@ -94,9 +127,18 @@
   ///
   /// If this is called outside of a [capture] zone, it just returns a
   /// single-trace chain.
-  factory Chain.current([int level=0]) {
+  factory Chain.current([int level = 0]) {
     if (_currentSpec != null) return _currentSpec.currentChain(level + 1);
-    return new Chain([new Trace.current(level + 1)]);
+
+    var chain = new Chain.forTrace(StackTrace.current);
+    return new LazyChain(() {
+      // JS includes a frame for the call to StackTrace.current, but the VM
+      // doesn't, so we skip an extra frame in a JS context.
+      var first = new Trace(
+          chain.traces.first.frames.skip(level + (inJS ? 2 : 1)),
+          original: chain.traces.first.original.toString());
+      return new Chain([first]..addAll(chain.traces.skip(1)));
+    });
   }
 
   /// Returns the stack chain associated with [trace].
@@ -109,8 +151,8 @@
   /// If [trace] is already a [Chain], it will be returned as-is.
   factory Chain.forTrace(StackTrace trace) {
     if (trace is Chain) return trace;
-    if (_currentSpec == null) return new Chain([new Trace.from(trace)]);
-    return _currentSpec.chainFor(trace);
+    if (_currentSpec != null) return _currentSpec.chainFor(trace);
+    return new LazyChain(() => new Chain.parse(trace.toString()));
   }
 
   /// Parses a string representation of a stack chain.
@@ -120,6 +162,10 @@
   /// and returned as a single-trace chain.
   factory Chain.parse(String chain) {
     if (chain.isEmpty) return new Chain([]);
+    if (chain.contains(vmChainGap)) {
+      return new Chain(
+          chain.split(vmChainGap).map((trace) => new Trace.parseVM(trace)));
+    }
     if (!chain.contains(chainGap)) return new Chain([new Trace.parse(chain)]);
 
     return new Chain(
@@ -127,13 +173,19 @@
   }
 
   /// Returns a new [Chain] comprised of [traces].
-  Chain(Iterable<Trace> traces)
-      : traces = new UnmodifiableListView<Trace>(traces.toList());
+  Chain(Iterable<Trace> traces) : traces = new List<Trace>.unmodifiable(traces);
 
   /// Returns a terser version of [this].
   ///
   /// This calls [Trace.terse] on every trace in [traces], and discards any
   /// trace that contain only internal frames.
+  ///
+  /// This won't do anything with a raw JavaScript trace, since there's no way
+  /// to determine which frames come from which Dart libraries. However, the
+  /// [`source_map_stack_trace`][source_map_stack_trace] package can be used to
+  /// convert JavaScript traces into Dart-style traces.
+  ///
+  /// [source_map_stack_trace]: https://pub.dartlang.org/packages/source_map_stack_trace
   Chain get terse => foldFrames((_) => false, terse: true);
 
   /// Returns a new [Chain] based on [this] where multiple stack frames matching
@@ -150,11 +202,12 @@
   /// library or from this package, and simplify core library frames as in
   /// [Trace.terse].
   Chain foldFrames(bool predicate(Frame frame), {bool terse: false}) {
-    var foldedTraces = traces.map(
-        (trace) => trace.foldFrames(predicate, terse: terse));
+    var foldedTraces =
+        traces.map((trace) => trace.foldFrames(predicate, terse: terse));
     var nonEmptyTraces = foldedTraces.where((trace) {
       // Ignore traces that contain only folded frames.
       if (trace.frames.length > 1) return true;
+      if (trace.frames.isEmpty) return false;
 
       // In terse mode, the trace may have removed an outer folded frame,
       // leaving a single non-folded frame. We can detect a folded frame because
@@ -176,12 +229,13 @@
   ///
   /// The trace version of a chain is just the concatenation of all the traces
   /// in the chain.
-  Trace toTrace() => new Trace(flatten(traces.map((trace) => trace.frames)));
+  Trace toTrace() => new Trace(traces.expand((trace) => trace.frames));
 
   String toString() {
     // Figure out the longest path so we know how much to pad.
     var longest = traces.map((trace) {
-      return trace.frames.map((frame) => frame.location.length)
+      return trace.frames
+          .map((frame) => frame.location.length)
           .fold(0, math.max);
     }).fold(0, math.max);
 
@@ -189,7 +243,7 @@
     // padding is consistent across all traces.
     return traces.map((trace) {
       return trace.frames.map((frame) {
-        return '${padRight(frame.location, longest)}  ${frame.member}\n';
+        return '${frame.location.padRight(longest)}  ${frame.member}\n';
       }).join();
     }).join(chainGap);
   }
diff --git a/packages/stack_trace/lib/src/frame.dart b/packages/stack_trace/lib/src/frame.dart
index 4077c7c..bbe5c79 100644
--- a/packages/stack_trace/lib/src/frame.dart
+++ b/packages/stack_trace/lib/src/frame.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library frame;
-
 import 'package:path/path.dart' as path;
 
 import 'trace.dart';
@@ -19,8 +17,8 @@
 //     at VW.call$0 (eval as fn
 //         (http://pub.dartlang.org/stuff.dart.js:560:28), efn:3:28)
 //     at http://pub.dartlang.org/stuff.dart.js:560:28
-final _v8Frame = new RegExp(
-    r'^\s*at (?:(\S.*?)(?: \[as [^\]]+\])? \((.*)\)|(.*))$');
+final _v8Frame =
+    new RegExp(r'^\s*at (?:(\S.*?)(?: \[as [^\]]+\])? \((.*)\)|(.*))$');
 
 // http://pub.dartlang.org/stuff.dart.js:560:28
 final _v8UrlLocation = new RegExp(r'^(.*):(\d+):(\d+)|native$');
@@ -29,34 +27,34 @@
 // eval as function (http://pub.dartlang.org/stuff.dart.js:560:28)
 // eval as function (eval as otherFunction
 //     (http://pub.dartlang.org/stuff.dart.js:560:28))
-final _v8EvalLocation = new RegExp(
-    r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$');
+final _v8EvalLocation =
+    new RegExp(r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$');
 
 // .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560
 // .VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560
 // .VW.call$0/name<@http://pub.dartlang.org/stuff.dart.js:560
 // .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560:36
 // http://pub.dartlang.org/stuff.dart.js:560
-final _firefoxSafariFrame = new RegExp(
-    r'^'
+final _firefoxSafariFrame = new RegExp(r'^'
     r'(?:' // Member description. Not present in some Safari frames.
-      r'([^@(/]*)' // The actual name of the member.
-      r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox.
-      r'((?:/[^/]*)*)' // Extra characters indicating a nested closure.
-      r'(?:\(.*\))?' // Arguments to the closure.
-      r'@'
+    r'([^@(/]*)' // The actual name of the member.
+    r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox.
+    r'((?:/[^/]*)*)' // Extra characters indicating a nested closure.
+    r'(?:\(.*\))?' // Arguments to the closure.
+    r'@'
     r')?'
     r'(.*?)' // The frame's URL.
     r':'
     r'(\d*)' // The line number. Empty in Safari if it's unknown.
     r'(?::(\d*))?' // The column number. Not present in older browsers and
-                   // empty in Safari if it's unknown.
+    // empty in Safari if it's unknown.
     r'$');
 
-// foo/bar.dart 10:11 in Foo._bar
-// http://dartlang.org/foo/bar.dart in Foo._bar
-final _friendlyFrame = new RegExp(
-    r'^(\S+)(?: (\d+)(?::(\d+))?)?\s+([^\d]\S*)$');
+// foo/bar.dart 10:11 Foo._bar
+// foo/bar.dart 10:11 (anonymous function).dart.fn
+// http://dartlang.org/foo/bar.dart Foo._bar
+// data:... 10:11 Foo._bar
+final _friendlyFrame = new RegExp(r'^(\S+)(?: (\d+)(?::(\d+))?)?\s+([^\d].*)$');
 
 /// A regular expression that matches asynchronous member names generated by the
 /// VM.
@@ -120,7 +118,7 @@
   /// By default, this will return the frame above the current method. If
   /// [level] is `0`, it will return the current method's frame; if [level] is
   /// higher than `1`, it will return higher frames.
-  factory Frame.caller([int level=1]) {
+  factory Frame.caller([int level = 1]) {
     if (level < 0) {
       throw new ArgumentError("Argument [level] must be greater than or equal "
           "to 0.");
@@ -131,70 +129,72 @@
 
   /// Parses a string representation of a Dart VM stack frame.
   factory Frame.parseVM(String frame) => _catchFormatException(frame, () {
-    // The VM sometimes folds multiple stack frames together and replaces them
-    // with "...".
-    if (frame == '...') {
-      return new Frame(new Uri(), null, null, '...');
-    }
+        // The VM sometimes folds multiple stack frames together and replaces them
+        // with "...".
+        if (frame == '...') {
+          return new Frame(new Uri(), null, null, '...');
+        }
 
-    var match = _vmFrame.firstMatch(frame);
-    if (match == null) return new UnparsedFrame(frame);
+        var match = _vmFrame.firstMatch(frame);
+        if (match == null) return new UnparsedFrame(frame);
 
-    // Get the pieces out of the regexp match. Function, URI and line should
-    // always be found. The column is optional.
-    var member = match[1]
-        .replaceAll(_asyncBody, "<async>")
-        .replaceAll("<anonymous closure>", "<fn>");
-    var uri = Uri.parse(match[2]);
+        // Get the pieces out of the regexp match. Function, URI and line should
+        // always be found. The column is optional.
+        var member = match[1]
+            .replaceAll(_asyncBody, "<async>")
+            .replaceAll("<anonymous closure>", "<fn>");
+        var uri = Uri.parse(match[2]);
 
-    var lineAndColumn = match[3].split(':');
-    var line = lineAndColumn.length > 1 ? int.parse(lineAndColumn[1]) : null;
-    var column = lineAndColumn.length > 2 ? int.parse(lineAndColumn[2]) : null;
-    return new Frame(uri, line, column, member);
-  });
+        var lineAndColumn = match[3].split(':');
+        var line =
+            lineAndColumn.length > 1 ? int.parse(lineAndColumn[1]) : null;
+        var column =
+            lineAndColumn.length > 2 ? int.parse(lineAndColumn[2]) : null;
+        return new Frame(uri, line, column, member);
+      });
 
   /// Parses a string representation of a Chrome/V8 stack frame.
   factory Frame.parseV8(String frame) => _catchFormatException(frame, () {
-    var match = _v8Frame.firstMatch(frame);
-    if (match == null) return new UnparsedFrame(frame);
+        var match = _v8Frame.firstMatch(frame);
+        if (match == null) return new UnparsedFrame(frame);
 
-    // v8 location strings can be arbitrarily-nested, since it adds a layer of
-    // nesting for each eval performed on that line.
-    parseLocation(location, member) {
-      var evalMatch = _v8EvalLocation.firstMatch(location);
-      while (evalMatch != null) {
-        location = evalMatch[1];
-        evalMatch = _v8EvalLocation.firstMatch(location);
-      }
+        // v8 location strings can be arbitrarily-nested, since it adds a layer of
+        // nesting for each eval performed on that line.
+        parseLocation(location, member) {
+          var evalMatch = _v8EvalLocation.firstMatch(location);
+          while (evalMatch != null) {
+            location = evalMatch[1];
+            evalMatch = _v8EvalLocation.firstMatch(location);
+          }
 
-      if (location == 'native') {
-        return new Frame(Uri.parse('native'), null, null, member);
-      }
+          if (location == 'native') {
+            return new Frame(Uri.parse('native'), null, null, member);
+          }
 
-      var urlMatch = _v8UrlLocation.firstMatch(location);
-      if (urlMatch == null) return new UnparsedFrame(frame);
+          var urlMatch = _v8UrlLocation.firstMatch(location);
+          if (urlMatch == null) return new UnparsedFrame(frame);
 
-      return new Frame(
-          _uriOrPathToUri(urlMatch[1]),
-          int.parse(urlMatch[2]),
-          int.parse(urlMatch[3]),
-          member);
-    }
+          return new Frame(_uriOrPathToUri(urlMatch[1]), int.parse(urlMatch[2]),
+              int.parse(urlMatch[3]), member);
+        }
 
-    // V8 stack frames can be in two forms.
-    if (match[2] != null) {
-      // The first form looks like " at FUNCTION (LOCATION)". V8 proper lists
-      // anonymous functions within eval as "<anonymous>", while IE10 lists them
-      // as "Anonymous function".
-      return parseLocation(match[2],
-          match[1].replaceAll("<anonymous>", "<fn>")
-                  .replaceAll("Anonymous function", "<fn>"));
-    } else {
-      // The second form looks like " at LOCATION", and is used for anonymous
-      // functions.
-      return parseLocation(match[3], "<fn>");
-    }
-  });
+        // V8 stack frames can be in two forms.
+        if (match[2] != null) {
+          // The first form looks like " at FUNCTION (LOCATION)". V8 proper lists
+          // anonymous functions within eval as "<anonymous>", while IE10 lists them
+          // as "Anonymous function".
+          return parseLocation(
+              match[2],
+              match[1]
+                  .replaceAll("<anonymous>", "<fn>")
+                  .replaceAll("Anonymous function", "<fn>")
+                  .replaceAll("(anonymous function)", "<fn>"));
+        } else {
+          // The second form looks like " at LOCATION", and is used for anonymous
+          // functions.
+          return parseLocation(match[3], "<fn>");
+        }
+      });
 
   /// Parses a string representation of a JavaScriptCore stack trace.
   factory Frame.parseJSCore(String frame) => new Frame.parseV8(frame);
@@ -207,31 +207,31 @@
 
   /// Parses a string representation of a Firefox stack frame.
   factory Frame.parseFirefox(String frame) => _catchFormatException(frame, () {
-    var match = _firefoxSafariFrame.firstMatch(frame);
-    if (match == null) return new UnparsedFrame(frame);
+        var match = _firefoxSafariFrame.firstMatch(frame);
+        if (match == null) return new UnparsedFrame(frame);
 
-    // Normally this is a URI, but in a jsshell trace it can be a path.
-    var uri = _uriOrPathToUri(match[3]);
+        // Normally this is a URI, but in a jsshell trace it can be a path.
+        var uri = _uriOrPathToUri(match[3]);
 
-    var member;
-    if (match[1] != null) {
-      member = match[1];
-      member +=
-          new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
-      if (member == '') member = '<fn>';
+        var member;
+        if (match[1] != null) {
+          member = match[1];
+          member +=
+              new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
+          if (member == '') member = '<fn>';
 
-      // Some Firefox members have initial dots. We remove them for consistency
-      // with other platforms.
-      member = member.replaceFirst(_initialDot, '');
-    } else {
-      member = '<fn>';
-    }
+          // Some Firefox members have initial dots. We remove them for consistency
+          // with other platforms.
+          member = member.replaceFirst(_initialDot, '');
+        } else {
+          member = '<fn>';
+        }
 
-    var line = match[4] == '' ? null : int.parse(match[4]);
-    var column = match[5] == null || match[5] == '' ?
-        null : int.parse(match[5]);
-    return new Frame(uri, line, column, member);
-  });
+        var line = match[4] == '' ? null : int.parse(match[4]);
+        var column =
+            match[5] == null || match[5] == '' ? null : int.parse(match[5]);
+        return new Frame(uri, line, column, member);
+      });
 
   /// Parses a string representation of a Safari 6.0 stack frame.
   @Deprecated("Use Frame.parseSafari instead.")
@@ -246,23 +246,26 @@
 
   /// Parses this package's string representation of a stack frame.
   factory Frame.parseFriendly(String frame) => _catchFormatException(frame, () {
-    var match = _friendlyFrame.firstMatch(frame);
-    if (match == null) {
-      throw new FormatException(
-          "Couldn't parse package:stack_trace stack trace line '$frame'.");
-    }
+        var match = _friendlyFrame.firstMatch(frame);
+        if (match == null) {
+          throw new FormatException(
+              "Couldn't parse package:stack_trace stack trace line '$frame'.");
+        }
+        // Fake truncated data urls generated by the friendly stack trace format
+        // cause Uri.parse to throw an exception so we have to special case them.
+        var uri = match[1] == 'data:...'
+            ? new Uri.dataFromString('')
+            : Uri.parse(match[1]);
+        // If there's no scheme, this is a relative URI. We should interpret it as
+        // relative to the current working directory.
+        if (uri.scheme == '') {
+          uri = path.toUri(path.absolute(path.fromUri(uri)));
+        }
 
-    var uri = Uri.parse(match[1]);
-    // If there's no scheme, this is a relative URI. We should interpret it as
-    // relative to the current working directory.
-    if (uri.scheme == '') {
-      uri = path.toUri(path.absolute(path.fromUri(uri)));
-    }
-
-    var line = match[2] == null ? null : int.parse(match[2]);
-    var column = match[3] == null ? null : int.parse(match[3]);
-    return new Frame(uri, line, column, match[4]);
-  });
+        var line = match[2] == null ? null : int.parse(match[2]);
+        var column = match[3] == null ? null : int.parse(match[3]);
+        return new Frame(uri, line, column, match[4]);
+      });
 
   /// A regular expression matching an absolute URI.
   static final _uriRegExp = new RegExp(r'^[a-zA-Z][-+.a-zA-Z\d]*://');
diff --git a/packages/stack_trace/lib/src/lazy_chain.dart b/packages/stack_trace/lib/src/lazy_chain.dart
new file mode 100644
index 0000000..55b9897
--- /dev/null
+++ b/packages/stack_trace/lib/src/lazy_chain.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'chain.dart';
+import 'frame.dart';
+import 'lazy_trace.dart';
+import 'trace.dart';
+
+/// A thunk for lazily constructing a [Chain].
+typedef Chain ChainThunk();
+
+/// A wrapper around a [ChainThunk]. This works around issue 9579 by avoiding
+/// the conversion of native [StackTrace]s to strings until it's absolutely
+/// necessary.
+class LazyChain implements Chain {
+  final ChainThunk _thunk;
+  Chain _inner;
+
+  LazyChain(this._thunk);
+
+  Chain get _chain {
+    if (_inner == null) _inner = _thunk();
+    return _inner;
+  }
+
+  List<Trace> get traces => _chain.traces;
+  Chain get terse => _chain.terse;
+  Chain foldFrames(bool predicate(Frame frame), {bool terse: false}) =>
+      new LazyChain(() => _chain.foldFrames(predicate, terse: terse));
+  Trace toTrace() => new LazyTrace(() => _chain.toTrace());
+  String toString() => _chain.toString();
+}
diff --git a/packages/stack_trace/lib/src/lazy_trace.dart b/packages/stack_trace/lib/src/lazy_trace.dart
index 6bfe51c..a31b75f 100644
--- a/packages/stack_trace/lib/src/lazy_trace.dart
+++ b/packages/stack_trace/lib/src/lazy_trace.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library lazy_trace;
-
 import 'frame.dart';
 import 'trace.dart';
 
@@ -25,10 +23,11 @@
   }
 
   List<Frame> get frames => _trace.frames;
+  StackTrace get original => _trace.original;
   StackTrace get vmTrace => _trace.vmTrace;
   Trace get terse => new LazyTrace(() => _trace.terse);
   Trace foldFrames(bool predicate(Frame frame), {bool terse: false}) =>
-    new LazyTrace(() => _trace.foldFrames(predicate, terse: terse));
+      new LazyTrace(() => _trace.foldFrames(predicate, terse: terse));
   String toString() => _trace.toString();
 
   // Work around issue 14075.
diff --git a/packages/stack_trace/lib/src/stack_zone_specification.dart b/packages/stack_trace/lib/src/stack_zone_specification.dart
index 25d9642..eb06beb 100644
--- a/packages/stack_trace/lib/src/stack_zone_specification.dart
+++ b/packages/stack_trace/lib/src/stack_zone_specification.dart
@@ -2,12 +2,15 @@
 // for 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 stack_trace.stack_zone_specification;
-
 import 'dart:async';
 
-import 'trace.dart';
 import 'chain.dart';
+import 'lazy_trace.dart';
+import 'trace.dart';
+import 'utils.dart';
+
+/// A function that handles errors in the zone wrapped by [Chain.capture].
+typedef void _ChainHandler(error, Chain chain);
 
 /// A class encapsulating the zone specification for a [Chain.capture] zone.
 ///
@@ -29,6 +32,15 @@
 /// Since [ZoneSpecification] can't be extended or even implemented, in order to
 /// get a real [ZoneSpecification] instance it's necessary to call [toSpec].
 class StackZoneSpecification {
+  /// An opaque object used as a zone value to disable chain tracking in a given
+  /// zone.
+  ///
+  /// If `Zone.current[disableKey]` is `true`, no stack chains will be tracked.
+  static final disableKey = new Object();
+
+  /// Whether chain-tracking is disabled in the current zone.
+  bool get _disabled => Zone.current[disableKey] == true;
+
   /// The expando that associates stack chains with [StackTrace]s.
   ///
   /// The chains are associated with stack traces rather than errors themselves
@@ -43,7 +55,7 @@
   ///
   /// If this is null, that indicates that any unhandled errors should be passed
   /// to the parent zone.
-  final ChainHandler _onError;
+  final _ChainHandler _onError;
 
   /// The most recent node of the current stack chain.
   _Node _currentNode;
@@ -53,11 +65,11 @@
   /// Converts [this] to a real [ZoneSpecification].
   ZoneSpecification toSpec() {
     return new ZoneSpecification(
-        handleUncaughtError: handleUncaughtError,
-        registerCallback: registerCallback,
-        registerUnaryCallback: registerUnaryCallback,
-        registerBinaryCallback: registerBinaryCallback,
-        errorCallback: errorCallback);
+        handleUncaughtError: _handleUncaughtError,
+        registerCallback: _registerCallback,
+        registerUnaryCallback: _registerUnaryCallback,
+        registerBinaryCallback: _registerBinaryCallback,
+        errorCallback: _errorCallback);
   }
 
   /// Returns the current stack chain.
@@ -65,7 +77,7 @@
   /// By default, the first frame of the first trace will be the line where
   /// [currentChain] is called. If [level] is passed, the first trace will start
   /// that many frames up instead.
-  Chain currentChain([int level=0]) => _createNode(level + 1).toChain();
+  Chain currentChain([int level = 0]) => _createNode(level + 1).toChain();
 
   /// Returns the stack chain associated with [trace], if one exists.
   ///
@@ -78,57 +90,20 @@
     return new _Node(trace, previous).toChain();
   }
 
-  /// Ensures that an error emitted by [future] has the correct stack
-  /// information associated with it.
-  ///
-  /// By default, the first frame of the first trace will be the line where
-  /// [trackFuture] is called. If [level] is passed, the first trace will start
-  /// that many frames up instead.
-  Future trackFuture(Future future, [int level=0]) {
-    var completer = new Completer.sync();
-    var node = _createNode(level + 1);
-    future.then(completer.complete).catchError((e, stackTrace) {
-      if (stackTrace == null) stackTrace = new Trace.current();
-      if (stackTrace is! Chain && _chains[stackTrace] == null) {
-        _chains[stackTrace] = node;
-      }
-      completer.completeError(e, stackTrace);
-    });
-    return completer.future;
-  }
-
-  /// Ensures that any errors emitted by [stream] have the correct stack
-  /// information associated with them.
-  ///
-  /// By default, the first frame of the first trace will be the line where
-  /// [trackStream] is called. If [level] is passed, the first trace will start
-  /// that many frames up instead.
-  Stream trackStream(Stream stream, [int level=0]) {
-    var node = _createNode(level + 1);
-    return stream.transform(new StreamTransformer.fromHandlers(
-        handleError: (error, stackTrace, sink) {
-      if (stackTrace == null) stackTrace = new Trace.current();
-      if (stackTrace is! Chain && _chains[stackTrace] == null) {
-        _chains[stackTrace] = node;
-      }
-      sink.addError(error, stackTrace);
-    }));
-  }
-
   /// Tracks the current stack chain so it can be set to [_currentChain] when
   /// [f] is run.
-  ZoneCallback registerCallback(Zone self, ZoneDelegate parent, Zone zone,
-      Function f) {
-    if (f == null) return parent.registerCallback(zone, null);
+  ZoneCallback _registerCallback(
+      Zone self, ZoneDelegate parent, Zone zone, Function f) {
+    if (f == null || _disabled) return parent.registerCallback(zone, f);
     var node = _createNode(1);
     return parent.registerCallback(zone, () => _run(f, node));
   }
 
   /// Tracks the current stack chain so it can be set to [_currentChain] when
   /// [f] is run.
-  ZoneUnaryCallback registerUnaryCallback(Zone self, ZoneDelegate parent,
-      Zone zone, Function f) {
-    if (f == null) return parent.registerUnaryCallback(zone, null);
+  ZoneUnaryCallback _registerUnaryCallback(
+      Zone self, ZoneDelegate parent, Zone zone, Function f) {
+    if (f == null || _disabled) return parent.registerUnaryCallback(zone, f);
     var node = _createNode(1);
     return parent.registerUnaryCallback(zone, (arg) {
       return _run(() => f(arg), node);
@@ -137,9 +112,10 @@
 
   /// Tracks the current stack chain so it can be set to [_currentChain] when
   /// [f] is run.
-  ZoneBinaryCallback registerBinaryCallback(Zone self, ZoneDelegate parent,
-      Zone zone, Function f) {
-    if (f == null) return parent.registerBinaryCallback(zone, null);
+  ZoneBinaryCallback _registerBinaryCallback(
+      Zone self, ZoneDelegate parent, Zone zone, Function f) {
+    if (f == null || _disabled) return parent.registerBinaryCallback(zone, f);
+
     var node = _createNode(1);
     return parent.registerBinaryCallback(zone, (arg1, arg2) {
       return _run(() => f(arg1, arg2), node);
@@ -148,8 +124,12 @@
 
   /// Looks up the chain associated with [stackTrace] and passes it either to
   /// [_onError] or [parent]'s error handler.
-  handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone, error,
-      StackTrace stackTrace) {
+  _handleUncaughtError(
+      Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
+    if (_disabled) {
+      return parent.handleUncaughtError(zone, error, stackTrace);
+    }
+
     var stackChain = chainFor(stackTrace);
     if (_onError == null) {
       return parent.handleUncaughtError(zone, error, stackChain);
@@ -158,7 +138,7 @@
     // TODO(nweiz): Currently this copies a lot of logic from [runZoned]. Just
     // allow [runBinary] to throw instead once issue 18134 is fixed.
     try {
-      return parent.runBinary(zone, _onError, error, stackChain);
+      return self.parent.runBinary(_onError, error, stackChain);
     } catch (newError, newStackTrace) {
       if (identical(newError, error)) {
         return parent.handleUncaughtError(zone, error, stackChain);
@@ -170,8 +150,10 @@
 
   /// Attaches the current stack chain to [stackTrace], replacing it if
   /// necessary.
-  AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+  AsyncError _errorCallback(Zone self, ZoneDelegate parent, Zone zone,
       Object error, StackTrace stackTrace) {
+    if (_disabled) return parent.errorCallback(zone, error, stackTrace);
+
     // Go up two levels to get through [_CustomZone.errorCallback].
     if (stackTrace == null) {
       stackTrace = _createNode(2).toChain();
@@ -189,8 +171,8 @@
   /// By default, the first frame of the first trace will be the line where
   /// [_createNode] is called. If [level] is passed, the first trace will start
   /// that many frames up instead.
-  _Node _createNode([int level=0]) =>
-    new _Node(new Trace.current(level + 1), _currentNode);
+  _Node _createNode([int level = 0]) =>
+      new _Node(_currentTrace(level + 1), _currentNode);
 
   // TODO(nweiz): use a more robust way of detecting and tracking errors when
   // issue 15105 is fixed.
@@ -221,7 +203,7 @@
   final _Node previous;
 
   _Node(StackTrace trace, [this.previous])
-      : trace = trace == null ? new Trace.current() : new Trace.from(trace);
+      : trace = trace == null ? _currentTrace() : new Trace.from(trace);
 
   /// Converts this to a [Chain].
   Chain toChain() {
@@ -234,3 +216,22 @@
     return new Chain(nodes);
   }
 }
+
+/// Like [new Trace.current], but if the current stack trace has VM chaining
+/// enabled, this only returns the innermost sub-trace.
+Trace _currentTrace([int level]) {
+  level ??= 0;
+  var stackTrace = StackTrace.current;
+  return new LazyTrace(() {
+    // Ignore the VM's stack chains when we generate our own. Otherwise we'll
+    // end up with duplicate frames all over the place.
+    var text = stackTrace.toString();
+    var index = text.indexOf(vmChainGap);
+    if (index != -1) text = text.substring(0, index);
+
+    var trace = new Trace.parse(text);
+    // JS includes a frame for the call to StackTrace.current, but the VM
+    // doesn't, so we skip an extra frame in a JS context.
+    return new Trace(trace.frames.skip(level + (inJS ? 2 : 1)), original: text);
+  });
+}
diff --git a/packages/stack_trace/lib/src/trace.dart b/packages/stack_trace/lib/src/trace.dart
index 7f2c662..972c33e 100644
--- a/packages/stack_trace/lib/src/trace.dart
+++ b/packages/stack_trace/lib/src/trace.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library trace;
-
-import 'dart:collection';
 import 'dart:math' as math;
 
 import 'chain.dart';
@@ -46,22 +43,26 @@
 final _firefoxSafariTrace = new RegExp(
     r"^"
     r"(" // Member description. Not present in some Safari frames.
-      r"([.0-9A-Za-z_$/<]|\(.*\))*" // Member name and arguments.
-      r"@"
+    r"([.0-9A-Za-z_$/<]|\(.*\))*" // Member name and arguments.
+    r"@"
     r")?"
     r"[^\s]*" // Frame URL.
     r":\d*" // Line or column number. Some older frames only have a line number.
-    r"$", multiLine: true);
+    r"$",
+    multiLine: true);
 
 /// A RegExp to match this package's stack traces.
-final _friendlyTrace = new RegExp(r"^[^\s]+( \d+(:\d+)?)?[ \t]+[^\s]+$",
-    multiLine: true);
+final _friendlyTrace =
+    new RegExp(r"^[^\s<][^\s]*( \d+(:\d+)?)?[ \t]+[^\s]+$", multiLine: true);
 
 /// A stack trace, comprised of a list of stack frames.
 class Trace implements StackTrace {
   /// The stack frames that comprise this stack trace.
   final List<Frame> frames;
 
+  /// The original stack trace from which this trace was parsed.
+  final StackTrace original;
+
   /// Returns a human-readable representation of [stackTrace]. If [terse] is
   /// set, this folds together multiple stack frames from the Dart core
   /// libraries, so that only the core library method directly called from user
@@ -77,18 +78,19 @@
   /// By default, the first frame of this trace will be the line where
   /// [Trace.current] is called. If [level] is passed, the trace will start that
   /// many frames up instead.
-  factory Trace.current([int level=0]) {
+  factory Trace.current([int level = 0]) {
     if (level < 0) {
       throw new ArgumentError("Argument [level] must be greater than or equal "
           "to 0.");
     }
 
-    try {
-      throw '';
-    } catch (_, nativeTrace) {
-      var trace = new Trace.from(nativeTrace);
-      return new LazyTrace(() => new Trace(trace.frames.skip(level + 1)));
-    }
+    var trace = new Trace.from(StackTrace.current);
+    return new LazyTrace(() {
+      // JS includes a frame for the call to StackTrace.current, but the VM
+      // doesn't, so we skip an extra frame in a JS context.
+      return new Trace(trace.frames.skip(level + (inJS ? 2 : 1)),
+          original: trace.original.toString());
+    });
   }
 
   /// Returns a new stack trace containing the same data as [trace].
@@ -136,12 +138,14 @@
   }
 
   /// Parses a string representation of a Dart VM stack trace.
-  Trace.parseVM(String trace)
-      : this(_parseVM(trace));
+  Trace.parseVM(String trace) : this(_parseVM(trace), original: trace);
 
   static List<Frame> _parseVM(String trace) {
-    var lines = trace.trim().split("\n");
-    var frames = lines.take(lines.length - 1)
+    // Ignore [vmChainGap]. This matches the behavior of
+    // `Chain.parse().toTrace()`.
+    var lines = trace.trim().replaceAll(vmChainGap, '').split("\n");
+    var frames = lines
+        .take(lines.length - 1)
         .map((line) => new Frame.parseVM(line))
         .toList();
 
@@ -155,63 +159,80 @@
 
   /// Parses a string representation of a Chrome/V8 stack trace.
   Trace.parseV8(String trace)
-      : this(trace.split("\n").skip(1)
-          // It's possible that an Exception's description contains a line that
-          // looks like a V8 trace line, which will screw this up.
-          // Unfortunately, that's impossible to detect.
-          .skipWhile((line) => !line.startsWith(_v8TraceLine))
-          .map((line) => new Frame.parseV8(line)));
+      : this(
+            trace
+                .split("\n")
+                .skip(1)
+                // It's possible that an Exception's description contains a line that
+                // looks like a V8 trace line, which will screw this up.
+                // Unfortunately, that's impossible to detect.
+                .skipWhile((line) => !line.startsWith(_v8TraceLine))
+                .map((line) => new Frame.parseV8(line)),
+            original: trace);
 
   /// Parses a string representation of a JavaScriptCore stack trace.
   Trace.parseJSCore(String trace)
-      : this(trace.split("\n")
-            .where((line) => line != "\tat ")
-            .map((line) => new Frame.parseV8(line)));
+      : this(
+            trace
+                .split("\n")
+                .where((line) => line != "\tat ")
+                .map((line) => new Frame.parseV8(line)),
+            original: trace);
 
   /// Parses a string representation of an Internet Explorer stack trace.
   ///
   /// IE10+ traces look just like V8 traces. Prior to IE10, stack traces can't
   /// be retrieved.
-  Trace.parseIE(String trace)
-      : this.parseV8(trace);
+  Trace.parseIE(String trace) : this.parseV8(trace);
 
   /// Parses a string representation of a Firefox stack trace.
   Trace.parseFirefox(String trace)
-      : this(trace.trim().split("\n")
-          .where((line) => line.isNotEmpty && line != '[native code]')
-          .map((line) => new Frame.parseFirefox(line)));
+      : this(
+            trace
+                .trim()
+                .split("\n")
+                .where((line) => line.isNotEmpty && line != '[native code]')
+                .map((line) => new Frame.parseFirefox(line)),
+            original: trace);
 
   /// Parses a string representation of a Safari stack trace.
-  Trace.parseSafari(String trace)
-      : this.parseFirefox(trace);
+  Trace.parseSafari(String trace) : this.parseFirefox(trace);
 
   /// Parses a string representation of a Safari 6.1+ stack trace.
   @Deprecated("Use Trace.parseSafari instead.")
-  Trace.parseSafari6_1(String trace)
-      : this.parseSafari(trace);
+  Trace.parseSafari6_1(String trace) : this.parseSafari(trace);
 
   /// Parses a string representation of a Safari 6.0 stack trace.
   @Deprecated("Use Trace.parseSafari instead.")
   Trace.parseSafari6_0(String trace)
-      : this(trace.trim().split("\n")
-          .where((line) => line != '[native code]')
-          .map((line) => new Frame.parseFirefox(line)));
+      : this(
+            trace
+                .trim()
+                .split("\n")
+                .where((line) => line != '[native code]')
+                .map((line) => new Frame.parseFirefox(line)),
+            original: trace);
 
   /// Parses this package's string representation of a stack trace.
   ///
   /// This also parses string representations of [Chain]s. They parse to the
   /// same trace that [Chain.toTrace] would return.
   Trace.parseFriendly(String trace)
-      : this(trace.isEmpty
-            ? []
-            : trace.trim().split("\n")
-                // Filter out asynchronous gaps from [Chain]s.
-                .where((line) => !line.startsWith('====='))
-                .map((line) => new Frame.parseFriendly(line)));
+      : this(
+            trace.isEmpty
+                ? []
+                : trace
+                    .trim()
+                    .split("\n")
+                    // Filter out asynchronous gaps from [Chain]s.
+                    .where((line) => !line.startsWith('====='))
+                    .map((line) => new Frame.parseFriendly(line)),
+            original: trace);
 
   /// Returns a new [Trace] comprised of [frames].
-  Trace(Iterable<Frame> frames)
-      : frames = new UnmodifiableListView<Frame>(frames.toList());
+  Trace(Iterable<Frame> frames, {String original})
+      : frames = new List<Frame>.unmodifiable(frames),
+        original = new StackTrace.fromString(original);
 
   /// Returns a VM-style [StackTrace] object.
   ///
@@ -228,6 +249,13 @@
   /// removed. If the outermost frame of the stack trace is a core library
   /// frame, it's removed entirely.
   ///
+  /// This won't do anything with a raw JavaScript trace, since there's no way
+  /// to determine which frames come from which Dart libraries. However, the
+  /// [`source_map_stack_trace`][source_map_stack_trace] package can be used to
+  /// convert JavaScript traces into Dart-style traces.
+  ///
+  /// [source_map_stack_trace]: https://pub.dartlang.org/packages/source_map_stack_trace
+  ///
   /// For custom folding, see [foldFrames].
   Trace get terse => foldFrames((_) => false, terse: true);
 
@@ -263,13 +291,13 @@
       };
     }
 
-    var newFrames = [];
+    var newFrames = <Frame>[];
     for (var frame in frames.reversed) {
       if (frame is UnparsedFrame || !predicate(frame)) {
         newFrames.add(frame);
       } else if (newFrames.isEmpty || !predicate(newFrames.last)) {
-        newFrames.add(new Frame(
-            frame.uri, frame.line, frame.column, frame.member));
+        newFrames
+            .add(new Frame(frame.uri, frame.line, frame.column, frame.member));
       }
     }
 
@@ -279,22 +307,25 @@
         var library = frame.library.replaceAll(_terseRegExp, '');
         return new Frame(Uri.parse(library), null, null, frame.member);
       }).toList();
-      if (newFrames.length > 1 && newFrames.first.isCore) newFrames.removeAt(0);
+
+      if (newFrames.length > 1 && predicate(newFrames.first)) {
+        newFrames.removeAt(0);
+      }
     }
 
-    return new Trace(newFrames.reversed);
+    return new Trace(newFrames.reversed, original: this.original.toString());
   }
 
   /// Returns a human-readable string representation of [this].
   String toString() {
     // Figure out the longest path so we know how much to pad.
-    var longest = frames.map((frame) => frame.location.length)
-        .fold(0, math.max);
+    var longest =
+        frames.map((frame) => frame.location.length).fold(0, math.max);
 
     // Print out the stack trace nicely formatted.
     return frames.map((frame) {
       if (frame is UnparsedFrame) return "$frame\n";
-      return '${padRight(frame.location, longest)}  ${frame.member}\n';
+      return '${frame.location.padRight(longest)}  ${frame.member}\n';
     }).join();
   }
 }
diff --git a/packages/stack_trace/lib/src/unparsed_frame.dart b/packages/stack_trace/lib/src/unparsed_frame.dart
index f037c8a..78ac738 100644
--- a/packages/stack_trace/lib/src/unparsed_frame.dart
+++ b/packages/stack_trace/lib/src/unparsed_frame.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library stack_trace.unparsed_frame;
-
 import 'frame.dart';
 
 /// A frame that failed to parse.
@@ -23,4 +21,4 @@
   UnparsedFrame(this.member);
 
   String toString() => member;
-}
\ No newline at end of file
+}
diff --git a/packages/stack_trace/lib/src/utils.dart b/packages/stack_trace/lib/src/utils.dart
index 1d09443..838a093 100644
--- a/packages/stack_trace/lib/src/utils.dart
+++ b/packages/stack_trace/lib/src/utils.dart
@@ -2,39 +2,14 @@
 // for 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 stack_trace.src.utils;
-
 /// The line used in the string representation of stack chains to represent
 /// the gap between traces.
 const chainGap = '===== asynchronous gap ===========================\n';
 
-/// Returns [string] with enough spaces added to the end to make it [length]
-/// characters long.
-String padRight(String string, int length) {
-  if (string.length >= length) return string;
+/// The line used in the string representation of VM stack chains to represent
+/// the gap between traces.
+const vmChainGap = '<asynchronous suspension>\n';
 
-  var result = new StringBuffer();
-  result.write(string);
-  for (var i = 0; i < length - string.length; i++) {
-    result.write(' ');
-  }
-
-  return result.toString();
-}
-
-/// Flattens nested lists inside an iterable into a single list containing only
-/// non-list elements.
-List flatten(Iterable nested) {
-  var result = [];
-  helper(list) {
-    for (var element in list) {
-      if (element is List) {
-        helper(element);
-      } else {
-        result.add(element);
-      }
-    }
-  }
-  helper(nested);
-  return result;
-}
+// TODO(nweiz): When cross-platform imports work, use them to set this.
+/// Whether we're running in a JS context.
+final bool inJS = 0.0 is int;
diff --git a/packages/stack_trace/lib/src/vm_trace.dart b/packages/stack_trace/lib/src/vm_trace.dart
index 7991160..7086df7 100644
--- a/packages/stack_trace/lib/src/vm_trace.dart
+++ b/packages/stack_trace/lib/src/vm_trace.dart
@@ -2,10 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library vm_trace;
-
 import 'frame.dart';
-import 'utils.dart';
 
 /// An implementation of [StackTrace] that emulates the behavior of the VM's
 /// implementation.
@@ -21,7 +18,7 @@
   String toString() {
     var i = 1;
     return frames.map((frame) {
-      var number = padRight("#${i++}", 8);
+      var number = "#${i++}".padRight(8);
       var member = frame.member
           .replaceAllMapped(new RegExp(r"[^.]+\.<async>"),
               (match) => "${match[1]}.<${match[1]}_async_body>")
diff --git a/packages/stack_trace/lib/stack_trace.dart b/packages/stack_trace/lib/stack_trace.dart
index 6bba635..1e6f0b0 100644
--- a/packages/stack_trace/lib/stack_trace.dart
+++ b/packages/stack_trace/lib/stack_trace.dart
@@ -21,8 +21,6 @@
  * [pub]: http://pub.dartlang.org
  * [pkg]: http://pub.dartlang.org/packages/stack_trace
  */
-library stack_trace;
-
 export 'src/chain.dart';
 export 'src/frame.dart';
 export 'src/trace.dart';
diff --git a/packages/stack_trace/pubspec.yaml b/packages/stack_trace/pubspec.yaml
index 932f648..a4552ac 100644
--- a/packages/stack_trace/pubspec.yaml
+++ b/packages/stack_trace/pubspec.yaml
@@ -7,16 +7,14 @@
 #
 # When the major version is upgraded, you *must* update that version constraint
 # in pub to stay in sync with this.
-version: 1.5.0
+version: 1.8.0
 author: "Dart Team <misc@dartlang.org>"
-homepage: http://github.com/dart-lang/stack_trace
-description: >
-  A package for manipulating stack traces and printing them readably.
-
+homepage: https://github.com/dart-lang/stack_trace
+description: A package for manipulating stack traces and printing them readably.
 dependencies:
   path: "^1.2.0"
 
 dev_dependencies:
-  test: "^0.12.0"
+  test: '^0.12.17'
 environment:
-  sdk: ">=1.8.0 <2.0.0"
+  sdk: ">=1.21.0 <2.0.0"
diff --git a/packages/stack_trace/test/chain/chain_test.dart b/packages/stack_trace/test/chain/chain_test.dart
index 0eb3f00..407cc2b 100644
--- a/packages/stack_trace/test/chain/chain_test.dart
+++ b/packages/stack_trace/test/chain/chain_test.dart
@@ -10,6 +10,8 @@
 
 import 'utils.dart';
 
+typedef void ChainErrorCallback(stack, Chain chain);
+
 void main() {
   group('Chain.parse()', () {
     test('parses a real Chain', () {
@@ -26,9 +28,9 @@
     });
 
     test('parses a chain containing empty traces', () {
-      var chain = new Chain.parse(
-          '===== asynchronous gap ===========================\n'
-          '===== asynchronous gap ===========================\n');
+      var chain =
+          new Chain.parse('===== asynchronous gap ===========================\n'
+              '===== asynchronous gap ===========================\n');
       expect(chain.traces, hasLength(3));
       expect(chain.traces[0].frames, isEmpty);
       expect(chain.traces[1].frames, isEmpty);
@@ -36,92 +38,193 @@
     });
   });
 
+  group("Chain.capture() with when: false", () {
+    test("with no onError doesn't block errors", () {
+      expect(Chain.capture(() => new Future.error("oh no"), when: false),
+          throwsA("oh no"));
+    });
+
+    test("with onError blocks errors", () {
+      Chain.capture(() {
+        return new Future.error("oh no");
+      }, onError: expectAsync2((error, chain) {
+        expect(error, equals("oh no"));
+        expect(chain, new isInstanceOf<Chain>());
+      }), when: false);
+    });
+
+    test("doesn't enable chain-tracking", () {
+      return Chain.disable(() {
+        return Chain.capture(() {
+          var completer = new Completer();
+          inMicrotask(() {
+            completer.complete(new Chain.current());
+          });
+
+          return completer.future.then((chain) {
+            expect(chain.traces, hasLength(1));
+          });
+        }, when: false);
+      });
+    });
+  });
+
+  group("Chain.disable()", () {
+    test("disables chain-tracking", () {
+      return Chain.disable(() {
+        var completer = new Completer();
+        inMicrotask(() => completer.complete(new Chain.current()));
+
+        return completer.future.then((chain) {
+          expect(chain.traces, hasLength(1));
+        });
+      });
+    });
+
+    test("Chain.capture() re-enables chain-tracking", () {
+      return Chain.disable(() {
+        return Chain.capture(() {
+          var completer = new Completer();
+          inMicrotask(() => completer.complete(new Chain.current()));
+
+          return completer.future.then((chain) {
+            expect(chain.traces, hasLength(2));
+          });
+        });
+      });
+    });
+
+    test("preserves parent zones of the capture zone", () {
+      // The outer disable call turns off the test package's chain-tracking.
+      return Chain.disable(() {
+        return runZoned(() {
+          return Chain.capture(() {
+            expect(Chain.disable(() => Zone.current[#enabled]), isTrue);
+          });
+        }, zoneValues: {#enabled: true});
+      });
+    });
+
+    test("preserves child zones of the capture zone", () {
+      // The outer disable call turns off the test package's chain-tracking.
+      return Chain.disable(() {
+        return Chain.capture(() {
+          return runZoned(() {
+            expect(Chain.disable(() => Zone.current[#enabled]), isTrue);
+          }, zoneValues: {#enabled: true});
+        });
+      });
+    });
+
+    test("with when: false doesn't disable", () {
+      return Chain.capture(() {
+        return Chain.disable(() {
+          var completer = new Completer();
+          inMicrotask(() => completer.complete(new Chain.current()));
+
+          return completer.future.then((chain) {
+            expect(chain.traces, hasLength(2));
+          });
+        }, when: false);
+      });
+    });
+  });
+
   test("toString() ensures that all traces are aligned", () {
     var chain = new Chain([
       new Trace.parse('short 10:11  Foo.bar\n'),
       new Trace.parse('loooooooooooong 10:11  Zop.zoop')
     ]);
 
-    expect(chain.toString(), equals(
-        'short 10:11            Foo.bar\n'
-        '===== asynchronous gap ===========================\n'
-        'loooooooooooong 10:11  Zop.zoop\n'));
+    expect(
+        chain.toString(),
+        equals('short 10:11            Foo.bar\n'
+            '===== asynchronous gap ===========================\n'
+            'loooooooooooong 10:11  Zop.zoop\n'));
   });
 
   var userSlashCode = p.join('user', 'code.dart');
   group('Chain.terse', () {
     test('makes each trace terse', () {
       var chain = new Chain([
-        new Trace.parse(
-            'dart:core 10:11       Foo.bar\n'
+        new Trace.parse('dart:core 10:11       Foo.bar\n'
             'dart:core 10:11       Bar.baz\n'
             'user/code.dart 10:11  Bang.qux\n'
             'dart:core 10:11       Zip.zap\n'
             'dart:core 10:11       Zop.zoop'),
-        new Trace.parse(
-            'user/code.dart 10:11                        Bang.qux\n'
+        new Trace.parse('user/code.dart 10:11                        Bang.qux\n'
             'dart:core 10:11                             Foo.bar\n'
             'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
             'dart:core 10:11                             Zip.zap\n'
             'user/code.dart 10:11                        Zop.zoop')
       ]);
 
-      expect(chain.terse.toString(), equals(
-          'dart:core             Bar.baz\n'
-          '$userSlashCode 10:11  Bang.qux\n'
-          '===== asynchronous gap ===========================\n'
-          '$userSlashCode 10:11  Bang.qux\n'
-          'dart:core             Zip.zap\n'
-          '$userSlashCode 10:11  Zop.zoop\n'));
+      expect(
+          chain.terse.toString(),
+          equals('dart:core             Bar.baz\n'
+              '$userSlashCode 10:11  Bang.qux\n'
+              '===== asynchronous gap ===========================\n'
+              '$userSlashCode 10:11  Bang.qux\n'
+              'dart:core             Zip.zap\n'
+              '$userSlashCode 10:11  Zop.zoop\n'));
     });
 
     test('eliminates internal-only traces', () {
       var chain = new Chain([
-        new Trace.parse(
-            'user/code.dart 10:11  Foo.bar\n'
+        new Trace.parse('user/code.dart 10:11  Foo.bar\n'
             'dart:core 10:11       Bar.baz'),
-        new Trace.parse(
-            'dart:core 10:11                             Foo.bar\n'
+        new Trace.parse('dart:core 10:11                             Foo.bar\n'
             'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
             'dart:core 10:11                             Zip.zap'),
-        new Trace.parse(
-            'user/code.dart 10:11  Foo.bar\n'
+        new Trace.parse('user/code.dart 10:11  Foo.bar\n'
             'dart:core 10:11       Bar.baz')
       ]);
 
-      expect(chain.terse.toString(), equals(
-          '$userSlashCode 10:11  Foo.bar\n'
-          '===== asynchronous gap ===========================\n'
-          '$userSlashCode 10:11  Foo.bar\n'));
+      expect(
+          chain.terse.toString(),
+          equals('$userSlashCode 10:11  Foo.bar\n'
+              '===== asynchronous gap ===========================\n'
+              '$userSlashCode 10:11  Foo.bar\n'));
     });
 
     test("doesn't return an empty chain", () {
       var chain = new Chain([
-        new Trace.parse(
-            'dart:core 10:11                             Foo.bar\n'
+        new Trace.parse('dart:core 10:11                             Foo.bar\n'
             'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
             'dart:core 10:11                             Zip.zap'),
-        new Trace.parse(
-            'dart:core 10:11                             A.b\n'
+        new Trace.parse('dart:core 10:11                             A.b\n'
             'package:stack_trace/stack_trace.dart 10:11  C.d\n'
             'dart:core 10:11                             E.f')
       ]);
 
       expect(chain.terse.toString(), equals('dart:core  E.f\n'));
     });
+
+    // Regression test for #9
+    test("doesn't crash on empty traces", () {
+      var chain = new Chain([
+        new Trace.parse('user/code.dart 10:11  Bang.qux'),
+        new Trace([]),
+        new Trace.parse('user/code.dart 10:11  Bang.qux')
+      ]);
+
+      expect(
+          chain.terse.toString(),
+          equals('$userSlashCode 10:11  Bang.qux\n'
+              '===== asynchronous gap ===========================\n'
+              '$userSlashCode 10:11  Bang.qux\n'));
+    });
   });
 
   group('Chain.foldFrames', () {
     test('folds each trace', () {
       var chain = new Chain([
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'a.dart 10:11  Bar.baz\n'
             'b.dart 10:11  Bang.qux\n'
             'a.dart 10:11  Zip.zap\n'
             'a.dart 10:11  Zop.zoop'),
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'a.dart 10:11  Bar.baz\n'
             'a.dart 10:11  Bang.qux\n'
             'a.dart 10:11  Zip.zap\n'
@@ -129,68 +232,64 @@
       ]);
 
       var folded = chain.foldFrames((frame) => frame.library == 'a.dart');
-      expect(folded.toString(), equals(
-          'a.dart 10:11  Bar.baz\n'
-          'b.dart 10:11  Bang.qux\n'
-          'a.dart 10:11  Zop.zoop\n'
-          '===== asynchronous gap ===========================\n'
-          'a.dart 10:11  Zip.zap\n'
-          'b.dart 10:11  Zop.zoop\n'));
+      expect(
+          folded.toString(),
+          equals('a.dart 10:11  Bar.baz\n'
+              'b.dart 10:11  Bang.qux\n'
+              'a.dart 10:11  Zop.zoop\n'
+              '===== asynchronous gap ===========================\n'
+              'a.dart 10:11  Zip.zap\n'
+              'b.dart 10:11  Zop.zoop\n'));
     });
 
     test('with terse: true, folds core frames as well', () {
       var chain = new Chain([
-        new Trace.parse(
-            'a.dart 10:11                        Foo.bar\n'
+        new Trace.parse('a.dart 10:11                        Foo.bar\n'
             'dart:async-patch/future.dart 10:11  Zip.zap\n'
             'b.dart 10:11                        Bang.qux\n'
             'dart:core 10:11                     Bar.baz\n'
             'a.dart 10:11                        Zop.zoop'),
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'a.dart 10:11  Bar.baz\n'
             'a.dart 10:11  Bang.qux\n'
             'a.dart 10:11  Zip.zap\n'
             'b.dart 10:11  Zop.zoop')
       ]);
 
-      var folded = chain.foldFrames((frame) => frame.library == 'a.dart',
-          terse: true);
-      expect(folded.toString(), equals(
-          'dart:async    Zip.zap\n'
-          'b.dart 10:11  Bang.qux\n'
-          'a.dart        Zop.zoop\n'
-          '===== asynchronous gap ===========================\n'
-          'a.dart        Zip.zap\n'
-          'b.dart 10:11  Zop.zoop\n'));
+      var folded =
+          chain.foldFrames((frame) => frame.library == 'a.dart', terse: true);
+      expect(
+          folded.toString(),
+          equals('dart:async    Zip.zap\n'
+              'b.dart 10:11  Bang.qux\n'
+              '===== asynchronous gap ===========================\n'
+              'a.dart        Zip.zap\n'
+              'b.dart 10:11  Zop.zoop\n'));
     });
 
     test('eliminates completely-folded traces', () {
       var chain = new Chain([
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'b.dart 10:11  Bang.qux'),
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'a.dart 10:11  Bang.qux'),
-        new Trace.parse(
-            'a.dart 10:11  Zip.zap\n'
+        new Trace.parse('a.dart 10:11  Zip.zap\n'
             'b.dart 10:11  Zop.zoop')
       ]);
 
       var folded = chain.foldFrames((frame) => frame.library == 'a.dart');
-      expect(folded.toString(), equals(
-          'a.dart 10:11  Foo.bar\n'
-          'b.dart 10:11  Bang.qux\n'
-          '===== asynchronous gap ===========================\n'
-          'a.dart 10:11  Zip.zap\n'
-          'b.dart 10:11  Zop.zoop\n'));
+      expect(
+          folded.toString(),
+          equals('a.dart 10:11  Foo.bar\n'
+              'b.dart 10:11  Bang.qux\n'
+              '===== asynchronous gap ===========================\n'
+              'a.dart 10:11  Zip.zap\n'
+              'b.dart 10:11  Zop.zoop\n'));
     });
 
     test("doesn't return an empty trace", () {
       var chain = new Chain([
-        new Trace.parse(
-            'a.dart 10:11  Foo.bar\n'
+        new Trace.parse('a.dart 10:11  Foo.bar\n'
             'a.dart 10:11  Bang.qux')
       ]);
 
@@ -201,82 +300,17 @@
 
   test('Chain.toTrace eliminates asynchronous gaps', () {
     var trace = new Chain([
-      new Trace.parse(
-          'user/code.dart 10:11  Foo.bar\n'
+      new Trace.parse('user/code.dart 10:11  Foo.bar\n'
           'dart:core 10:11       Bar.baz'),
-      new Trace.parse(
-          'user/code.dart 10:11  Foo.bar\n'
+      new Trace.parse('user/code.dart 10:11  Foo.bar\n'
           'dart:core 10:11       Bar.baz')
     ]).toTrace();
 
-    expect(trace.toString(), equals(
-        '$userSlashCode 10:11  Foo.bar\n'
-        'dart:core 10:11       Bar.baz\n'
-        '$userSlashCode 10:11  Foo.bar\n'
-        'dart:core 10:11       Bar.baz\n'));
+    expect(
+        trace.toString(),
+        equals('$userSlashCode 10:11  Foo.bar\n'
+            'dart:core 10:11       Bar.baz\n'
+            '$userSlashCode 10:11  Foo.bar\n'
+            'dart:core 10:11       Bar.baz\n'));
   });
-
-  group('Chain.track(Future)', () {
-    test('forwards the future value within Chain.capture()', () {
-      Chain.capture(() {
-        expect(Chain.track(new Future.value('value')),
-            completion(equals('value')));
-
-        var trace = new Trace.current();
-        expect(Chain.track(new Future.error('error', trace))
-            .catchError((e, stackTrace) {
-          expect(e, equals('error'));
-          expect(stackTrace.toString(), equals(trace.toString()));
-        }), completes);
-      });
-    });
-
-    test('forwards the future value outside of Chain.capture()', () {
-      expect(Chain.track(new Future.value('value')),
-          completion(equals('value')));
-
-      var trace = new Trace.current();
-      expect(Chain.track(new Future.error('error', trace))
-          .catchError((e, stackTrace) {
-        expect(e, equals('error'));
-        expect(stackTrace.toString(), equals(trace.toString()));
-      }), completes);
-    });
-  });
-
-  group('Chain.track(Stream)', () {
-    test('forwards stream values within Chain.capture()', () {
-      Chain.capture(() {
-        var controller = new StreamController()
-            ..add(1)..add(2)..add(3)..close();
-        expect(Chain.track(controller.stream).toList(),
-            completion(equals([1, 2, 3])));
-
-        var trace = new Trace.current();
-        controller = new StreamController()..addError('error', trace);
-        expect(Chain.track(controller.stream).toList()
-            .catchError((e, stackTrace) {
-          expect(e, equals('error'));
-          expect(stackTrace.toString(), equals(trace.toString()));
-        }), completes);
-      });
-    });
-
-    test('forwards stream values outside of Chain.capture()', () {
-      Chain.capture(() {
-        var controller = new StreamController()
-            ..add(1)..add(2)..add(3)..close();
-        expect(Chain.track(controller.stream).toList(),
-            completion(equals([1, 2, 3])));
-
-        var trace = new Trace.current();
-        controller = new StreamController()..addError('error', trace);
-        expect(Chain.track(controller.stream).toList()
-            .catchError((e, stackTrace) {
-          expect(e, equals('error'));
-          expect(stackTrace.toString(), equals(trace.toString()));
-        }), completes);
-      });
-    });
-  });
-}
\ No newline at end of file
+}
diff --git a/packages/stack_trace/test/chain/dart2js_test.dart b/packages/stack_trace/test/chain/dart2js_test.dart
index afb27fa..df3d07b 100644
--- a/packages/stack_trace/test/chain/dart2js_test.dart
+++ b/packages/stack_trace/test/chain/dart2js_test.dart
@@ -28,14 +28,14 @@
     });
 
     test('thrown in a one-shot timer', () async {
-      var chain = await captureFuture(
-          () => inOneShotTimer(() => throw 'error'));
+      var chain =
+          await captureFuture(() => inOneShotTimer(() => throw 'error'));
       expect(chain.traces, hasLength(2));
     });
 
     test('thrown in a periodic timer', () async {
-      var chain = await captureFuture(
-          () => inPeriodicTimer(() => throw 'error'));
+      var chain =
+          await captureFuture(() => inPeriodicTimer(() => throw 'error'));
       expect(chain.traces, hasLength(2));
     });
 
@@ -238,11 +238,11 @@
     });
   });
 
-  test('current() outside of capture() returns a chain wrapping the current '
+  test(
+      'current() outside of capture() returns a chain wrapping the current '
       'trace', () {
-    // The test runner runs all tests with chains enabled, so to test without we
-    // have to do some zone munging.
-    return runZoned(() async {
+    // The test runner runs all tests with chains enabled.
+    return Chain.disable(() async {
       var completer = new Completer();
       inMicrotask(() => completer.complete(new Chain.current()));
 
@@ -251,7 +251,7 @@
       // chain isn't available and it just returns the current stack when
       // called.
       expect(chain.traces, hasLength(1));
-    }, zoneValues: {#stack_trace.stack_zone.spec: null});
+    });
   });
 
   group('forTrace() within capture()', () {
@@ -282,7 +282,8 @@
       expect(chain.traces, hasLength(3));
     });
 
-    test('called for a stack trace from a nested series of asynchronous '
+    test(
+        'called for a stack trace from a nested series of asynchronous '
         'operations', () async {
       var chain = await Chain.capture(() {
         return chainForTrace((callback) {
@@ -301,7 +302,8 @@
       expect(chain.traces, hasLength(3));
     });
 
-    test('called for an unregistered stack trace returns a chain wrapping that '
+    test(
+        'called for an unregistered stack trace returns a chain wrapping that '
         'trace', () {
       var trace;
       var chain = Chain.capture(() {
@@ -319,7 +321,8 @@
     });
   });
 
-  test('forTrace() outside of capture() returns a chain wrapping the given '
+  test(
+      'forTrace() outside of capture() returns a chain wrapping the given '
       'trace', () {
     var trace;
     var chain = Chain.capture(() {
diff --git a/packages/stack_trace/test/chain/utils.dart b/packages/stack_trace/test/chain/utils.dart
index 1e19eeb..bf82158 100644
--- a/packages/stack_trace/test/chain/utils.dart
+++ b/packages/stack_trace/test/chain/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library stack_trace.test.chain.utils;
-
 import 'dart:async';
 
 import 'package:stack_trace/stack_trace.dart';
@@ -72,11 +70,15 @@
     // [new Future.sync] because those methods don't pass the exception through
     // the zone specification before propagating it, so there's no chance to
     // attach a chain to its stack trace. See issue 15105.
-    new Future.value().then((_) => callback())
+    new Future.value()
+        .then((_) => callback())
         .catchError(completer.completeError);
   });
+
+  // TODO(rnystrom): Remove this cast if catchError() gets a better type.
   return completer.future
-      .catchError((_, stackTrace) => new Chain.forTrace(stackTrace));
+          .catchError((_, stackTrace) => new Chain.forTrace(stackTrace))
+      as Future<Chain>;
 }
 
 /// Runs [callback] in a [Chain.capture] zone and returns a Future that
diff --git a/packages/stack_trace/test/chain/vm_test.dart b/packages/stack_trace/test/chain/vm_test.dart
index 70635b7..daf7f8f 100644
--- a/packages/stack_trace/test/chain/vm_test.dart
+++ b/packages/stack_trace/test/chain/vm_test.dart
@@ -17,11 +17,10 @@
 void main() {
   group('capture() with onError catches exceptions', () {
     test('thrown synchronously', () {
-      return captureFuture(() => throw 'error')
-          .then((chain) {
+      return captureFuture(() => throw 'error').then((chain) {
         expect(chain.traces, hasLength(1));
-        expect(chain.traces.single.frames.first,
-            frameMember(startsWith('main')));
+        expect(
+            chain.traces.single.frames.first, frameMember(startsWith('main')));
       });
     });
 
@@ -349,11 +348,11 @@
     });
   });
 
-  test('current() outside of capture() returns a chain wrapping the current '
+  test(
+      'current() outside of capture() returns a chain wrapping the current '
       'trace', () {
-    // The test runner runs all tests with chains enabled, so to test without we
-    // have to do some zone munging.
-    return runZoned(() {
+    // The test runner runs all tests with chains enabled.
+    return Chain.disable(() {
       var completer = new Completer();
       inMicrotask(() => completer.complete(new Chain.current()));
 
@@ -362,10 +361,10 @@
         // chain isn't available and it just returns the current stack when
         // called.
         expect(chain.traces, hasLength(1));
-        expect(chain.traces.first.frames.first,
-            frameMember(startsWith('main')));
+        expect(
+            chain.traces.first.frames.first, frameMember(startsWith('main')));
       });
-    }, zoneValues: {#stack_trace.stack_zone.spec: null});
+    });
   });
 
   group('forTrace() within capture()', () {
@@ -411,7 +410,8 @@
       });
     });
 
-    test('called for a stack trace from a nested series of asynchronous '
+    test(
+        'called for a stack trace from a nested series of asynchronous '
         'operations', () {
       return Chain.capture(() {
         return chainForTrace((callback) {
@@ -444,7 +444,8 @@
       });
     });
 
-    test('called for an unregistered stack trace returns a chain wrapping that '
+    test(
+        'called for an unregistered stack trace returns a chain wrapping that '
         'trace', () {
       var trace;
       var chain = Chain.capture(() {
@@ -462,7 +463,8 @@
     });
   });
 
-  test('forTrace() outside of capture() returns a chain wrapping the given '
+  test(
+      'forTrace() outside of capture() returns a chain wrapping the given '
       'trace', () {
     var trace;
     var chain = Chain.capture(() {
diff --git a/packages/stack_trace/test/frame_test.dart b/packages/stack_trace/test/frame_test.dart
index 63035e0..42df4cd 100644
--- a/packages/stack_trace/test/frame_test.dart
+++ b/packages/stack_trace/test/frame_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library frame_test;
-
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 import 'package:test/test.dart';
@@ -13,8 +11,8 @@
     test('parses a stack frame with column correctly', () {
       var frame = new Frame.parseVM("#1      Foo._bar "
           "(file:///home/nweiz/code/stuff.dart:42:21)");
-      expect(frame.uri,
-          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(
+          frame.uri, equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
       expect(frame.line, equals(42));
       expect(frame.column, equals(21));
       expect(frame.member, equals('Foo._bar'));
@@ -23,8 +21,8 @@
     test('parses a stack frame without column correctly', () {
       var frame = new Frame.parseVM("#1      Foo._bar "
           "(file:///home/nweiz/code/stuff.dart:24)");
-      expect(frame.uri,
-          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(
+          frame.uri, equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
       expect(frame.line, equals(24));
       expect(frame.column, null);
       expect(frame.member, equals('Foo._bar'));
@@ -34,8 +32,8 @@
     test('parses a stack frame without line or column correctly', () {
       var frame = new Frame.parseVM("#1      Foo._bar "
           "(file:///home/nweiz/code/stuff.dart)");
-      expect(frame.uri,
-          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(
+          frame.uri, equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
       expect(frame.line, isNull);
       expect(frame.column, isNull);
       expect(frame.member, equals('Foo._bar'));
@@ -57,8 +55,8 @@
     });
 
     test('converts "<function_name_async_body>" to "<async>"', () {
-      var frame = new Frame.parseVM(
-          '#0 Foo.<function_name_async_body> (foo:0:0)');
+      var frame =
+          new Frame.parseVM('#0 Foo.<function_name_async_body> (foo:0:0)');
       expect(frame.member, equals('Foo.<async>'));
     });
 
@@ -70,7 +68,9 @@
       expect(frame.line, isNull);
       expect(frame.column, isNull);
     });
+  });
 
+  group('.parseV8', () {
     test('returns an UnparsedFrame for malformed frames', () {
       expectIsUnparsed((text) => new Frame.parseV8(text), '');
       expectIsUnparsed((text) => new Frame.parseV8(text), '#1');
@@ -80,9 +80,7 @@
       expectIsUnparsed((text) => new Frame.parseV8(text),
           'Foo (dart:async/future.dart:10:15)');
     });
-  });
 
-  group('.parseV8', () {
     test('parses a stack frame correctly', () {
       var frame = new Frame.parseV8("    at VW.call\$0 "
           "(http://pub.dartlang.org/stuff.dart.js:560:28)");
@@ -114,8 +112,8 @@
     test('parses a stack frame with a Windows UNC path correctly', () {
       var frame = new Frame.parseV8("    at VW.call\$0 "
           r"(\\mount\path\to\stuff.dart.js:560:28)");
-      expect(frame.uri,
-          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(
+          frame.uri, equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, equals(28));
       expect(frame.member, equals('VW.call\$0'));
@@ -150,8 +148,7 @@
     });
 
     test('parses a native stack frame correctly', () {
-      var frame = new Frame.parseV8(
-          "    at Object.stringify (native)");
+      var frame = new Frame.parseV8("    at Object.stringify (native)");
       expect(frame.uri, Uri.parse('native'));
       expect(frame.line, isNull);
       expect(frame.column, isNull);
@@ -215,8 +212,8 @@
           new Frame.parseV8('    at $member (foo:0:0)').member;
 
       expect(parsedMember('Foo.<anonymous>'), equals('Foo.<fn>'));
-      expect(parsedMember('<anonymous>.<anonymous>.bar'),
-          equals('<fn>.<fn>.bar'));
+      expect(
+          parsedMember('<anonymous>.<anonymous>.bar'), equals('<fn>.<fn>.bar'));
     });
 
     test('returns an UnparsedFrame for malformed frames', () {
@@ -229,12 +226,12 @@
           '    at (dart:async/future.dart:10:15)');
       expectIsUnparsed((text) => new Frame.parseV8(text),
           'Foo (dart:async/future.dart:10:15)');
-      expectIsUnparsed((text) => new Frame.parseV8(text),
-          '    at dart:async/future.dart');
+      expectIsUnparsed(
+          (text) => new Frame.parseV8(text), '    at dart:async/future.dart');
       expectIsUnparsed((text) => new Frame.parseV8(text),
           '    at dart:async/future.dart:10');
-      expectIsUnparsed((text) => new Frame.parseV8(text),
-          'dart:async/future.dart:10:15');
+      expectIsUnparsed(
+          (text) => new Frame.parseV8(text), 'dart:async/future.dart:10:15');
     });
   });
 
@@ -250,8 +247,8 @@
     });
 
     test('parses a stack frame with an absolute POSIX path correctly', () {
-      var frame = new Frame.parseFirefox(
-          ".VW.call\$0@/path/to/stuff.dart.js:560");
+      var frame =
+          new Frame.parseFirefox(".VW.call\$0@/path/to/stuff.dart.js:560");
       expect(frame.uri, equals(Uri.parse("file:///path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, isNull);
@@ -259,8 +256,8 @@
     });
 
     test('parses a stack frame with an absolute Windows path correctly', () {
-      var frame = new Frame.parseFirefox(
-          r".VW.call$0@C:\path\to\stuff.dart.js:560");
+      var frame =
+          new Frame.parseFirefox(r".VW.call$0@C:\path\to\stuff.dart.js:560");
       expect(frame.uri, equals(Uri.parse("file:///C:/path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, isNull);
@@ -270,16 +267,16 @@
     test('parses a stack frame with a Windows UNC path correctly', () {
       var frame = new Frame.parseFirefox(
           r".VW.call$0@\\mount\path\to\stuff.dart.js:560");
-      expect(frame.uri,
-          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(
+          frame.uri, equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, isNull);
       expect(frame.member, equals('VW.call\$0'));
     });
 
     test('parses a stack frame with a relative POSIX path correctly', () {
-      var frame = new Frame.parseFirefox(
-          ".VW.call\$0@path/to/stuff.dart.js:560");
+      var frame =
+          new Frame.parseFirefox(".VW.call\$0@path/to/stuff.dart.js:560");
       expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, isNull);
@@ -287,8 +284,8 @@
     });
 
     test('parses a stack frame with a relative Windows path correctly', () {
-      var frame = new Frame.parseFirefox(
-          r".VW.call$0@path\to\stuff.dart.js:560");
+      var frame =
+          new Frame.parseFirefox(r".VW.call$0@path\to\stuff.dart.js:560");
       expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
       expect(frame.line, equals(560));
       expect(frame.column, isNull);
@@ -296,8 +293,8 @@
     });
 
     test('parses a simple anonymous stack frame correctly', () {
-      var frame = new Frame.parseFirefox(
-          "@http://pub.dartlang.org/stuff.dart.js:560");
+      var frame =
+          new Frame.parseFirefox("@http://pub.dartlang.org/stuff.dart.js:560");
       expect(frame.uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
       expect(frame.line, equals(560));
@@ -352,8 +349,7 @@
     });
 
     test('parses a nested anonymous stack frame with parameters correctly', () {
-      var frame = new Frame.parseFirefox(
-          '.foo(12, "@)()/<")/.fn<@'
+      var frame = new Frame.parseFirefox('.foo(12, "@)()/<")/.fn<@'
           'http://pub.dartlang.org/stuff.dart.js:560');
       expect(frame.uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
@@ -362,11 +358,12 @@
       expect(frame.member, equals("foo.<fn>"));
     });
 
-    test('parses a deeply-nested anonymous stack frame with parameters '
+    test(
+        'parses a deeply-nested anonymous stack frame with parameters '
         'correctly', () {
-      var frame = new Frame.parseFirefox(
-          '.convertDartClosureToJS/\$function</<@'
-          'http://pub.dartlang.org/stuff.dart.js:560');
+      var frame =
+          new Frame.parseFirefox('.convertDartClosureToJS/\$function</<@'
+              'http://pub.dartlang.org/stuff.dart.js:560');
       expect(frame.uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
       expect(frame.line, equals(560));
@@ -381,8 +378,8 @@
           '.foo@dart:async/future.dart');
       expectIsUnparsed((text) => new Frame.parseFirefox(text),
           '.foo(@dart:async/future.dart:10');
-      expectIsUnparsed((text) => new Frame.parseFirefox(text),
-          '@dart:async/future.dart');
+      expectIsUnparsed(
+          (text) => new Frame.parseFirefox(text), '@dart:async/future.dart');
     });
 
     test('parses a simple stack frame correctly', () {
@@ -395,8 +392,8 @@
     });
 
     test('parses an anonymous stack frame correctly', () {
-      var frame = new Frame.parseFirefox(
-          "http://dartlang.org/foo/bar.dart:10:11");
+      var frame =
+          new Frame.parseFirefox("http://dartlang.org/foo/bar.dart:10:11");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, equals(10));
       expect(frame.column, equals(11));
@@ -450,7 +447,7 @@
       expect(frame.member, equals('Foo.<fn>.bar'));
     });
 
-    test('parses a stack frame with no line correctly', () {
+    test('parses a stack frame with no column correctly', () {
       var frame = new Frame.parseFriendly(
           "http://dartlang.org/foo/bar.dart 10  Foo.<fn>.bar");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
@@ -461,8 +458,8 @@
 
     test('parses a stack frame with a relative path correctly', () {
       var frame = new Frame.parseFriendly("foo/bar.dart 10:11    Foo.<fn>.bar");
-      expect(frame.uri, equals(
-          path.toUri(path.absolute(path.join('foo', 'bar.dart')))));
+      expect(frame.uri,
+          equals(path.toUri(path.absolute(path.join('foo', 'bar.dart')))));
       expect(frame.line, equals(10));
       expect(frame.column, equals(11));
       expect(frame.member, equals('Foo.<fn>.bar'));
@@ -471,14 +468,51 @@
     test('returns an UnparsedFrame for malformed frames', () {
       expectIsUnparsed((text) => new Frame.parseFriendly(text), '');
       expectIsUnparsed((text) => new Frame.parseFriendly(text), 'foo/bar.dart');
-      expectIsUnparsed((text) => new Frame.parseFriendly(text),
-          'foo/bar.dart 10:11');
+      expectIsUnparsed(
+          (text) => new Frame.parseFriendly(text), 'foo/bar.dart 10:11');
+    });
+
+    test('parses a data url stack frame with no line or column correctly', () {
+      var frame = new Frame.parseFriendly("data:...  main");
+      expect(frame.uri.scheme, equals('data'));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+      expect(frame.member, equals('main'));
+    });
+
+    test('parses a data url stack frame correctly', () {
+      var frame = new Frame.parseFriendly("data:... 10:11    main");
+      expect(frame.uri.scheme, equals('data'));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('main'));
+    });
+
+    test('parses a stack frame with spaces in the member name correctly', () {
+      var frame = new Frame.parseFriendly(
+          "foo/bar.dart 10:11    (anonymous function).dart.fn");
+      expect(frame.uri,
+          equals(path.toUri(path.absolute(path.join('foo', 'bar.dart')))));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('(anonymous function).dart.fn'));
+    });
+
+    test(
+        'parses a stack frame with spaces in the member name and no line or '
+        'column correctly', () {
+      var frame = new Frame.parseFriendly(
+          "http://dartlang.org/foo/bar.dart  (anonymous function).dart.fn");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+      expect(frame.member, equals('(anonymous function).dart.fn'));
     });
   });
 
   test('only considers dart URIs to be core', () {
     bool isCore(String library) =>
-      new Frame.parseVM('#0 Foo ($library:0:0)').isCore;
+        new Frame.parseVM('#0 Foo ($library:0:0)').isCore;
 
     expect(isCore('dart:core'), isTrue);
     expect(isCore('dart:async'), isTrue);
@@ -494,8 +528,10 @@
     test('returns the URI string for non-file URIs', () {
       expect(new Frame.parseVM('#0 Foo (dart:async/future.dart:0:0)').library,
           equals('dart:async/future.dart'));
-      expect(new Frame.parseVM('#0 Foo '
-              '(http://dartlang.org/stuff/thing.dart:0:0)').library,
+      expect(
+          new Frame.parseVM('#0 Foo '
+                  '(http://dartlang.org/stuff/thing.dart:0:0)')
+              .library,
           equals('http://dartlang.org/stuff/thing.dart'));
     });
 
@@ -512,10 +548,13 @@
   });
 
   group('.location', () {
-    test('returns the library and line/column numbers for non-core '
+    test(
+        'returns the library and line/column numbers for non-core '
         'libraries', () {
-      expect(new Frame.parseVM('#0 Foo '
-              '(http://dartlang.org/thing.dart:5:10)').location,
+      expect(
+          new Frame.parseVM('#0 Foo '
+                  '(http://dartlang.org/thing.dart:5:10)')
+              .location,
           equals('http://dartlang.org/thing.dart 5:10'));
       expect(new Frame.parseVM('#0 Foo (foo/bar.dart:1:2)').location,
           equals('${path.join('foo', 'bar.dart')} 1:2'));
@@ -526,8 +565,10 @@
     test('returns null for non-package URIs', () {
       expect(new Frame.parseVM('#0 Foo (dart:async/future.dart:0:0)').package,
           isNull);
-      expect(new Frame.parseVM('#0 Foo '
-              '(http://dartlang.org/stuff/thing.dart:0:0)').package,
+      expect(
+          new Frame.parseVM('#0 Foo '
+                  '(http://dartlang.org/stuff/thing.dart:0:0)')
+              .package,
           isNull);
     });
 
@@ -540,16 +581,20 @@
   });
 
   group('.toString()', () {
-    test('returns the library and line/column numbers for non-core '
+    test(
+        'returns the library and line/column numbers for non-core '
         'libraries', () {
-      expect(new Frame.parseVM('#0 Foo (http://dartlang.org/thing.dart:5:10)')
+      expect(
+          new Frame.parseVM('#0 Foo (http://dartlang.org/thing.dart:5:10)')
               .toString(),
           equals('http://dartlang.org/thing.dart 5:10 in Foo'));
     });
 
     test('converts "<anonymous closure>" to "<fn>"', () {
-      expect(new Frame.parseVM('#0 Foo.<anonymous closure> '
-              '(dart:core/uri.dart:5:10)').toString(),
+      expect(
+          new Frame.parseVM('#0 Foo.<anonymous closure> '
+                  '(dart:core/uri.dart:5:10)')
+              .toString(),
           equals('dart:core/uri.dart 5:10 in Foo.<fn>'));
     });
 
diff --git a/packages/stack_trace/test/trace_test.dart b/packages/stack_trace/test/trace_test.dart
index d12bc71..33d4f4e 100644
--- a/packages/stack_trace/test/trace_test.dart
+++ b/packages/stack_trace/test/trace_test.dart
@@ -2,28 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library trace_test;
-
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 import 'package:test/test.dart';
 
-String getStackTraceString() {
-  try {
-    throw '';
-  } catch (_, stackTrace) {
-    return stackTrace.toString();
-  }
-}
-
-StackTrace getStackTraceObject() {
-  try {
-    throw '';
-  } catch (_, stackTrace) {
-    return stackTrace;
-  }
-}
-
 Trace getCurrentTrace([int level]) => new Trace.current(level);
 
 Trace nestedGetCurrentTrace(int level) => getCurrentTrace(level);
@@ -38,7 +20,7 @@
           '#0      Foo._bar (file:///home/nweiz/code/stuff.dart:42:21)\n'
           '#1      zip.<anonymous closure>.zap (dart:async/future.dart:0:2)\n'
           '#2      zip.<anonymous closure>.zap (http://pub.dartlang.org/thing.'
-              'dart:1:100)');
+          'dart:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
@@ -48,12 +30,11 @@
     });
 
     test('parses a V8 stack trace correctly', () {
-      var trace = new Trace.parse(
-          'Error\n'
+      var trace = new Trace.parse('Error\n'
           '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
           '    at http://pub.dartlang.org/stuff.js:0:2\n'
           '    at zip.<anonymous>.zap '
-              '(http://pub.dartlang.org/thing.js:1:100)');
+          '(http://pub.dartlang.org/thing.js:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -62,12 +43,11 @@
       expect(trace.frames[2].uri,
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
 
-      trace = new Trace.parse(
-          "Exception: foo\n"
+      trace = new Trace.parse("Exception: foo\n"
           '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
           '    at http://pub.dartlang.org/stuff.js:0:2\n'
           '    at zip.<anonymous>.zap '
-              '(http://pub.dartlang.org/thing.js:1:100)');
+          '(http://pub.dartlang.org/thing.js:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -76,13 +56,12 @@
       expect(trace.frames[2].uri,
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
 
-      trace = new Trace.parse(
-          'Exception: foo\n'
+      trace = new Trace.parse('Exception: foo\n'
           '    bar\n'
           '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
           '    at http://pub.dartlang.org/stuff.js:0:2\n'
           '    at zip.<anonymous>.zap '
-              '(http://pub.dartlang.org/thing.js:1:100)');
+          '(http://pub.dartlang.org/thing.js:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -90,6 +69,22 @@
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
       expect(trace.frames[2].uri,
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse('Exception: foo\n'
+          '    bar\n'
+          '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '    at http://pub.dartlang.org/stuff.js:0:2\n'
+          '    at (anonymous function).zip.zap '
+          '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].member, equals("<fn>"));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+      expect(trace.frames[2].member, equals("<fn>.zip.zap"));
     });
 
     // JavaScriptCore traces are just like V8, except that it doesn't have a
@@ -99,7 +94,7 @@
           '\tat Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
           '\tat http://pub.dartlang.org/stuff.js:0:2\n'
           '\tat zip.<anonymous>.zap '
-              '(http://pub.dartlang.org/thing.js:1:100)');
+          '(http://pub.dartlang.org/thing.js:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -112,7 +107,7 @@
           '\tat Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
           '\tat \n'
           '\tat zip.<anonymous>.zap '
-              '(http://pub.dartlang.org/thing.js:1:100)');
+          '(http://pub.dartlang.org/thing.js:1:100)');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -121,10 +116,10 @@
     });
 
     test('parses a Firefox/Safari stack trace correctly', () {
-      var trace = new Trace.parse(
-          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
-          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
-          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+      var trace =
+          new Trace.parse('Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+              'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+              'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -133,8 +128,7 @@
       expect(trace.frames[2].uri,
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
 
-      trace = new Trace.parse(
-          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+      trace = new Trace.parse('zip/<@http://pub.dartlang.org/stuff.js:0\n'
           'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
           'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
@@ -160,11 +154,11 @@
 
     test('parses a Firefox/Safari stack trace containing native code correctly',
         () {
-      var trace = new Trace.parse(
-          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
-          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
-          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1\n'
-          '[native code]');
+      var trace =
+          new Trace.parse('Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+              'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+              'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1\n'
+              '[native code]');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -177,8 +171,7 @@
 
     test('parses a Firefox/Safari stack trace without a method name correctly',
         () {
-      var trace = new Trace.parse(
-          'http://pub.dartlang.org/stuff.js:42\n'
+      var trace = new Trace.parse('http://pub.dartlang.org/stuff.js:42\n'
           'zip/<@http://pub.dartlang.org/stuff.js:0\n'
           'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
@@ -193,11 +186,11 @@
 
     test('parses a Firefox/Safari stack trace with an empty line correctly',
         () {
-      var trace = new Trace.parse(
-          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
-          '\n'
-          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
-          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+      var trace =
+          new Trace.parse('Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+              '\n'
+              'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+              'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -209,10 +202,10 @@
 
     test('parses a Firefox/Safari stack trace with a column number correctly',
         () {
-      var trace = new Trace.parse(
-          'Foo._bar@http://pub.dartlang.org/stuff.js:42:2\n'
-          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
-          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+      var trace =
+          new Trace.parse('Foo._bar@http://pub.dartlang.org/stuff.js:42:2\n'
+              'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+              'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -287,15 +280,17 @@
       new Frame(Uri.parse('dart:async'), 15, null, 'baz'),
     ]);
 
-    expect(trace.vmTrace.toString(), equals(
-        '#1      Foo.<anonymous closure> ($uri:10:20)\n'
-        '#2      bar (http://dartlang.org/foo.dart:0:0)\n'
-        '#3      baz (dart:async:15:0)\n'));
+    expect(
+        trace.vmTrace.toString(),
+        equals('#1      Foo.<anonymous closure> ($uri:10:20)\n'
+            '#2      bar (http://dartlang.org/foo.dart:0:0)\n'
+            '#3      baz (dart:async:15:0)\n'));
   });
 
   group("folding", () {
-    test('.terse folds core frames together bottom-up', () {
-      var trace = new Trace.parse('''
+    group(".terse", () {
+      test('folds core frames together bottom-up', () {
+        var trace = new Trace.parse('''
 #1 top (dart:async/future.dart:0:2)
 #2 bottom (dart:core/uri.dart:1:100)
 #0 notCore (foo.dart:42:21)
@@ -304,30 +299,30 @@
 #5 alsoNotCore (bar.dart:10:20)
 ''');
 
-      expect(trace.terse.toString(), equals('''
+        expect(trace.terse.toString(), equals('''
 dart:core       bottom
 foo.dart 42:21  notCore
 dart:async      bottom
 bar.dart 10:20  alsoNotCore
 '''));
-    });
+      });
 
-    test('.terse folds empty async frames', () {
-      var trace = new Trace.parse('''
+      test('folds empty async frames', () {
+        var trace = new Trace.parse('''
 #0 top (dart:async/future.dart:0:2)
 #1 empty.<<anonymous closure>_async_body> (bar.dart)
 #2 bottom (dart:async-patch/future.dart:9:11)
 #3 notCore (foo.dart:42:21)
 ''');
 
-      expect(trace.terse.toString(), equals('''
+        expect(trace.terse.toString(), equals('''
 dart:async      bottom
 foo.dart 42:21  notCore
 '''));
-    });
+      });
 
-    test('.terse removes the bottom-most async frame', () {
-      var trace = new Trace.parse('''
+      test('removes the bottom-most async frame', () {
+        var trace = new Trace.parse('''
 #0 notCore (foo.dart:42:21)
 #1 top (dart:async/future.dart:0:2)
 #2 bottom (dart:core/uri.dart:1:100)
@@ -335,28 +330,30 @@
 #4 bottom (dart:async-patch/future.dart:9:11)
 ''');
 
-      expect(trace.terse.toString(), equals('''
+        expect(trace.terse.toString(), equals('''
 foo.dart 42:21  notCore
 '''));
-    });
+      });
 
-    test(".terse won't make a trace empty", () {
-      var trace = new Trace.parse('''
+      test("won't make a trace empty", () {
+        var trace = new Trace.parse('''
 #1 top (dart:async/future.dart:0:2)
 #2 bottom (dart:core/uri.dart:1:100)
 ''');
 
-      expect(trace.terse.toString(), equals('''
+        expect(trace.terse.toString(), equals('''
 dart:core  bottom
 '''));
+      });
+
+      test("won't panic on an empty trace", () {
+        expect(new Trace.parse("").terse.toString(), equals(""));
+      });
     });
 
-    test(".terse won't panic on an empty trace", () {
-      expect(new Trace.parse("").terse.toString(), equals(""));
-    });
-
-    test('.foldFrames folds frames together bottom-up', () {
-      var trace = new Trace.parse('''
+    group(".foldFrames", () {
+      test('folds frames together bottom-up', () {
+        var trace = new Trace.parse('''
 #0 notFoo (foo.dart:42:21)
 #1 fooTop (bar.dart:0:2)
 #2 fooBottom (foo.dart:1:100)
@@ -365,17 +362,33 @@
 #5 fooBottom (dart:async-patch/future.dart:9:11)
 ''');
 
-      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'));
-      expect(folded.toString(), equals('''
+        var folded =
+            trace.foldFrames((frame) => frame.member.startsWith('foo'));
+        expect(folded.toString(), equals('''
 foo.dart 42:21                     notFoo
 foo.dart 1:100                     fooBottom
 bar.dart 10:20                     alsoNotFoo
 dart:async-patch/future.dart 9:11  fooBottom
 '''));
-    });
+      });
 
-    test('.foldFrames with terse: true folds core frames as well', () {
-      var trace = new Trace.parse('''
+      test('will never fold unparsed frames', () {
+        var trace = new Trace.parse(r'''
+.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
+%+j-?uppx<([j@#nu{{>*+$%x-={`{
+!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+''');
+
+        expect(trace.foldFrames((frame) => true).toString(), equals(r'''
+.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
+%+j-?uppx<([j@#nu{{>*+$%x-={`{
+!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+'''));
+      });
+
+      group("with terse: true", () {
+        test('folds core frames as well', () {
+          var trace = new Trace.parse('''
 #0 notFoo (foo.dart:42:21)
 #1 fooTop (bar.dart:0:2)
 #2 coreBottom (dart:async/future.dart:0:2)
@@ -384,47 +397,55 @@
 #5 coreBottom (dart:async-patch/future.dart:9:11)
 ''');
 
-      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'),
-          terse: true);
-      expect(folded.toString(), equals('''
+          var folded = trace.foldFrames(
+              (frame) => frame.member.startsWith('foo'),
+              terse: true);
+          expect(folded.toString(), equals('''
 foo.dart 42:21  notFoo
 dart:async      coreBottom
 bar.dart 10:20  alsoNotFoo
 '''));
-    });
+        });
 
-    test('.foldFrames with terse: true shortens folded frames', () {
-      var trace = new Trace.parse('''
+        test('shortens folded frames', () {
+          var trace = new Trace.parse('''
 #0 notFoo (foo.dart:42:21)
 #1 fooTop (bar.dart:0:2)
 #2 fooBottom (package:foo/bar.dart:0:2)
 #3 alsoNotFoo (bar.dart:10:20)
 #4 fooTop (foo.dart:9:11)
 #5 fooBottom (foo/bar.dart:9:11)
+#6 againNotFoo (bar.dart:20:20)
 ''');
 
-      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'),
-          terse: true);
-      expect(folded.toString(), equals('''
+          var folded = trace.foldFrames(
+              (frame) => frame.member.startsWith('foo'),
+              terse: true);
+          expect(folded.toString(), equals('''
 foo.dart 42:21  notFoo
 package:foo     fooBottom
 bar.dart 10:20  alsoNotFoo
 foo             fooBottom
+bar.dart 20:20  againNotFoo
 '''));
-    });
+        });
 
-    test('.foldFrames will never fold unparsed frames', () {
-      var trace = new Trace.parse(r'''
-.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
-%+j-?uppx<([j@#nu{{>*+$%x-={`{
-!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+        test('removes the bottom-most folded frame', () {
+          var trace = new Trace.parse('''
+#2 fooTop (package:foo/bar.dart:0:2)
+#3 notFoo (bar.dart:10:20)
+#5 fooBottom (foo/bar.dart:9:11)
 ''');
 
-      expect(trace.foldFrames((frame) => true).toString(), equals(r'''
-.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
-%+j-?uppx<([j@#nu{{>*+$%x-={`{
-!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+          var folded = trace.foldFrames(
+              (frame) => frame.member.startsWith('foo'),
+              terse: true);
+          expect(folded.toString(), equals('''
+package:foo     fooTop
+bar.dart 10:20  notFoo
 '''));
+        });
+      });
     });
   });
 }
diff --git a/packages/stack_trace/test/utils.dart b/packages/stack_trace/test/utils.dart
index 912f8f4..0241b37 100644
--- a/packages/stack_trace/test/utils.dart
+++ b/packages/stack_trace/test/utils.dart
@@ -2,17 +2,15 @@
 // for 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 stack_trace.test.utils;
-
 import 'package:test/test.dart';
 
 /// Returns a matcher that runs [matcher] against a [Frame]'s `member` field.
 Matcher frameMember(matcher) =>
-  transform((frame) => frame.member, matcher, 'member');
+    transform((frame) => frame.member, matcher, 'member');
 
 /// Returns a matcher that runs [matcher] against a [Frame]'s `library` field.
 Matcher frameLibrary(matcher) =>
-  transform((frame) => frame.library, matcher, 'library');
+    transform((frame) => frame.library, matcher, 'library');
 
 /// Returns a matcher that runs [transformation] on its input, then matches
 /// the output against [matcher].
@@ -20,7 +18,7 @@
 /// [description] should be a noun phrase that describes the relation of the
 /// output of [transformation] to its input.
 Matcher transform(transformation(value), matcher, String description) =>
-  new _TransformMatcher(transformation, wrapMatcher(matcher), description);
+    new _TransformMatcher(transformation, wrapMatcher(matcher), description);
 
 class _TransformMatcher extends Matcher {
   final Function _transformation;
@@ -30,8 +28,8 @@
   _TransformMatcher(this._transformation, this._matcher, this._description);
 
   bool matches(item, Map matchState) =>
-    _matcher.matches(_transformation(item), matchState);
+      _matcher.matches(_transformation(item), matchState);
 
   Description describe(Description description) =>
-    description.add(_description).add(' ').addDescriptionOf(_matcher);
+      description.add(_description).add(' ').addDescriptionOf(_matcher);
 }
diff --git a/packages/stack_trace/test/vm_test.dart b/packages/stack_trace/test/vm_test.dart
index 947f14b..1b53458 100644
--- a/packages/stack_trace/test/vm_test.dart
+++ b/packages/stack_trace/test/vm_test.dart
@@ -12,21 +12,11 @@
 import 'package:stack_trace/stack_trace.dart';
 import 'package:test/test.dart';
 
-String getStackTraceString() {
-  try {
-    throw '';
-  } catch (_, stackTrace) {
-    return stackTrace.toString();
-  }
-}
+// The name of this (trivial) function is verified as part of the test
+String getStackTraceString() => StackTrace.current.toString();
 
-StackTrace getStackTraceObject() {
-  try {
-    throw '';
-  } catch (_, stackTrace) {
-    return stackTrace;
-  }
-}
+// The name of this (trivial) function is verified as part of the test
+StackTrace getStackTraceObject() => StackTrace.current;
 
 Frame getCaller([int level]) {
   if (level == null) return new Frame.caller();
diff --git a/packages/string_scanner/.analysis_options b/packages/string_scanner/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/string_scanner/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/string_scanner/CHANGELOG.md b/packages/string_scanner/CHANGELOG.md
index 23f911c..83ca15b 100644
--- a/packages/string_scanner/CHANGELOG.md
+++ b/packages/string_scanner/CHANGELOG.md
@@ -1,3 +1,35 @@
+## 1.0.2
+
+* `SpanScanner` no longer crashes when creating a span that contains a UTF-16
+  surrogate pair.
+
+## 1.0.1
+
+* Fix the error text emitted by `StringScanner.expectChar()`.
+
+## 1.0.0
+
+* **Breaking change**: `StringScanner.error()`'s `length` argument now defaults
+  to `0` rather than `1` when no match data is available.
+
+* **Breaking change**: `StringScanner.lastMatch` and related methods are now
+  reset when the scanner's position changes without producing a new match.
+
+**Note**: While the changes in `1.0.0` are user-visible, they're unlikely to
+actually break any code in practice. Unless you know that your package is
+incompatible with 0.1.x, consider using 0.1.5 as your lower bound rather
+than 1.0.0. For example, `string_scanner: ">=0.1.5 <2.0.0"`.
+
+## 0.1.5
+
+* Add `new SpanScanner.within()`, which scans within a existing `FileSpan`.
+
+* Add `StringScanner.scanChar()` and `StringScanner.expectChar()`.
+
+## 0.1.4+1
+
+* Remove the dependency on `path`, since we don't actually import it.
+
 ## 0.1.4
 
 * Add `new SpanScanner.eager()` for creating a `SpanScanner` that eagerly
diff --git a/packages/string_scanner/lib/src/eager_span_scanner.dart b/packages/string_scanner/lib/src/eager_span_scanner.dart
index 3fae5cc..f80dce5 100644
--- a/packages/string_scanner/lib/src/eager_span_scanner.dart
+++ b/packages/string_scanner/lib/src/eager_span_scanner.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.eager_span_scanner;
-
 import 'package:charcode/ascii.dart';
 
 import 'line_scanner.dart';
@@ -69,15 +67,26 @@
   EagerSpanScanner(String string, {sourceUrl, int position})
       : super(string, sourceUrl: sourceUrl, position: position);
 
+  bool scanChar(int character) {
+    if (!super.scanChar(character)) return false;
+    _adjustLineAndColumn(character);
+    return true;
+  }
+
   int readChar() {
-    var char = super.readChar();
-    if (char == $lf || (char == $cr && peekChar() != $lf)) {
+    var character = super.readChar();
+    _adjustLineAndColumn(character);
+    return character;
+  }
+
+  /// Adjusts [_line] and [_column] after having consumed [character].
+  void _adjustLineAndColumn(int character) {
+    if (character == $lf || (character == $cr && peekChar() != $lf)) {
       _line += 1;
       _column = 0;
     } else {
       _column += 1;
     }
-    return char;
   }
 
   bool scan(Pattern pattern) {
diff --git a/packages/string_scanner/lib/src/exception.dart b/packages/string_scanner/lib/src/exception.dart
index 50177d6..84bf5e8 100644
--- a/packages/string_scanner/lib/src/exception.dart
+++ b/packages/string_scanner/lib/src/exception.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.exception;
-
 import 'package:source_span/source_span.dart';
 
 /// An exception thrown by a [StringScanner] that failed to parse a string.
diff --git a/packages/string_scanner/lib/src/line_scanner.dart b/packages/string_scanner/lib/src/line_scanner.dart
index 66d7575..06f1cbc 100644
--- a/packages/string_scanner/lib/src/line_scanner.dart
+++ b/packages/string_scanner/lib/src/line_scanner.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.line_scanner;
-
 import 'package:charcode/ascii.dart';
 
 import 'string_scanner.dart';
@@ -28,6 +26,8 @@
   /// This can be used to efficiently save and restore the state of the scanner
   /// when backtracking. A given [LineScannerState] is only valid for the
   /// [LineScanner] that created it.
+  ///
+  /// This does not include the scanner's match information.
   LineScannerState get state =>
       new LineScannerState._(this, position, line, column);
 
@@ -75,15 +75,26 @@
   LineScanner(String string, {sourceUrl, int position})
       : super(string, sourceUrl: sourceUrl, position: position);
 
+  bool scanChar(int character) {
+    if (!super.scanChar(character)) return false;
+    _adjustLineAndColumn(character);
+    return true;
+  }
+
   int readChar() {
-    var char = super.readChar();
-    if (char == $lf || (char == $cr && peekChar() != $lf)) {
+    var character = super.readChar();
+    _adjustLineAndColumn(character);
+    return character;
+  }
+
+  /// Adjusts [_line] and [_column] after having consumed [character].
+  void _adjustLineAndColumn(int character) {
+    if (character == $lf || (character == $cr && peekChar() != $lf)) {
       _line += 1;
       _column = 0;
     } else {
       _column += 1;
     }
-    return char;
   }
 
   bool scan(Pattern pattern) {
diff --git a/packages/string_scanner/lib/src/relative_span_scanner.dart b/packages/string_scanner/lib/src/relative_span_scanner.dart
new file mode 100644
index 0000000..fdcd03f
--- /dev/null
+++ b/packages/string_scanner/lib/src/relative_span_scanner.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:source_span/source_span.dart';
+
+import 'exception.dart';
+import 'line_scanner.dart';
+import 'span_scanner.dart';
+import 'string_scanner.dart';
+import 'utils.dart';
+
+/// A [SpanScanner] that scans within an existing [FileSpan].
+///
+/// This re-implements chunks of [SpanScanner] rather than using a dummy span or
+/// inheritance because scanning is often a performance-critical operation, so
+/// it's important to avoid adding extra overhead when relative scanning isn't
+/// needed.
+class RelativeSpanScanner extends StringScanner implements SpanScanner {
+  /// The source of the scanner.
+  ///
+  /// This caches line break information and is used to generate [Span]s.
+  final SourceFile _sourceFile;
+
+  /// The start location of the span within which this scanner is scanning.
+  ///
+  /// This is used to convert between span-relative and file-relative fields.
+  final FileLocation _startLocation;
+
+  int get line => _sourceFile.getLine(_startLocation.offset + position) -
+      _startLocation.line;
+
+  int get column {
+    var line = _sourceFile.getLine(_startLocation.offset + position);
+    var column = _sourceFile.getColumn(_startLocation.offset + position,
+        line: line);
+    return line == _startLocation.line
+        ? column - _startLocation.column
+        : column;
+  }
+
+  LineScannerState get state => new _SpanScannerState(this, position);
+
+  set state(LineScannerState state) {
+    if (state is! _SpanScannerState ||
+        !identical((state as _SpanScannerState)._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    this.position = state.position;
+  }
+
+  FileSpan get lastSpan => _lastSpan;
+  FileSpan _lastSpan;
+
+  FileLocation get location =>
+      _sourceFile.location(_startLocation.offset + position);
+
+  FileSpan get emptySpan => location.pointSpan();
+
+  RelativeSpanScanner(FileSpan span)
+      : _sourceFile = span.file,
+        _startLocation = span.start,
+        super(span.text, sourceUrl: span.sourceUrl);
+
+  FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
+    var endPosition = endState == null ? position : endState.position;
+    return _sourceFile.span(
+        _startLocation.offset + startState.position,
+        _startLocation.offset + endPosition);
+  }
+
+  bool matches(Pattern pattern) {
+    if (!super.matches(pattern)) {
+      _lastSpan = null;
+      return false;
+    }
+
+    _lastSpan = _sourceFile.span(
+        _startLocation.offset + position,
+        _startLocation.offset + lastMatch.end);
+    return true;
+  }
+
+  void error(String message, {Match match, int position, int length}) {
+    validateErrorArgs(string, match, position, length);
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var span = _sourceFile.span(
+        _startLocation.offset + position,
+        _startLocation.offset + position + length);
+    throw new StringScannerException(message, span, string);
+  }
+}
+
+/// A class representing the state of a [SpanScanner].
+class _SpanScannerState implements LineScannerState {
+  /// The [SpanScanner] that created this.
+  final RelativeSpanScanner _scanner;
+
+  final int position;
+  int get line => _scanner._sourceFile.getLine(position);
+  int get column => _scanner._sourceFile.getColumn(position);
+
+  _SpanScannerState(this._scanner, this.position);
+}
diff --git a/packages/string_scanner/lib/src/span_scanner.dart b/packages/string_scanner/lib/src/span_scanner.dart
index ebe230d..f362223 100644
--- a/packages/string_scanner/lib/src/span_scanner.dart
+++ b/packages/string_scanner/lib/src/span_scanner.dart
@@ -2,13 +2,12 @@
 // for 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 string_scanner.span_scanner;
-
 import 'package:source_span/source_span.dart';
 
 import 'eager_span_scanner.dart';
 import 'exception.dart';
 import 'line_scanner.dart';
+import 'relative_span_scanner.dart';
 import 'string_scanner.dart';
 import 'utils.dart';
 
@@ -39,7 +38,10 @@
   ///
   /// This is the span for the entire match. There's no way to get spans for
   /// subgroups since [Match] exposes no information about their positions.
-  FileSpan get lastSpan => _lastSpan;
+  FileSpan get lastSpan {
+    if (lastMatch == null) _lastSpan = null;
+    return _lastSpan;
+  }
   FileSpan _lastSpan;
 
   /// The current location of the scanner.
@@ -54,7 +56,7 @@
   /// [FileSpan]s as well as for error reporting. It can be a [String], a
   /// [Uri], or `null`.
   SpanScanner(String string, {sourceUrl, int position})
-      : _sourceFile = new SourceFile(string, url: sourceUrl),
+      : _sourceFile = new SourceFile.fromString(string, url: sourceUrl),
         super(string, sourceUrl: sourceUrl, position: position);
 
   /// Creates a new [SpanScanner] that eagerly computes line and column numbers.
@@ -71,6 +73,14 @@
   factory SpanScanner.eager(String string, {sourceUrl, int position}) =
       EagerSpanScanner;
 
+  /// Creates a new [SpanScanner] that scans within [span].
+  ///
+  /// This scans through [span.text], but emits new spans from [span.file] in
+  /// their appropriate relative positions. The [string] field contains only
+  /// [span.text], and [position], [line], and [column] are all relative to the
+  /// span.
+  factory SpanScanner.within(FileSpan span) = RelativeSpanScanner;
+
   /// Creates a [FileSpan] representing the source range between [startState]
   /// and the current position.
   FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
@@ -95,7 +105,7 @@
     if (position == null) {
       position = match == null ? this.position : match.start;
     }
-    if (length == null) length = match == null ? 1 : match.end - match.start;
+    if (length == null) length = match == null ? 0 : match.end - match.start;
 
     var span = _sourceFile.span(position, position + length);
     throw new StringScannerException(message, span, string);
diff --git a/packages/string_scanner/lib/src/string_scanner.dart b/packages/string_scanner/lib/src/string_scanner.dart
index d9c1c2f..712292c 100644
--- a/packages/string_scanner/lib/src/string_scanner.dart
+++ b/packages/string_scanner/lib/src/string_scanner.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.string_scanner;
-
+import 'package:charcode/charcode.dart';
 import 'package:source_span/source_span.dart';
 
 import 'exception.dart';
@@ -33,14 +32,21 @@
     }
 
     _position = position;
+    _lastMatch = null;
   }
   int _position = 0;
 
   /// The data about the previous match made by the scanner.
   ///
   /// If the last match failed, this will be `null`.
-  Match get lastMatch => _lastMatch;
+  Match get lastMatch {
+    // Lazily unset [_lastMatch] so that we avoid extra assignments in
+    // character-by-character methods that are used in core loops.
+    if (_position != _lastMatchPosition) _lastMatch = null;
+    return _lastMatch;
+  }
   Match _lastMatch;
+  int _lastMatchPosition;
 
   /// The portion of the string that hasn't yet been scanned.
   String get rest => string.substring(position);
@@ -81,13 +87,48 @@
     return string.codeUnitAt(index);
   }
 
+  /// If the next character in the string is [character], consumes it.
+  ///
+  /// Returns whether or not [character] was consumed.
+  bool scanChar(int character) {
+    if (isDone) return false;
+    if (string.codeUnitAt(_position) != character) return false;
+    _position++;
+    return true;
+  }
+
+  /// If the next character in the string is [character], consumes it.
+  ///
+  /// If [character] could not be consumed, throws a [FormatException]
+  /// describing the position of the failure. [name] is used in this error as
+  /// the expected name of the character being matched; if it's `null`, the
+  /// character itself is used instead.
+  void expectChar(int character, {String name}) {
+    if (scanChar(character)) return;
+
+    if (name == null) {
+      if (character == $backslash) {
+        name = r'"\"';
+      } else if (character == $double_quote) {
+        name = r'"\""';
+      } else {
+        name = '"${new String.fromCharCode(character)}"';
+      }
+    }
+
+    _fail(name);
+  }
+
   /// If [pattern] matches at the current position of the string, scans forward
   /// until the end of the match.
   ///
   /// Returns whether or not [pattern] matched.
   bool scan(Pattern pattern) {
     var success = matches(pattern);
-    if (success) _position = _lastMatch.end;
+    if (success) {
+      _position = _lastMatch.end;
+      _lastMatchPosition = _position;
+    }
     return success;
   }
 
@@ -128,6 +169,7 @@
   /// This doesn't move the scan pointer forward.
   bool matches(Pattern pattern) {
     _lastMatch = pattern.matchAsPrefix(string, position);
+    _lastMatchPosition = _position;
     return _lastMatch != null;
   }
 
@@ -150,7 +192,7 @@
   ///
   /// If [position] and/or [length] are passed, they are used as the error span
   /// instead. If only [length] is passed, [position] defaults to the current
-  /// position; if only [position] is passed, [length] defaults to 1.
+  /// position; if only [position] is passed, [length] defaults to 0.
   ///
   /// It's an error to pass [match] at the same time as [position] or [length].
   void error(String message, {Match match, int position, int length}) {
@@ -160,9 +202,9 @@
     if (position == null) {
       position = match == null ? this.position : match.start;
     }
-    if (length == null) length = match == null ? 1 : match.end - match.start;
+    if (length == null) length = match == null ? 0 : match.end - match.start;
 
-    var sourceFile = new SourceFile(string, url: sourceUrl);
+    var sourceFile = new SourceFile.fromString(string, url: sourceUrl);
     var span = sourceFile.span(position, position + length);
     throw new StringScannerException(message, span, string);
   }
diff --git a/packages/string_scanner/lib/src/utils.dart b/packages/string_scanner/lib/src/utils.dart
index 107c4c5..aa3e957 100644
--- a/packages/string_scanner/lib/src/utils.dart
+++ b/packages/string_scanner/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.utils;
-
 /// Validates the arguments passed to [StringScanner.error].
 void validateErrorArgs(String string, Match match, int position, int length) {
   if (match != null && (position != null || length != null)) {
diff --git a/packages/string_scanner/lib/string_scanner.dart b/packages/string_scanner/lib/string_scanner.dart
index be294f4..7f36eef 100644
--- a/packages/string_scanner/lib/string_scanner.dart
+++ b/packages/string_scanner/lib/string_scanner.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// A library for parsing strings using a sequence of patterns.
-library string_scanner;
-
 export 'src/exception.dart';
 export 'src/line_scanner.dart';
 export 'src/span_scanner.dart';
diff --git a/packages/string_scanner/pubspec.yaml b/packages/string_scanner/pubspec.yaml
index 35b3fe0..f0862ee 100644
--- a/packages/string_scanner/pubspec.yaml
+++ b/packages/string_scanner/pubspec.yaml
@@ -1,13 +1,12 @@
 name: string_scanner
-version: 0.1.4
+version: 1.0.2
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/string_scanner
 description: >
   A class for parsing strings using a sequence of patterns.
 dependencies:
   charcode: "^1.1.0"
-  path: "^1.2.0"
-  source_span: "^1.0.0"
+  source_span: "^1.4.0"
 dev_dependencies:
   test: ">=0.12.0 <0.13.0"
 environment:
diff --git a/packages/string_scanner/test/error_test.dart b/packages/string_scanner/test/error_test.dart
index 9c485e5..166077d 100644
--- a/packages/string_scanner/test/error_test.dart
+++ b/packages/string_scanner/test/error_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.error_test;
-
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
@@ -61,11 +59,11 @@
   });
 
   group("with position and/or length", () {
-    test('defaults to length 1', () {
+    test('defaults to length 0', () {
       var scanner = new StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1),
-          throwsStringScannerException('o'));
+          throwsStringScannerException(''));
     });
 
     test('defaults to the current position', () {
diff --git a/packages/string_scanner/test/line_scanner_test.dart b/packages/string_scanner/test/line_scanner_test.dart
index 68e5c38..ed04b37 100644
--- a/packages/string_scanner/test/line_scanner_test.dart
+++ b/packages/string_scanner/test/line_scanner_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.line_scanner_test;
-
+import 'package:charcode/charcode.dart';
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
@@ -82,6 +81,39 @@
     });
   });
 
+  group("scanChar()", () {
+    test("on a non-newline character increases the column but not the line",
+        () {
+      scanner.scanChar($f);
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(1));
+    });
+
+    test("consuming a newline resets the column and increases the line", () {
+      scanner.expect('foo');
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+
+      scanner.scanChar($lf);
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(0));
+    });
+
+    test("consuming halfway through a CR LF doesn't count as a line", () {
+      scanner.expect('foo\nbar');
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(3));
+
+      scanner.scanChar($cr);
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(4));
+
+      scanner.scanChar($lf);
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(0));
+    });
+  });
+
   group("position=", () {
     test("forward through newlines sets the line and column", () {
       scanner.position = 10; // "foo\nbar\r\nb"
diff --git a/packages/string_scanner/test/span_scanner_test.dart b/packages/string_scanner/test/span_scanner_test.dart
index 114bff7..ab3cc80 100644
--- a/packages/string_scanner/test/span_scanner_test.dart
+++ b/packages/string_scanner/test/span_scanner_test.dart
@@ -2,18 +2,105 @@
 // for 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 string_scanner.span_scanner_test;
-
+import 'package:source_span/source_span.dart';
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
+import 'utils.dart';
+
 void main() {
-  testForImplementation("lazy", () {
-    return new SpanScanner('foo\nbar\nbaz', sourceUrl: 'source');
+  testForImplementation("lazy", ([string]) {
+    return new SpanScanner(string ?? 'foo\nbar\nbaz', sourceUrl: 'source');
   });
 
-  testForImplementation("eager", () {
-    return new SpanScanner.eager('foo\nbar\nbaz', sourceUrl: 'source');
+  testForImplementation("eager", ([string]) {
+    return new SpanScanner.eager(string ?? 'foo\nbar\nbaz',
+        sourceUrl: 'source');
+  });
+
+  group("within", () {
+    var text = 'first\nbefore: foo\nbar\nbaz :after\nlast';
+    var startOffset = text.indexOf('foo');
+
+    var scanner;
+    setUp(() {
+      var file = new SourceFile.fromString(text, url: 'source');
+      scanner = new SpanScanner.within(
+          file.span(startOffset, text.indexOf(' :after')));
+    });
+
+    test("string only includes the span text", () {
+      expect(scanner.string, equals("foo\nbar\nbaz"));
+    });
+
+    test("line and column are span-relative", () {
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(0));
+
+      scanner.scan("foo");
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+
+      scanner.scan("\n");
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(0));
+    });
+
+    test("tracks the span for the last match", () {
+      scanner.scan('fo');
+      scanner.scan('o\nba');
+
+      var span = scanner.lastSpan;
+      expect(span.start.offset, equals(startOffset + 2));
+      expect(span.start.line, equals(1));
+      expect(span.start.column, equals(10));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.end.offset, equals(startOffset + 6));
+      expect(span.end.line, equals(2));
+      expect(span.end.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.text, equals('o\nba'));
+    });
+
+    test(".spanFrom() returns a span from a previous state", () {
+      scanner.scan('fo');
+      var state = scanner.state;
+      scanner.scan('o\nba');
+      scanner.scan('r\nba');
+
+      var span = scanner.spanFrom(state);
+      expect(span.text, equals('o\nbar\nba'));
+    });
+
+    test(".emptySpan returns an empty span at the current location", () {
+      scanner.scan('foo\nba');
+
+      var span = scanner.emptySpan;
+      expect(span.start.offset, equals(startOffset + 6));
+      expect(span.start.line, equals(2));
+      expect(span.start.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.end.offset, equals(startOffset + 6));
+      expect(span.end.line, equals(2));
+      expect(span.end.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.text, equals(''));
+    });
+
+    test(".error() uses an absolute span", () {
+      scanner.expect("foo");
+      expect(() => scanner.error('oh no!'),
+          throwsStringScannerException("foo"));
+    });
+
+    test(".isDone returns true at the end of the span", () {
+      scanner.expect("foo\nbar\nbaz");
+      expect(scanner.isDone, isTrue);
+    });
   });
 }
 
@@ -50,6 +137,15 @@
       expect(span.text, equals('o\nbar\nba'));
     });
 
+    test(".spanFrom() handles surrogate pairs correctly", () {
+      scanner = create('fo\u{12345}o');
+      scanner.scan('fo');
+      var state = scanner.state;
+      scanner.scan('\u{12345}o');
+      var span = scanner.spanFrom(state);
+      expect(span.text, equals('\u{12345}o'));
+    });
+
     test(".emptySpan returns an empty span at the current location", () {
       scanner.scan('foo\nba');
 
diff --git a/packages/string_scanner/test/string_scanner_test.dart b/packages/string_scanner/test/string_scanner_test.dart
index c8e43a5..55ffa0a 100644
--- a/packages/string_scanner/test/string_scanner_test.dart
+++ b/packages/string_scanner/test/string_scanner_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.string_scanner_test;
-
+import 'package:charcode/charcode.dart';
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
@@ -43,6 +42,18 @@
       expect(scanner.position, equals(0));
     });
 
+    test("scanChar returns false and doesn't change the state", () {
+      expect(scanner.scanChar($f), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("expectChar fails and doesn't change the state", () {
+      expect(() => scanner.expectChar($f), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
     test("scan returns false and doesn't change the state", () {
       expect(scanner.scan(new RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
@@ -119,6 +130,30 @@
       expect(scanner.position, equals(0));
     });
 
+    test("a matching scanChar returns true moves forward", () {
+      expect(scanner.scanChar($f), isTrue);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(1));
+    });
+
+    test("a non-matching scanChar returns false and does nothing", () {
+      expect(scanner.scanChar($x), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("a matching expectChar moves forward", () {
+      scanner.expectChar($f);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(1));
+    });
+
+    test("a non-matching expectChar fails", () {
+      expect(() => scanner.expectChar($x), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
     test("a matching scan returns true and changes the state", () {
       expect(scanner.scan(new RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
@@ -226,6 +261,32 @@
     });
   });
 
+  group('after a scan', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+      expect(scanner.scan('foo'), isTrue);
+    });
+
+    test('readChar returns the first character and unsets the last match', () {
+      expect(scanner.readChar(), equals($space));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(4));
+    });
+
+    test('a matching scanChar returns true and unsets the last match', () {
+      expect(scanner.scanChar($space), isTrue);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(4));
+    });
+
+    test('a matching expectChar returns true and unsets the last match', () {
+      scanner.expectChar($space);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(4));
+    });
+  });
+
   group('at the end of a string', () {
     var scanner;
     setUp(() {
@@ -258,6 +319,18 @@
       expect(scanner.position, equals(7));
     });
 
+    test("scanChar returns false and doesn't change the state", () {
+      expect(scanner.scanChar($f), isFalse);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("expectChar fails and doesn't change the state", () {
+      expect(() => scanner.expectChar($f), throwsFormatException);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
     test("scan returns false and sets lastMatch to null", () {
       expect(scanner.scan(new RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
@@ -299,6 +372,13 @@
       expect(scanner.rest, equals('bar'));
     });
 
+    test('setting and resetting position clears lastMatch', () {
+      var oldPosition = scanner.position;
+      scanner.position = 1;
+      scanner.position = oldPosition;
+      expect(scanner.lastMatch, isNull);
+    });
+
     test('setting position beyond the string throws an ArgumentError', () {
       expect(() {
         scanner.position = 8;
diff --git a/packages/string_scanner/test/utils.dart b/packages/string_scanner/test/utils.dart
index 8df4b51..471b4c8 100644
--- a/packages/string_scanner/test/utils.dart
+++ b/packages/string_scanner/test/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library string_scanner.test.utils;
-
 import 'package:string_scanner/string_scanner.dart';
 import 'package:test/test.dart';
 
diff --git a/packages/template_binding/.gitignore b/packages/template_binding/.gitignore
deleted file mode 100644
index e979170..0000000
--- a/packages/template_binding/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Don’t commit the following directories created by pub.
-.pub
-build/
-packages
-
-# Or the files created by dart2js.
-*.dart.js
-*.dart.precompiled.js
-*.js_
-*.js.deps
-*.js.map
-*.sw?
-.idea/
-.pub/
-
-# Include when developing application packages.
-pubspec.lock
diff --git a/packages/template_binding/.status b/packages/template_binding/.status
deleted file mode 100644
index 289df1e..0000000
--- a/packages/template_binding/.status
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Don't run any test-like files that show up in packages directories. It
-# shouldn't be necessary to run "pub install" in these packages, but if you do
-# it shouldn't break the tests.
-*/packages/*/*: Skip
-*/*/packages/*/*: Skip
-*/*/*/packages/*/*: Skip
-*/*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
-
-[ $runtime == ie10 ]
-build/test/custom_element_bindings_test: Pass, RuntimeError # Issue 20714
-build/test/template_binding_test: Pass, RuntimeError # Issue 19265
-
-[ $runtime == vm ]
-test/*: Skip
-build/*: Skip
-
-[ $compiler == dart2js ]
-test/*: Skip # use pub-build to invoke dart2js instead
diff --git a/packages/template_binding/AUTHORS b/packages/template_binding/AUTHORS
deleted file mode 100644
index 0617765..0000000
--- a/packages/template_binding/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/packages/template_binding/CHANGELOG.md b/packages/template_binding/CHANGELOG.md
deleted file mode 100644
index 6696689..0000000
--- a/packages/template_binding/CHANGELOG.md
+++ /dev/null
@@ -1,62 +0,0 @@
-#### Pub version 0.14.0+2
-  * Update `web_components` dependency.
-
-#### Pub version 0.14.0+1
-  * Update `observe` dependency.
-
-#### Pub version 0.14.0
-  * Up to date with release 0.5.1 ([TemplateBinding#d2bddc4][d2bddc4]).
-  * The `js/patches_mdv.js` file is now named `js/flush.js`.
-
-#### Pub version 0.13.1
-  * Up to date with release 0.4.2 ([TemplateBinding#35b7880][35b7880]).
-  * Widen web_components version constraint to include 0.9.0.
-
-#### Pub version 0.13.0+1
-  * Widen web_components version constraint.
-
-#### Pub version 0.13.0
-  * Up to date with [TemplateBinding#41e95ea][41e95ea] (release 0.4.0)
-  * Using this package now requires some additional javascript polyfills, that
-    were moved out of platform.js. These files are listed under lib/js, and all
-    are required in addition to platform.js from the web_components package.
-
-#### Pub version 0.12.1
-  * Up to date with [TemplateBinding#6a2808c][6a2808c] (release 0.3.5)
-
-#### Pub version 0.12.0+4
-  * Widen the dependency constraint on `observe`.
-
-#### Pub version 0.12.0+3
-  * fix bug in interop layer to ensure callbacks are run in the dirty-checking
-    zone (this only affected running code directly in Dartium without running
-    pub-build or pub-serve)
-
-#### Pub version 0.12.0
-  * NodeBind interop support. This allows elements such as Polymer's
-    core-elements and paper-elements to work properly with Dart binding paths,
-    including using Elements and functions as values, and two-way bindings.
-  * NodeBind is no longer ported. It now comes from
-    packages/web_components/platform.js
-  * Up to date with [TemplateBinding#d9f4543][d9f4543] (release 0.3.4)
-
-#### Pub version 0.11.0
-  * Ported up to commit [TemplateBinding#5b9a3b][5b9a3b] and
-    [NodeBind#c47bc1][c47bc1].
-
-#### Pub version 0.10.0
-  * Applied patch to throw errors asynchronously if property path evaluation
-    fails.
-  * Applied patch matching commit [51df59][] (fix parser to avoid allocating
-    PropertyPath if there is a non-null delegateFn).
-  * Ported up to commit [TemplateBinding#99e52d][99e52d] and
-    [NodeBind#f7cc76][f7cc76].
-
-[41e95ea]: https://github.com/Polymer/TemplateBinding/commit/41e95ea0e4b45543a29ea5240cd4f0defc7208c1
-[35b7880]: https://github.com/Polymer/TemplateBinding/commit/35b78809b80b65f96466e30e8853b944b545303f
-[d9f4543]: https://github.com/Polymer/TemplateBinding/commit/d9f4543dc06935824bfd43564c442b0897ce1c54
-[5b9a3b]: https://github.com/Polymer/TemplateBinding/commit/5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
-[c47bc1]: https://github.com/Polymer/NodeBind/commit/c47bc1b40d1cf0123b29620820a7111471e83ff3
-[51df59]: https://github.com/Polymer/TemplateBinding/commit/51df59c16e0922dec041cfe604016aac00918d5d
-[99e52d]: https://github.com/Polymer/TemplateBinding/commit/99e52dd7fbaefdaee9807648d1d6097eb3e99eda
-[f7cc76]: https://github.com/Polymer/NodeBind/commit/f7cc76749e509e06fa7cbc9ba970f87f5fe33b5c
diff --git a/packages/template_binding/LICENSE b/packages/template_binding/LICENSE
deleted file mode 100644
index 65ee1c1..0000000
--- a/packages/template_binding/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor 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, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
\ No newline at end of file
diff --git a/packages/template_binding/PATENTS b/packages/template_binding/PATENTS
deleted file mode 100644
index e120963..0000000
--- a/packages/template_binding/PATENTS
+++ /dev/null
@@ -1,23 +0,0 @@
-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/packages/template_binding/codereview.settings b/packages/template_binding/codereview.settings
deleted file mode 100644
index 39ffa4f..0000000
--- a/packages/template_binding/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/core-elements/commit/
-CC_LIST: reviews@dartlang.org
diff --git a/packages/template_binding/lib/js/flush.js b/packages/template_binding/lib/js/flush.js
deleted file mode 100644
index 61da3a8..0000000
--- a/packages/template_binding/lib/js/flush.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-/**
- * @class Polymer
- */
-
-// imports
-var endOfMicrotask = scope.endOfMicrotask;
-
-// logging
-var log = window.WebComponents ? WebComponents.flags.log : {};
-
-// inject style sheet
-var style = document.createElement('style');
-style.textContent = 'template {display: none !important;} /* injected by platform.js */';
-var head = document.querySelector('head');
-head.insertBefore(style, head.firstChild);
-
-
-/**
- * Force any pending data changes to be observed before 
- * the next task. Data changes are processed asynchronously but are guaranteed
- * to be processed, for example, before paintin. This method should rarely be 
- * needed. It does nothing when Object.observe is available; 
- * when Object.observe is not available, Polymer automatically flushes data 
- * changes approximately every 1/10 second. 
- * Therefore, `flush` should only be used when a data mutation should be 
- * observed sooner than this.
- * 
- * @method flush
- */
-// flush (with logging)
-var flushing;
-function flush() {
-  if (!flushing) {
-    flushing = true;
-    endOfMicrotask(function() {
-      flushing = false;
-      log.data && console.group('flush');
-      Platform.performMicrotaskCheckpoint();
-      log.data && console.groupEnd();
-    });
-  }
-};
-
-// polling dirty checker
-// flush periodically if platform does not have object observe.
-if (!Observer.hasObjectObserve) {
-  var FLUSH_POLL_INTERVAL = 125;
-  window.addEventListener('WebComponentsReady', function() {
-    flush();
-    // watch document visiblity to toggle dirty-checking
-    var visibilityHandler = function() {
-      // only flush if the page is visibile
-      if (document.visibilityState === 'hidden') {
-        if (scope.flushPoll) {
-          clearInterval(scope.flushPoll);
-        }
-      } else {
-        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
-      }
-    };
-    if (typeof document.visibilityState === 'string') {
-      document.addEventListener('visibilitychange', visibilityHandler);
-    }
-    visibilityHandler();
-  });
-} else {
-  // make flush a no-op when we have Object.observe
-  flush = function() {};
-}
-
-if (window.CustomElements && !CustomElements.useNative) {
-  var originalImportNode = Document.prototype.importNode;
-  Document.prototype.importNode = function(node, deep) {
-    var imported = originalImportNode.call(this, node, deep);
-    CustomElements.upgradeAll(imported);
-    return imported;
-  };
-}
-
-// exports
-scope.flush = flush;
-// bc
-Platform.flush = flush;
-
-})(window.Polymer);
-
diff --git a/packages/template_binding/lib/js/microtask.js b/packages/template_binding/lib/js/microtask.js
deleted file mode 100644
index ad954e3..0000000
--- a/packages/template_binding/lib/js/microtask.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-var iterations = 0;
-var callbacks = [];
-var twiddle = document.createTextNode('');
-
-function endOfMicrotask(callback) {
-  twiddle.textContent = iterations++;
-  callbacks.push(callback);
-}
-
-function atEndOfMicrotask() {
-  while (callbacks.length) {
-    callbacks.shift()();
-  }
-}
-
-new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
-  .observe(twiddle, {characterData: true})
-  ;
-
-// exports
-scope.endOfMicrotask = endOfMicrotask;
-// bc 
-Platform.endOfMicrotask = endOfMicrotask;
-
-})(Polymer);
-
diff --git a/packages/template_binding/lib/js/node_bind.js b/packages/template_binding/lib/js/node_bind.js
deleted file mode 100644
index 270c557..0000000
--- a/packages/template_binding/lib/js/node_bind.js
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-// Code distributed by Google as part of the polymer project is also
-// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-(function(global) {
-  'use strict';
-
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-
-  function getTreeScope(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-
-    return typeof node.getElementById === 'function' ? node : null;
-  }
-
-  Node.prototype.bind = function(name, observable) {
-    console.error('Unhandled binding to Node: ', this, name, observable);
-  };
-
-  Node.prototype.bindFinished = function() {};
-
-  function updateBindings(node, name, binding) {
-    var bindings = node.bindings_;
-    if (!bindings)
-      bindings = node.bindings_ = {};
-
-    if (bindings[name])
-      binding[name].close();
-
-    return bindings[name] = binding;
-  }
-
-  function returnBinding(node, name, binding) {
-    return binding;
-  }
-
-  function sanitizeValue(value) {
-    return value == null ? '' : value;
-  }
-
-  function updateText(node, value) {
-    node.data = sanitizeValue(value);
-  }
-
-  function textBinding(node) {
-    return function(value) {
-      return updateText(node, value);
-    };
-  }
-
-  var maybeUpdateBindings = returnBinding;
-
-  Object.defineProperty(Platform, 'enableBindingsReflection', {
-    get: function() {
-      return maybeUpdateBindings === updateBindings;
-    },
-    set: function(enable) {
-      maybeUpdateBindings = enable ? updateBindings : returnBinding;
-      return enable;
-    },
-    configurable: true
-  });
-
-  Text.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'textContent')
-      return Node.prototype.bind.call(this, name, value, oneTime);
-
-    if (oneTime)
-      return updateText(this, value);
-
-    var observable = value;
-    updateText(this, observable.open(textBinding(this)));
-    return maybeUpdateBindings(this, name, observable);
-  }
-
-  function updateAttribute(el, name, conditional, value) {
-    if (conditional) {
-      if (value)
-        el.setAttribute(name, '');
-      else
-        el.removeAttribute(name);
-      return;
-    }
-
-    el.setAttribute(name, sanitizeValue(value));
-  }
-
-  function attributeBinding(el, name, conditional) {
-    return function(value) {
-      updateAttribute(el, name, conditional, value);
-    };
-  }
-
-  Element.prototype.bind = function(name, value, oneTime) {
-    var conditional = name[name.length - 1] == '?';
-    if (conditional) {
-      this.removeAttribute(name);
-      name = name.slice(0, -1);
-    }
-
-    if (oneTime)
-      return updateAttribute(this, name, conditional, value);
-
-
-    var observable = value;
-    updateAttribute(this, name, conditional,
-        observable.open(attributeBinding(this, name, conditional)));
-
-    return maybeUpdateBindings(this, name, observable);
-  };
-
-  var checkboxEventType;
-  (function() {
-    // Attempt to feature-detect which event (change or click) is fired first
-    // for checkboxes.
-    var div = document.createElement('div');
-    var checkbox = div.appendChild(document.createElement('input'));
-    checkbox.setAttribute('type', 'checkbox');
-    var first;
-    var count = 0;
-    checkbox.addEventListener('click', function(e) {
-      count++;
-      first = first || 'click';
-    });
-    checkbox.addEventListener('change', function() {
-      count++;
-      first = first || 'change';
-    });
-
-    var event = document.createEvent('MouseEvent');
-    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
-        false, false, false, 0, null);
-    checkbox.dispatchEvent(event);
-    // WebKit/Blink don't fire the change event if the element is outside the
-    // document, so assume 'change' for that case.
-    checkboxEventType = count == 1 ? 'change' : first;
-  })();
-
-  function getEventForInputType(element) {
-    switch (element.type) {
-      case 'checkbox':
-        return checkboxEventType;
-      case 'radio':
-      case 'select-multiple':
-      case 'select-one':
-        return 'change';
-      case 'range':
-        if (/Trident|MSIE/.test(navigator.userAgent))
-          return 'change';
-      default:
-        return 'input';
-    }
-  }
-
-  function updateInput(input, property, value, santizeFn) {
-    input[property] = (santizeFn || sanitizeValue)(value);
-  }
-
-  function inputBinding(input, property, santizeFn) {
-    return function(value) {
-      return updateInput(input, property, value, santizeFn);
-    }
-  }
-
-  function noop() {}
-
-  function bindInputEvent(input, property, observable, postEventFn) {
-    var eventType = getEventForInputType(input);
-
-    function eventHandler() {
-      observable.setValue(input[property]);
-      observable.discardChanges();
-      (postEventFn || noop)(input);
-      Platform.performMicrotaskCheckpoint();
-    }
-    input.addEventListener(eventType, eventHandler);
-
-    return {
-      close: function() {
-        input.removeEventListener(eventType, eventHandler);
-        observable.close();
-      },
-
-      observable_: observable
-    }
-  }
-
-  function booleanSanitize(value) {
-    return Boolean(value);
-  }
-
-  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
-  // Returns an array containing all radio buttons other than |element| that
-  // have the same |name|, either in the form that |element| belongs to or,
-  // if no form, in the document tree to which |element| belongs.
-  //
-  // This implementation is based upon the HTML spec definition of a
-  // "radio button group":
-  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
-  //
-  function getAssociatedRadioButtons(element) {
-    if (element.form) {
-      return filter(element.form.elements, function(el) {
-        return el != element &&
-            el.tagName == 'INPUT' &&
-            el.type == 'radio' &&
-            el.name == element.name;
-      });
-    } else {
-      var treeScope = getTreeScope(element);
-      if (!treeScope)
-        return [];
-      var radios = treeScope.querySelectorAll(
-          'input[type="radio"][name="' + element.name + '"]');
-      return filter(radios, function(el) {
-        return el != element && !el.form;
-      });
-    }
-  }
-
-  function checkedPostEvent(input) {
-    // Only the radio button that is getting checked gets an event. We
-    // therefore find all the associated radio buttons and update their
-    // check binding manually.
-    if (input.tagName === 'INPUT' &&
-        input.type === 'radio') {
-      getAssociatedRadioButtons(input).forEach(function(radio) {
-        var checkedBinding = radio.bindings_.checked;
-        if (checkedBinding) {
-          // Set the value directly to avoid an infinite call stack.
-          checkedBinding.observable_.setValue(false);
-        }
-      });
-    }
-  }
-
-  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value' && name !== 'checked')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
-    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
-
-    if (oneTime)
-      return updateInput(this, name, value, sanitizeFn);
-
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable, postEventFn);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name, sanitizeFn)),
-                sanitizeFn);
-
-    // Checkboxes may need to update bindings of other checkboxes.
-    return updateBindings(this, name, binding);
-  }
-
-  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateInput(this, 'value', value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateInput(this, 'value',
-                observable.open(inputBinding(this, 'value', sanitizeValue)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  function updateOption(option, value) {
-    var parentNode = option.parentNode;;
-    var select;
-    var selectBinding;
-    var oldValue;
-    if (parentNode instanceof HTMLSelectElement &&
-        parentNode.bindings_ &&
-        parentNode.bindings_.value) {
-      select = parentNode;
-      selectBinding = select.bindings_.value;
-      oldValue = select.value;
-    }
-
-    option.value = sanitizeValue(value);
-
-    if (select && select.value != oldValue) {
-      selectBinding.observable_.setValue(select.value);
-      selectBinding.observable_.discardChanges();
-      Platform.performMicrotaskCheckpoint();
-    }
-  }
-
-  function optionBinding(option) {
-    return function(value) {
-      updateOption(option, value);
-    }
-  }
-
-  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateOption(this, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateOption(this, observable.open(optionBinding(this)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
-    if (name === 'selectedindex')
-      name = 'selectedIndex';
-
-    if (name !== 'selectedIndex' && name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-
-    if (oneTime)
-      return updateInput(this, name, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name)));
-
-    // Option update events may need to access select bindings.
-    return updateBindings(this, name, binding);
-  }
-})(this);
diff --git a/packages/template_binding/lib/js/observe.js b/packages/template_binding/lib/js/observe.js
deleted file mode 100644
index 6cd2ccb..0000000
--- a/packages/template_binding/lib/js/observe.js
+++ /dev/null
@@ -1,1711 +0,0 @@
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(global) {
-  'use strict';
-
-  var testingExposeCycleCount = global.testingExposeCycleCount;
-
-  // Detect and do basic sanity checking on Object/Array.observe.
-  function detectObjectObserve() {
-    if (typeof Object.observe !== 'function' ||
-        typeof Array.observe !== 'function') {
-      return false;
-    }
-
-    var records = [];
-
-    function callback(recs) {
-      records = recs;
-    }
-
-    var test = {};
-    var arr = [];
-    Object.observe(test, callback);
-    Array.observe(arr, callback);
-    test.id = 1;
-    test.id = 2;
-    delete test.id;
-    arr.push(1, 2);
-    arr.length = 0;
-
-    Object.deliverChangeRecords(callback);
-    if (records.length !== 5)
-      return false;
-
-    if (records[0].type != 'add' ||
-        records[1].type != 'update' ||
-        records[2].type != 'delete' ||
-        records[3].type != 'splice' ||
-        records[4].type != 'splice') {
-      return false;
-    }
-
-    Object.unobserve(test, callback);
-    Array.unobserve(arr, callback);
-
-    return true;
-  }
-
-  var hasObserve = detectObjectObserve();
-
-  function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-
-    // Firefox OS Apps do not allow eval. This feature detection is very hacky
-    // but even if some other platform adds support for this function this code
-    // will continue to work.
-    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
-      return false;
-    }
-
-    try {
-      var f = new Function('', 'return true;');
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-
-  var hasEval = detectEval();
-
-  function isIndex(s) {
-    return +s === s >>> 0 && s !== '';
-  }
-
-  function toNumber(s) {
-    return +s;
-  }
-
-  function isObject(obj) {
-    return obj === Object(obj);
-  }
-
-  var numberIsNaN = global.Number.isNaN || function(value) {
-    return typeof value === 'number' && global.isNaN(value);
-  }
-
-  function areSameValue(left, right) {
-    if (left === right)
-      return left !== 0 || 1 / left === 1 / right;
-    if (numberIsNaN(left) && numberIsNaN(right))
-      return true;
-
-    return left !== left && right !== right;
-  }
-
-  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;
-    };
-
-  var identStart = '[\$_a-zA-Z]';
-  var identPart = '[\$_a-zA-Z0-9]';
-  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
-
-  function getPathCharType(char) {
-    if (char === undefined)
-      return 'eof';
-
-    var code = char.charCodeAt(0);
-
-    switch(code) {
-      case 0x5B: // [
-      case 0x5D: // ]
-      case 0x2E: // .
-      case 0x22: // "
-      case 0x27: // '
-      case 0x30: // 0
-        return char;
-
-      case 0x5F: // _
-      case 0x24: // $
-        return 'ident';
-
-      case 0x20: // Space
-      case 0x09: // Tab
-      case 0x0A: // Newline
-      case 0x0D: // Return
-      case 0xA0:  // No-break space
-      case 0xFEFF:  // Byte Order Mark
-      case 0x2028:  // Line Separator
-      case 0x2029:  // Paragraph Separator
-        return 'ws';
-    }
-
-    // a-z, A-Z
-    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
-      return 'ident';
-
-    // 1-9
-    if (0x31 <= code && code <= 0x39)
-      return 'number';
-
-    return 'else';
-  }
-
-  var pathStateMachine = {
-    'beforePath': {
-      'ws': ['beforePath'],
-      'ident': ['inIdent', 'append'],
-      '[': ['beforeElement'],
-      'eof': ['afterPath']
-    },
-
-    'inPath': {
-      'ws': ['inPath'],
-      '.': ['beforeIdent'],
-      '[': ['beforeElement'],
-      'eof': ['afterPath']
-    },
-
-    'beforeIdent': {
-      'ws': ['beforeIdent'],
-      'ident': ['inIdent', 'append']
-    },
-
-    'inIdent': {
-      'ident': ['inIdent', 'append'],
-      '0': ['inIdent', 'append'],
-      'number': ['inIdent', 'append'],
-      'ws': ['inPath', 'push'],
-      '.': ['beforeIdent', 'push'],
-      '[': ['beforeElement', 'push'],
-      'eof': ['afterPath', 'push']
-    },
-
-    'beforeElement': {
-      'ws': ['beforeElement'],
-      '0': ['afterZero', 'append'],
-      'number': ['inIndex', 'append'],
-      "'": ['inSingleQuote', 'append', ''],
-      '"': ['inDoubleQuote', 'append', '']
-    },
-
-    'afterZero': {
-      'ws': ['afterElement', 'push'],
-      ']': ['inPath', 'push']
-    },
-
-    'inIndex': {
-      '0': ['inIndex', 'append'],
-      'number': ['inIndex', 'append'],
-      'ws': ['afterElement'],
-      ']': ['inPath', 'push']
-    },
-
-    'inSingleQuote': {
-      "'": ['afterElement'],
-      'eof': ['error'],
-      'else': ['inSingleQuote', 'append']
-    },
-
-    'inDoubleQuote': {
-      '"': ['afterElement'],
-      'eof': ['error'],
-      'else': ['inDoubleQuote', 'append']
-    },
-
-    'afterElement': {
-      'ws': ['afterElement'],
-      ']': ['inPath', 'push']
-    }
-  }
-
-  function noop() {}
-
-  function parsePath(path) {
-    var keys = [];
-    var index = -1;
-    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
-
-    var actions = {
-      push: function() {
-        if (key === undefined)
-          return;
-
-        keys.push(key);
-        key = undefined;
-      },
-
-      append: function() {
-        if (key === undefined)
-          key = newChar
-        else
-          key += newChar;
-      }
-    };
-
-    function maybeUnescapeQuote() {
-      if (index >= path.length)
-        return;
-
-      var nextChar = path[index + 1];
-      if ((mode == 'inSingleQuote' && nextChar == "'") ||
-          (mode == 'inDoubleQuote' && nextChar == '"')) {
-        index++;
-        newChar = nextChar;
-        actions.append();
-        return true;
-      }
-    }
-
-    while (mode) {
-      index++;
-      c = path[index];
-
-      if (c == '\\' && maybeUnescapeQuote(mode))
-        continue;
-
-      type = getPathCharType(c);
-      typeMap = pathStateMachine[mode];
-      transition = typeMap[type] || typeMap['else'] || 'error';
-
-      if (transition == 'error')
-        return; // parse error;
-
-      mode = transition[0];
-      action = actions[transition[1]] || noop;
-      newChar = transition[2] === undefined ? c : transition[2];
-      action();
-
-      if (mode === 'afterPath') {
-        return keys;
-      }
-    }
-
-    return; // parse error
-  }
-
-  function isIdent(s) {
-    return identRegExp.test(s);
-  }
-
-  var constructorIsPrivate = {};
-
-  function Path(parts, privateToken) {
-    if (privateToken !== constructorIsPrivate)
-      throw Error('Use Path.get to retrieve path objects');
-
-    for (var i = 0; i < parts.length; i++) {
-      this.push(String(parts[i]));
-    }
-
-    if (hasEval && this.length) {
-      this.getValueFrom = this.compiledGetValueFromFn();
-    }
-  }
-
-  // TODO(rafaelw): Make simple LRU cache
-  var pathCache = {};
-
-  function getPath(pathString) {
-    if (pathString instanceof Path)
-      return pathString;
-
-    if (pathString == null || pathString.length == 0)
-      pathString = '';
-
-    if (typeof pathString != 'string') {
-      if (isIndex(pathString.length)) {
-        // Constructed with array-like (pre-parsed) keys
-        return new Path(pathString, constructorIsPrivate);
-      }
-
-      pathString = String(pathString);
-    }
-
-    var path = pathCache[pathString];
-    if (path)
-      return path;
-
-    var parts = parsePath(pathString);
-    if (!parts)
-      return invalidPath;
-
-    var path = new Path(parts, constructorIsPrivate);
-    pathCache[pathString] = path;
-    return path;
-  }
-
-  Path.get = getPath;
-
-  function formatAccessor(key) {
-    if (isIndex(key)) {
-      return '[' + key + ']';
-    } else {
-      return '["' + key.replace(/"/g, '\\"') + '"]';
-    }
-  }
-
-  Path.prototype = createObject({
-    __proto__: [],
-    valid: true,
-
-    toString: function() {
-      var pathString = '';
-      for (var i = 0; i < this.length; i++) {
-        var key = this[i];
-        if (isIdent(key)) {
-          pathString += i ? '.' + key : key;
-        } else {
-          pathString += formatAccessor(key);
-        }
-      }
-
-      return pathString;
-    },
-
-    getValueFrom: function(obj, directObserver) {
-      for (var i = 0; i < this.length; i++) {
-        if (obj == null)
-          return;
-        obj = obj[this[i]];
-      }
-      return obj;
-    },
-
-    iterateObjects: function(obj, observe) {
-      for (var i = 0; i < this.length; i++) {
-        if (i)
-          obj = obj[this[i - 1]];
-        if (!isObject(obj))
-          return;
-        observe(obj, this[i]);
-      }
-    },
-
-    compiledGetValueFromFn: function() {
-      var str = '';
-      var pathString = 'obj';
-      str += 'if (obj != null';
-      var i = 0;
-      var key;
-      for (; i < (this.length - 1); i++) {
-        key = this[i];
-        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-        str += ' &&\n     ' + pathString + ' != null';
-      }
-      str += ')\n';
-
-      var key = this[i];
-      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-
-      str += '  return ' + pathString + ';\nelse\n  return undefined;';
-      return new Function('obj', str);
-    },
-
-    setValueFrom: function(obj, value) {
-      if (!this.length)
-        return false;
-
-      for (var i = 0; i < this.length - 1; i++) {
-        if (!isObject(obj))
-          return false;
-        obj = obj[this[i]];
-      }
-
-      if (!isObject(obj))
-        return false;
-
-      obj[this[i]] = value;
-      return true;
-    }
-  });
-
-  var invalidPath = new Path('', constructorIsPrivate);
-  invalidPath.valid = false;
-  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
-
-  var MAX_DIRTY_CHECK_CYCLES = 1000;
-
-  function dirtyCheck(observer) {
-    var cycles = 0;
-    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
-      cycles++;
-    }
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    return cycles > 0;
-  }
-
-  function objectIsEmpty(object) {
-    for (var prop in object)
-      return false;
-    return true;
-  }
-
-  function diffIsEmpty(diff) {
-    return objectIsEmpty(diff.added) &&
-           objectIsEmpty(diff.removed) &&
-           objectIsEmpty(diff.changed);
-  }
-
-  function diffObjectFromOldObject(object, oldObject) {
-    var added = {};
-    var removed = {};
-    var changed = {};
-
-    for (var prop in oldObject) {
-      var newValue = object[prop];
-
-      if (newValue !== undefined && newValue === oldObject[prop])
-        continue;
-
-      if (!(prop in object)) {
-        removed[prop] = undefined;
-        continue;
-      }
-
-      if (newValue !== oldObject[prop])
-        changed[prop] = newValue;
-    }
-
-    for (var prop in object) {
-      if (prop in oldObject)
-        continue;
-
-      added[prop] = object[prop];
-    }
-
-    if (Array.isArray(object) && object.length !== oldObject.length)
-      changed.length = object.length;
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  var eomTasks = [];
-  function runEOMTasks() {
-    if (!eomTasks.length)
-      return false;
-
-    for (var i = 0; i < eomTasks.length; i++) {
-      eomTasks[i]();
-    }
-    eomTasks.length = 0;
-    return true;
-  }
-
-  var runEOM = hasObserve ? (function(){
-    return function(fn) {
-      return Promise.resolve().then(fn);
-    }
-  })() :
-  (function() {
-    return function(fn) {
-      eomTasks.push(fn);
-    };
-  })();
-
-  var observedObjectCache = [];
-
-  function newObservedObject() {
-    var observer;
-    var object;
-    var discardRecords = false;
-    var first = true;
-
-    function callback(records) {
-      if (observer && observer.state_ === OPENED && !discardRecords)
-        observer.check_(records);
-    }
-
-    return {
-      open: function(obs) {
-        if (observer)
-          throw Error('ObservedObject in use');
-
-        if (!first)
-          Object.deliverChangeRecords(callback);
-
-        observer = obs;
-        first = false;
-      },
-      observe: function(obj, arrayObserve) {
-        object = obj;
-        if (arrayObserve)
-          Array.observe(object, callback);
-        else
-          Object.observe(object, callback);
-      },
-      deliver: function(discard) {
-        discardRecords = discard;
-        Object.deliverChangeRecords(callback);
-        discardRecords = false;
-      },
-      close: function() {
-        observer = undefined;
-        Object.unobserve(object, callback);
-        observedObjectCache.push(this);
-      }
-    };
-  }
-
-  /*
-   * The observedSet abstraction is a perf optimization which reduces the total
-   * number of Object.observe observations of a set of objects. The idea is that
-   * groups of Observers will have some object dependencies in common and this
-   * observed set ensures that each object in the transitive closure of
-   * dependencies is only observed once. The observedSet acts as a write barrier
-   * such that whenever any change comes through, all Observers are checked for
-   * changed values.
-   *
-   * Note that this optimization is explicitly moving work from setup-time to
-   * change-time.
-   *
-   * TODO(rafaelw): Implement "garbage collection". In order to move work off
-   * the critical path, when Observers are closed, their observed objects are
-   * not Object.unobserve(d). As a result, it's possible that if the observedSet
-   * is kept open, but some Observers have been closed, it could cause "leaks"
-   * (prevent otherwise collectable objects from being collected). At some
-   * point, we should implement incremental "gc" which keeps a list of
-   * observedSets which may need clean-up and does small amounts of cleanup on a
-   * timeout until all is clean.
-   */
-
-  function getObservedObject(observer, object, arrayObserve) {
-    var dir = observedObjectCache.pop() || newObservedObject();
-    dir.open(observer);
-    dir.observe(object, arrayObserve);
-    return dir;
-  }
-
-  var observedSetCache = [];
-
-  function newObservedSet() {
-    var observerCount = 0;
-    var observers = [];
-    var objects = [];
-    var rootObj;
-    var rootObjProps;
-
-    function observe(obj, prop) {
-      if (!obj)
-        return;
-
-      if (obj === rootObj)
-        rootObjProps[prop] = true;
-
-      if (objects.indexOf(obj) < 0) {
-        objects.push(obj);
-        Object.observe(obj, callback);
-      }
-
-      observe(Object.getPrototypeOf(obj), prop);
-    }
-
-    function allRootObjNonObservedProps(recs) {
-      for (var i = 0; i < recs.length; i++) {
-        var rec = recs[i];
-        if (rec.object !== rootObj ||
-            rootObjProps[rec.name] ||
-            rec.type === 'setPrototype') {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    function callback(recs) {
-      if (allRootObjNonObservedProps(recs))
-        return;
-
-      var observer;
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.iterateObjects_(observe);
-        }
-      }
-
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.check_();
-        }
-      }
-    }
-
-    var record = {
-      objects: objects,
-      get rootObject() { return rootObj; },
-      set rootObject(value) {
-        rootObj = value;
-        rootObjProps = {};
-      },
-      open: function(obs, object) {
-        observers.push(obs);
-        observerCount++;
-        obs.iterateObjects_(observe);
-      },
-      close: function(obs) {
-        observerCount--;
-        if (observerCount > 0) {
-          return;
-        }
-
-        for (var i = 0; i < objects.length; i++) {
-          Object.unobserve(objects[i], callback);
-          Observer.unobservedCount++;
-        }
-
-        observers.length = 0;
-        objects.length = 0;
-        rootObj = undefined;
-        rootObjProps = undefined;
-        observedSetCache.push(this);
-        if (lastObservedSet === this)
-          lastObservedSet = null;
-      },
-    };
-
-    return record;
-  }
-
-  var lastObservedSet;
-
-  function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {
-      lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.rootObject = obj;
-    }
-    lastObservedSet.open(observer, obj);
-    return lastObservedSet;
-  }
-
-  var UNOPENED = 0;
-  var OPENED = 1;
-  var CLOSED = 2;
-  var RESETTING = 3;
-
-  var nextObserverId = 1;
-
-  function Observer() {
-    this.state_ = UNOPENED;
-    this.callback_ = undefined;
-    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
-    this.directObserver_ = undefined;
-    this.value_ = undefined;
-    this.id_ = nextObserverId++;
-  }
-
-  Observer.prototype = {
-    open: function(callback, target) {
-      if (this.state_ != UNOPENED)
-        throw Error('Observer has already been opened.');
-
-      addToAll(this);
-      this.callback_ = callback;
-      this.target_ = target;
-      this.connect_();
-      this.state_ = OPENED;
-      return this.value_;
-    },
-
-    close: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      removeFromAll(this);
-      this.disconnect_();
-      this.value_ = undefined;
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.state_ = CLOSED;
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      dirtyCheck(this);
-    },
-
-    report_: function(changes) {
-      try {
-        this.callback_.apply(this.target_, changes);
-      } catch (ex) {
-        Observer._errorThrownDuringCallback = true;
-        console.error('Exception caught during observer callback: ' +
-                       (ex.stack || ex));
-      }
-    },
-
-    discardChanges: function() {
-      this.check_(undefined, true);
-      return this.value_;
-    }
-  }
-
-  var collectObservers = !hasObserve;
-  var allObservers;
-  Observer._allObserversCount = 0;
-
-  if (collectObservers) {
-    allObservers = [];
-  }
-
-  function addToAll(observer) {
-    Observer._allObserversCount++;
-    if (!collectObservers)
-      return;
-
-    allObservers.push(observer);
-  }
-
-  function removeFromAll(observer) {
-    Observer._allObserversCount--;
-  }
-
-  var runningMicrotaskCheckpoint = false;
-
-  global.Platform = global.Platform || {};
-
-  global.Platform.performMicrotaskCheckpoint = function() {
-    if (runningMicrotaskCheckpoint)
-      return;
-
-    if (!collectObservers)
-      return;
-
-    runningMicrotaskCheckpoint = true;
-
-    var cycles = 0;
-    var anyChanged, toCheck;
-
-    do {
-      cycles++;
-      toCheck = allObservers;
-      allObservers = [];
-      anyChanged = false;
-
-      for (var i = 0; i < toCheck.length; i++) {
-        var observer = toCheck[i];
-        if (observer.state_ != OPENED)
-          continue;
-
-        if (observer.check_())
-          anyChanged = true;
-
-        allObservers.push(observer);
-      }
-      if (runEOMTasks())
-        anyChanged = true;
-    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
-
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    runningMicrotaskCheckpoint = false;
-  };
-
-  if (collectObservers) {
-    global.Platform.clearObservers = function() {
-      allObservers = [];
-    };
-  }
-
-  function ObjectObserver(object) {
-    Observer.call(this);
-    this.value_ = object;
-    this.oldObject_ = undefined;
-  }
-
-  ObjectObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    arrayObserve: false,
-
-    connect_: function(callback, target) {
-      if (hasObserve) {
-        this.directObserver_ = getObservedObject(this, this.value_,
-                                                 this.arrayObserve);
-      } else {
-        this.oldObject_ = this.copyObject(this.value_);
-      }
-
-    },
-
-    copyObject: function(object) {
-      var copy = Array.isArray(object) ? [] : {};
-      for (var prop in object) {
-        copy[prop] = object[prop];
-      };
-      if (Array.isArray(object))
-        copy.length = object.length;
-      return copy;
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var diff;
-      var oldValues;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-
-        oldValues = {};
-        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
-                                           oldValues);
-      } else {
-        oldValues = this.oldObject_;
-        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
-      }
-
-      if (diffIsEmpty(diff))
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([
-        diff.added || {},
-        diff.removed || {},
-        diff.changed || {},
-        function(property) {
-          return oldValues[property];
-        }
-      ]);
-
-      return true;
-    },
-
-    disconnect_: function() {
-      if (hasObserve) {
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-      } else {
-        this.oldObject_ = undefined;
-      }
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      if (hasObserve)
-        this.directObserver_.deliver(false);
-      else
-        dirtyCheck(this);
-    },
-
-    discardChanges: function() {
-      if (this.directObserver_)
-        this.directObserver_.deliver(true);
-      else
-        this.oldObject_ = this.copyObject(this.value_);
-
-      return this.value_;
-    }
-  });
-
-  function ArrayObserver(array) {
-    if (!Array.isArray(array))
-      throw Error('Provided object is not an Array');
-    ObjectObserver.call(this, array);
-  }
-
-  ArrayObserver.prototype = createObject({
-
-    __proto__: ObjectObserver.prototype,
-
-    arrayObserve: true,
-
-    copyObject: function(arr) {
-      return arr.slice();
-    },
-
-    check_: function(changeRecords) {
-      var splices;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-        splices = projectArraySplices(this.value_, changeRecords);
-      } else {
-        splices = calcSplices(this.value_, 0, this.value_.length,
-                              this.oldObject_, 0, this.oldObject_.length);
-      }
-
-      if (!splices || !splices.length)
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([splices]);
-      return true;
-    }
-  });
-
-  ArrayObserver.applySplices = function(previous, current, splices) {
-    splices.forEach(function(splice) {
-      var spliceArgs = [splice.index, splice.removed.length];
-      var addIndex = splice.index;
-      while (addIndex < splice.index + splice.addedCount) {
-        spliceArgs.push(current[addIndex]);
-        addIndex++;
-      }
-
-      Array.prototype.splice.apply(previous, spliceArgs);
-    });
-  };
-
-  function PathObserver(object, path) {
-    Observer.call(this);
-
-    this.object_ = object;
-    this.path_ = getPath(path);
-    this.directObserver_ = undefined;
-  }
-
-  PathObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    get path() {
-      return this.path_;
-    },
-
-    connect_: function() {
-      if (hasObserve)
-        this.directObserver_ = getObservedSet(this, this.object_);
-
-      this.check_(undefined, true);
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    iterateObjects_: function(observe) {
-      this.path_.iterateObjects(this.object_, observe);
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValue = this.value_;
-      this.value_ = this.path_.getValueFrom(this.object_);
-      if (skipChanges || areSameValue(this.value_, oldValue))
-        return false;
-
-      this.report_([this.value_, oldValue, this]);
-      return true;
-    },
-
-    setValue: function(newValue) {
-      if (this.path_)
-        this.path_.setValueFrom(this.object_, newValue);
-    }
-  });
-
-  function CompoundObserver(reportChangesOnOpen) {
-    Observer.call(this);
-
-    this.reportChangesOnOpen_ = reportChangesOnOpen;
-    this.value_ = [];
-    this.directObserver_ = undefined;
-    this.observed_ = [];
-  }
-
-  var observerSentinel = {};
-
-  CompoundObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      if (hasObserve) {
-        var object;
-        var needsDirectObserver = false;
-        for (var i = 0; i < this.observed_.length; i += 2) {
-          object = this.observed_[i]
-          if (object !== observerSentinel) {
-            needsDirectObserver = true;
-            break;
-          }
-        }
-
-        if (needsDirectObserver)
-          this.directObserver_ = getObservedSet(this, object);
-      }
-
-      this.check_(undefined, !this.reportChangesOnOpen_);
-    },
-
-    disconnect_: function() {
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        if (this.observed_[i] === observerSentinel)
-          this.observed_[i + 1].close();
-      }
-      this.observed_.length = 0;
-      this.value_.length = 0;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    addPath: function(object, path) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add paths once started.');
-
-      var path = getPath(path);
-      this.observed_.push(object, path);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = path.getValueFrom(object);
-    },
-
-    addObserver: function(observer) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add observers once started.');
-
-      this.observed_.push(observerSentinel, observer);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = observer.open(this.deliver, this);
-    },
-
-    startReset: function() {
-      if (this.state_ != OPENED)
-        throw Error('Can only reset while open');
-
-      this.state_ = RESETTING;
-      this.disconnect_();
-    },
-
-    finishReset: function() {
-      if (this.state_ != RESETTING)
-        throw Error('Can only finishReset after startReset');
-      this.state_ = OPENED;
-      this.connect_();
-
-      return this.value_;
-    },
-
-    iterateObjects_: function(observe) {
-      var object;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        object = this.observed_[i]
-        if (object !== observerSentinel)
-          this.observed_[i + 1].iterateObjects(object, observe)
-      }
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValues;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        var object = this.observed_[i];
-        var path = this.observed_[i+1];
-        var value;
-        if (object === observerSentinel) {
-          var observable = path;
-          value = this.state_ === UNOPENED ?
-              observable.open(this.deliver, this) :
-              observable.discardChanges();
-        } else {
-          value = path.getValueFrom(object);
-        }
-
-        if (skipChanges) {
-          this.value_[i / 2] = value;
-          continue;
-        }
-
-        if (areSameValue(value, this.value_[i / 2]))
-          continue;
-
-        oldValues = oldValues || [];
-        oldValues[i / 2] = this.value_[i / 2];
-        this.value_[i / 2] = value;
-      }
-
-      if (!oldValues)
-        return false;
-
-      // TODO(rafaelw): Having observed_ as the third callback arg here is
-      // pretty lame API. Fix.
-      this.report_([this.value_, oldValues, this.observed_]);
-      return true;
-    }
-  });
-
-  function identFn(value) { return value; }
-
-  function ObserverTransform(observable, getValueFn, setValueFn,
-                             dontPassThroughSet) {
-    this.callback_ = undefined;
-    this.target_ = undefined;
-    this.value_ = undefined;
-    this.observable_ = observable;
-    this.getValueFn_ = getValueFn || identFn;
-    this.setValueFn_ = setValueFn || identFn;
-    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
-    // at the moment because of a bug in it's dependency tracking.
-    this.dontPassThroughSet_ = dontPassThroughSet;
-  }
-
-  ObserverTransform.prototype = {
-    open: function(callback, target) {
-      this.callback_ = callback;
-      this.target_ = target;
-      this.value_ =
-          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
-      return this.value_;
-    },
-
-    observedCallback_: function(value) {
-      value = this.getValueFn_(value);
-      if (areSameValue(value, this.value_))
-        return;
-      var oldValue = this.value_;
-      this.value_ = value;
-      this.callback_.call(this.target_, this.value_, oldValue);
-    },
-
-    discardChanges: function() {
-      this.value_ = this.getValueFn_(this.observable_.discardChanges());
-      return this.value_;
-    },
-
-    deliver: function() {
-      return this.observable_.deliver();
-    },
-
-    setValue: function(value) {
-      value = this.setValueFn_(value);
-      if (!this.dontPassThroughSet_ && this.observable_.setValue)
-        return this.observable_.setValue(value);
-    },
-
-    close: function() {
-      if (this.observable_)
-        this.observable_.close();
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.observable_ = undefined;
-      this.value_ = undefined;
-      this.getValueFn_ = undefined;
-      this.setValueFn_ = undefined;
-    }
-  }
-
-  var expectedRecordTypes = {
-    add: true,
-    update: true,
-    delete: true
-  };
-
-  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
-    var added = {};
-    var removed = {};
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      if (!expectedRecordTypes[record.type]) {
-        console.error('Unknown changeRecord type: ' + record.type);
-        console.error(record);
-        continue;
-      }
-
-      if (!(record.name in oldValues))
-        oldValues[record.name] = record.oldValue;
-
-      if (record.type == 'update')
-        continue;
-
-      if (record.type == 'add') {
-        if (record.name in removed)
-          delete removed[record.name];
-        else
-          added[record.name] = true;
-
-        continue;
-      }
-
-      // type = 'delete'
-      if (record.name in added) {
-        delete added[record.name];
-        delete oldValues[record.name];
-      } else {
-        removed[record.name] = true;
-      }
-    }
-
-    for (var prop in added)
-      added[prop] = object[prop];
-
-    for (var prop in removed)
-      removed[prop] = undefined;
-
-    var changed = {};
-    for (var prop in oldValues) {
-      if (prop in added || prop in removed)
-        continue;
-
-      var newValue = object[prop];
-      if (oldValues[prop] !== newValue)
-        changed[prop] = newValue;
-    }
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  function newSplice(index, removed, addedCount) {
-    return {
-      index: index,
-      removed: removed,
-      addedCount: addedCount
-    };
-  }
-
-  var EDIT_LEAVE = 0;
-  var EDIT_UPDATE = 1;
-  var EDIT_ADD = 2;
-  var EDIT_DELETE = 3;
-
-  function ArraySplice() {}
-
-  ArraySplice.prototype = {
-
-    // Note: This function is *based* on the computation of the Levenshtein
-    // "edit" distance. The one change is that "updates" are treated as two
-    // edits - not one. With Array splices, an update is really a delete
-    // followed by an add. By retaining this, we optimize for "keeping" the
-    // maximum array items in the original array. For example:
-    //
-    //   'xxxx123' -> '123yyyy'
-    //
-    // With 1-edit updates, the shortest path would be just to update all seven
-    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
-    // leaves the substring '123' intact.
-    calcEditDistances: function(current, currentStart, currentEnd,
-                                old, oldStart, oldEnd) {
-      // "Deletion" columns
-      var rowCount = oldEnd - oldStart + 1;
-      var columnCount = currentEnd - currentStart + 1;
-      var distances = new Array(rowCount);
-
-      // "Addition" rows. Initialize null column.
-      for (var i = 0; i < rowCount; i++) {
-        distances[i] = new Array(columnCount);
-        distances[i][0] = i;
-      }
-
-      // Initialize null row
-      for (var j = 0; j < columnCount; j++)
-        distances[0][j] = j;
-
-      for (var i = 1; i < rowCount; i++) {
-        for (var j = 1; j < columnCount; j++) {
-          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
-            distances[i][j] = distances[i - 1][j - 1];
-          else {
-            var north = distances[i - 1][j] + 1;
-            var west = distances[i][j - 1] + 1;
-            distances[i][j] = north < west ? north : west;
-          }
-        }
-      }
-
-      return distances;
-    },
-
-    // This starts at the final weight, and walks "backward" by finding
-    // the minimum previous weight recursively until the origin of the weight
-    // matrix.
-    spliceOperationsFromEditDistances: function(distances) {
-      var i = distances.length - 1;
-      var j = distances[0].length - 1;
-      var current = distances[i][j];
-      var edits = [];
-      while (i > 0 || j > 0) {
-        if (i == 0) {
-          edits.push(EDIT_ADD);
-          j--;
-          continue;
-        }
-        if (j == 0) {
-          edits.push(EDIT_DELETE);
-          i--;
-          continue;
-        }
-        var northWest = distances[i - 1][j - 1];
-        var west = distances[i - 1][j];
-        var north = distances[i][j - 1];
-
-        var min;
-        if (west < north)
-          min = west < northWest ? west : northWest;
-        else
-          min = north < northWest ? north : northWest;
-
-        if (min == northWest) {
-          if (northWest == current) {
-            edits.push(EDIT_LEAVE);
-          } else {
-            edits.push(EDIT_UPDATE);
-            current = northWest;
-          }
-          i--;
-          j--;
-        } else if (min == west) {
-          edits.push(EDIT_DELETE);
-          i--;
-          current = west;
-        } else {
-          edits.push(EDIT_ADD);
-          j--;
-          current = north;
-        }
-      }
-
-      edits.reverse();
-      return edits;
-    },
-
-    /**
-     * Splice Projection functions:
-     *
-     * A splice map is a representation of how a previous array of items
-     * was transformed into a new array of items. Conceptually it is a list of
-     * tuples of
-     *
-     *   <index, removed, addedCount>
-     *
-     * which are kept in ascending index order of. The tuple represents that at
-     * the |index|, |removed| sequence of items were removed, and counting forward
-     * from |index|, |addedCount| items were added.
-     */
-
-    /**
-     * Lacking individual splice mutation information, the minimal set of
-     * splices can be synthesized given the previous state and final state of an
-     * array. The basic approach is to calculate the edit distance matrix and
-     * choose the shortest path through it.
-     *
-     * Complexity: O(l * p)
-     *   l: The length of the current array
-     *   p: The length of the old array
-     */
-    calcSplices: function(current, currentStart, currentEnd,
-                          old, oldStart, oldEnd) {
-      var prefixCount = 0;
-      var suffixCount = 0;
-
-      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-      if (currentStart == 0 && oldStart == 0)
-        prefixCount = this.sharedPrefix(current, old, minLength);
-
-      if (currentEnd == current.length && oldEnd == old.length)
-        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-
-      currentStart += prefixCount;
-      oldStart += prefixCount;
-      currentEnd -= suffixCount;
-      oldEnd -= suffixCount;
-
-      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
-        return [];
-
-      if (currentStart == currentEnd) {
-        var splice = newSplice(currentStart, [], 0);
-        while (oldStart < oldEnd)
-          splice.removed.push(old[oldStart++]);
-
-        return [ splice ];
-      } else if (oldStart == oldEnd)
-        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-
-      var ops = this.spliceOperationsFromEditDistances(
-          this.calcEditDistances(current, currentStart, currentEnd,
-                                 old, oldStart, oldEnd));
-
-      var splice = undefined;
-      var splices = [];
-      var index = currentStart;
-      var oldIndex = oldStart;
-      for (var i = 0; i < ops.length; i++) {
-        switch(ops[i]) {
-          case EDIT_LEAVE:
-            if (splice) {
-              splices.push(splice);
-              splice = undefined;
-            }
-
-            index++;
-            oldIndex++;
-            break;
-          case EDIT_UPDATE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-          case EDIT_ADD:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-            break;
-          case EDIT_DELETE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-        }
-      }
-
-      if (splice) {
-        splices.push(splice);
-      }
-      return splices;
-    },
-
-    sharedPrefix: function(current, old, searchLength) {
-      for (var i = 0; i < searchLength; i++)
-        if (!this.equals(current[i], old[i]))
-          return i;
-      return searchLength;
-    },
-
-    sharedSuffix: function(current, old, searchLength) {
-      var index1 = current.length;
-      var index2 = old.length;
-      var count = 0;
-      while (count < searchLength && this.equals(current[--index1], old[--index2]))
-        count++;
-
-      return count;
-    },
-
-    calculateSplices: function(current, previous) {
-      return this.calcSplices(current, 0, current.length, previous, 0,
-                              previous.length);
-    },
-
-    equals: function(currentValue, previousValue) {
-      return currentValue === previousValue;
-    }
-  };
-
-  var arraySplice = new ArraySplice();
-
-  function calcSplices(current, currentStart, currentEnd,
-                       old, oldStart, oldEnd) {
-    return arraySplice.calcSplices(current, currentStart, currentEnd,
-                                   old, oldStart, oldEnd);
-  }
-
-  function intersect(start1, end1, start2, end2) {
-    // Disjoint
-    if (end1 < start2 || end2 < start1)
-      return -1;
-
-    // Adjacent
-    if (end1 == start2 || end2 == start1)
-      return 0;
-
-    // Non-zero intersect, span1 first
-    if (start1 < start2) {
-      if (end1 < end2)
-        return end1 - start2; // Overlap
-      else
-        return end2 - start2; // Contained
-    } else {
-      // Non-zero intersect, span2 first
-      if (end2 < end1)
-        return end2 - start1; // Overlap
-      else
-        return end1 - start1; // Contained
-    }
-  }
-
-  function mergeSplice(splices, index, removed, addedCount) {
-
-    var splice = newSplice(index, removed, addedCount);
-
-    var inserted = false;
-    var insertionOffset = 0;
-
-    for (var i = 0; i < splices.length; i++) {
-      var current = splices[i];
-      current.index += insertionOffset;
-
-      if (inserted)
-        continue;
-
-      var intersectCount = intersect(splice.index,
-                                     splice.index + splice.removed.length,
-                                     current.index,
-                                     current.index + current.addedCount);
-
-      if (intersectCount >= 0) {
-        // Merge the two splices
-
-        splices.splice(i, 1);
-        i--;
-
-        insertionOffset -= current.addedCount - current.removed.length;
-
-        splice.addedCount += current.addedCount - intersectCount;
-        var deleteCount = splice.removed.length +
-                          current.removed.length - intersectCount;
-
-        if (!splice.addedCount && !deleteCount) {
-          // merged splice is a noop. discard.
-          inserted = true;
-        } else {
-          var removed = current.removed;
-
-          if (splice.index < current.index) {
-            // some prefix of splice.removed is prepended to current.removed.
-            var prepend = splice.removed.slice(0, current.index - splice.index);
-            Array.prototype.push.apply(prepend, removed);
-            removed = prepend;
-          }
-
-          if (splice.index + splice.removed.length > current.index + current.addedCount) {
-            // some suffix of splice.removed is appended to current.removed.
-            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
-            Array.prototype.push.apply(removed, append);
-          }
-
-          splice.removed = removed;
-          if (current.index < splice.index) {
-            splice.index = current.index;
-          }
-        }
-      } else if (splice.index < current.index) {
-        // Insert splice here.
-
-        inserted = true;
-
-        splices.splice(i, 0, splice);
-        i++;
-
-        var offset = splice.addedCount - splice.removed.length
-        current.index += offset;
-        insertionOffset += offset;
-      }
-    }
-
-    if (!inserted)
-      splices.push(splice);
-  }
-
-  function createInitialSplices(array, changeRecords) {
-    var splices = [];
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      switch(record.type) {
-        case 'splice':
-          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
-          break;
-        case 'add':
-        case 'update':
-        case 'delete':
-          if (!isIndex(record.name))
-            continue;
-          var index = toNumber(record.name);
-          if (index < 0)
-            continue;
-          mergeSplice(splices, index, [record.oldValue], 1);
-          break;
-        default:
-          console.error('Unexpected record type: ' + JSON.stringify(record));
-          break;
-      }
-    }
-
-    return splices;
-  }
-
-  function projectArraySplices(array, changeRecords) {
-    var splices = [];
-
-    createInitialSplices(array, changeRecords).forEach(function(splice) {
-      if (splice.addedCount == 1 && splice.removed.length == 1) {
-        if (splice.removed[0] !== array[splice.index])
-          splices.push(splice);
-
-        return
-      };
-
-      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
-                                           splice.removed, 0, splice.removed.length));
-    });
-
-    return splices;
-  }
-
-  // Export the observe-js object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, export as a global object.
-
-  var expose = global;
-
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      expose = exports = module.exports;
-    }
-    expose = exports;
-  } 
-
-  expose.Observer = Observer;
-  expose.Observer.runEOM_ = runEOM;
-  expose.Observer.observerSentinel_ = observerSentinel; // for testing.
-  expose.Observer.hasObjectObserve = hasObserve;
-  expose.ArrayObserver = ArrayObserver;
-  expose.ArrayObserver.calculateSplices = function(current, previous) {
-    return arraySplice.calculateSplices(current, previous);
-  };
-
-  expose.ArraySplice = ArraySplice;
-  expose.ObjectObserver = ObjectObserver;
-  expose.PathObserver = PathObserver;
-  expose.CompoundObserver = CompoundObserver;
-  expose.Path = Path;
-  expose.ObserverTransform = ObserverTransform;
-  
-})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
diff --git a/packages/template_binding/lib/src/binding_delegate.dart b/packages/template_binding/lib/src/binding_delegate.dart
deleted file mode 100644
index 215c9f3..0000000
--- a/packages/template_binding/lib/src/binding_delegate.dart
+++ /dev/null
@@ -1,78 +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 template_binding;
-
-/**
- * Template Bindings native features enables a wide-range of use cases,
- * but (by design) don't attempt to implement a wide array of specialized
- * behaviors.
- *
- * Enabling these features is a matter of implementing and registering a
- * BindingDelegate. A binding delegate is an object which contains one or more
- * delegation functions which implement specialized behavior. This object is
- * registered via [TemplateBindExtension.bindingDelegate]:
- *
- * HTML:
- *     <template bind>
- *       {{ What!Ever('crazy')->thing^^^I+Want(data) }}
- *     </template>
- *
- * Dart:
- *     class MySyntax extends BindingDelegate {
- *       prepareBinding(path, name, node) {
- *         // The magic happens here!
- *       }
- *     }
- *     ...
- *     templateBind(query('template'))
- *         ..bindingDelegate = new MySyntax()
- *         ..model = new MyModel();
- *
- *
- * See
- * <http://www.polymer-project.org/platform/template.html#binding-delegate-api>
- * for more information about the binding delegate.
- */
-// TODO(jmesserly): need better api docs here. The link above seems out of date.
-class BindingDelegate {
-  /**
-   * Prepares a binding. This is called immediately after parsing a mustache
-   * token with `{{ path }}` in the context of the [node] and the property named
-   * [name]. This should return a function that will be passed the actual
-   * node and model, and either returns null or an object with a `value`
-   * property. This allows the syntax to reinterpret the model for each binding.
-   */
-  PrepareBindingFunction prepareBinding(String path, String name, Node node)
-      => null;
-
-  /**
-   * Returns a function that can optionally replace the model that will be
-   * passed to [TemplateBindExtension.createInstance]. This can be used to
-   * implement syntax such as `<template repeat="{{ item in items }}">` by
-   * ensuring that the returned model has the "item" name available.
-   */
-  PrepareInstanceModelFunction prepareInstanceModel(Element template) => null;
-
-  /**
-   * Returns a function that will be called whenever the position of an item
-   * inside this template changes.
-   */
-  PrepareInstancePositionChangedFunction prepareInstancePositionChanged(
-      Element template) => null;
-
-  Expando<_InstanceBindingMap> _bindingMaps;
-
-  // TODO(jmesserly): if we have use this everywhere, we can avoid many
-  // delegate != null checks throughout the code, simplifying things.
-  // For now we just use it for _bindingMaps.
-  static final _DEFAULT = new BindingDelegate();
-}
-
-typedef PrepareBindingFunction(model, Node node, bool oneTime);
-
-typedef PrepareInstanceModelFunction(model);
-
-typedef PrepareInstancePositionChangedFunction(TemplateInstance instance,
-    int index);
diff --git a/packages/template_binding/lib/src/instance_binding_map.dart b/packages/template_binding/lib/src/instance_binding_map.dart
deleted file mode 100644
index bc4105a..0000000
--- a/packages/template_binding/lib/src/instance_binding_map.dart
+++ /dev/null
@@ -1,87 +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 template_binding;
-
-class _InstanceBindingMap {
-  final List bindings;
-  List<_InstanceBindingMap> children;
-  DocumentFragment content;
-
-  bool get isTemplate => false;
-
-  _InstanceBindingMap(this.bindings);
-
-  _InstanceBindingMap getChild(int index) {
-    if (children == null || index >= children.length) return null;
-    return children[index];
-  }
-}
-
-class _TemplateBindingMap extends _InstanceBindingMap {
-  bool get isTemplate => true;
-
-  MustacheTokens _if, _bind, _repeat;
-
-  _TemplateBindingMap(List bindings) : super(bindings);
-}
-
-_InstanceBindingMap _createInstanceBindingMap(Node node,
-    BindingDelegate delegate) {
-
-  _InstanceBindingMap map = _getBindings(node, delegate);
-  if (map == null) map = new _InstanceBindingMap([]);
-
-  List children = null;
-  int index = 0;
-  for (var c = node.firstChild; c != null; c = c.nextNode, index++) {
-    var childMap = _createInstanceBindingMap(c, delegate);
-    if (childMap == null) continue;
-
-    // TODO(jmesserly): use a sparse map instead?
-    if (children == null) children = new List(node.nodes.length);
-    children[index] = childMap;
-  }
-  map.children = children;
-
-  return map;
-}
-
-Node _cloneAndBindInstance(Node node, Node parent, Document stagingDocument,
-    _InstanceBindingMap bindings, model, BindingDelegate delegate,
-    List instanceBindings, [TemplateInstance instanceRecord]) {
-
-  var clone = parent.append(stagingDocument.importNode(node, false));
-
-  int i = 0;
-  for (var c = node.firstChild; c != null; c = c.nextNode, i++) {
-    var childMap = bindings != null ? bindings.getChild(i) : null;
-    _cloneAndBindInstance(c, clone, stagingDocument, childMap, model, delegate,
-        instanceBindings);
-  }
-
-  if (bindings.isTemplate) {
-    TemplateBindExtension.decorate(clone, node);
-    if (delegate != null) {
-      templateBindFallback(clone).bindingDelegate = delegate;
-    }
-  }
-
-  _processBindings(clone, bindings, model, instanceBindings);
-  return clone;
-}
-
-// TODO(rafaelw): Setup a MutationObserver on content which clears the expando
-// so that bindingMaps regenerate when template.content changes.
-_getInstanceBindingMap(DocumentFragment content, BindingDelegate delegate) {
-  if (delegate == null) delegate = BindingDelegate._DEFAULT;
-
-  if (delegate._bindingMaps == null) delegate._bindingMaps = new Expando();
-  var map = delegate._bindingMaps[content];
-  if (map == null) {
-    map = _createInstanceBindingMap(content, delegate);
-    delegate._bindingMaps[content] = map;
-  }
-  return map;
-}
diff --git a/packages/template_binding/lib/src/mustache_tokens.dart b/packages/template_binding/lib/src/mustache_tokens.dart
deleted file mode 100644
index c05dac1..0000000
--- a/packages/template_binding/lib/src/mustache_tokens.dart
+++ /dev/null
@@ -1,153 +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 template_binding.src.mustache_tokens;
-
-import 'package:observe/observe.dart';
-
-// Dart note: this was added to decouple the parse function below from the rest
-// of template_binding. This allows using this code in command-line tools as
-// well.
-typedef Function DelegateFunctionFactory(String pathString);
-
-/**
- * Represents a set of parsed tokens from a {{ mustache binding expression }}.
- * This can be created by calling [parse].
- *
- * For performance reasons the data is stored in one linear array in [_tokens].
- * This class wraps that array and provides accessors in an attempt to make the
- * pattern easier to understand. See [length] and [getText] for example.
- */
-class MustacheTokens {
-  // Constants for indexing into the exploded structs in [_tokens] .
-  static const _TOKEN_TEXT = 0;
-  static const _TOKEN_ONETIME = 1;
-  static const _TOKEN_PATH = 2;
-  static const _TOKEN_PREPAREFN = 3;
-  static const _TOKEN_SIZE = 4;
-
-  // There is 1 extra entry for the end text.
-  static const _TOKEN_ENDTEXT = 1;
-
-  bool get hasOnePath => _tokens.length == _TOKEN_SIZE + _TOKEN_ENDTEXT;
-  bool get isSimplePath => hasOnePath &&
-      _tokens[_TOKEN_TEXT] == '' && _tokens[_TOKEN_SIZE + _TOKEN_TEXT] == '';
-
-  /**
-   * [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one
-   * mustache.
-   */
-  final List _tokens;
-
-  final bool onlyOneTime;
-
-  // Dart note: I think this is cached in JavaScript to avoid an extra
-  // allocation per template instance. Seems reasonable, so we do the same.
-  Function _combinator;
-  Function get combinator => _combinator;
-
-  MustacheTokens._(this._tokens, this.onlyOneTime) {
-    // Should be: [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+].
-    assert((_tokens.length - _TOKEN_ENDTEXT) % _TOKEN_SIZE == 0);
-
-    _combinator = hasOnePath ? _singleCombinator : _listCombinator;
-  }
-
-  int get length => _tokens.length ~/ _TOKEN_SIZE;
-
-  /**
-   * Gets the [i]th text entry. Note that [length] can be passed to get the
-   * final text entry.
-   */
-  String getText(int i) => _tokens[i * _TOKEN_SIZE + _TOKEN_TEXT];
-
-  /** Gets the oneTime flag for the [i]th token. */
-  bool getOneTime(int i) => _tokens[i * _TOKEN_SIZE + _TOKEN_ONETIME];
-
-  /** Gets the path for the [i]th token. */
-  PropertyPath getPath(int i) => _tokens[i * _TOKEN_SIZE + _TOKEN_PATH];
-
-  /** Gets the prepareBinding function for the [i]th token. */
-  Function getPrepareBinding(int i) =>
-      _tokens[i * _TOKEN_SIZE + _TOKEN_PREPAREFN];
-
-
-  /**
-   * Parses {{ mustache }} bindings.
-   *
-   * Returns null if there are no matches. Otherwise returns the parsed tokens.
-   */
-  static MustacheTokens parse(String s, [DelegateFunctionFactory fnFactory]) {
-    if (s == null || s.isEmpty) return null;
-
-    var tokens = null;
-    var length = s.length;
-    var lastIndex = 0;
-    var onlyOneTime = true;
-    while (lastIndex < length) {
-      var startIndex = s.indexOf('{{', lastIndex);
-      var oneTimeStart = s.indexOf('[[', lastIndex);
-      var oneTime = false;
-      var terminator = '}}';
-
-      if (oneTimeStart >= 0 &&
-          (startIndex < 0 || oneTimeStart < startIndex)) {
-        startIndex = oneTimeStart;
-        oneTime = true;
-        terminator = ']]';
-      }
-
-      var endIndex = -1;
-      if (startIndex >= 0) {
-        endIndex = s.indexOf(terminator, startIndex + 2);
-      }
-
-      if (endIndex < 0) {
-        if (tokens == null) return null;
-
-        tokens.add(s.substring(lastIndex)); // TEXT
-        break;
-      }
-
-      if (tokens == null) tokens = [];
-      tokens.add(s.substring(lastIndex, startIndex)); // TEXT
-      var pathString = s.substring(startIndex + 2, endIndex).trim();
-      tokens.add(oneTime); // ONETIME?
-      onlyOneTime = onlyOneTime && oneTime;
-      var delegateFn = fnFactory == null ? null : fnFactory(pathString);
-      // Don't try to parse the expression if there's a prepareBinding function
-      if (delegateFn == null) {
-        tokens.add(new PropertyPath(pathString)); // PATH
-      } else {
-        tokens.add(null);
-      }
-      tokens.add(delegateFn); // DELEGATE_FN
-
-      lastIndex = endIndex + 2;
-    }
-
-    if (lastIndex == length) tokens.add(''); // TEXT
-
-    return new MustacheTokens._(tokens, onlyOneTime);
-  }
-
-
-  // Dart note: split "combinator" into the single/list variants, so the
-  // argument can be typed.
-  String _singleCombinator(Object value) {
-    if (value == null) value = '';
-    return '${getText(0)}$value${getText(length)}';
-  }
-
-  String _listCombinator(List<Object> values) {
-    var newValue = new StringBuffer(getText(0));
-    int len = this.length;
-    for (var i = 0; i < len; i++) {
-      var value = values[i];
-      if (value != null) newValue.write(value);
-      newValue.write(getText(i + 1));
-    }
-    return newValue.toString();
-  }
-}
diff --git a/packages/template_binding/lib/src/node.dart b/packages/template_binding/lib/src/node.dart
deleted file mode 100644
index fbcf96a..0000000
--- a/packages/template_binding/lib/src/node.dart
+++ /dev/null
@@ -1,200 +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 template_binding;
-
-/** Extensions to the [Node] API. */
-class NodeBindExtension {
-  final Node _node;
-  final JsObject _js;
-
-  NodeBindExtension._(node)
-      : _node = node,
-        _js = new JsObject.fromBrowserObject(node);
-
-  /**
-   * Gets the data bindings that are associated with this node, if any.
-   *
-   * This starts out null, and if [enableBindingsReflection] is enabled, calls
-   * to [bind] will initialize this field and the binding.
-   */
-  // Dart note: in JS this has a trailing underscore, meaning "private".
-  // But in dart if we made it _bindings, it wouldn't be accessible at all.
-  // It is unfortunately needed to implement Node.bind correctly.
-  Map<String, Bindable> get bindings {
-    var b = _js['bindings_'];
-    if (b == null) return null;
-    // TODO(jmesserly): should cache this for identity.
-    return new _NodeBindingsMap(_node, b);
-  }
-  
-  set bindings(Map<String, Bindable> value) {
-    if (value == null) {
-      _js.deleteProperty('bindings_');
-      return;
-    }
-    var b = bindings;
-    if (b == null) {
-      _js['bindings_'] = new JsObject.jsify({});
-      b = bindings;
-    }
-    b.addAll(value);
-  }
-
-  /**
-   * Binds the attribute [name] to [value]. [value] can be a simple value when
-   * [oneTime] is true, or a [Bindable] like [PathObserver].
-   * Returns the [Bindable] instance.
-   */
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    name = _dartToJsName(_node, name);
-
-    if (!oneTime && value is Bindable) {
-      value = bindableToJsObject(value);
-    }
-    return jsObjectToBindable(_js.callMethod('bind', [name, value, oneTime]));
-  }
-
-  /**
-   * Called when all [bind] calls are finished for a given template expansion.
-   */
-  bindFinished() => _js.callMethod('bindFinished');
-
-  // Note: confusingly this is on NodeBindExtension because it can be on any
-  // Node. It's really an API added by TemplateBinding. Therefore it stays
-  // implemented in Dart because TemplateBinding still is.
-  TemplateInstance _templateInstance;
-
-  /** Gets the template instance that instantiated this node, if any. */
-  TemplateInstance get templateInstance =>
-      _templateInstance != null ? _templateInstance :
-      (_node.parent != null ? nodeBind(_node.parent).templateInstance : null);
-}
-
-class _NodeBindingsMap extends MapBase<String, Bindable> {
-  final Node _node;
-  final JsObject _bindings;
-
-  _NodeBindingsMap(this._node, this._bindings);
-
-  // TODO(jmesserly): this should be lazy
-  Iterable<String> get keys =>
-      js.context['Object'].callMethod('keys', [_bindings]).map(
-          (name) => _jsToDartName(_node, name));
-
-  Bindable operator[](String name) =>
-      jsObjectToBindable(_bindings[_dartToJsName(_node, name)]);
-
-  operator[]=(String name, Bindable value) {
-    _bindings[_dartToJsName(_node, name)] = bindableToJsObject(value);
-  }
-
-  @override Bindable remove(String name) {
-    name = _dartToJsName(_node, name);
-    var old = this[name];
-    _bindings.deleteProperty(name);
-    return old;
-  }
-
-  @override void clear() {
-    // Notes: this implementation only works because our "keys" returns a copy.
-    // We could also make it O(1) by assigning a new JS object to the bindings_
-    // property, if performance is an issue.
-    keys.forEach(remove);
-  }
-}
-
-// TODO(jmesserly): perhaps we should switch Dart's Node.bind API back to
-// 'textContent' for consistency? This only affects the raw Node.bind API when
-// called on Text nodes, which is unlikely to be used except by TemplateBinding.
-// Seems like a lot of magic to support it. I don't think Node.bind promises any
-// strong relationship between properties and [name], so textContent seems fine.
-String _dartToJsName(Node node, String name) {
-  if (node is Text && name == 'text') name = 'textContent';
-  return name;
-}
-
-
-String _jsToDartName(Node node, String name) {
-  if (node is Text && name == 'textContent') name = 'text';
-  return name;
-}
-
-
-/// Given a bindable [JsObject], wraps it in a Dart [Bindable].
-/// See [bindableToJsObject] to go in the other direction.
-Bindable jsObjectToBindable(JsObject obj) {
-  if (obj == null) return null;
-  var b = obj['__dartBindable'];
-  // For performance, unwrap the Dart bindable if we find one.
-  // Note: in the unlikely event some code messes with our __dartBindable
-  // property we can simply fallback to a _JsBindable wrapper.
-  return b is Bindable ? b : new _JsBindable(obj);
-}
-
-class _JsBindable extends Bindable {
-  final JsObject _js;
-  _JsBindable(JsObject obj) : _js = obj;
-
-  open(callback) => _js.callMethod('open',
-      [Zone.current.bindUnaryCallback(callback)]);
-
-  close() => _js.callMethod('close');
-
-  get value => _js.callMethod('discardChanges');
-
-  set value(newValue) {
-    _js.callMethod('setValue', [newValue]);
-  }
-
-  deliver() => _js.callMethod('deliver');
-}
-
-/// Given a [bindable], create a JS object proxy for it.
-/// This is the inverse of [jsObjectToBindable].
-JsObject bindableToJsObject(Bindable bindable) {
-  if (bindable is _JsBindable) return bindable._js;
-
-  var zone = Zone.current;
-  inZone(f) => zone.bindCallback(f, runGuarded: false);
-  inZoneUnary(f) => zone.bindUnaryCallback(f, runGuarded: false);
-
-  return new JsObject.jsify({
-    'open': inZoneUnary(
-        (callback) => bindable.open((x) => callback.apply([x]))),
-    'close': inZone(() => bindable.close()),
-    'discardChanges': inZone(() => bindable.value),
-    'setValue': inZoneUnary((x) => bindable.value = x),
-    // NOTE: this is not used by Node.bind, but it's used by Polymer:
-    // https://github.com/Polymer/polymer-dev/blob/ba2b68fe5a5721f60b5994135f3270e63588809a/src/declaration/properties.js#L130
-    // Technically this works because 'deliver' is on PathObserver and
-    // CompoundObserver. But ideally Polymer-JS would not assume that.
-    'deliver': inZone(() => bindable.deliver()),
-    // Save this so we can return it from [jsObjectToBindable]
-    '__dartBindable': bindable
-  });
-}
-
-/** Information about the instantiated template. */
-class TemplateInstance {
-  // TODO(rafaelw): firstNode & lastNode should be read-synchronous
-  // in cases where script has modified the template instance boundary.
-
-  /** The first node of this template instantiation. */
-  Node get firstNode => _firstNode;
-
-  /**
-   * The last node of this template instantiation.
-   * This could be identical to [firstNode] if the template only expanded to a
-   * single node.
-   */
-  Node get lastNode => _lastNode;
-
-  /** The model used to instantiate the template. */
-  final model;
-
-  Node _firstNode, _lastNode;
-
-  TemplateInstance(this.model);
-}
diff --git a/packages/template_binding/lib/src/template.dart b/packages/template_binding/lib/src/template.dart
deleted file mode 100644
index 2dc7ac5..0000000
--- a/packages/template_binding/lib/src/template.dart
+++ /dev/null
@@ -1,536 +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 template_binding;
-
-/** Extensions to [Element]s that behave as templates. */
-class TemplateBindExtension extends NodeBindExtension {
-  var _model;
-  BindingDelegate _bindingDelegate;
-  _TemplateIterator _iterator;
-  bool _setModelScheduled = false;
-
-  Element _templateInstanceRef;
-
-  // Note: only used if `this is! TemplateElement`
-  DocumentFragment _content;
-  bool _templateIsDecorated;
-
-  HtmlDocument _stagingDocument;
-
-  _InstanceBindingMap _bindingMap;
-
-  Node _refContent;
-
-  TemplateBindExtension._(Element node) : super._(node);
-
-  Element get _node => super._node;
-
-  TemplateBindExtension get _self => _node is TemplateBindExtension
-      ? _node : this;
-
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    if (name != 'ref') return super.bind(name, value, oneTime: oneTime);
-
-    var ref = oneTime ? value : value.open((ref) {
-      _node.attributes['ref'] = ref;
-      _refChanged();
-    });
-
-    _node.attributes['ref'] = ref;
-    _refChanged();
-    if (oneTime) return null;
-
-    if (bindings == null) bindings = {};
-    return bindings['ref'] = value;
-  }
-
-  _TemplateIterator _processBindingDirectives(_TemplateBindingMap directives) {
-    if (_iterator != null) _iterator._closeDependencies();
-
-    if (directives._if == null &&
-        directives._bind == null &&
-        directives._repeat == null) {
-
-      if (_iterator != null) {
-        _iterator.close();
-        _iterator = null;
-      }
-      return null;
-    }
-
-    if (_iterator == null) {
-      _iterator = new _TemplateIterator(this);
-    }
-
-    _iterator._updateDependencies(directives, model);
-
-    _templateObserver.observe(_node,
-        attributes: true, attributeFilter: ['ref']);
-
-    return _iterator;
-  }
-
-  /**
-   * Creates an instance of the template, using the provided [model] and
-   * optional binding [delegate].
-   *
-   * If [instanceBindings] is supplied, each [Bindable] in the returned
-   * instance will be added to the list. This makes it easy to close all of the
-   * bindings without walking the tree. This is not normally necessary, but is
-   * used internally by the system.
-   */
-  DocumentFragment createInstance([model, BindingDelegate delegate]) {
-    if (delegate == null) delegate = _bindingDelegate;
-    if (_refContent == null) _refContent = templateBind(_ref).content;
-
-    var content = _refContent;
-    if (content.firstChild == null) return _emptyInstance;
-
-    final map = _getInstanceBindingMap(content, delegate);
-    final staging = _getTemplateStagingDocument();
-    final instance = _stagingDocument.createDocumentFragment();
-
-    final instanceExt = new _InstanceExtension();
-    _instanceExtension[instance] = instanceExt
-      .._templateCreator = _node
-      .._protoContent = content;
-
-    final instanceRecord = new TemplateInstance(model);
-    nodeBindFallback(instance)._templateInstance = instanceRecord;
-
-    var i = 0;
-    bool collectTerminator = false;
-    for (var c = content.firstChild; c != null; c = c.nextNode, i++) {
-      // The terminator of the instance is the clone of the last child of the
-      // content. If the last child is an active template, it may produce
-      // instances as a result of production, so simply collecting the last
-      // child of the instance after it has finished producing may be wrong.
-      if (c.nextNode == null) collectTerminator = true;
-
-      final childMap = map != null ? map.getChild(i) : null;
-      var clone = _cloneAndBindInstance(c, instance, _stagingDocument,
-          childMap, model, delegate, instanceExt._bindings);
-
-      nodeBindFallback(clone)._templateInstance = instanceRecord;
-      if (collectTerminator) instanceExt._terminator = clone;
-    }
-
-    instanceRecord._firstNode = instance.firstChild;
-    instanceRecord._lastNode = instance.lastChild;
-
-    instanceExt._protoContent = null;
-    instanceExt._templateCreator = null;
-    return instance;
-  }
-
-  /** The data model which is inherited through the tree. */
-  get model => _model;
-
-  void set model(value) {
-    _model = value;
-    _ensureSetModelScheduled();
-  }
-
-  static Node _deepCloneIgnoreTemplateContent(Node node, stagingDocument) {
-    var clone = stagingDocument.importNode(node, false);
-    if (isSemanticTemplate(clone)) return clone;
-
-    for (var c = node.firstChild; c != null; c = c.nextNode) {
-      clone.append(_deepCloneIgnoreTemplateContent(c, stagingDocument));
-    }
-    return clone;
-  }
-
-  /**
-   * The binding delegate which is inherited through the tree. It can be used
-   * to configure custom syntax for `{{bindings}}` inside this template.
-   */
-  BindingDelegate get bindingDelegate => _bindingDelegate;
-
-
-  void set bindingDelegate(BindingDelegate value) {
-    if (_bindingDelegate != null) {
-      throw new StateError('Template must be cleared before a new '
-          'bindingDelegate can be assigned');
-    }
-    _bindingDelegate = value;
-
-    // Clear cached state based on the binding delegate.
-    _bindingMap = null;
-    if (_iterator != null) {
-      _iterator._initPrepareFunctions = false;
-      _iterator._instanceModelFn = null;
-      _iterator._instancePositionChangedFn = null;
-    }
-  }
-
-  _ensureSetModelScheduled() {
-    if (_setModelScheduled) return;
-    _decorate();
-    _setModelScheduled = true;
-    scheduleMicrotask(_setModel);
-  }
-
-  void _setModel() {
-    _setModelScheduled = false;
-    var map = _getBindings(_node, _bindingDelegate);
-    _processBindings(_node, map, _model);
-  }
-
-  _refChanged() {
-    if (_iterator == null || _refContent == templateBind(_ref).content) return;
-
-    _refContent = null;
-    _iterator._valueChanged(null);
-    _iterator._updateIteratedValue(this._iterator._getUpdatedValue());
-  }
-
-  void clear() {
-    _model = null;
-    _bindingDelegate = null;
-    if (bindings != null) {
-      var ref = bindings.remove('ref');
-      if (ref != null) ref.close();
-    }
-    _refContent = null;
-    if (_iterator == null) return;
-    _iterator._valueChanged(null);
-    _iterator.close();
-    _iterator = null;
-  }
-
-  /** Gets the template this node refers to. */
-  Element get _ref {
-    _decorate();
-
-    var ref = _searchRefId(_node, _node.attributes['ref']);
-    if (ref == null) {
-      ref = _templateInstanceRef;
-      if (ref == null) return _node;
-    }
-
-    var nextRef = templateBindFallback(ref)._ref;
-    return nextRef != null ? nextRef : ref;
-  }
-
-  /**
-   * Gets the content of this template.
-   */
-  DocumentFragment get content {
-    _decorate();
-    return _content != null ? _content : (_node as TemplateElement).content;
-  }
-
-  /**
-   * Ensures proper API and content model for template elements.
-   *
-   * [instanceRef] can be used to set the [Element.ref] property of [template],
-   * and use the ref's content will be used as source when createInstance() is
-   * invoked.
-   *
-   * Returns true if this template was just decorated, or false if it was
-   * already decorated.
-   */
-  static bool decorate(Element template, [Element instanceRef]) =>
-      templateBindFallback(template)._decorate(instanceRef);
-
-  bool _decorate([Element instanceRef]) {
-    // == true check because it starts as a null field.
-    if (_templateIsDecorated == true) return false;
-
-    _injectStylesheet();
-    _globalBaseUriWorkaround();
-
-    var templateElementExt = this;
-    _templateIsDecorated = true;
-    var isNativeHtmlTemplate = _node is TemplateElement;
-    final bootstrapContents = isNativeHtmlTemplate;
-    final liftContents = !isNativeHtmlTemplate;
-    var liftRoot = false;
-
-    if (!isNativeHtmlTemplate) {
-      if (_isAttributeTemplate(_node)) {
-        if (instanceRef != null) {
-          // Dart note: this is just an assert in JS.
-          throw new ArgumentError('instanceRef should not be supplied for '
-              'attribute templates.');
-        }
-        templateElementExt = templateBind(
-            _extractTemplateFromAttributeTemplate(_node));
-        templateElementExt._templateIsDecorated = true;
-        isNativeHtmlTemplate = templateElementExt._node is TemplateElement;
-        liftRoot = true;
-      } else if (_isSvgTemplate(_node)) {
-        templateElementExt = templateBind(
-            _extractTemplateFromSvgTemplate(_node));
-        templateElementExt._templateIsDecorated = true;
-        isNativeHtmlTemplate = templateElementExt._node is TemplateElement;
-      }
-    }
-
-    if (!isNativeHtmlTemplate) {
-      var doc = _getOrCreateTemplateContentsOwner(templateElementExt._node);
-      templateElementExt._content = doc.createDocumentFragment();
-    }
-
-    if (instanceRef != null) {
-      // template is contained within an instance, its direct content must be
-      // empty
-      templateElementExt._templateInstanceRef = instanceRef;
-    } else if (liftContents) {
-      _liftNonNativeChildrenIntoContent(templateElementExt, _node, liftRoot);
-    } else if (bootstrapContents) {
-      bootstrap(templateElementExt.content);
-    }
-
-    return true;
-  }
-
-  static final _contentsOwner = new Expando();
-  static final _ownerStagingDocument = new Expando();
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  static HtmlDocument _getOrCreateTemplateContentsOwner(Element template) {
-    var doc = template.ownerDocument;
-    if (doc.window == null) return doc;
-
-    var d = _contentsOwner[doc];
-    if (d == null) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHtmlDocument('');
-      while (d.lastChild != null) {
-        d.lastChild.remove();
-      }
-      _contentsOwner[doc] = d;
-    }
-    return d;
-  }
-
-  HtmlDocument _getTemplateStagingDocument() {
-    if (_stagingDocument == null) {
-      var owner = _node.ownerDocument;
-      var doc = _ownerStagingDocument[owner];
-      if (doc == null) {
-        doc = owner.implementation.createHtmlDocument('');
-        _isStagingDocument[doc] = true;
-        _baseUriWorkaround(doc);
-        _ownerStagingDocument[owner] = doc;
-      }
-      _stagingDocument = doc;
-    }
-    return _stagingDocument;
-  }
-
-  // For non-template browsers, the parser will disallow <template> in certain
-  // locations, so we allow "attribute templates" which combine the template
-  // element with the top-level container node of the content, e.g.
-  //
-  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
-  //
-  // becomes
-  //
-  //   <template repeat="{{ foo }}">
-  //   + #document-fragment
-  //     + <tr class="bar">
-  //       + <td>Bar</td>
-  //
-  static Element _extractTemplateFromAttributeTemplate(Element el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    for (var name in el.attributes.keys.toList()) {
-      switch (name) {
-        case 'template':
-          el.attributes.remove(name);
-          break;
-        case 'repeat':
-        case 'bind':
-        case 'ref':
-          template.attributes[name] = el.attributes.remove(name);
-          break;
-      }
-    }
-
-    return template;
-  }
-
-  static Element _extractTemplateFromSvgTemplate(Element el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-    template.attributes.addAll(el.attributes);
-
-    el.attributes.clear();
-    el.remove();
-    return template;
-  }
-
-  static void _liftNonNativeChildrenIntoContent(TemplateBindExtension template,
-      Element el, bool useRoot) {
-
-    var content = template.content;
-    if (useRoot) {
-      content.append(el);
-      return;
-    }
-
-    var child;
-    while ((child = el.firstChild) != null) {
-      content.append(child);
-    }
-  }
-
-  /**
-   * This used to decorate recursively all templates from a given node.
-   *
-   * By default [decorate] will be called on templates lazily when certain
-   * properties such as [model] are accessed, but it can be run eagerly to
-   * decorate an entire tree recursively.
-   */
-  // TODO(rafaelw): Review whether this is the right public API.
-  static void bootstrap(Node content) {
-    void _bootstrap(template) {
-      if (!TemplateBindExtension.decorate(template)) {
-        bootstrap(templateBind(template).content);
-      }
-    }
-
-    // Need to do this first as the contents may get lifted if |node| is
-    // template.
-    // TODO(jmesserly): content is DocumentFragment or Element
-    var descendents =
-        (content as dynamic).querySelectorAll(_allTemplatesSelectors);
-    if (isSemanticTemplate(content)) {
-      _bootstrap(content);
-    }
-
-    descendents.forEach(_bootstrap);
-  }
-
-  static final String _allTemplatesSelectors =
-      'template, ' +
-      _SEMANTIC_TEMPLATE_TAGS.keys.map((k) => "$k[template]").join(", ");
-
-  static bool _initStyles;
-
-  // This is to replicate template_element.css
-  // TODO(jmesserly): move this to an opt-in CSS file?
-  static void _injectStylesheet() {
-    if (_initStyles == true) return;
-    _initStyles = true;
-
-    var style = new StyleElement()
-        ..text = '$_allTemplatesSelectors { display: none; }';
-    document.head.append(style);
-  }
-
-  static bool _initBaseUriWorkaround;
-
-  static void _globalBaseUriWorkaround() {
-    if (_initBaseUriWorkaround == true) return;
-    _initBaseUriWorkaround = true;
-
-    var t = document.createElement('template');
-    if (t is TemplateElement) {
-      var d = t.content.ownerDocument;
-      if (d.documentElement == null) {
-        d.append(d.createElement('html')).append(d.createElement('head'));
-      }
-      // don't patch this if TemplateBinding.js already has.
-      if (d.head.querySelector('base') == null) {
-        _baseUriWorkaround(d);
-      }
-    }
-  }
-
-  // TODO(rafaelw): Remove when fix for
-  // https://codereview.chromium.org/164803002/
-  // makes it to Chrome release.
-  static void _baseUriWorkaround(HtmlDocument doc) {
-    BaseElement base = doc.createElement('base');
-    base.href = document.baseUri;
-    doc.head.append(base);
-  }
-
-  static final _templateObserver = new MutationObserver((records, _) {
-    for (MutationRecord record in records) {
-      templateBindFallback(record.target)._refChanged();
-    }
-  });
-
-}
-
-final DocumentFragment _emptyInstance = () {
-  var empty = new DocumentFragment();
-  _instanceExtension[empty] = new _InstanceExtension();
-  return empty;
-}();
-
-// TODO(jmesserly): if we merged with wtih TemplateInstance, it seems like it
-// would speed up some operations (e.g. _getInstanceRoot wouldn't need to walk
-// the parent chain).
-class _InstanceExtension {
-  final List _bindings = [];
-  Node _terminator;
-  Element _templateCreator;
-  DocumentFragment _protoContent;
-}
-
-// TODO(jmesserly): this is private in JS but public for us because pkg:polymer
-// uses it.
-List getTemplateInstanceBindings(DocumentFragment fragment) {
-  var ext = _instanceExtension[fragment];
-  return ext != null ? ext._bindings : ext;
-}
-
-/// Gets the root of the current node's parent chain
-_getFragmentRoot(Node node) {
-  var p;
-  while ((p = node.parentNode) != null) {
-    node = p;
-  }
-  return node;
-}
-
-Node _searchRefId(Node node, String id) {
-  if (id == null || id == '') return null;
-
-  final selector = '#$id';
-  while (true) {
-    node = _getFragmentRoot(node);
-
-    Node ref = null;
-
-    _InstanceExtension instance = _instanceExtension[node];
-    if (instance != null && instance._protoContent != null) {
-      ref = instance._protoContent.querySelector(selector);
-    } else if (_hasGetElementById(node)) {
-      ref = (node as dynamic).getElementById(id);
-    }
-
-    if (ref != null) return ref;
-
-    if (instance == null) return null;
-    node = instance._templateCreator;
-    if (node == null) return null;
-  }
-}
-
-_getInstanceRoot(node) {
-  while (node.parentNode != null) {
-    node = node.parentNode;
-  }
-  _InstanceExtension instance = _instanceExtension[node];
-  return instance != null && instance._templateCreator != null ? node : null;
-}
-
-// Note: JS code tests that getElementById is present. We can't do that
-// easily, so instead check for the types known to implement it.
-bool _hasGetElementById(Node node) =>
-    node is Document || node is ShadowRoot || node is SvgSvgElement;
-
-final Expando<_InstanceExtension> _instanceExtension = new Expando();
-
-final _isStagingDocument = new Expando();
diff --git a/packages/template_binding/lib/src/template_iterator.dart b/packages/template_binding/lib/src/template_iterator.dart
deleted file mode 100644
index 7100486..0000000
--- a/packages/template_binding/lib/src/template_iterator.dart
+++ /dev/null
@@ -1,556 +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 template_binding;
-
-// This code is a port of what was formerly known as Model-Driven-Views, now
-// located at:
-//     https://github.com/polymer/TemplateBinding
-//     https://github.com/polymer/NodeBind
-
-// TODO(jmesserly): not sure what kind of boolean conversion rules to
-// apply for template data-binding. HTML attributes are true if they're
-// present. However Dart only treats "true" as true. Since this is HTML we'll
-// use something closer to the HTML rules: null (missing) and false are false,
-// everything else is true.
-// See: https://github.com/polymer/TemplateBinding/issues/59
-bool _toBoolean(value) => null != value && false != value;
-
-// Dart note: this was added to decouple the MustacheTokens.parse function from
-// the rest of template_binding.
-_getDelegateFactory(name, node, delegate) {
-  if (delegate == null) return null;
-  return (pathString) => delegate.prepareBinding(pathString, name, node);
-}
-
-_InstanceBindingMap _getBindings(Node node, BindingDelegate delegate) {
-  if (node is Element) {
-    return _parseAttributeBindings(node, delegate);
-  }
-
-  if (node is Text) {
-    var tokens = MustacheTokens.parse(node.text,
-        _getDelegateFactory('text', node, delegate));
-    if (tokens != null) return new _InstanceBindingMap(['text', tokens]);
-  }
-
-  return null;
-}
-
-void _addBindings(Node node, model, [BindingDelegate delegate]) {
-  final bindings = _getBindings(node, delegate);
-  if (bindings != null) {
-    _processBindings(node, bindings, model);
-  }
-
-  for (var c = node.firstChild; c != null; c = c.nextNode) {
-    _addBindings(c, model, delegate);
-  }
-}
-
-MustacheTokens _parseWithDefault(Element element, String name,
-    BindingDelegate delegate) {
-
-  var v = element.attributes[name];
-  if (v == '') v = '{{}}';
-  return MustacheTokens.parse(v, _getDelegateFactory(name, element, delegate));
-}
-
-_InstanceBindingMap _parseAttributeBindings(Element element,
-    BindingDelegate delegate) {
-
-  var bindings = null;
-  var ifFound = false;
-  var bindFound = false;
-  var isTemplateNode = isSemanticTemplate(element);
-
-  element.attributes.forEach((name, value) {
-    // Allow bindings expressed in attributes to be prefixed with underbars.
-    // We do this to allow correct semantics for browsers that don't implement
-    // <template> where certain attributes might trigger side-effects -- and
-    // for IE which sanitizes certain attributes, disallowing mustache
-    // replacements in their text.
-    while (name[0] == '_') {
-      name = name.substring(1);
-    }
-
-    if (isTemplateNode &&
-        (name == 'bind' || name == 'if' || name == 'repeat')) {
-      return;
-    }
-
-    var tokens = MustacheTokens.parse(value,
-        _getDelegateFactory(name, element, delegate));
-    if (tokens != null) {
-      if (bindings == null) bindings = [];
-      bindings..add(name)..add(tokens);
-    }
-  });
-
-  if (isTemplateNode) {
-    if (bindings == null) bindings = [];
-    var result = new _TemplateBindingMap(bindings)
-        .._if = _parseWithDefault(element, 'if', delegate)
-        .._bind = _parseWithDefault(element, 'bind', delegate)
-        .._repeat = _parseWithDefault(element, 'repeat', delegate);
-
-    // Treat <template if> as <template bind if>
-    if (result._if != null && result._bind == null && result._repeat == null) {
-      result._bind = MustacheTokens.parse('{{}}',
-          _getDelegateFactory('bind', element, delegate));
-    }
-
-    return result;
-  }
-
-  return bindings == null ? null : new _InstanceBindingMap(bindings);
-}
-
-_processOneTimeBinding(String name, MustacheTokens tokens, Node node, model) {
-
-  if (tokens.hasOnePath) {
-    var delegateFn = tokens.getPrepareBinding(0);
-    var value = delegateFn != null ? delegateFn(model, node, true) :
-        tokens.getPath(0).getValueFrom(model);
-    return tokens.isSimplePath ? value : tokens.combinator(value);
-  }
-
-  // Tokens uses a striding scheme to essentially store a sequence of structs in
-  // the list. See _MustacheTokens for more information.
-  var values = new List(tokens.length);
-  for (int i = 0; i < tokens.length; i++) {
-    Function delegateFn = tokens.getPrepareBinding(i);
-    values[i] = delegateFn != null ?
-        delegateFn(model, node, false) :
-        tokens.getPath(i).getValueFrom(model);
-  }
-  return tokens.combinator(values);
-}
-
-_processSinglePathBinding(String name, MustacheTokens tokens, Node node,
-    model) {
-  Function delegateFn = tokens.getPrepareBinding(0);
-  var observer = delegateFn != null ?
-      delegateFn(model, node, false) :
-      new PathObserver(model, tokens.getPath(0));
-
-  return tokens.isSimplePath ? observer :
-      new ObserverTransform(observer, tokens.combinator);
-}
-
-_processBinding(String name, MustacheTokens tokens, Node node, model) {
-  if (tokens.onlyOneTime) {
-    return _processOneTimeBinding(name, tokens, node, model);
-  }
-  if (tokens.hasOnePath) {
-    return _processSinglePathBinding(name, tokens, node, model);
-  }
-
-  var observer = new CompoundObserver();
-
-  for (int i = 0; i < tokens.length; i++) {
-    bool oneTime = tokens.getOneTime(i);
-    Function delegateFn = tokens.getPrepareBinding(i);
-
-    if (delegateFn != null) {
-      var value = delegateFn(model, node, oneTime);
-      if (oneTime) {
-        observer.addPath(value);
-      } else {
-        observer.addObserver(value);
-      }
-      continue;
-    }
-
-    PropertyPath path = tokens.getPath(i);
-    if (oneTime) {
-      observer.addPath(path.getValueFrom(model));
-    } else {
-      observer.addPath(model, path);
-    }
-  }
-
-  return new ObserverTransform(observer, tokens.combinator);
-}
-
-void _processBindings(Node node, _InstanceBindingMap map, model,
-    [List<Bindable> instanceBindings]) {
-
-  final bindings = map.bindings;
-  final nodeExt = nodeBind(node);
-  for (var i = 0; i < bindings.length; i += 2) {
-    var name = bindings[i];
-    var tokens = bindings[i + 1];
-
-    var value = _processBinding(name, tokens, node, model);
-    var binding = nodeExt.bind(name, value, oneTime: tokens.onlyOneTime);
-    if (binding != null && instanceBindings != null) {
-      instanceBindings.add(binding);
-    }
-  }
-
-  nodeExt.bindFinished();
-  if (map is! _TemplateBindingMap) return;
-
-  final templateExt = nodeBindFallback(node);
-  templateExt._model = model;
-
-  var iter = templateExt._processBindingDirectives(map);
-  if (iter != null && instanceBindings != null) {
-    instanceBindings.add(iter);
-  }
-}
-
-
-// Note: this doesn't really implement most of Bindable. See:
-// https://github.com/Polymer/TemplateBinding/issues/147
-class _TemplateIterator extends Bindable {
-  final TemplateBindExtension _templateExt;
-
-  final List<DocumentFragment> _instances = [];
-
-  /** A copy of the last rendered [_presentValue] list state. */
-  final List _iteratedValue = [];
-
-  List _presentValue;
-
-  bool _closed = false;
-
-  // Dart note: instead of storing these in a Map like JS, or using a separate
-  // object (extra memory overhead) we just inline the fields.
-  var _ifValue, _value;
-
-  // TODO(jmesserly): lots of booleans in this object. Bitmask?
-  bool _hasIf, _hasRepeat;
-  bool _ifOneTime, _oneTime;
-
-  StreamSubscription _listSub;
-
-  bool _initPrepareFunctions = false;
-  PrepareInstanceModelFunction _instanceModelFn;
-  PrepareInstancePositionChangedFunction _instancePositionChangedFn;
-
-  _TemplateIterator(this._templateExt);
-
-  open(callback) => throw new StateError('binding already opened');
-  get value => _value;
-
-  Element get _templateElement => _templateExt._node;
-
-  void _closeDependencies() {
-    if (_ifValue is Bindable) {
-      _ifValue.close();
-      _ifValue = null;
-    }
-    if (_value is Bindable) {
-      _value.close();
-      _value = null;
-    }
-  }
-
-  void _updateDependencies(_TemplateBindingMap directives, model) {
-    _closeDependencies();
-
-    final template = _templateElement;
-
-    _hasIf = directives._if != null;
-    _hasRepeat = directives._repeat != null;
-
-    var ifValue = true;
-    if (_hasIf) {
-      _ifOneTime = directives._if.onlyOneTime;
-      _ifValue = _processBinding('if', directives._if, template, model);
-      ifValue = _ifValue;
-
-      // oneTime if & predicate is false. nothing else to do.
-      if (_ifOneTime && !_toBoolean(ifValue)) {
-        _valueChanged(null);
-        return;
-      }
-
-      if (!_ifOneTime) {
-        ifValue = (ifValue as Bindable).open(_updateIfValue);
-      }
-    }
-
-    if (_hasRepeat) {
-      _oneTime = directives._repeat.onlyOneTime;
-      _value = _processBinding('repeat', directives._repeat, template, model);
-    } else {
-      _oneTime = directives._bind.onlyOneTime;
-      _value = _processBinding('bind', directives._bind, template, model);
-    }
-
-    var value = _value;
-    if (!_oneTime) {
-      value = _value.open(_updateIteratedValue);
-    }
-
-    if (!_toBoolean(ifValue)) {
-      _valueChanged(null);
-      return;
-    }
-
-    _updateValue(value);
-  }
-
-  /// Gets the updated value of the bind/repeat. This can potentially call
-  /// user code (if a bindingDelegate is set up) so we try to avoid it if we
-  /// already have the value in hand (from Observer.open).
-  Object _getUpdatedValue() {
-    var value = _value;
-    // Dart note: x.discardChanges() is x.value in Dart.
-    if (!_toBoolean(_oneTime)) value = value.value;
-    return value;
-  }
-
-  void _updateIfValue(ifValue) {
-    if (!_toBoolean(ifValue)) {
-      _valueChanged(null);
-      return;
-    }
-    _updateValue(_getUpdatedValue());
-  }
-
-  void _updateIteratedValue(value) {
-    if (_hasIf) {
-      var ifValue = _ifValue;
-      if (!_ifOneTime) ifValue = (ifValue as Bindable).value;
-      if (!_toBoolean(ifValue)) {
-        _valueChanged([]);
-        return;
-      }
-    }
-
-    _updateValue(value);
-  }
-
-  void _updateValue(Object value) {
-    if (!_hasRepeat) value = [value];
-    _valueChanged(value);
-  }
-
-  void _valueChanged(Object value) {
-    if (value is! List) {
-      if (value is Iterable) {
-        // Dart note: we support Iterable by calling toList.
-        // But we need to be careful to observe the original iterator if it
-        // supports that.
-        value = (value as Iterable).toList();
-      } else {
-        value = [];
-      }
-    }
-
-    if (identical(value, _iteratedValue)) return;
-
-    _unobserve();
-    _presentValue = value;
-
-    if (value is ObservableList && _hasRepeat && !_oneTime) {
-      // Make sure any pending changes aren't delivered, since we're getting
-      // a snapshot at this point in time.
-      value.discardListChages();
-      _listSub = value.listChanges.listen(_handleSplices);
-    }
-
-    _handleSplices(ObservableList.calculateChangeRecords(
-        _iteratedValue != null ? _iteratedValue : [],
-        _presentValue != null ? _presentValue : []));
-  }
-
-  Node _getLastInstanceNode(int index) {
-    if (index == -1) return _templateElement;
-    // TODO(jmesserly): we could avoid this expando lookup by caching the
-    // instance extension instead of the instance.
-    var instance = _instanceExtension[_instances[index]];
-    var terminator = instance._terminator;
-    if (terminator == null) return _getLastInstanceNode(index - 1);
-
-    if (!isSemanticTemplate(terminator) ||
-        identical(terminator, _templateElement)) {
-      return terminator;
-    }
-
-    var subtemplateIterator = templateBindFallback(terminator)._iterator;
-    if (subtemplateIterator == null) return terminator;
-
-    return subtemplateIterator._getLastTemplateNode();
-  }
-
-  Node _getLastTemplateNode() => _getLastInstanceNode(_instances.length - 1);
-
-  void _insertInstanceAt(int index, DocumentFragment fragment) {
-    var previousInstanceLast = _getLastInstanceNode(index - 1);
-    var parent = _templateElement.parentNode;
-
-    _instances.insert(index, fragment);
-    parent.insertBefore(fragment, previousInstanceLast.nextNode);
-  }
-
-  DocumentFragment _extractInstanceAt(int index) {
-    var previousInstanceLast = _getLastInstanceNode(index - 1);
-    var lastNode = _getLastInstanceNode(index);
-    var parent = _templateElement.parentNode;
-    var instance = _instances.removeAt(index);
-
-    while (lastNode != previousInstanceLast) {
-      var node = previousInstanceLast.nextNode;
-      if (node == lastNode) lastNode = previousInstanceLast;
-
-      instance.append(node..remove());
-    }
-
-    return instance;
-  }
-
-  void _handleSplices(List<ListChangeRecord> splices) {
-    if (_closed || splices.isEmpty) return;
-
-    final template = _templateElement;
-
-    if (template.parentNode == null) {
-      close();
-      return;
-    }
-
-    ObservableList.applyChangeRecords(_iteratedValue, _presentValue, splices);
-
-    final delegate = _templateExt.bindingDelegate;
-
-    // Dart note: the JavaScript code relies on the distinction between null
-    // and undefined to track whether the functions are prepared. We use a bool.
-    if (!_initPrepareFunctions) {
-      _initPrepareFunctions = true;
-      final delegate = _templateExt._self.bindingDelegate;
-      if (delegate != null) {
-        _instanceModelFn = delegate.prepareInstanceModel(template);
-        _instancePositionChangedFn =
-            delegate.prepareInstancePositionChanged(template);
-      }
-    }
-
-    // Instance Removals.
-    var instanceCache = new HashMap(equals: identical);
-    var removeDelta = 0;
-    for (var splice in splices) {
-      for (var model in splice.removed) {
-        var instance = _extractInstanceAt(splice.index + removeDelta);
-        if (instance != _emptyInstance) {
-          instanceCache[model] = instance;
-        }
-      }
-
-      removeDelta -= splice.addedCount;
-    }
-
-    for (var splice in splices) {
-      for (var addIndex = splice.index;
-          addIndex < splice.index + splice.addedCount;
-          addIndex++) {
-
-        var model = _iteratedValue[addIndex];
-        DocumentFragment instance = instanceCache.remove(model);
-        if (instance == null) {
-          try {
-            if (_instanceModelFn != null) {
-              model = _instanceModelFn(model);
-            }
-            if (model == null) {
-              instance = _emptyInstance;
-            } else {
-              instance = _templateExt.createInstance(model, delegate);
-            }
-          } catch (e, s) {
-            // Dart note: we propagate errors asynchronously here to avoid
-            // disrupting the rendering flow. This is different than in the JS
-            // implementation but it should probably be fixed there too. Dart
-            // hits this case more because non-existing properties in
-            // [PropertyPath] are treated as errors, while JS treats them as
-            // null/undefined.
-            // TODO(sigmund): this should be a synchronous throw when this is
-            // called from createInstance, but that requires enough refactoring
-            // that it should be done upstream first. See dartbug.com/17789.
-            new Completer().completeError(e, s);
-            instance = _emptyInstance;
-          }
-        }
-
-        _insertInstanceAt(addIndex, instance);
-      }
-    }
-
-    for (var instance in instanceCache.values) {
-      _closeInstanceBindings(instance);
-    }
-
-    if (_instancePositionChangedFn != null) _reportInstancesMoved(splices);
-  }
-
-  void _reportInstanceMoved(int index) {
-    var instance = _instances[index];
-    if (instance == _emptyInstance) return;
-
-    _instancePositionChangedFn(nodeBind(instance).templateInstance, index);
-  }
-
-  void _reportInstancesMoved(List<ListChangeRecord> splices) {
-    var index = 0;
-    var offset = 0;
-    for (var splice in splices) {
-      if (offset != 0) {
-        while (index < splice.index) {
-          _reportInstanceMoved(index);
-          index++;
-        }
-      } else {
-        index = splice.index;
-      }
-
-      while (index < splice.index + splice.addedCount) {
-        _reportInstanceMoved(index);
-        index++;
-      }
-
-      offset += splice.addedCount - splice.removed.length;
-    }
-
-    if (offset == 0) return;
-
-    var length = _instances.length;
-    while (index < length) {
-      _reportInstanceMoved(index);
-      index++;
-    }
-  }
-
-  void _closeInstanceBindings(DocumentFragment instance) {
-    var bindings = _instanceExtension[instance]._bindings;
-    for (var binding in bindings) binding.close();
-  }
-
-  void _unobserve() {
-    if (_listSub == null) return;
-    _listSub.cancel();
-    _listSub = null;
-  }
-
-  void close() {
-    if (_closed) return;
-
-    _unobserve();
-    _instances.forEach(_closeInstanceBindings);
-    _instances.clear();
-    _closeDependencies();
-    _templateExt._iterator = null;
-    _closed = true;
-  }
-}
-
-// Dart note: the JavaScript version just puts an expando on the array.
-class _BoundNodes {
-  final List<Node> nodes;
-  final List<Bindable> instanceBindings;
-  _BoundNodes(this.nodes, this.instanceBindings);
-}
diff --git a/packages/template_binding/lib/template_binding.dart b/packages/template_binding/lib/template_binding.dart
deleted file mode 100644
index 88fa17b..0000000
--- a/packages/template_binding/lib/template_binding.dart
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This library provides access to the Polymer project's
- * [Data Binding](http://www.polymer-project.org/docs/polymer/databinding.html)
- * Find more information at the
- * [Polymer.dart homepage](https://www.dartlang.org/polymer-dart/).
- *
- * Extends the capabilities of the HTML Template Element by enabling it to
- * create, manage, and remove instances of content bound to data defined in
- * Dart.
- *
- * Node.bind() is a new method added to all DOM nodes which instructs them to
- * bind the named property to the data provided. These allows applications to
- * create a data model in Dart or JavaScript that DOM reacts to.
- */
-library template_binding;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:html';
-import 'dart:js' as js show context;
-import 'dart:js' show JsObject;
-import 'dart:svg' show SvgSvgElement;
-import 'package:observe/observe.dart';
-
-import 'src/mustache_tokens.dart';
-
-part 'src/binding_delegate.dart';
-part 'src/instance_binding_map.dart';
-part 'src/node.dart';
-part 'src/template.dart';
-part 'src/template_iterator.dart';
-
-// TODO(jmesserly): ideally we would split TemplateBinding and Node.bind into
-// two packages, but this is not easy when we are faking extension methods.
-// Since TemplateElement needs to override Node.bind, it seems like the
-// Node.bind layer must have some innate knowledge of TemplateBinding.
-// NOTE: I've heard NodeBind might become an internal API, which is all the more
-// reason to have it in this package.
-
-/**
- * Provides access to the data binding APIs for the [node]. For example:
- *
- *     templateBind(node).model = new MyModel();
- *
- * This is equivalent to [nodeBind], but provides access to
- * [TemplateBindExtension] APIs. [node] should be a [TemplateElement], or
- * equivalent semantic template such as:
- *
- *     <table template repeat="{{row in rows}}">
- *       <tr template repeat="{{item in row}}">
- *         <td>{{item}}</td>
- *       </tr>
- *     </table>
- */
-TemplateBindExtension templateBind(Element node) => nodeBind(node);
-
-/**
- * Like [templateBind], but intended to be used only within a custom element
- * that implements [TemplateBindExtension]. This method can be used to simulate
- * a super call. For example:
- *
- *     class CoolTemplate extends TemplateElement
- *         implements TemplateBindExtension {
- *
- *       createInstance(model, delegate) {
- *         // do something cool...
- *         // otherwise, fall back to superclass
- *         return templateBindFallback(this).createInstance(model, delegate);
- *       }
- *       ...
- *     }
- */
-TemplateBindExtension templateBindFallback(Element node) =>
-    nodeBindFallback(node);
-
-/**
- * Provides access to the data binding APIs for the [node]. For example:
- *
- *     nodeBind(node).bind('checked', model, 'path.to.some.value');
- */
-NodeBindExtension nodeBind(Node node) {
-  return node is NodeBindExtension ? node : nodeBindFallback(node);
-}
-
-/**
- * Like [nodeBind], but intended to be used only within a custom element that
- * implements [NodeBindExtension]. This method can be used to simulate a super
- * call. For example:
- *
- *     class FancyButton extends ButtonElement implements NodeBindExtension {
- *       bind(name, model, path) {
- *         if (name == 'fancy-prop') ... // do fancy binding
- *         // otherwise, fall back to superclass
- *         return nodeBindFallback(this).bind(name, model, path);
- *       }
- *       ...
- *     }
- */
-NodeBindExtension nodeBindFallback(Node node) {
-  var extension = _expando[node];
-  if (extension != null) return extension;
-
-  if (isSemanticTemplate(node)) {
-    extension = new TemplateBindExtension._(node);
-  } else {
-    extension = new NodeBindExtension._(node);
-  }
-  _expando[node] = extension;
-  return extension;
-}
-
-
-bool _isAttributeTemplate(Element n) => n.attributes.containsKey('template') &&
-    _SEMANTIC_TEMPLATE_TAGS.containsKey(n.localName);
-
-bool _isSvgTemplate(Element el) => el.tagName == 'template' &&
-    el.namespaceUri == 'http://www.w3.org/2000/svg';
-
-bool _isHtmlTemplate(Element el) => el.tagName == 'TEMPLATE' &&
-    el.namespaceUri == 'http://www.w3.org/1999/xhtml';
-
-/**
- * Returns true if this node is semantically a template.
- *
- * A node is a template if [tagName] is TEMPLATE, or the node has the
- * 'template' attribute and this tag supports attribute form for backwards
- * compatibility with existing HTML parsers. The nodes that can use attribute
- * form are table elements (THEAD, TBODY, TFOOT, TH, TR, TD, CAPTION, COLGROUP
- * and COL), OPTION, and OPTGROUP.
- */
-bool isSemanticTemplate(Node n) => n is Element &&
-    (_isHtmlTemplate(n) || _isAttributeTemplate(n) || _isSvgTemplate(n));
-
-/** Returns true if this is the staging document for a template. */
-bool isTemplateStagingDocument(Document d) => _isStagingDocument[d] == true;
-
-
-/**
- * True to enable [NodeBindingExtension.bindings]. This can be used by tools
- * such as UI builders to easily inspect live bindings. Defaults to false for
- * performance reasons.
- */
-bool get enableBindingsReflection =>
-    js.context['Platform']['enableBindingsReflection'] == true;
-
-set enableBindingsReflection(bool value) {
-  js.context['Platform']['enableBindingsReflection'] = value;
-}
-
-// TODO(jmesserly): const set would be better
-const _SEMANTIC_TEMPLATE_TAGS = const {
-  'caption': null,
-  'col': null,
-  'colgroup': null,
-  'option': null,
-  'optgroup': null,
-  'tbody': null,
-  'td': null,
-  'tfoot': null,
-  'th': null,
-  'thead': null,
-  'tr': null,
-};
-
-
-// TODO(jmesserly): investigate if expandos give us enough performance.
-
-// The expando for storing our MDV extensions.
-//
-// In general, we need state associated with the nodes. Rather than having a
-// bunch of individual expandos, we keep one per node.
-//
-// Aside from the potentially helping performance, it also keeps things simpler
-// if we decide to integrate MDV into the DOM later, and means less code needs
-// to worry about expandos.
-final Expando _expando = new Expando('template_binding');
diff --git a/packages/template_binding/pubspec.yaml b/packages/template_binding/pubspec.yaml
deleted file mode 100644
index 47dac00..0000000
--- a/packages/template_binding/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: template_binding
-version: 0.14.0+2
-author: Polymer.dart Team <web-ui-dev@dartlang.org>
-description: >
-  Extends the capabilities of the HTML Template Element by enabling it to
-  create, manage, and remove instances of content bound to data defined in Dart.
-homepage: https://www.dartlang.org/polymer-dart/
-dependencies:
-  observe: ">=0.11.0 <0.14.0"
-  web_components: ">=0.7.0 <0.12.0"
-dev_dependencies:
-  unittest: ">=0.10.0 <0.12.0"
-  browser: ">=0.10.0 <0.11.0"
-environment:
-  sdk: ">=1.2.0 <2.0.0"
diff --git a/packages/template_binding/test/binding_syntax.dart b/packages/template_binding/test/binding_syntax.dart
deleted file mode 100644
index 859698b..0000000
--- a/packages/template_binding/test/binding_syntax.dart
+++ /dev/null
@@ -1,325 +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 template_binding.test.binding_syntax;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:html';
-import 'package:template_binding/template_binding.dart';
-import 'package:observe/observe.dart';
-import 'package:unittest/unittest.dart';
-import 'utils.dart';
-
-// Note: this test is executed by template_element_test.dart
-
-syntaxTests(FooBarModel fooModel([foo, bar])) {
-  test('prepareBinding', () {
-    var model = fooModel('bar');
-    var testSyntax = new TestBindingSyntax();
-    var div = createTestHtml(
-        '<template bind>{{ foo }}'
-          '<template bind>{{ foo }}</template>'
-        '</template>');
-    var template = templateBind(div.firstChild);
-    template
-      ..model = model
-      ..bindingDelegate = testSyntax;
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.nodes.last.text, 'bar');
-      expect(div.nodes[2].tagName, 'TEMPLATE');
-      expect(testSyntax.log, [
-        ['prepare', '', 'bind', 'TEMPLATE'],
-        ['bindFn', model, 'TEMPLATE', 0],
-        ['prepare', 'foo', 'text', 'TEXT'],
-        ['prepare', '', 'bind', 'TEMPLATE'],
-        ['bindFn', model, 'TEXT', 2],
-        ['bindFn', model, 'TEMPLATE', 3],
-        ['prepare', 'foo', 'text', 'TEXT'],
-        ['bindFn', model, 'TEXT', 6],
-      ]);
-    });
-  });
-
-  test('prepareInstanceModel', () {
-    var model = toObservable([fooModel(1), fooModel(2), fooModel(3)]);
-
-    var testSyntax = new TestModelSyntax();
-    testSyntax.altModels.addAll([fooModel('a'), fooModel('b'), fooModel('c')]);
-
-    var div = createTestHtml('<template repeat>{{ foo }}</template>');
-
-    var template = div.nodes[0];
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = testSyntax;
-    return new Future(() {
-
-      expect(div.nodes.length, 4);
-      expect(div.nodes[0].tagName, 'TEMPLATE');
-      expect(div.nodes[1].text, 'a');
-      expect(div.nodes[2].text, 'b');
-      expect(div.nodes[3].text, 'c');
-
-      expect(testSyntax.log, [
-        ['prepare', template],
-        ['bindFn', model[0]],
-        ['bindFn', model[1]],
-        ['bindFn', model[2]],
-      ]);
-    });
-  });
-
-  test('prepareInstanceModel - reorder instances', () {
-    var model = toObservable([0, 1, 2]);
-
-    var div = createTestHtml('<template repeat>{{}}</template>');
-    var template = div.firstChild;
-    var delegate = new TestInstanceModelSyntax();
-
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = delegate;
-    return new Future(() {
-      expect(delegate.prepareCount, 1);
-      expect(delegate.callCount, 3);
-
-      // Note: intentionally mutate in place.
-      model.replaceRange(0, model.length, model.reversed.toList());
-    }).then(endOfMicrotask).then((_) {
-      expect(delegate.prepareCount, 1);
-      expect(delegate.callCount, 3);
-    });
-  });
-
-  test('prepareInstancePositionChanged', () {
-    var model = toObservable(['a', 'b', 'c']);
-
-    var div = createTestHtml('<template repeat>{{}}</template>');
-    var delegate = new TestPositionChangedSyntax();
-
-    var template = div.nodes[0];
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = delegate;
-    return new Future(() {
-
-      expect(div.nodes.length, 4);
-      expect(div.nodes[0].tagName, 'TEMPLATE');
-      expect(div.nodes[1].text, 'a');
-      expect(div.nodes[2].text, 'b');
-      expect(div.nodes[3].text, 'c');
-
-      expect(delegate.log, [
-        ['prepare', template],
-        ['bindFn', model[0], 0],
-        ['bindFn', model[1], 1],
-        ['bindFn', model[2], 2],
-      ]);
-
-      delegate.log.clear();
-
-      model.removeAt(1);
-    }).then(endOfMicrotask).then((_) {
-
-      expect(delegate.log, [['bindFn', 'c', 1]], reason: 'removed item');
-
-      expect(div.nodes.skip(1).map((n) => n.text), ['a', 'c']);
-    });
-  });
-
-
-  test('Update bindingDelegate with active template', () {
-    var model = toObservable([1, 2]);
-
-    var div = createTestHtml(
-        '<template repeat>{{ \$index }} - {{ \$ident }}</template>');
-    var template = templateBind(div.firstChild)
-      ..bindingDelegate = new UpdateBindingDelegateA()
-      ..model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 3);
-      expect(div.nodes[1].text, 'i:0 - a:1');
-      expect(div.nodes[2].text, 'i:1 - a:2');
-
-      expect(() {
-        template.bindingDelegate = new UpdateBindingDelegateB();
-      }, throws);
-
-      template.clear();
-      expect(div.nodes.length, 1);
-
-      template
-        ..bindingDelegate = new UpdateBindingDelegateB()
-        ..model = model;
-
-      model.add(3);
-    }).then(nextMicrotask).then((_) {
-      // All instances should reflect delegateB
-      expect(4, div.nodes.length);
-      expect(div.nodes[1].text, 'I:0 - A:1-narg');
-      expect(div.nodes[2].text, 'I:2 - A:2-narg');
-      expect(div.nodes[3].text, 'I:4 - A:3-narg');
-    });
-  });
-
-  test('Basic', () {
-    var model = fooModel(2, 4);
-    var div = createTestHtml(
-        '<template bind>'
-        '{{ foo }} + {{ 2x: bar }} + {{ 4x: bar }}</template>');
-    var template = templateBind(div.firstChild);
-    template
-      ..model = model
-      ..bindingDelegate = new TimesTwoSyntax();
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, '2 + 8 + ');
-
-      model.foo = 4;
-      model.bar = 8;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, '4 + 16 + ');
-    });
-  });
-
-  test('CreateInstance', () {
-    var delegateFoo = new SimpleTextDelegate('foo');
-    var delegateBar = new SimpleTextDelegate('bar');
-
-    var div = createTestHtml('<template bind>[[ 2x: bar ]]</template>');
-    var template = templateBind(div.firstChild);
-    template..bindingDelegate = delegateFoo..model = {};
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'foo');
-
-      var fragment = template.createInstance({});
-      expect(fragment.nodes.length, 1);
-      expect(fragment.lastChild.text, 'foo');
-
-      fragment = template.createInstance({}, delegateBar);
-      expect(fragment.nodes.length, 1);
-      expect(fragment.lastChild.text, 'bar');
-    });
-  });
-
-  // Note: issue-141 test not included here as it's not related to the
-  // BindingDelegate
-}
-
-// TODO(jmesserly): mocks would be cleaner here.
-
-class TestBindingSyntax extends BindingDelegate {
-  var log = [];
-
-  prepareBinding(String path, String name, Node node) {
-    var tagName = node is Element ? node.tagName : 'TEXT';
-    int id = log.length;
-    log.add(['prepare', path, name, tagName]);
-    final outerNode = node;
-    return (model, node, oneTime) {
-      var tagName = node is Element ? node.tagName : 'TEXT';
-      log.add(['bindFn', model, tagName, id]);
-      return oneTime ? new PropertyPath(path).getValueFrom(model) :
-          new PathObserver(model, path);
-    };
-  }
-}
-
-class SimpleTextDelegate extends BindingDelegate {
-  final String text;
-  SimpleTextDelegate(this.text);
-
-  prepareBinding(path, name, node) =>
-      name != 'text' ? null : (_, __, ___) => text;
-}
-
-class TestModelSyntax extends BindingDelegate {
-  var log = [];
-  var altModels = new ListQueue();
-
-  prepareInstanceModel(template) {
-    log.add(['prepare', template]);
-    return (model) {
-      log.add(['bindFn', model]);
-      return altModels.removeFirst();
-    };
-  }
-}
-
-class TestInstanceModelSyntax extends BindingDelegate {
-  int prepareCount = 0;
-  int callCount = 0;
-  prepareInstanceModel(template) {
-    prepareCount++;
-    return (model) {
-      callCount++;
-      return model;
-    };
-  }
-}
-
-
-class TestPositionChangedSyntax extends BindingDelegate {
-  var log = [];
-
-  prepareInstancePositionChanged(template) {
-    int id = log.length;
-    log.add(['prepare', template]);
-    return (templateInstance, index) {
-      log.add(['bindFn', templateInstance.model, index]);
-    };
-  }
-}
-
-
-class TimesTwoSyntax extends BindingDelegate {
-  prepareBinding(path, name, node) {
-    path = path.trim();
-    if (!path.startsWith('2x:')) return null;
-
-    path = path.substring(3);
-    return (model, _, oneTime) {
-      return new ObserverTransform(new PathObserver(model, path), (x) => 2 * x);
-    };
-  }
-}
-
-class UpdateBindingDelegateBase extends BindingDelegate {
-  bindingHandler(prefix, path) => (model, _, oneTime) =>
-      new ObserverTransform(new PathObserver(model, path), (x) => '$prefix:$x');
-}
-
-class UpdateBindingDelegateA extends UpdateBindingDelegateBase {
-  prepareBinding(path, name, node) {
-    if (path == '\$ident') return bindingHandler('a', 'id');
-    if (path == '\$index') return bindingHandler('i', 'index');
-  }
-
-  prepareInstanceModel(template) => (model) => toObservable({ 'id': model });
-
-  prepareInstancePositionChanged(template) => (templateInstance, index) {
-    templateInstance.model['index'] = index;
-  };
-}
-
-class UpdateBindingDelegateB extends UpdateBindingDelegateBase {
-  prepareBinding(path, name, node) {
-    if (path == '\$ident') return bindingHandler('A', 'id');
-    if (path == '\$index') return bindingHandler('I', 'index');
-  }
-
-  prepareInstanceModel(template) =>
-      (model) => toObservable({ 'id': '${model}-narg' });
-
-
-  prepareInstancePositionChanged(template) => (templateInstance, index) {
-    templateInstance.model['index'] = 2 * index;
-  };
-}
-
diff --git a/packages/template_binding/test/custom_element_bindings_test.dart b/packages/template_binding/test/custom_element_bindings_test.dart
deleted file mode 100644
index 0d7429a..0000000
--- a/packages/template_binding/test/custom_element_bindings_test.dart
+++ /dev/null
@@ -1,177 +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 template_binding.test.custom_element_bindings_test;
-
-import 'dart:async';
-import 'dart:html';
-import 'dart:collection' show MapView;
-import 'package:template_binding/template_binding.dart';
-import 'package:observe/observe.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import 'package:web_components/polyfill.dart';
-import 'utils.dart';
-import 'package:observe/mirrors_used.dart'; // make test smaller
-import 'package:smoke/mirrors.dart' as smoke;
-
-Future _registered;
-
-main() => dirtyCheckZone().run(() {
-  smoke.useMirrors();
-  useHtmlConfiguration();
-
-  _registered = customElementsReady.then((_) {
-    document.registerElement('my-custom-element', MyCustomElement);
-  });
-
-  group('Custom Element Bindings', customElementBindingsTest);
-});
-
-customElementBindingsTest() {
-  setUp(() {
-    document.body.append(testDiv = new DivElement());
-    return _registered;
-  });
-
-  tearDown(() {
-    testDiv.remove();
-    testDiv = null;
-  });
-
-  test('override bind/bindFinished', () {
-    var element = new MyCustomElement();
-    var model = toObservable({'a': new Point(123, 444), 'b': new Monster(100)});
-
-    var pointBinding = nodeBind(element)
-        .bind('my-point', new PathObserver(model, 'a'));
-
-    var scaryBinding = nodeBind(element)
-        .bind('scary-monster', new PathObserver(model, 'b'));
-
-    expect(element.attributes, isNot(contains('my-point')));
-    expect(element.attributes, isNot(contains('scary-monster')));
-
-    expect(element.myPoint, model['a']);
-    expect(element.scaryMonster, model['b']);
-
-    model['a'] = null;
-    return new Future(() {
-      expect(element.myPoint, null);
-      expect(element.bindFinishedCalled, 0);
-      pointBinding.close();
-
-      model['a'] = new Point(1, 2);
-      model['b'] = new Monster(200);
-    }).then(endOfMicrotask).then((_) {
-      expect(element.scaryMonster, model['b']);
-      expect(element.myPoint, null, reason: 'a was unbound');
-
-      scaryBinding.close();
-      model['b'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(element.scaryMonster.health, 200);
-      expect(element.bindFinishedCalled, 0);
-    });
-  });
-
-  test('template bind uses overridden custom element bind', () {
-
-    var model = toObservable({'a': new Point(123, 444), 'b': new Monster(100)});
-    var div = createTestHtml('<template bind>'
-          '<my-custom-element my-point="{{a}}" scary-monster="{{b}}">'
-          '</my-custom-element>'
-        '</template>');
-
-    templateBind(div.query('template')).model = model;
-    var element;
-    return new Future(() {
-      element = div.nodes[1];
-
-      expect(element is MyCustomElement, true,
-          reason: '$element should be a MyCustomElement');
-
-      expect(element.myPoint, model['a']);
-      expect(element.scaryMonster, model['b']);
-
-      expect(element.attributes, isNot(contains('my-point')));
-      expect(element.attributes, isNot(contains('scary-monster')));
-
-      expect(element.bindFinishedCalled, 1);
-
-      model['a'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(element.myPoint, null);
-      expect(element.bindFinishedCalled, 1);
-
-
-      templateBind(div.query('template')).model = null;
-    }).then(endOfMicrotask).then((_) {
-      // Note: the detached element
-      expect(element.parentNode is DocumentFragment, true,
-          reason: 'removed element is added back to its document fragment');
-      expect(element.parentNode.parentNode, null,
-          reason: 'document fragment is detached');
-      expect(element.bindFinishedCalled, 1);
-
-      model['a'] = new Point(1, 2);
-      model['b'] = new Monster(200);
-    }).then(endOfMicrotask).then((_) {
-      expect(element.myPoint, null, reason: 'model was unbound');
-      expect(element.scaryMonster.health, 100, reason: 'model was unbound');
-      expect(element.bindFinishedCalled, 1);
-    });
-  });
-
-}
-
-class Monster {
-  int health;
-  Monster(this.health);
-}
-
-/** Demonstrates a custom element overriding bind/bindFinished. */
-class MyCustomElement extends HtmlElement implements NodeBindExtension {
-  Point myPoint;
-  Monster scaryMonster;
-  int bindFinishedCalled = 0;
-
-  factory MyCustomElement() => new Element.tag('my-custom-element');
-
-  MyCustomElement.created() : super.created();
-
-  Bindable bind(String name, value, {oneTime: false}) {
-    switch (name) {
-      case 'my-point':
-      case 'scary-monster':
-        attributes.remove(name);
-        if (oneTime) {
-          _setProperty(name, value);
-          return null;
-        }
-        _setProperty(name, value.open((x) => _setProperty(name, x)));
-
-        if (!enableBindingsReflection) return value;
-        if (bindings == null) bindings = {};
-        var old = bindings[name];
-        if (old != null) old.close();
-        return bindings[name] = value;
-    }
-    return nodeBindFallback(this).bind(name, value, oneTime: oneTime);
-  }
-
-  void bindFinished() {
-    bindFinishedCalled++;
-  }
-
-  get bindings => nodeBindFallback(this).bindings;
-  set bindings(x) => nodeBindFallback(this).bindings = x;
-  get templateInstance => nodeBindFallback(this).templateInstance;
-
-  void _setProperty(String property, newValue) {
-    if (property == 'my-point') myPoint = newValue;
-    if (property == 'scary-monster') scaryMonster = newValue;
-  }
-}
-
diff --git a/packages/template_binding/test/custom_element_bindings_test.html b/packages/template_binding/test/custom_element_bindings_test.html
deleted file mode 100644
index f22d90a..0000000
--- a/packages/template_binding/test/custom_element_bindings_test.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> custom_element_bindings_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/template_binding/js/observe.js"></script>
-  <script src="/packages/template_binding/js/node_bind.js"></script>
-  <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/flush.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running custom_element_bindings_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="custom_element_bindings_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
-</body>
-</html>
diff --git a/packages/template_binding/test/node_bind_test.dart b/packages/template_binding/test/node_bind_test.dart
deleted file mode 100644
index b797657..0000000
--- a/packages/template_binding/test/node_bind_test.dart
+++ /dev/null
@@ -1,745 +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 template_binding.test.node_bind_test;
-
-import 'dart:async';
-import 'dart:html';
-
-import 'package:observe/observe.dart'
-    show toObservable, PathObserver, PropertyPath;
-import 'package:template_binding/template_binding.dart'
-    show nodeBind, enableBindingsReflection;
-import 'package:observe/mirrors_used.dart'; // make test smaller
-import 'package:smoke/mirrors.dart' as smoke;
-
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import 'utils.dart';
-
-// Ported from: https://github.com/Polymer/NodeBind/blob/master/tests/tests.js
-
-var bindings;
-
-main() => dirtyCheckZone().run(() {
-  smoke.useMirrors();
-  useHtmlConfiguration();
-
-  setUp(() {
-    document.body.append(testDiv = new DivElement());
-    bindings = [];
-  });
-
-  tearDown(() {
-    testDiv.remove();
-    testDiv = null;
-    for (var b in bindings) if (b != null) b.close();
-    bindings = null;
-  });
-
-  group('Text bindings', testBindings);
-  group('Element attribute bindings', elementBindings);
-  group('Form Element bindings', formBindings);
-});
-
-testBindings() {
-  test('Basic', () {
-    var text = new Text('hi');
-    var model = toObservable({'a': 1});
-    bindings.add(nodeBind(text).bind('text', new PathObserver(model, 'a')));
-    expect(text.text, '1');
-
-    model['a'] = 2;
-    return new Future(() {
-      expect(text.text, '2');
-    });
-  });
-
-  test('oneTime', () {
-    var text = new Text('hi');
-    bindings.add(nodeBind(text).bind('text', 1, oneTime: true));
-    expect(text.text, '1');
-  });
-
-  test('No Path', () {
-    var text = new Text('hi');
-    var model = 1;
-    bindings.add(nodeBind(text).bind('text', new PathObserver(model)));
-    expect(text.text, '1');
-  });
-
-  test('Path unreachable', () {
-    var text = testDiv.append(new Text('hi'));
-    var model = 1;
-    var pathObserver = new PathObserver(model, 'a');
-    expect(() => nodeBind(text).bind('text', pathObserver), throws);
-    expect(text.text, 'hi');
-  });
-
-  test('Observer is Model', () {
-    // Dart note: we don't have _allObserversCount so we use binding reflection
-    // instead.
-    enableBindingsReflection = true;
-
-    // This future is here so we can turn off bindings reflection reliably.
-    Text text;
-    return new Future(() {
-      text = new Text('');
-      var model = toObservable({'a': {'b': {'c': 1}}});
-      var observer = new PathObserver(model, 'a.b.c');
-      bindings.add(nodeBind(text).bind('text', observer));
-      expect(text.text, '1');
-
-      var binding = nodeBind(text).bindings['text'];
-      expect(binding, observer, reason: 'should reuse observer');
-
-      model['a']['b']['c'] = 2;
-    }).then(endOfMicrotask).then((_) {
-      expect(text.text, '2');
-    }).whenComplete(() {
-      enableBindingsReflection = false;
-    });
-  });
-}
-
-elementBindings() {
-
-  test('Basic', () {
-    var el = new DivElement();
-    var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
-
-    return new Future(() {
-      expect(el.attributes['foo'], '1');
-      model['a'] = '2';
-    }).then(endOfMicrotask).then((_) {
-      expect(el.attributes['foo'], '2');
-      model['a'] = 232.2;
-    }).then(endOfMicrotask).then((_) {
-      expect(el.attributes['foo'], '232.2');
-      model['a'] = 232;
-    }).then(endOfMicrotask).then((_) {
-      expect(el.attributes['foo'], '232');
-      model['a'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(el.attributes['foo'], '');
-    });
-  });
-
-  // Dart specific test
-  test('enableBindingsReflection defaults to off', () {
-    expect(enableBindingsReflection, false);
-
-    var el = new DivElement();
-    var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
-
-    expect(nodeBind(el).bindings, null);
-  });
-
-  test('enableBindingsReflection', () {
-    enableBindingsReflection = true;
-    try {
-      var el = testDiv.append(new DivElement());
-      var model = toObservable({'a': '1'});
-      bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
-      bindings.add(nodeBind(el).bind('bar', new PathObserver(model, 'a')));
-      bindings.add(nodeBind(el).bind('baz', new PathObserver(model, 'a')));
-
-      expect(nodeBind(el).bindings.keys,
-          unorderedEquals(['foo', 'bar', 'baz']));
-
-    } finally {
-      enableBindingsReflection = false;
-    }
-  });
-
-  test('oneTime', () {
-    var el = testDiv.append(new DivElement());
-    var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', 1, oneTime: true));
-    expect('1', el.attributes['foo']);
-  });
-
-  test('No Path', () {
-    var el = testDiv.append(new DivElement());
-    var model = 1;
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model)));
-    return new Future(() {
-      expect(el.attributes['foo'], '1');
-    });
-  });
-
-  test('Path unreachable', () {
-    var el = testDiv.append(new DivElement());
-    var model = toObservable({});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'bar')));
-    return new Future(() {
-      expect(el.attributes['foo'], '');
-    });
-  });
-
-  test('Dashes', () {
-    var el = testDiv.append(new DivElement());
-    var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo-bar', new PathObserver(model, 'a')));
-    return new Future(() {
-      expect(el.attributes['foo-bar'], '1');
-      model['a'] = '2';
-
-    }).then(endOfMicrotask).then((_) {
-      expect(el.attributes['foo-bar'], '2');
-    });
-  });
-
-  test('Element.id, Element.hidden?', () {
-    var element = new DivElement();
-    var model = toObservable({'a': 1, 'b': 2});
-    bindings.add(
-        nodeBind(element).bind('hidden?', new PathObserver(model, 'a')));
-    bindings.add(nodeBind(element).bind('id', new PathObserver(model, 'b')));
-
-    expect(element.attributes, contains('hidden'));
-    expect(element.attributes['hidden'], '');
-    expect(element.id, '2');
-
-    model['a'] = null;
-    return new Future(() {
-      expect(element.attributes, isNot(contains('hidden')),
-          reason: 'null is false-y');
-
-      model['a'] = false;
-    }).then(endOfMicrotask).then((_) {
-      expect(element.attributes, isNot(contains('hidden')));
-
-      model['a'] = 'foo';
-      model['b'] = 'x';
-    }).then(endOfMicrotask).then((_) {
-      expect(element.attributes, contains('hidden'));
-      expect(element.attributes['hidden'], '');
-      expect(element.id, 'x');
-    });
-  });
-
-  test('Element.id - path unreachable', () {
-    var element = testDiv.append(new DivElement());
-    var model = toObservable({});
-    bindings.add(nodeBind(element).bind('id', new PathObserver(model, 'a')));
-    return new Future(() => expect(element.id, ''));
-  });
-}
-
-formBindings() {
-  inputTextAreaValueTest(String tagName) {
-    var el = new Element.tag(tagName);
-    testDiv.nodes.add(el);
-    var model = toObservable({'x': 42});
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'x')));
-    expect(el.value, '42');
-
-    model['x'] = 'Hi';
-    expect(el.value, '42', reason: 'changes delivered async');
-    return new Future(() {
-      expect(el.value, 'Hi');
-
-      el.value = 'changed';
-      dispatchEvent('input', el);
-      expect(model['x'], 'changed');
-    });
-  }
-
-  inputTextAreaValueOnetime(String tagName) {
-    var el = testDiv.append(new Element.tag(tagName));
-    bindings.add(nodeBind(el).bind('value', 42, oneTime: true));
-    expect(el.value, '42');
-  }
-
-  inputTextAreaNoPath(String tagName) {
-    var el = testDiv.append(new Element.tag(tagName));
-    var model = 42;
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model)));
-    expect(el.value, '42');
-  }
-
-  inputTextAreaPathUnreachable(String tagName) {
-    var el = testDiv.append(new Element.tag(tagName));
-    var model = toObservable({});
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'a')));
-    expect(el.value, '');
-  }
-
-  test('Input.value',
-      () => inputTextAreaValueTest('input'));
-
-  test('Input.value - oneTime',
-      () => inputTextAreaValueOnetime('input'));
-
-  test('Input.value - no path',
-      () => inputTextAreaNoPath('input'));
-
-  test('Input.value - path unreachable',
-      () => inputTextAreaPathUnreachable('input'));
-
-  test('TextArea.value',
-      () => inputTextAreaValueTest('textarea'));
-
-  test('TextArea.value - oneTime',
-      () => inputTextAreaValueOnetime('textarea'));
-
-  test('TextArea.value - no path',
-      () => inputTextAreaNoPath('textarea'));
-
-  test('TextArea.value - path unreachable',
-      () => inputTextAreaPathUnreachable('textarea'));
-
-  test('Radio Input', () {
-    var input = new InputElement();
-    input.type = 'radio';
-    var model = toObservable({'x': true});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
-    expect(input.checked, true);
-
-    model['x'] = false;
-    expect(input.checked, true);
-    return new Future(() {
-      expect(input.checked, false,reason: 'model change should update checked');
-
-      input.checked = true;
-      dispatchEvent('change', input);
-      expect(model['x'], true, reason: 'input.checked should set model');
-
-      bindings[0].close();
-
-      input.checked = false;
-      dispatchEvent('change', input);
-      expect(model['x'], true,
-          reason: 'disconnected binding should not fire');
-    });
-  });
-
-  test('Input.value - user value rejected', () {
-    var model = toObservable({'val': 'ping'});
-
-    var rejector = new PathObserver(model, 'val');
-    rejector.open(() {
-      model['val'] = 'ping';
-    });
-
-    var el = new InputElement();
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'val')));
-
-    return new Future(() {
-      expect(el.value, 'ping');
-
-      el.value = 'pong';
-      dispatchEvent('input', el);
-
-    }).then(endOfMicrotask).then((_) {
-      // rejector will have set the bound value back to 'ping'.
-      expect(el.value, 'ping');
-
-      rejector.close();
-    });
-  });
-
-  test('Checkbox Input.checked', () {
-    var el = testDiv.append(new InputElement());
-    el.type = 'checkbox';
-
-    var model = toObservable({'x': true});
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'x')));
-    expect(el.checked, true);
-
-    model['x'] = false;
-    expect(el.checked, true, reason: 'changes delivered async');
-    return new Future(() {
-      expect(el.checked, false);
-
-      el.click();
-      expect(model['x'], true);
-    }).then(endOfMicrotask).then((_) {
-
-      el.click();
-      expect(model['x'], false);
-    });
-  });
-
-  test('Checkbox Input.checked - oneTime', () {
-    var input = testDiv.append(new InputElement());
-    input.type = 'checkbox';
-    bindings.add(nodeBind(input).bind('checked', true, oneTime: true));
-    expect(input.checked, true, reason: 'checked was set');
-  });
-
-  test('Checkbox Input.checked - path unreachable', () {
-    var input = testDiv.append(new InputElement());
-    input.type = 'checkbox';
-    var model = toObservable({});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
-    expect(input.checked, false);
-  });
-
-  test('Checkbox Input.checked 2', () {
-    var model = toObservable({'val': true});
-
-    var el = testDiv.append(new InputElement());
-    el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
-    return new Future(() {
-      expect(el.checked, true);
-
-      model['val'] = false;
-    }).then(endOfMicrotask).then((_) {
-      expect(el.checked, false);
-
-      el.click();
-      expect(model['val'], true);
-
-      el.click();
-      expect(model['val'], false);
-
-      el.onClick.listen((_) {
-        expect(model['val'], true);
-      });
-      el.onChange.listen((_) {
-        expect(model['val'], true);
-      });
-
-      el.dispatchEvent(new MouseEvent('click', view: window));
-    });
-  });
-
-  test('Checkbox Input.checked - binding updated on click', () {
-    var model = toObservable({'val': true});
-
-    var el = new InputElement();
-    testDiv.append(el);
-    el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
-    return new Future(() {
-      expect(el.checked, true);
-
-      int fired = 0;
-      el.onClick.listen((_) {
-        fired++;
-        expect(model['val'], false);
-      });
-
-      el.dispatchEvent(new MouseEvent('click', view: window));
-
-      expect(fired, 1, reason: 'events dispatched synchronously');
-    });
-  });
-
-  test('Checkbox Input.checked - binding updated on change', () {
-    var model = toObservable({'val': true});
-
-    var el = new InputElement();
-    testDiv.append(el);
-    el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
-    return new Future(() {
-      expect(el.checked, true);
-
-      int fired = 0;
-      el.onChange.listen((_) {
-        fired++;
-        expect(model['val'], false);
-      });
-
-      el.dispatchEvent(new MouseEvent('click', view: window));
-
-      expect(fired, 1, reason: 'events dispatched synchronously');
-    });
-  });
-
-  test('Radio Input.checked', () {
-    var input = testDiv.append(new InputElement());
-    input.type = 'radio';
-    var model = toObservable({'x': true});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
-    expect(input.checked, true);
-
-    model['x'] = false;
-    expect(input.checked, true);
-    return new Future(() {
-      expect(input.checked, false);
-
-      input.checked = true;
-      dispatchEvent('change', input);
-      expect(model['x'], true);
-    });
-  });
-
-  test('Radio Input.checked - oneTime', () {
-    var input = testDiv.append(new InputElement());
-    input.type = 'radio';
-    bindings.add(nodeBind(input).bind('checked', true, oneTime: true));
-    expect(input.checked, true, reason: 'checked was set');
-  });
-
-  radioInputChecked2(host) {
-    var model = toObservable({'val1': true, 'val2': false, 'val3': false,
-        'val4': true});
-    var RADIO_GROUP_NAME = 'test';
-
-    var container = host.append(new DivElement());
-
-    var el1 = container.append(new InputElement());
-    el1.type = 'radio';
-    el1.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el1).bind('checked', new PathObserver(model, 'val1')));
-
-    var el2 = container.append(new InputElement());
-    el2.type = 'radio';
-    el2.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el2).bind('checked', new PathObserver(model, 'val2')));
-
-    var el3 = container.append(new InputElement());
-    el3.type = 'radio';
-    el3.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el3).bind('checked', new PathObserver(model, 'val3')));
-
-    var el4 = container.append(new InputElement());
-    el4.type = 'radio';
-    el4.name = 'othergroup';
-    bindings.add(
-        nodeBind(el4).bind('checked', new PathObserver(model, 'val4')));
-
-    return new Future(() {
-      expect(el1.checked, true);
-      expect(el2.checked, false);
-      expect(el3.checked, false);
-      expect(el4.checked, true);
-
-      model['val1'] = false;
-      model['val2'] = true;
-    }).then(endOfMicrotask).then((_) {
-      expect(el1.checked, false);
-      expect(el2.checked, true);
-      expect(el3.checked, false);
-      expect(el4.checked, true);
-
-      el1.checked = true;
-      dispatchEvent('change', el1);
-      expect(model['val1'], true);
-      expect(model['val2'], false);
-      expect(model['val3'], false);
-      expect(model['val4'], true);
-
-      el3.checked = true;
-      dispatchEvent('change', el3);
-      expect(model['val1'], false);
-      expect(model['val2'], false);
-      expect(model['val3'], true);
-      expect(model['val4'], true);
-    });
-  }
-
-  test('Radio Input.checked 2', () => radioInputChecked2(testDiv));
-
-  test('Radio Input.checked 2 - ShadowRoot', () {
-    if (!ShadowRoot.supported) return null;
-
-    var shadowRoot = new DivElement().createShadowRoot();
-    return radioInputChecked2(shadowRoot);
-  });
-
-  radioInputCheckedMultipleForms(host) {
-    var model = toObservable({'val1': true, 'val2': false, 'val3': false,
-        'val4': true});
-    var RADIO_GROUP_NAME = 'test';
-
-    var container = testDiv.append(new DivElement());
-    var form1 = new FormElement();
-    container.append(form1);
-    var form2 = new FormElement();
-    container.append(form2);
-
-    var el1 = new InputElement();
-    form1.append(el1);
-    el1.type = 'radio';
-    el1.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el1).bind('checked', new PathObserver(model, 'val1')));
-
-    var el2 = new InputElement();
-    form1.append(el2);
-    el2.type = 'radio';
-    el2.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el2).bind('checked', new PathObserver(model, 'val2')));
-
-    var el3 = new InputElement();
-    form2.append(el3);
-    el3.type = 'radio';
-    el3.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el3).bind('checked', new PathObserver(model, 'val3')));
-
-    var el4 = new InputElement();
-    form2.append(el4);
-    el4.type = 'radio';
-    el4.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el4).bind('checked', new PathObserver(model, 'val4')));
-
-    return new Future(() {
-      expect(el1.checked, true);
-      expect(el2.checked, false);
-      expect(el3.checked, false);
-      expect(el4.checked, true);
-
-      el2.checked = true;
-      dispatchEvent('change', el2);
-      expect(model['val1'], false);
-      expect(model['val2'], true);
-
-      // Radio buttons in form2 should be unaffected
-      expect(model['val3'], false);
-      expect(model['val4'], true);
-
-      el3.checked = true;
-      dispatchEvent('change', el3);
-      expect(model['val3'], true);
-      expect(model['val4'], false);
-
-      // Radio buttons in form1 should be unaffected
-      expect(model['val1'], false);
-      expect(model['val2'], true);
-    });
-  }
-
-  test('Radio Input.checked - multiple forms', () {
-    return radioInputCheckedMultipleForms(testDiv);
-  });
-
-  test('Radio Input.checked - multiple forms - ShadowRoot', () {
-    if (!ShadowRoot.supported) return null;
-
-    var shadowRoot = new DivElement().createShadowRoot();
-    return radioInputCheckedMultipleForms(shadowRoot);
-  });
-
-  test('Select.selectedIndex', () {
-    var select = new SelectElement();
-    testDiv.append(select);
-    var option0 = select.append(new OptionElement());
-    var option1 = select.append(new OptionElement());
-    var option2 = select.append(new OptionElement());
-
-    var model = toObservable({'val': 2});
-
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
-    return new Future(() {
-      expect(select.selectedIndex, 2);
-
-      select.selectedIndex = 1;
-      dispatchEvent('change', select);
-      expect(model['val'], 1);
-    });
-  });
-
-  test('Select.selectedIndex - oneTime', () {
-    var select = new SelectElement();
-    testDiv.append(select);
-    var option0 = select.append(new OptionElement());
-    var option1 = select.append(new OptionElement());
-    var option2 = select.append(new OptionElement());
-
-    bindings.add(nodeBind(select).bind('selectedIndex', 2, oneTime: true));
-    return new Future(() => expect(select.selectedIndex, 2));
-  });
-
-  test('Select.selectedIndex - invalid path', () {
-    var select = new SelectElement();
-    testDiv.append(select);
-    var option0 = select.append(new OptionElement());
-    var option1 = select.append(new OptionElement());
-    option1.selected = true;
-    var option2 = select.append(new OptionElement());
-
-    var model = toObservable({'val': 'foo'});
-
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
-    return new Future(() => expect(select.selectedIndex, 0));
-  });
-
-  test('Select.selectedIndex - path unreachable', () {
-    var select = new SelectElement();
-    testDiv.append(select);
-    var option0 = select.append(new OptionElement());
-    var option1 = select.append(new OptionElement());
-    option1.selected = true;
-    var option2 = select.append(new OptionElement());
-
-    var model = toObservable({});
-
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
-    return new Future(() => expect(select.selectedIndex, 0));
-  });
-
-  test('Option.value', () {
-    var option = testDiv.append(new OptionElement());
-    var model = toObservable({'x': 42});
-    bindings.add(nodeBind(option).bind('value', new PathObserver(model, 'x')));
-    expect(option.value, '42');
-
-    model['x'] = 'Hi';
-    expect(option.value, '42');
-    return new Future(() => expect(option.value, 'Hi'));
-  });
-
-  test('Option.value - oneTime', () {
-    var option = testDiv.append(new OptionElement());
-    bindings.add(nodeBind(option).bind('value', 42, oneTime: true));
-    expect(option.value, '42');
-  });
-
-  test('Select.value', () {
-    var select = testDiv.append(new SelectElement());
-    testDiv.append(select);
-    var option0 = select.append(new OptionElement());
-    var option1 = select.append(new OptionElement());
-    var option2 = select.append(new OptionElement());
-
-    var model = toObservable({
-      'opt0': 'a',
-      'opt1': 'b',
-      'opt2': 'c',
-      'selected': 'b'
-    });
-
-    bindings.add(
-        nodeBind(option0).bind('value', new PathObserver(model, 'opt0')));
-    bindings.add(
-        nodeBind(option1).bind('value', new PathObserver(model, 'opt1')));
-    bindings.add(
-        nodeBind(option2).bind('value', new PathObserver(model, 'opt2')));
-    bindings.add(
-        nodeBind(select).bind('value', new PathObserver(model, 'selected')));
-    return new Future(() {
-      expect(select.value, 'b');
-
-      select.value = 'c';
-      dispatchEvent('change', select);
-      expect(model['selected'], 'c');
-
-      model['opt2'] = 'X';
-    }).then(endOfMicrotask).then((_) {
-      expect(select.value, 'X');
-      expect(model['selected'], 'X');
-
-      model['selected'] = 'a';
-    }).then(endOfMicrotask).then((_) {
-      expect(select.value, 'a');
-    });
-  });
-}
diff --git a/packages/template_binding/test/node_bind_test.html b/packages/template_binding/test/node_bind_test.html
deleted file mode 100644
index 7e37413..0000000
--- a/packages/template_binding/test/node_bind_test.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> node_bind_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/template_binding/js/observe.js"></script>
-  <script src="/packages/template_binding/js/node_bind.js"></script>
-  <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/flush.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running node_bind_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="node_bind_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
-</body>
-</html>
diff --git a/packages/template_binding/test/template_binding_test.dart b/packages/template_binding/test/template_binding_test.dart
deleted file mode 100644
index 4eae607..0000000
--- a/packages/template_binding/test/template_binding_test.dart
+++ /dev/null
@@ -1,2736 +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 template_binding.test.template_binding_test;
-
-import 'dart:async';
-import 'dart:html';
-import 'dart:js' show JsObject;
-import 'dart:math' as math;
-import 'package:observe/observe.dart';
-import 'package:template_binding/template_binding.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import 'package:observe/mirrors_used.dart'; // make test smaller
-import 'package:smoke/mirrors.dart' as smoke;
-
-// TODO(jmesserly): merge this file?
-import 'binding_syntax.dart' show syntaxTests;
-import 'utils.dart';
-
-// Note: this file ported from TemplateBinding's tests/tests.js
-
-// TODO(jmesserly): submit a small cleanup patch to original. I fixed some
-// cases where "div" and "t" were unintentionally using the JS global scope;
-// look for "assertNodesAre".
-
-main() => dirtyCheckZone().run(() {
-  smoke.useMirrors();
-  useHtmlConfiguration();
-
-  setUp(() {
-    document.body.append(testDiv = new DivElement());
-  });
-
-  tearDown(() {
-    testDiv.remove();
-    clearAllTemplates(testDiv);
-    testDiv = null;
-  });
-
-  test('MutationObserver is supported', () {
-    expect(MutationObserver.supported, true, reason: 'polyfill was loaded.');
-  });
-
-  group('Template', templateInstantiationTests);
-
-  group('Binding Delegate API', () {
-    group('with Observable', () {
-      syntaxTests(([f, b]) => new FooBarModel(f, b));
-    });
-
-    group('with ChangeNotifier', () {
-      syntaxTests(([f, b]) => new FooBarNotifyModel(f, b));
-    });
-  });
-
-  group('Compat', compatTests);
-});
-
-var expando = new Expando('test');
-void addExpandos(node) {
-  while (node != null) {
-    expando[node] = node.text;
-    node = node.nextNode;
-  }
-}
-
-void checkExpandos(node) {
-  expect(node, isNotNull);
-  while (node != null) {
-    expect(expando[node], node.text);
-    node = node.nextNode;
-  }
-}
-
-templateInstantiationTests() {
-  // Dart note: renamed some of these tests to have unique names
-
-  test('accessing bindingDelegate getter without Bind', () {
-    var div = createTestHtml('<template>');
-    var template = div.firstChild;
-    expect(templateBind(template).bindingDelegate, null);
-  });
-
-  test('Bind - simple', () {
-    var div = createTestHtml('<template bind={{}}>text</template>');
-    templateBind(div.firstChild).model = {};
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'text');
-
-      // Dart note: null is used instead of undefined to clear the template.
-      templateBind(div.firstChild).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-      templateBind(div.firstChild).model = 123;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'text');
-    });
-  });
-
-  test('oneTime-Bind', () {
-    var div = createTestHtml('<template bind="[[ bound ]]">text</template>');
-    var model = toObservable({'bound': 1});
-    templateBind(div.firstChild).model = model;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'text');
-
-      model['bound'] = false;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'text');
-    });
-  });
-
-  test('Bind - no parent', () {
-    var div = createTestHtml('<template bind>text</template>');
-    var template = div.firstChild;
-    template.remove();
-
-    templateBind(template).model = {};
-    return new Future(() {
-      expect(template.nodes.length, 0);
-      expect(template.nextNode, null);
-    });
-  });
-
-  test('Bind - no defaultView', () {
-    var div = createTestHtml('<template bind>text</template>');
-    var template = div.firstChild;
-    var doc = document.implementation.createHtmlDocument('');
-    doc.adoptNode(div);
-    templateBind(template).model = {};
-    return new Future(() => expect(div.nodes.length, 2));
-  });
-
-  test('Empty Bind', () {
-    var div = createTestHtml('<template bind>text</template>');
-    var template = div.firstChild;
-    templateBind(template).model = {};
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'text');
-    });
-  });
-
-  test('Bind If', () {
-    var div = createTestHtml(
-        '<template bind="{{ bound }}" if="{{ predicate }}">'
-          'value:{{ value }}'
-        '</template>');
-    // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart.
-    // See https://code.google.com/p/dart/issues/detail?id=11956
-    // Changed bound from null->1 since null is equivalent to JS undefined,
-    // and would cause the template to not be expanded.
-    var m = toObservable({ 'predicate': null, 'bound': 1 });
-    var template = div.firstChild;
-    bool errorSeen = false;
-    runZoned(() {
-      templateBind(template).model = m;
-    }, onError: (e, s) {
-      _expectNoSuchMethod(e);
-      errorSeen = true;
-    });
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = 1;
-
-      expect(errorSeen, isFalse);
-    }).then(nextMicrotask).then((_) {
-      expect(errorSeen, isTrue);
-      expect(div.nodes.length, 1);
-
-      m['bound'] = toObservable({ 'value': 2 });
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:2');
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      templateBind(template).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Bind oneTime-If - predicate false', () {
-    var div = createTestHtml(
-        '<template bind="{{ bound }}" if="[[ predicate ]]">'
-          'value:{{ value }}'
-        '</template>');
-    // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart.
-    // See https://code.google.com/p/dart/issues/detail?id=11956
-    // Changed bound from null->1 since null is equivalent to JS undefined,
-    // and would cause the template to not be expanded.
-    var m = toObservable({ 'predicate': null, 'bound': 1 });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = 1;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-
-      m['bound'] = toObservable({ 'value': 2 });
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-
-      templateBind(template).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Bind oneTime-If - predicate true', () {
-    var div = createTestHtml(
-        '<template bind="{{ bound }}" if="[[ predicate ]]">'
-          'value:{{ value }}'
-        '</template>');
-
-    // Dart note: changed bound from null->1 since null is equivalent to JS
-    // undefined, and would cause the template to not be expanded.
-    var m = toObservable({ 'predicate': 1, 'bound': 1 });
-    var template = div.firstChild;
-    bool errorSeen = false;
-    runZoned(() {
-      templateBind(template).model = m;
-    }, onError: (e, s) {
-      _expectNoSuchMethod(e);
-      errorSeen = true;
-    });
-
-    return new Future(() {
-      expect(div.nodes.length, 1);
-      m['bound'] = toObservable({ 'value': 2 });
-      expect(errorSeen, isTrue);
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:2');
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      m['predicate'] = null; // will have no effect
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      templateBind(template).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('oneTime-Bind If', () {
-    var div = createTestHtml(
-        '<template bind="[[ bound ]]" if="{{ predicate }}">'
-          'value:{{ value }}'
-        '</template>');
-
-    var m = toObservable({'predicate': null, 'bound': {'value': 2}});
-    var template = div.firstChild;
-    templateBind(template).model = m;
-
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = 1;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:2');
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      m['bound'] = toObservable({'value': 4 });
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      templateBind(template).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('oneTime-Bind oneTime-If', () {
-    var div = createTestHtml(
-        '<template bind="[[ bound ]]" if="[[ predicate ]]">'
-          'value:{{ value }}'
-        '</template>');
-
-    var m = toObservable({'predicate': 1, 'bound': {'value': 2}});
-    var template = div.firstChild;
-    templateBind(template).model = m;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:2');
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      m['bound'] = toObservable({'value': 4 });
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      m['predicate'] = false;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      templateBind(template).model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Bind If, 2', () {
-    var div = createTestHtml(
-        '<template bind="{{ foo }}" if="{{ bar }}">{{ bat }}</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'bar': null, 'foo': { 'bat': 'baz' } });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['bar'] = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'baz');
-    });
-  });
-
-  test('If', () {
-    var div = createTestHtml('<template if="{{ foo }}">{{ value }}</template>');
-    // Dart note: foo changed from 0->null because 0 isn't falsey in Dart.
-    // See https://code.google.com/p/dart/issues/detail?id=11956
-    var m = toObservable({ 'foo': null, 'value': 'foo' });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['foo'] = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'foo');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Bind If minimal discardChanges', () {
-    var div = createTestHtml(
-        '<template bind="{{bound}}" if="{{predicate}}">value:{{ value }}'
-        '</template>');
-    // Dart Note: bound changed from null->{}.
-    var m = toObservable({ 'bound': {}, 'predicate': null });
-    var template = div.firstChild;
-
-    var discardChangesCalled = { 'bound': 0, 'predicate': 0 };
-    templateBind(template)
-        ..model = m
-        ..bindingDelegate =
-            new BindIfMinimalDiscardChanges(discardChangesCalled);
-
-    return new Future(() {
-      expect(discardChangesCalled['bound'], 0);
-      expect(discardChangesCalled['predicate'], 0);
-      expect(div.childNodes.length, 1);
-      m['predicate'] = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(discardChangesCalled['bound'], 1);
-      expect(discardChangesCalled['predicate'], 0);
-
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:');
-
-      m['bound'] = toObservable({'value': 2});
-    }).then(endOfMicrotask).then((_) {
-      expect(discardChangesCalled['bound'], 1);
-      expect(discardChangesCalled['predicate'], 1);
-
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:2');
-
-      m['bound']['value'] = 3;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(discardChangesCalled['bound'], 1);
-      expect(discardChangesCalled['predicate'], 1);
-
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:3');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(discardChangesCalled['bound'], 1);
-      expect(discardChangesCalled['predicate'], 1);
-
-      expect(div.nodes.length, 1);
-    });
-  });
-
-
-  test('Empty-If', () {
-    var div = createTestHtml('<template if>{{ value }}</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = null;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      templateBind(template).model = m;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'foo');
-    });
-  });
-
-  test('OneTime - simple text', () {
-    var div = createTestHtml('<template bind>[[ value ]]</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'foo');
-
-      m['value'] = 'bar';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged.
-      expect(div.lastChild.text, 'foo');
-    });
-  });
-
-  test('OneTime - compound text', () {
-    var div = createTestHtml(
-        '<template bind>[[ foo ]] bar [[ baz ]]</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'foo': 'FOO', 'baz': 'BAZ' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'FOO bar BAZ');
-
-      m['foo'] = 'FI';
-      m['baz'] = 'BA';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged.
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'FOO bar BAZ');
-    });
-  });
-
-  test('OneTime/Dynamic Mixed - compound text', () {
-    var div = createTestHtml(
-        '<template bind>[[ foo ]] bar {{ baz }}</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'foo': 'FOO', 'baz': 'BAZ' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'FOO bar BAZ');
-
-      m['foo'] = 'FI';
-      m['baz'] = 'BA';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged [[ foo ]].
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'FOO bar BA');
-    });
-  });
-
-  test('OneTime - simple attribute', () {
-    var div = createTestHtml(
-        '<template bind><div foo="[[ value ]]"></div></template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.attributes['foo'], 'foo');
-
-      m['value'] = 'bar';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged.
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.attributes['foo'], 'foo');
-    });
-  });
-
-  test('OneTime - compound attribute', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<div foo="[[ value ]]:[[ otherValue ]]"></div>'
-        '</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'value': 'foo', 'otherValue': 'bar' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.attributes['foo'], 'foo:bar');
-
-      m['value'] = 'baz';
-      m['otherValue'] = 'bot';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged.
-      expect(div.lastChild.attributes['foo'], 'foo:bar');
-    });
-  });
-
-  test('OneTime/Dynamic mixed - compound attribute', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<div foo="{{ value }}:[[ otherValue ]]"></div>'
-        '</template>');
-    var template = div.firstChild;
-    var m = toObservable({ 'value': 'foo', 'otherValue': 'bar' });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.attributes['foo'], 'foo:bar');
-
-      m['value'] = 'baz';
-      m['otherValue'] = 'bot';
-
-    }).then(endOfMicrotask).then((_) {
-      // unchanged [[ otherValue ]].
-      expect(div.lastChild.attributes['foo'], 'baz:bar');
-    });
-  });
-
-  test('Repeat If', () {
-    var div = createTestHtml(
-        '<template repeat="{{ items }}" if="{{ predicate }}">{{}}</template>');
-    // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart.
-    // See https://code.google.com/p/dart/issues/detail?id=11956
-    var m = toObservable({ 'predicate': null, 'items': [1] });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = 1;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items']..add(2)..add(3);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '1');
-      expect(div.nodes[2].text, '2');
-      expect(div.nodes[3].text, '3');
-
-      m['items'] = [4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '4');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Repeat oneTime-If (predicate false)', () {
-    var div = createTestHtml(
-        '<template repeat="{{ items }}" if="[[ predicate ]]">{{}}</template>');
-    // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart.
-    // See https://code.google.com/p/dart/issues/detail?id=11956
-    var m = toObservable({ 'predicate': null, 'items': [1] });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = 1;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1, reason: 'unchanged');
-
-      m['items']..add(2)..add(3);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1, reason: 'unchanged');
-
-      m['items'] = [4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1, reason: 'unchanged');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Repeat oneTime-If (predicate true)', () {
-    var div = createTestHtml(
-        '<template repeat="{{ items }}" if="[[ predicate ]]">{{}}</template>');
-
-    var m = toObservable({ 'predicate': true, 'items': [1] });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items']..add(2)..add(3);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '1');
-      expect(div.nodes[2].text, '2');
-      expect(div.nodes[3].text, '3');
-
-      m['items'] = [4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '4');
-
-      m['predicate'] = false;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2, reason: 'unchanged');
-      expect(div.nodes[1].text, '4', reason: 'unchanged');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('oneTime-Repeat If', () {
-    var div = createTestHtml(
-        '<template repeat="[[ items ]]" if="{{ predicate }}">{{}}</template>');
-
-    var m = toObservable({ 'predicate': false, 'items': [1] });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 1);
-
-      m['predicate'] = true;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items']..add(2)..add(3);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items'] = [4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('oneTime-Repeat oneTime-If', () {
-    var div = createTestHtml(
-        '<template repeat="[[ items ]]" if="[[ predicate ]]">{{}}</template>');
-
-    var m = toObservable({ 'predicate': true, 'items': [1] });
-    var template = div.firstChild;
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items']..add(2)..add(3);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['items'] = [4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      m['predicate'] = false;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes[1].text, '1');
-
-      templateBind(template).model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('TextTemplateWithNullStringBinding', () {
-    var div = createTestHtml('<template bind={{}}>a{{b}}c</template>');
-    var template = div.firstChild;
-    var model = toObservable({'b': 'B'});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'aBc');
-
-      model['b'] = 'b';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'abc');
-
-      model['b'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'ac');
-
-      model = null;
-    }).then(endOfMicrotask).then((_) {
-      // setting model isn't bindable.
-      expect(div.nodes.last.text, 'ac');
-    });
-  });
-
-  test('TextTemplateWithBindingPath', () {
-    var div = createTestHtml(
-        '<template bind="{{ data }}">a{{b}}c</template>');
-    var model = toObservable({ 'data': {'b': 'B'} });
-    var template = div.firstChild;
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'aBc');
-
-      model['data']['b'] = 'b';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'abc');
-
-      model['data'] = toObservable({'b': 'X'});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'aXc');
-
-      // Dart note: changed from `null` since our null means don't render a model.
-      model['data'] = toObservable({});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'ac');
-
-      model['data'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('TextTemplateWithBindingAndConditional', () {
-    var div = createTestHtml(
-        '<template bind="{{}}" if="{{ d }}">a{{b}}c</template>');
-    var template = div.firstChild;
-    var model = toObservable({'b': 'B', 'd': 1});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'aBc');
-
-      model['b'] = 'b';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'abc');
-
-      // TODO(jmesserly): MDV set this to empty string and relies on JS conversion
-      // rules. Is that intended?
-      // See https://github.com/Polymer/TemplateBinding/issues/59
-      model['d'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-
-      model['d'] = 'here';
-      model['b'] = 'd';
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'adc');
-    });
-  });
-
-  test('TemplateWithTextBinding2', () {
-    var div = createTestHtml(
-        '<template bind="{{ b }}">a{{value}}c</template>');
-    expect(div.nodes.length, 1);
-    var template = div.firstChild;
-    var model = toObservable({'b': {'value': 'B'}});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.text, 'aBc');
-
-      model['b'] = toObservable({'value': 'b'});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.text, 'abc');
-    });
-  });
-
-  test('TemplateWithAttributeBinding', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">'
-        '<div foo="a{{b}}c"></div>'
-        '</template>');
-    var template = div.firstChild;
-    var model = toObservable({'b': 'B'});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.attributes['foo'], 'aBc');
-
-      model['b'] = 'b';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.attributes['foo'], 'abc');
-
-      model['b'] = 'X';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.attributes['foo'], 'aXc');
-    });
-  });
-
-  test('TemplateWithConditionalBinding', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">'
-        '<div foo?="{{b}}"></div>'
-        '</template>');
-    var template = div.firstChild;
-    var model = toObservable({'b': 'b'});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.attributes['foo'], '');
-      expect(div.nodes.last.attributes, isNot(contains('foo?')));
-
-      model['b'] = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.attributes, isNot(contains('foo')));
-    });
-  });
-
-  test('Repeat', () {
-    var div = createTestHtml(
-        '<template repeat="{{ array }}">{{}},</template>');
-
-    var model = toObservable({'array': [0, 1, 2]});
-    var template = templateBind(div.firstChild);
-    template.model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.text, '0,1,2,');
-
-      model['array'].length = 1;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.text, '0,');
-
-      model['array'].addAll([3, 4]);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-      expect(div.text, '0,3,4,');
-
-      model['array'].removeRange(1, 2);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 3);
-      expect(div.text, '0,4,');
-
-      model['array'].addAll([5, 6]);
-      model['array'] = toObservable(['x', 'y']);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 3);
-      expect(div.text, 'x,y,');
-
-      template.model = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-      expect(div.text, '');
-    });
-  });
-
-  test('Repeat - oneTime', () {
-    var div = createTestHtml('<template repeat="[[]]">text</template>');
-
-    var model = toObservable([0, 1, 2]);
-    var template = templateBind(div.firstChild);
-    template.model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-
-      model.length = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-
-      model.addAll([3, 4]);
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-
-      model.removeRange(1, 2);
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-
-      template.model = null;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-    });
-  });
-
-  test('Repeat - Reuse Instances', () {
-    var div = createTestHtml('<template repeat>{{ val }}</template>');
-
-    var model = toObservable([
-      {'val': 10},
-      {'val': 5},
-      {'val': 2},
-      {'val': 8},
-      {'val': 1}
-    ]);
-    var template = div.firstChild;
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 6);
-
-      addExpandos(template.nextNode);
-      checkExpandos(template.nextNode);
-
-      model.sort((a, b) => a['val'] - b['val']);
-    }).then(endOfMicrotask).then((_) {
-      checkExpandos(template.nextNode);
-
-      model = toObservable(model.reversed);
-      templateBind(template).model = model;
-    }).then(endOfMicrotask).then((_) {
-      checkExpandos(template.nextNode);
-
-      for (var item in model) {
-        item['val'] += 1;
-      }
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[1].text, "11");
-      expect(div.nodes[2].text, "9");
-      expect(div.nodes[3].text, "6");
-      expect(div.nodes[4].text, "3");
-      expect(div.nodes[5].text, "2");
-    });
-  });
-
-  test('Bind - Reuse Instance', () {
-    var div = createTestHtml(
-        '<template bind="{{ foo }}">{{ bar }}</template>');
-
-    var template = div.firstChild;
-    var model = toObservable({ 'foo': { 'bar': 5 }});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-
-      addExpandos(template.nextNode);
-      checkExpandos(template.nextNode);
-
-      model = toObservable({'foo': model['foo']});
-      templateBind(template).model = model;
-    }).then(endOfMicrotask).then((_) {
-      checkExpandos(template.nextNode);
-    });
-  });
-
-  test('Repeat-Empty', () {
-    var div = createTestHtml(
-        '<template repeat>text</template>');
-
-    var template = div.firstChild;
-    var model = toObservable([0, 1, 2]);
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-
-      model.length = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-
-      model.addAll(toObservable([3, 4]));
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-
-      model.removeRange(1, 2);
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 3);
-    });
-  });
-
-  test('Removal from iteration needs to unbind', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}"><a>{{v}}</a></template>');
-    var template = div.firstChild;
-    var model = toObservable([{'v': 0}, {'v': 1}, {'v': 2}, {'v': 3},
-        {'v': 4}]);
-    templateBind(template).model = model;
-
-    var nodes, vs;
-    return new Future(() {
-
-      nodes = div.nodes.skip(1).toList();
-      vs = model.toList();
-
-      for (var i = 0; i < 5; i++) {
-        expect(nodes[i].text, '$i');
-      }
-
-      model.length = 3;
-    }).then(endOfMicrotask).then((_) {
-      for (var i = 0; i < 5; i++) {
-        expect(nodes[i].text, '$i');
-      }
-
-      vs[3]['v'] = 33;
-      vs[4]['v'] = 44;
-    }).then(endOfMicrotask).then((_) {
-      for (var i = 0; i < 5; i++) {
-        expect(nodes[i].text, '$i');
-      }
-    });
-  });
-
-  test('Template.clear', () {
-    var div = createTestHtml(
-        '<template repeat>{{}}</template>');
-    var template = div.firstChild;
-    templateBind(template).model = [0, 1, 2];
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '0');
-      expect(div.nodes[2].text, '1');
-      expect(div.nodes[3].text, '2');
-
-      // clear() synchronously removes instances and clears the model.
-      templateBind(div.firstChild).clear();
-      expect(div.nodes.length, 1);
-      expect(templateBind(template).model, null);
-
-      // test that template still works if new model assigned
-      templateBind(template).model = [3, 4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 3);
-      expect(div.nodes[1].text, '3');
-      expect(div.nodes[2].text, '4');
-    });
-  });
-
-  test('DOM Stability on Iteration', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}">{{}}</template>');
-    var template = div.firstChild;
-    var model = toObservable([1, 2, 3, 4, 5]);
-    templateBind(template).model = model;
-
-    var nodes;
-    return new Future(() {
-      // Note: the node at index 0 is the <template>.
-      nodes = div.nodes.toList();
-      expect(nodes.length, 6, reason: 'list has 5 items');
-
-      model.removeAt(0);
-      model.removeLast();
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4, reason: 'list has 3 items');
-      expect(identical(div.nodes[1], nodes[2]), true, reason: '2 not removed');
-      expect(identical(div.nodes[2], nodes[3]), true, reason: '3 not removed');
-      expect(identical(div.nodes[3], nodes[4]), true, reason: '4 not removed');
-
-      model.insert(0, 5);
-      model[2] = 6;
-      model.add(7);
-
-    }).then(endOfMicrotask).then((_) {
-
-      expect(div.nodes.length, 6, reason: 'list has 5 items');
-      expect(nodes.contains(div.nodes[1]), false, reason: '5 is a new node');
-      expect(identical(div.nodes[2], nodes[2]), true);
-      expect(nodes.contains(div.nodes[3]), false, reason: '6 is a new node');
-      expect(identical(div.nodes[4], nodes[4]), true);
-      expect(nodes.contains(div.nodes[5]), false, reason: '7 is a new node');
-
-      nodes = div.nodes.toList();
-
-      model.insert(2, 8);
-
-    }).then(endOfMicrotask).then((_) {
-
-      expect(div.nodes.length, 7, reason: 'list has 6 items');
-      expect(identical(div.nodes[1], nodes[1]), true);
-      expect(identical(div.nodes[2], nodes[2]), true);
-      expect(nodes.contains(div.nodes[3]), false, reason: '8 is a new node');
-      expect(identical(div.nodes[4], nodes[3]), true);
-      expect(identical(div.nodes[5], nodes[4]), true);
-      expect(identical(div.nodes[6], nodes[5]), true);
-    });
-  });
-
-  test('Repeat2', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}">{{value}}</template>');
-    expect(div.nodes.length, 1);
-
-    var template = div.firstChild;
-    var model = toObservable([
-      {'value': 0},
-      {'value': 1},
-      {'value': 2}
-    ]);
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '0');
-      expect(div.nodes[2].text, '1');
-      expect(div.nodes[3].text, '2');
-
-      model[1]['value'] = 'One';
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '0');
-      expect(div.nodes[2].text, 'One');
-      expect(div.nodes[3].text, '2');
-
-      model.replaceRange(0, 1, toObservable([{'value': 'Zero'}]));
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, 'Zero');
-      expect(div.nodes[2].text, 'One');
-      expect(div.nodes[3].text, '2');
-    });
-  });
-
-  test('TemplateWithInputValue', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">'
-        '<input value="{{x}}">'
-        '</template>');
-    var template = div.firstChild;
-    var model = toObservable({'x': 'hi'});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.nodes.last.value, 'hi');
-
-      model['x'] = 'bye';
-      expect(div.nodes.last.value, 'hi');
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.value, 'bye');
-
-      div.nodes.last.value = 'hello';
-      dispatchEvent('input', div.nodes.last);
-      expect(model['x'], 'hello');
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.last.value, 'hello');
-    });
-  });
-
-//////////////////////////////////////////////////////////////////////////////
-
-  test('Decorated', () {
-    var div = createTestHtml(
-        '<template bind="{{ XX }}" id="t1">'
-          '<p>Crew member: {{name}}, Job title: {{title}}</p>'
-        '</template>'
-        '<template bind="{{ XY }}" id="t2" ref="t1"></template>');
-
-    var t1 = document.getElementById('t1');
-    var t2 = document.getElementById('t2');
-    var model = toObservable({
-      'XX': {'name': 'Leela', 'title': 'Captain'},
-      'XY': {'name': 'Fry', 'title': 'Delivery boy'},
-      'XZ': {'name': 'Zoidberg', 'title': 'Doctor'}
-    });
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
-
-    return new Future(() {
-      var instance = t1.nextElementSibling;
-      expect(instance.text, 'Crew member: Leela, Job title: Captain');
-
-      instance = t2.nextElementSibling;
-      expect(instance.text, 'Crew member: Fry, Job title: Delivery boy');
-
-      expect(div.children.length, 4);
-      expect(div.nodes.length, 4);
-
-      expect(div.nodes[1].tagName, 'P');
-      expect(div.nodes[3].tagName, 'P');
-    });
-  });
-
-  test('DefaultStyles', () {
-    var t = new Element.tag('template');
-    TemplateBindExtension.decorate(t);
-
-    document.body.append(t);
-    expect(t.getComputedStyle().display, 'none');
-
-    t.remove();
-  });
-
-
-  test('Bind', () {
-    var div = createTestHtml('<template bind="{{}}">Hi {{ name }}</template>');
-    var template = div.firstChild;
-    var model = toObservable({'name': 'Leela'});
-    templateBind(template).model = model;
-
-    return new Future(() => expect(div.nodes[1].text, 'Hi Leela'));
-  });
-
-  test('BindPlaceHolderHasNewLine', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">Hi {{\nname\n}}</template>');
-    var template = div.firstChild;
-    var model = toObservable({'name': 'Leela'});
-    templateBind(template).model = model;
-
-    return new Future(() => expect(div.nodes[1].text, 'Hi Leela'));
-  });
-
-  test('BindWithRef', () {
-    var id = 't${new math.Random().nextInt(100)}';
-    var div = createTestHtml(
-        '<template id="$id">'
-          'Hi {{ name }}'
-        '</template>'
-        '<template ref="$id" bind="{{}}"></template>');
-
-    var t1 = div.nodes.first;
-    var t2 = div.nodes[1];
-
-    var model = toObservable({'name': 'Fry'});
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
-
-    return new Future(() => expect(t2.nextNode.text, 'Hi Fry'));
-  });
-
-  test('Ref at multiple', () {
-    // Note: this test is asserting that template "ref"erences can be located
-    // at various points. In particular:
-    // -in the document (at large) (e.g. ref=doc)
-    // -within template content referenced from sub-content
-    //   -both before and after the reference
-    // The following asserts ensure that all referenced templates content is
-    // found.
-    var div = createTestHtml(
-      '<template bind>'
-        '<template bind ref=doc></template>'
-        '<template id=elRoot>EL_ROOT</template>'
-        '<template bind>'
-          '<template bind ref=elRoot></template>'
-          '<template bind>'
-            '<template bind ref=subA></template>'
-            '<template id=subB>SUB_B</template>'
-            '<template bind>'
-              '<template bind ref=subB></template>'
-            '</template>'
-          '</template>'
-          '<template id=subA>SUB_A</template>'
-        '</template>'
-      '</template>'
-      '<template id=doc>DOC</template>');
-    var t = div.firstChild;
-    var fragment = templateBind(t).createInstance({});
-    expect(fragment.nodes.length, 14);
-    expect(fragment.nodes[1].text, 'DOC');
-    expect(fragment.nodes[5].text, 'EL_ROOT');
-    expect(fragment.nodes[8].text, 'SUB_A');
-    expect(fragment.nodes[12].text, 'SUB_B');
-    div.append(fragment);
-  });
-
-  test('Update Ref', () {
-    // Updating ref by observing the attribute is dependent on MutationObserver
-    var div = createTestHtml(
-        '<template id=A>Hi, {{}}</template>'
-        '<template id=B>Hola, {{}}</template>'
-        '<template ref=A repeat></template>');
-
-    var template = div.nodes[2];
-    var model = new ObservableList.from(['Fry']);
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect('Hi, Fry', div.nodes[3].text);
-
-      // In IE 11, MutationObservers do not fire before setTimeout.
-      // So rather than using "then" to queue up the next test, we use a
-      // MutationObserver here to detect the change to "ref".
-      var done = new Completer();
-      new MutationObserver((mutations, observer) {
-        expect(div.nodes.length, 5);
-
-        expect('Hola, Fry', div.nodes[3].text);
-        expect('Hola, Leela', div.nodes[4].text);
-        done.complete();
-      }).observe(template, attributes: true, attributeFilter: ['ref']);
-
-      template.setAttribute('ref', 'B');
-      model.add('Leela');
-
-      return done.future;
-    });
-  });
-
-  test('Bound Ref', () {
-    var div = createTestHtml(
-        '<template id=A>Hi, {{}}</template>'
-        '<template id=B>Hola, {{}}</template>'
-        '<template ref="{{ ref }}" repeat="{{ people }}"></template>');
-
-    var template = div.nodes[2];
-    var model = toObservable({'ref': 'A', 'people': ['Fry']});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect('Hi, Fry', div.nodes[3].text);
-
-      model['ref'] = 'B';
-      model['people'].add('Leela');
-
-    }).then(endOfMicrotask).then((x) {
-      expect(div.nodes.length, 5);
-
-      expect('Hola, Fry', div.nodes[3].text);
-      expect('Hola, Leela', div.nodes[4].text);
-    });
-  });
-
-  test('BindWithDynamicRef', () {
-    var id = 't${new math.Random().nextInt(100)}';
-    var div = createTestHtml(
-        '<template id="$id">'
-          'Hi {{ name }}'
-        '</template>'
-        '<template ref="{{ id }}" bind="{{}}"></template>');
-
-    var t1 = div.firstChild;
-    var t2 = div.nodes[1];
-    var model = toObservable({'name': 'Fry', 'id': id });
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
-
-    return new Future(() => expect(t2.nextNode.text, 'Hi Fry'));
-  });
-
-  assertNodesAre(div, [arguments]) {
-    var expectedLength = arguments.length;
-    expect(div.nodes.length, expectedLength + 1);
-
-    for (var i = 0; i < arguments.length; i++) {
-      var targetNode = div.nodes[i + 1];
-      expect(targetNode.text, arguments[i]);
-    }
-  }
-
-  test('Repeat3', () {
-    var div = createTestHtml(
-        '<template repeat="{{ contacts }}">Hi {{ name }}</template>');
-    var t = div.nodes.first;
-
-    var m = toObservable({
-      'contacts': [
-        {'name': 'Raf'},
-        {'name': 'Arv'},
-        {'name': 'Neal'}
-      ]
-    });
-
-    templateBind(t).model = m;
-    return new Future(() {
-
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
-
-      m['contacts'].add(toObservable({'name': 'Alex'}));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal', 'Hi Alex']);
-
-      m['contacts'].replaceRange(0, 2,
-          toObservable([{'name': 'Rafael'}, {'name': 'Erik'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Neal', 'Hi Alex']);
-
-      m['contacts'].removeRange(1, 3);
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Alex']);
-
-      m['contacts'].insertAll(1,
-          toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']);
-
-      m['contacts'].replaceRange(0, 1,
-          toObservable([{'name': 'Tab'}, {'name': 'Neal'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri',
-          'Hi Alex']);
-
-      m['contacts'] = toObservable([{'name': 'Alex'}]);
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Alex']);
-
-      m['contacts'].length = 0;
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, []);
-    });
-  });
-
-  test('RepeatModelSet', () {
-    var div = createTestHtml(
-        '<template repeat="{{ contacts }}">'
-          'Hi {{ name }}'
-        '</template>');
-    var template = div.firstChild;
-    var m = toObservable({
-      'contacts': [
-        {'name': 'Raf'},
-        {'name': 'Arv'},
-        {'name': 'Neal'}
-      ]
-    });
-    templateBind(template).model = m;
-    return new Future(() {
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
-    });
-  });
-
-  test('RepeatEmptyPath', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}">Hi {{ name }}</template>');
-    var t = div.nodes.first;
-
-    var m = toObservable([
-      {'name': 'Raf'},
-      {'name': 'Arv'},
-      {'name': 'Neal'}
-    ]);
-    templateBind(t).model = m;
-    return new Future(() {
-
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
-
-      m.add(toObservable({'name': 'Alex'}));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal', 'Hi Alex']);
-
-      m.replaceRange(0, 2, toObservable([{'name': 'Rafael'}, {'name': 'Erik'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Neal', 'Hi Alex']);
-
-      m.removeRange(1, 3);
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Alex']);
-
-      m.insertAll(1, toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']);
-
-      m.replaceRange(0, 1, toObservable([{'name': 'Tab'}, {'name': 'Neal'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri',
-          'Hi Alex']);
-
-      m.length = 0;
-      m.add(toObservable({'name': 'Alex'}));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Alex']);
-    });
-  });
-
-  test('RepeatNullModel', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}">Hi {{ name }}</template>');
-    var t = div.nodes.first;
-
-    var m = null;
-    templateBind(t).model = m;
-
-    expect(div.nodes.length, 1);
-
-    t.attributes['iterate'] = '';
-    m = toObservable({});
-    templateBind(t).model = m;
-    return new Future(() => expect(div.nodes.length, 1));
-  });
-
-  test('RepeatReuse', () {
-    var div = createTestHtml(
-        '<template repeat="{{}}">Hi {{ name }}</template>');
-    var t = div.nodes.first;
-
-    var m = toObservable([
-      {'name': 'Raf'},
-      {'name': 'Arv'},
-      {'name': 'Neal'}
-    ]);
-    templateBind(t).model = m;
-
-    var node1, node2, node3;
-    return new Future(() {
-      assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
-      node1 = div.nodes[1];
-      node2 = div.nodes[2];
-      node3 = div.nodes[3];
-
-      m.replaceRange(1, 2, toObservable([{'name': 'Erik'}]));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Raf', 'Hi Erik', 'Hi Neal']);
-      expect(div.nodes[1], node1,
-          reason: 'model[0] did not change so the node should not have changed');
-      expect(div.nodes[2], isNot(equals(node2)),
-          reason: 'Should not reuse when replacing');
-      expect(div.nodes[3], node3,
-          reason: 'model[2] did not change so the node should not have changed');
-
-      node2 = div.nodes[2];
-      m.insert(0, toObservable({'name': 'Alex'}));
-    }).then(endOfMicrotask).then((_) {
-      assertNodesAre(div, ['Hi Alex', 'Hi Raf', 'Hi Erik', 'Hi Neal']);
-    });
-  });
-
-  test('TwoLevelsDeepBug', () {
-    var div = createTestHtml(
-      '<template bind="{{}}"><span><span>{{ foo }}</span></span></template>');
-    var template = div.firstChild;
-    var model = toObservable({'foo': 'bar'});
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.nodes[1].nodes[0].nodes[0].text, 'bar');
-    });
-  });
-
-  test('Checked', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<input type="checkbox" checked="{{a}}">'
-        '</template>');
-    var t = div.nodes.first;
-    templateBind(t).model = toObservable({'a': true });
-
-    return new Future(() {
-
-      var instanceInput = t.nextNode;
-      expect(instanceInput.checked, true);
-
-      instanceInput.click();
-      expect(instanceInput.checked, false);
-
-      instanceInput.click();
-      expect(instanceInput.checked, true);
-    });
-  });
-
-  nestedHelper(s, start) {
-    var div = createTestHtml(s);
-
-    var m = toObservable({
-      'a': {
-        'b': 1,
-        'c': {'d': 2}
-      },
-    });
-
-    recursivelySetTemplateModel(div, m);
-    return new Future(() {
-
-      var i = start;
-      expect(div.nodes[i++].text, '1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, '2');
-
-      m['a']['b'] = 11;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[start].text, '11');
-
-      m['a']['c'] = toObservable({'d': 22});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[start + 2].text, '22');
-
-      //clearAllTemplates(div);
-    });
-  }
-
-  test('Nested', () => nestedHelper(
-      '<template bind="{{a}}">'
-        '{{b}}'
-        '<template bind="{{c}}">'
-          '{{d}}'
-        '</template>'
-      '</template>', 1));
-
-  test('NestedWithRef', () => nestedHelper(
-        '<template id="inner">{{d}}</template>'
-        '<template id="outer" bind="{{a}}">'
-          '{{b}}'
-          '<template ref="inner" bind="{{c}}"></template>'
-        '</template>', 2));
-
-  nestedIterateInstantiateHelper(s, start) {
-    var div = createTestHtml(s);
-
-    var m = toObservable({
-      'a': [
-        {
-          'b': 1,
-          'c': {'d': 11}
-        },
-        {
-          'b': 2,
-          'c': {'d': 22}
-        }
-      ]
-    });
-
-    recursivelySetTemplateModel(div, m);
-    return new Future(() {
-
-      var i = start;
-      expect(div.nodes[i++].text, '1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, '11');
-      expect(div.nodes[i++].text, '2');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, '22');
-
-      m['a'][1] = toObservable({
-        'b': 3,
-        'c': {'d': 33}
-      });
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[start + 3].text, '3');
-      expect(div.nodes[start + 5].text, '33');
-    });
-  }
-
-  test('NestedRepeatBind', () => nestedIterateInstantiateHelper(
-      '<template repeat="{{a}}">'
-        '{{b}}'
-        '<template bind="{{c}}">'
-          '{{d}}'
-        '</template>'
-      '</template>', 1));
-
-  test('NestedRepeatBindWithRef', () => nestedIterateInstantiateHelper(
-      '<template id="inner">'
-        '{{d}}'
-      '</template>'
-      '<template repeat="{{a}}">'
-        '{{b}}'
-        '<template ref="inner" bind="{{c}}"></template>'
-      '</template>', 2));
-
-  nestedIterateIterateHelper(s, start) {
-    var div = createTestHtml(s);
-
-    var m = toObservable({
-      'a': [
-        {
-          'b': 1,
-          'c': [{'d': 11}, {'d': 12}]
-        },
-        {
-          'b': 2,
-          'c': [{'d': 21}, {'d': 22}]
-        }
-      ]
-    });
-
-    recursivelySetTemplateModel(div, m);
-    return new Future(() {
-
-      var i = start;
-      expect(div.nodes[i++].text, '1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, '11');
-      expect(div.nodes[i++].text, '12');
-      expect(div.nodes[i++].text, '2');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, '21');
-      expect(div.nodes[i++].text, '22');
-
-      m['a'][1] = toObservable({
-        'b': 3,
-        'c': [{'d': 31}, {'d': 32}, {'d': 33}]
-      });
-
-      i = start + 4;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[start + 4].text, '3');
-      expect(div.nodes[start + 6].text, '31');
-      expect(div.nodes[start + 7].text, '32');
-      expect(div.nodes[start + 8].text, '33');
-    });
-  }
-
-  test('NestedRepeatBind', () => nestedIterateIterateHelper(
-      '<template repeat="{{a}}">'
-        '{{b}}'
-        '<template repeat="{{c}}">'
-          '{{d}}'
-        '</template>'
-      '</template>', 1));
-
-  test('NestedRepeatRepeatWithRef', () => nestedIterateIterateHelper(
-      '<template id="inner">'
-        '{{d}}'
-      '</template>'
-      '<template repeat="{{a}}">'
-        '{{b}}'
-        '<template ref="inner" repeat="{{c}}"></template>'
-      '</template>', 2));
-
-  test('NestedRepeatSelfRef', () {
-    var div = createTestHtml(
-        '<template id="t" repeat="{{}}">'
-          '{{name}}'
-          '<template ref="t" repeat="{{items}}"></template>'
-        '</template>');
-
-    var template = div.firstChild;
-
-    var m = toObservable([
-      {
-        'name': 'Item 1',
-        'items': [
-          {
-            'name': 'Item 1.1',
-            'items': [
-              {
-                 'name': 'Item 1.1.1',
-                 'items': []
-              }
-            ]
-          },
-          {
-            'name': 'Item 1.2'
-          }
-        ]
-      },
-      {
-        'name': 'Item 2',
-        'items': []
-      },
-    ]);
-
-    templateBind(template).model = m;
-
-    int i = 1;
-    return new Future(() {
-      expect(div.nodes[i++].text, 'Item 1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, 'Item 1.1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, 'Item 1.1.1');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, 'Item 1.2');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, 'Item 2');
-
-      m[0] = toObservable({'name': 'Item 1 changed'});
-
-      i = 1;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[i++].text, 'Item 1 changed');
-      expect(div.nodes[i++].tagName, 'TEMPLATE');
-      expect(div.nodes[i++].text, 'Item 2');
-    });
-  });
-
-  // Note: we don't need a zone for this test, and we don't want to alter timing
-  // since we're testing a rather subtle relationship between select and option.
-  test('Attribute Template Option/Optgroup', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<select selectedIndex="{{ selected }}">'
-            '<optgroup template repeat="{{ groups }}" label="{{ name }}">'
-              '<option template repeat="{{ items }}">{{ val }}</option>'
-            '</optgroup>'
-          '</select>'
-        '</template>');
-
-    var template = div.firstChild;
-    var m = toObservable({
-      'selected': 1,
-      'groups': [{
-        'name': 'one', 'items': [{ 'val': 0 }, { 'val': 1 }]
-      }],
-    });
-
-    templateBind(template).model = m;
-
-    var completer = new Completer();
-
-    new MutationObserver((records, observer) {
-      var select = div.nodes[0].nextNode;
-      if (select == null || select.querySelector('option') == null) return;
-
-      observer.disconnect();
-      new Future(() {
-        expect(select.nodes.length, 2);
-
-        expect(select.selectedIndex, 1, reason: 'selected index should update '
-            'after template expands.');
-
-        expect(select.nodes[0].tagName, 'TEMPLATE');
-        var optgroup = select.nodes[1];
-        expect(optgroup.nodes[0].tagName, 'TEMPLATE');
-        expect(optgroup.nodes[1].tagName, 'OPTION');
-        expect(optgroup.nodes[1].text, '0');
-        expect(optgroup.nodes[2].tagName, 'OPTION');
-        expect(optgroup.nodes[2].text, '1');
-
-        completer.complete();
-      });
-    })..observe(div, childList: true, subtree: true);
-
-    Observable.dirtyCheck();
-
-    return completer.future;
-  });
-
-  test('NestedIterateTableMixedSemanticNative', () {
-    if (!parserHasNativeTemplate) return null;
-
-    var div = createTestHtml(
-        '<table><tbody>'
-          '<template repeat="{{}}">'
-            '<tr>'
-              '<td template repeat="{{}}" class="{{ val }}">{{ val }}</td>'
-            '</tr>'
-          '</template>'
-        '</tbody></table>');
-    var template = div.firstChild.firstChild.firstChild;
-
-    var m = toObservable([
-      [{ 'val': 0 }, { 'val': 1 }],
-      [{ 'val': 2 }, { 'val': 3 }]
-    ]);
-
-    templateBind(template).model = m;
-    return new Future(() {
-      var tbody = div.nodes[0].nodes[0];
-
-      // 1 for the <tr template>, 2 * (1 tr)
-      expect(tbody.nodes.length, 3);
-
-      // 1 for the <td template>, 2 * (1 td)
-      expect(tbody.nodes[1].nodes.length, 3);
-
-      expect(tbody.nodes[1].nodes[1].text, '0');
-      expect(tbody.nodes[1].nodes[2].text, '1');
-
-      // 1 for the <td template>, 2 * (1 td)
-      expect(tbody.nodes[2].nodes.length, 3);
-      expect(tbody.nodes[2].nodes[1].text, '2');
-      expect(tbody.nodes[2].nodes[2].text, '3');
-
-      // Asset the 'class' binding is retained on the semantic template (just
-      // check the last one).
-      expect(tbody.nodes[2].nodes[2].attributes["class"], '3');
-    });
-  });
-
-  test('NestedIterateTable', () {
-    var div = createTestHtml(
-        '<table><tbody>'
-          '<tr template repeat="{{}}">'
-            '<td template repeat="{{}}" class="{{ val }}">{{ val }}</td>'
-          '</tr>'
-        '</tbody></table>');
-    var template = div.firstChild.firstChild.firstChild;
-
-    var m = toObservable([
-      [{ 'val': 0 }, { 'val': 1 }],
-      [{ 'val': 2 }, { 'val': 3 }]
-    ]);
-
-    templateBind(template).model = m;
-    return new Future(() {
-
-      var i = 1;
-      var tbody = div.nodes[0].nodes[0];
-
-      // 1 for the <tr template>, 2 * (1 tr)
-      expect(tbody.nodes.length, 3);
-
-      // 1 for the <td template>, 2 * (1 td)
-      expect(tbody.nodes[1].nodes.length, 3);
-      expect(tbody.nodes[1].nodes[1].text, '0');
-      expect(tbody.nodes[1].nodes[2].text, '1');
-
-      // 1 for the <td template>, 2 * (1 td)
-      expect(tbody.nodes[2].nodes.length, 3);
-      expect(tbody.nodes[2].nodes[1].text, '2');
-      expect(tbody.nodes[2].nodes[2].text, '3');
-
-      // Asset the 'class' binding is retained on the semantic template (just
-      // check the last one).
-      expect(tbody.nodes[2].nodes[2].attributes['class'], '3');
-    });
-  });
-
-  test('NestedRepeatDeletionOfMultipleSubTemplates', () {
-    var div = createTestHtml(
-        '<ul>'
-          '<template repeat="{{}}" id=t1>'
-            '<li>{{name}}'
-              '<ul>'
-                '<template ref=t1 repeat="{{items}}"></template>'
-              '</ul>'
-            '</li>'
-          '</template>'
-        '</ul>');
-
-    var m = toObservable([
-      {
-        'name': 'Item 1',
-        'items': [
-          {
-            'name': 'Item 1.1'
-          }
-        ]
-      }
-    ]);
-    var ul = div.firstChild;
-    var t = ul.firstChild;
-
-    templateBind(t).model = m;
-    return new Future(() {
-      expect(ul.nodes.length, 2);
-      var ul2 = ul.nodes[1].nodes[1];
-      expect(ul2.nodes.length, 2);
-      var ul3 = ul2.nodes[1].nodes[1];
-      expect(ul3.nodes.length, 1);
-
-      m.removeAt(0);
-    }).then(endOfMicrotask).then((_) {
-      expect(ul.nodes.length, 1);
-    });
-  });
-
-  test('DeepNested', () {
-    var div = createTestHtml(
-      '<template bind="{{a}}">'
-        '<p>'
-          '<template bind="{{b}}">'
-            '{{ c }}'
-          '</template>'
-        '</p>'
-      '</template>');
-    var template = div.firstChild;
-    var m = toObservable({
-      'a': {
-        'b': {
-          'c': 42
-        }
-      }
-    });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes[1].tagName, 'P');
-      expect(div.nodes[1].nodes.first.tagName, 'TEMPLATE');
-      expect(div.nodes[1].nodes[1].text, '42');
-    });
-  });
-
-  test('TemplateContentRemoved', () {
-    var div = createTestHtml('<template bind="{{}}">{{ }}</template>');
-    var template = div.firstChild;
-    var model = 42;
-
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.nodes[1].text, '42');
-      expect(div.nodes[0].text, '');
-    });
-  });
-
-  test('TemplateContentRemovedEmptyArray', () {
-    var div = createTestHtml('<template iterate>Remove me</template>');
-    var template = div.firstChild;
-    templateBind(template).model = [];
-    return new Future(() {
-      expect(div.nodes.length, 1);
-      expect(div.nodes[0].text, '');
-    });
-  });
-
-  test('TemplateContentRemovedNested', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">'
-          '{{ a }}'
-          '<template bind="{{}}">'
-            '{{ b }}'
-          '</template>'
-        '</template>');
-    var template = div.firstChild;
-    var model = toObservable({
-      'a': 1,
-      'b': 2
-    });
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.nodes[0].text, '');
-      expect(div.nodes[1].text, '1');
-      expect(div.nodes[2].text, '');
-      expect(div.nodes[3].text, '2');
-    });
-  });
-
-  test('BindWithUndefinedModel', () {
-    var div = createTestHtml(
-        '<template bind="{{}}" if="{{}}">{{ a }}</template>');
-    var template = div.firstChild;
-
-    var model = toObservable({'a': 42});
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.nodes[1].text, '42');
-
-      model = null;
-      templateBind(template).model = model;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 1);
-
-      model = toObservable({'a': 42});
-      templateBind(template).model = model;
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes[1].text, '42');
-    });
-  });
-
-  test('BindNested', () {
-    var div = createTestHtml(
-        '<template bind="{{}}">'
-          'Name: {{ name }}'
-          '<template bind="{{wife}}" if="{{wife}}">'
-            'Wife: {{ name }}'
-          '</template>'
-          '<template bind="{{child}}" if="{{child}}">'
-            'Child: {{ name }}'
-          '</template>'
-        '</template>');
-    var template = div.firstChild;
-    var m = toObservable({
-      'name': 'Hermes',
-      'wife': {
-        'name': 'LaBarbara'
-      }
-    });
-    templateBind(template).model = m;
-
-    return new Future(() {
-      expect(div.nodes.length, 5);
-      expect(div.nodes[1].text, 'Name: Hermes');
-      expect(div.nodes[3].text, 'Wife: LaBarbara');
-
-      m['child'] = toObservable({'name': 'Dwight'});
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 6);
-      expect(div.nodes[5].text, 'Child: Dwight');
-
-      m.remove('wife');
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 5);
-      expect(div.nodes[4].text, 'Child: Dwight');
-    });
-  });
-
-  test('BindRecursive', () {
-    var div = createTestHtml(
-        '<template bind="{{}}" if="{{}}" id="t">'
-          'Name: {{ name }}'
-          '<template bind="{{friend}}" if="{{friend}}" ref="t"></template>'
-        '</template>');
-    var template = div.firstChild;
-    var m = toObservable({
-      'name': 'Fry',
-      'friend': {
-        'name': 'Bender'
-      }
-    });
-    templateBind(template).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 5);
-      expect(div.nodes[1].text, 'Name: Fry');
-      expect(div.nodes[3].text, 'Name: Bender');
-
-      m['friend']['friend'] = toObservable({'name': 'Leela'});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 7);
-      expect(div.nodes[5].text, 'Name: Leela');
-
-      m['friend'] = toObservable({'name': 'Leela'});
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 5);
-      expect(div.nodes[3].text, 'Name: Leela');
-    });
-  });
-
-  test('Template - Self is terminator', () {
-    var div = createTestHtml(
-        '<template repeat>{{ foo }}'
-          '<template bind></template>'
-        '</template>');
-    var template = div.firstChild;
-
-    var m = toObservable([{ 'foo': 'bar' }]);
-    templateBind(template).model = m;
-    return new Future(() {
-
-      m.add(toObservable({ 'foo': 'baz' }));
-      templateBind(template).model = m;
-    }).then(endOfMicrotask).then((_) {
-
-      expect(div.nodes.length, 5);
-      expect(div.nodes[1].text, 'bar');
-      expect(div.nodes[3].text, 'baz');
-    });
-  });
-
-  test('Template - Same Contents, Different Array has no effect', () {
-    if (!MutationObserver.supported) return null;
-
-    var div = createTestHtml('<template repeat>{{ foo }}</template>');
-    var template = div.firstChild;
-
-    var m = toObservable([{ 'foo': 'bar' }, { 'foo': 'bat'}]);
-    templateBind(template).model = m;
-    var observer = new MutationObserver((x, y) {});
-    return new Future(() {
-      observer.observe(div, childList: true);
-
-      var template = div.firstChild;
-      templateBind(template).model = new ObservableList.from(m);
-    }).then(endOfMicrotask).then((_) {
-      var records = observer.takeRecords();
-      expect(records.length, 0);
-    });
-  });
-
-  test('RecursiveRef', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<template id=src>{{ foo }}</template>'
-          '<template bind ref=src></template>'
-        '</template>');
-
-    var m = toObservable({'foo': 'bar'});
-    templateBind(div.firstChild).model = m;
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[3].text, 'bar');
-    });
-  });
-
-  test('baseURI', () {
-    // TODO(jmesserly): Dart's setInnerHtml breaks this test -- the template
-    // URL is created as blank despite the NullTreeSanitizer.
-    // Use JS interop as a workaround.
-    //var div = createTestHtml('<template bind>'
-    //   '<div style="background: url(foo.jpg)"></div></template>');
-    var div = new DivElement();
-    new JsObject.fromBrowserObject(div)['innerHTML'] = '<template bind>'
-        '<div style="background: url(foo.jpg)"></div></template>';
-    testDiv.append(div);
-    TemplateBindExtension.decorate(div.firstChild);
-
-    var local = document.createElement('div');
-    local.attributes['style'] = 'background: url(foo.jpg)';
-    div.append(local);
-    var template = div.firstChild;
-    templateBind(template).model = {};
-    return new Future(() {
-      expect(div.nodes[1].style.backgroundImage, local.style.backgroundImage);
-    });
-  });
-
-  test('ChangeRefId', () {
-    var div = createTestHtml(
-        '<template id="a">a:{{ }}</template>'
-        '<template id="b">b:{{ }}</template>'
-        '<template repeat="{{}}">'
-          '<template ref="a" bind="{{}}"></template>'
-        '</template>');
-    var template = div.nodes[2];
-    var model = toObservable([]);
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.nodes.length, 3);
-
-      document.getElementById('a').id = 'old-a';
-      document.getElementById('b').id = 'a';
-
-      model..add(1)..add(2);
-    }).then(endOfMicrotask).then((_) {
-
-      expect(div.nodes.length, 7);
-      expect(div.nodes[4].text, 'b:1');
-      expect(div.nodes[6].text, 'b:2');
-    });
-  });
-
-  test('Content', () {
-    var div = createTestHtml(
-        '<template><a></a></template>'
-        '<template><b></b></template>');
-    var templateA = div.nodes.first;
-    var templateB = div.nodes.last;
-    var contentA = templateBind(templateA).content;
-    var contentB = templateBind(templateB).content;
-    expect(contentA, isNotNull);
-
-    expect(templateA.ownerDocument, isNot(equals(contentA.ownerDocument)));
-    expect(templateB.ownerDocument, isNot(equals(contentB.ownerDocument)));
-
-    expect(templateB.ownerDocument, templateA.ownerDocument);
-    expect(contentB.ownerDocument, contentA.ownerDocument);
-
-    // NOTE: these tests don't work under ShadowDOM polyfill.
-    // Disabled for now.
-    //expect(templateA.ownerDocument.window, window);
-    //expect(templateB.ownerDocument.window, window);
-
-    expect(contentA.ownerDocument.window, null);
-    expect(contentB.ownerDocument.window, null);
-
-    expect(contentA.nodes.last, contentA.nodes.first);
-    expect(contentA.nodes.first.tagName, 'A');
-
-    expect(contentB.nodes.last, contentB.nodes.first);
-    expect(contentB.nodes.first.tagName, 'B');
-  });
-
-  test('NestedContent', () {
-    var div = createTestHtml(
-        '<template>'
-        '<template></template>'
-        '</template>');
-    var templateA = div.nodes.first;
-    var templateB = templateBind(templateA).content.nodes.first;
-
-    expect(templateB.ownerDocument, templateBind(templateA)
-        .content.ownerDocument);
-    expect(templateBind(templateB).content.ownerDocument,
-        templateBind(templateA).content.ownerDocument);
-  });
-
-  test('BindShadowDOM', () {
-    if (!ShadowRoot.supported) return null;
-
-    var root = createShadowTestHtml(
-        '<template bind="{{}}">Hi {{ name }}</template>');
-    var model = toObservable({'name': 'Leela'});
-    templateBind(root.firstChild).model = model;
-    return new Future(() => expect(root.nodes[1].text, 'Hi Leela'));
-  });
-
-  // Dart note: this test seems gone from JS. Keeping for posterity sake.
-  test('BindShadowDOM createInstance', () {
-    if (!ShadowRoot.supported) return null;
-
-    var model = toObservable({'name': 'Leela'});
-    var template = new Element.html('<template>Hi {{ name }}</template>');
-    var root = createShadowTestHtml('');
-    root.nodes.add(templateBind(template).createInstance(model));
-
-    return new Future(() {
-      expect(root.text, 'Hi Leela');
-
-      model['name'] = 'Fry';
-    }).then(endOfMicrotask).then((_) {
-      expect(root.text, 'Hi Fry');
-    });
-  });
-
-  test('BindShadowDOM Template Ref', () {
-    if (!ShadowRoot.supported) return null;
-    var root = createShadowTestHtml(
-        '<template id=foo>Hi</template><template bind ref=foo></template>');
-    var template = root.nodes[1];
-    templateBind(template).model = toObservable({});
-    return new Future(() {
-      expect(root.nodes.length, 3);
-      clearAllTemplates(root);
-    });
-  });
-
-  // https://github.com/Polymer/TemplateBinding/issues/8
-  test('UnbindingInNestedBind', () {
-    var div = createTestHtml(
-      '<template bind="{{outer}}" if="{{outer}}" syntax="testHelper">'
-        '<template bind="{{inner}}" if="{{inner}}">'
-          '{{ age }}'
-        '</template>'
-      '</template>');
-    var template = div.firstChild;
-    var syntax = new UnbindingInNestedBindSyntax();
-    var model = toObservable({'outer': {'inner': {'age': 42}}});
-
-    templateBind(template)..model = model..bindingDelegate = syntax;
-
-    return new Future(() {
-      expect(syntax.count, 1);
-
-      var inner = model['outer']['inner'];
-      model['outer'] = null;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(syntax.count, 1);
-
-      model['outer'] = toObservable({'inner': {'age': 2}});
-      syntax.expectedAge = 2;
-
-    }).then(endOfMicrotask).then((_) {
-      expect(syntax.count, 2);
-    });
-  });
-
-  // https://github.com/toolkitchen/mdv/issues/8
-  test('DontCreateInstancesForAbandonedIterators', () {
-    var div = createTestHtml(
-      '<template bind="{{}} {{}}">'
-        '<template bind="{{}}">Foo</template>'
-      '</template>');
-    var template = div.firstChild;
-    templateBind(template).model = null;
-    return nextMicrotask;
-  });
-
-  test('CreateInstance', () {
-    var div = createTestHtml(
-      '<template bind="{{a}}">'
-        '<template bind="{{b}}">'
-          '{{ foo }}:{{ replaceme }}'
-        '</template>'
-      '</template>');
-    var outer = templateBind(div.nodes.first);
-    var model = toObservable({'b': {'foo': 'bar'}});
-
-    var instance = outer.createInstance(model, new TestBindingSyntax());
-    expect(instance.firstChild.nextNode.text, 'bar:replaced');
-
-    clearAllTemplates(instance);
-  });
-
-  test('CreateInstance - sync error', () {
-    var div = createTestHtml('<template>{{foo}}</template>');
-    var outer = templateBind(div.nodes.first);
-    var model = 1; // model is missing 'foo' should throw.
-    expect(() => outer.createInstance(model, new TestBindingSyntax()),
-        throwsA(_isNoSuchMethodError));
-  });
-
-  test('CreateInstance - async error', () {
-    var div = createTestHtml(
-      '<template>'
-        '<template bind="{{b}}">'
-          '{{ foo }}:{{ replaceme }}'
-        '</template>'
-      '</template>');
-    var outer = templateBind(div.nodes.first);
-    var model = toObservable({'b': 1}); // missing 'foo' should throw.
-
-    bool seen = false;
-    runZoned(() => outer.createInstance(model, new TestBindingSyntax()),
-      onError: (e) {
-        _expectNoSuchMethod(e);
-        seen = true;
-      });
-    return new Future(() { expect(seen, isTrue); });
-  });
-
-  test('Repeat - svg', () {
-    var div = createTestHtml(
-        '<svg width="400" height="110">'
-          '<template repeat>'
-            '<rect width="{{ width }}" height="{{ height }}" />'
-          '</template>'
-        '</svg>');
-
-    var model = toObservable([{ 'width': 10, 'height': 11 },
-                              { 'width': 20, 'height': 21 }]);
-    var svg = div.firstChild;
-    var template = svg.firstChild;
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(svg.nodes.length, 3);
-      expect(svg.nodes[1].attributes['width'], '10');
-      expect(svg.nodes[1].attributes['height'], '11');
-      expect(svg.nodes[2].attributes['width'], '20');
-      expect(svg.nodes[2].attributes['height'], '21');
-    });
-  });
-
-  test('Bootstrap', () {
-    var div = new DivElement();
-    div.innerHtml =
-      '<template>'
-        '<div></div>'
-        '<template>'
-          'Hello'
-        '</template>'
-      '</template>';
-
-    TemplateBindExtension.bootstrap(div);
-    var template = templateBind(div.nodes.first);
-    expect(template.content.nodes.length, 2);
-    var template2 = templateBind(template.content.nodes.first.nextNode);
-    expect(template2.content.nodes.length, 1);
-    expect(template2.content.nodes.first.text, 'Hello');
-
-    template = new Element.tag('template');
-    template.innerHtml =
-      '<template>'
-        '<div></div>'
-        '<template>'
-          'Hello'
-        '</template>'
-      '</template>';
-
-    TemplateBindExtension.bootstrap(template);
-    template2 = templateBind(templateBind(template).content.nodes.first);
-    expect(template2.content.nodes.length, 2);
-    var template3 = templateBind(template2.content.nodes.first.nextNode);
-    expect(template3.content.nodes.length, 1);
-    expect(template3.content.nodes.first.text, 'Hello');
-  });
-
-  test('issue-285', () {
-    var div = createTestHtml(
-        '<template>'
-          '<template bind if="{{show}}">'
-            '<template id=del repeat="{{items}}">'
-              '{{}}'
-            '</template>'
-          '</template>'
-        '</template>');
-
-    var template = div.firstChild;
-
-    var model = toObservable({
-      'show': true,
-      'items': [1]
-    });
-
-    div.append(templateBind(template).createInstance(model,
-        new Issue285Syntax()));
-
-    return new Future(() {
-      expect(template.nextNode.nextNode.nextNode.text, '2');
-      model['show'] = false;
-    }).then(endOfMicrotask).then((_) {
-      model['show'] = true;
-    }).then(endOfMicrotask).then((_) {
-      expect(template.nextNode.nextNode.nextNode.text, '2');
-    });
-  });
-
-  test('Accessor value retrieval count', () {
-    var div = createTestHtml(
-        '<template bind>{{ prop }}</template>');
-
-    var model = new TestAccessorModel();
-
-    templateBind(div.firstChild).model = model;
-
-    return new Future(() {
-      expect(model.count, 1);
-
-      model.value++;
-      // Dart note: we don't handle getters in @observable, so we need to
-      // notify regardless.
-      model.notifyPropertyChange(#prop, 1, model.value);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(model.count, 2);
-    });
-  });
-
-  test('issue-141', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<div foo="{{foo1}} {{foo2}}" bar="{{bar}}"></div>'
-        '</template>');
-
-    var template = div.firstChild;
-    var model = toObservable({
-      'foo1': 'foo1Value',
-      'foo2': 'foo2Value',
-      'bar': 'barValue'
-    });
-
-    templateBind(template).model = model;
-    return new Future(() {
-      expect(div.lastChild.attributes['bar'], 'barValue');
-    });
-  });
-
-  test('issue-18', () {
-    var delegate = new Issue18Syntax();
-
-    var div = createTestHtml(
-        '<template bind>'
-          '<div class="foo: {{ bar }}"></div>'
-        '</template>');
-
-    var template = div.firstChild;
-    var model = toObservable({'bar': 2});
-
-    templateBind(template)..model = model..bindingDelegate = delegate;
-
-    return new Future(() {
-      expect(div.lastChild.attributes['class'], 'foo: 2');
-    });
-  });
-
-  test('issue-152', () {
-    var div = createTestHtml(
-        '<template ref=notThere bind>XXX</template>');
-
-    var template = div.firstChild;
-    templateBind(template).model = {};
-
-    return new Future(() {
-      // if a ref cannot be located, a template will continue to use itself
-      // as the source of template instances.
-      expect(div.nodes[1].text, 'XXX');
-    });
-  });
-}
-
-compatTests() {
-  test('underbar bindings', () {
-    var div = createTestHtml(
-        '<template bind>'
-          '<div _style="color: {{ color }};"></div>'
-          '<img _src="{{ url }}">'
-          '<a _href="{{ url2 }}">Link</a>'
-          '<input type="number" _value="{{ number }}">'
-        '</template>');
-
-    var template = div.firstChild;
-    var model = toObservable({
-      'color': 'red',
-      'url': 'pic.jpg',
-      'url2': 'link.html',
-      'number': 4
-    });
-
-    templateBind(template).model = model;
-    return new Future(() {
-      var subDiv = div.firstChild.nextNode;
-      expect(subDiv.attributes['style'], 'color: red;');
-
-      var img = subDiv.nextNode;
-      expect(img.attributes['src'], 'pic.jpg');
-
-      var a = img.nextNode;
-      expect(a.attributes['href'], 'link.html');
-
-      var input = a.nextNode;
-      expect(input.value, '4');
-    });
-  });
-}
-
-// TODO(jmesserly): ideally we could test the type with isNoSuchMethodError,
-// however dart:js converts the nSM into a String at some point.
-// So for now we do string comparison.
-_isNoSuchMethodError(e) => '$e'.contains('NoSuchMethodError');
-
-_expectNoSuchMethod(e) {
-  // expect(e, isNoSuchMethodError);
-  expect('$e', contains('NoSuchMethodError'));
-}
-
-class Issue285Syntax extends BindingDelegate {
-  prepareInstanceModel(template) {
-    if (template.id == 'del') return (val) => val * 2;
-  }
-}
-
-class TestBindingSyntax extends BindingDelegate {
-  prepareBinding(String path, name, node) {
-    if (path.trim() == 'replaceme') {
-      return (m, n, oneTime) => new PathObserver('replaced', '');
-    }
-    return null;
-  }
-}
-
-class UnbindingInNestedBindSyntax extends BindingDelegate {
-  int expectedAge = 42;
-  int count = 0;
-
-  prepareBinding(path, name, node) {
-    if (name != 'text' || path != 'age') return null;
-
-    return (model, _, oneTime) {
-      expect(model['age'], expectedAge);
-      count++;
-      return new PathObserver(model, path);
-    };
-  }
-}
-
-class Issue18Syntax extends BindingDelegate {
-  prepareBinding(path, name, node) {
-    if (name != 'class') return null;
-
-    return (model, _, oneTime) => new PathObserver(model, path);
-  }
-}
-
-class BindIfMinimalDiscardChanges extends BindingDelegate {
-  Map<String, int> discardChangesCalled;
-
-  BindIfMinimalDiscardChanges(this.discardChangesCalled) : super() {}
-
-  prepareBinding(path, name, node) {
-    return (model, node, oneTime) =>
-      new DiscardCountingPathObserver(discardChangesCalled, model, path);
-  }
-}
-
-class DiscardCountingPathObserver extends PathObserver {
-  Map<String, int> discardChangesCalled;
-
-  DiscardCountingPathObserver(this.discardChangesCalled, model, path)
-      : super(model, path) {}
-
-  get value {
-    discardChangesCalled[path.toString()]++;
-    return super.value;
-  }
-}
-
-class TestAccessorModel extends Observable {
-  @observable var value = 1;
-  var count = 0;
-
-  @reflectable
-  get prop {
-    count++;
-    return value;
-  }
-}
diff --git a/packages/template_binding/test/template_binding_test.html b/packages/template_binding/test/template_binding_test.html
deleted file mode 100644
index 5d5c0cb..0000000
--- a/packages/template_binding/test/template_binding_test.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="dart.unittest" content="full-stack-traces">
-  <title> template_binding_test </title>
-  <style>
-     .unittest-table { font-family:monospace; border:1px; }
-     .unittest-pass { background: #6b3;}
-     .unittest-fail { background: #d55;}
-     .unittest-error { background: #a11;}
-  </style>
-  <script src="/packages/web_components/webcomponents.js"></script>
-  <script src="/packages/template_binding/js/observe.js"></script>
-  <script src="/packages/template_binding/js/node_bind.js"></script>
-  <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/flush.js"></script>
-  <script src="/packages/web_components/dart_support.js"></script>
-</head>
-<body>
-  <h1> Running template_binding_test </h1>
-  <script type="text/javascript"
-      src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <script type="application/dart" src="template_binding_test.dart"></script>
-  <script type="text/javascript" src="/packages/browser/dart.js"></script>
-</body>
-</html>
diff --git a/packages/template_binding/test/utils.dart b/packages/template_binding/test/utils.dart
deleted file mode 100644
index 6cea4fe..0000000
--- a/packages/template_binding/test/utils.dart
+++ /dev/null
@@ -1,115 +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 template_binding.test.utils;
-
-import 'dart:async';
-import 'dart:html';
-import 'package:observe/observe.dart';
-
-// Note: tests that import 'utils.dart' rely on the following line to make test
-// smaller for dart2js and prevent timeouts in the test bots.
-import 'package:observe/mirrors_used.dart';
-import 'package:template_binding/template_binding.dart';
-export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
-
-/// A small method to help readability. Used to cause the next "then" in a chain
-/// to happen in the next microtask:
-///
-///     future.then(endOfMicrotask).then(...)
-endOfMicrotask(_) => new Future.value();
-
-/// A small method to help readability. Used to cause the next "then" in a chain
-/// to happen in the next microtask, after a timer:
-///
-///     future.then(nextMicrotask).then(...)
-nextMicrotask(_) => new Future(() {});
-
-final bool parserHasNativeTemplate = () {
-  var div = new DivElement()..innerHtml = '<table><template>';
-  return div.firstChild.firstChild != null &&
-      div.firstChild.firstChild.tagName == 'TEMPLATE';
-}();
-
-recursivelySetTemplateModel(element, model, [delegate]) {
-  for (var node in element.queryAll('*')) {
-    if (isSemanticTemplate(node)) {
-      templateBind(node)
-          ..bindingDelegate = delegate
-          ..model = model;
-    }
-  }
-}
-
-dispatchEvent(type, target) {
-  target.dispatchEvent(new Event(type, cancelable: false));
-}
-
-class FooBarModel extends Observable {
-  @observable var foo;
-  @observable var bar;
-
-  FooBarModel([this.foo, this.bar]);
-}
-
-@reflectable
-class FooBarNotifyModel extends ChangeNotifier implements FooBarModel {
-  var _foo;
-  var _bar;
-
-  FooBarNotifyModel([this._foo, this._bar]);
-
-  get foo => _foo;
-  set foo(value) {
-    _foo = notifyPropertyChange(#foo, _foo, value);
-  }
-
-  get bar => _bar;
-  set bar(value) {
-    _bar = notifyPropertyChange(#bar, _bar, value);
-  }
-}
-
-DivElement testDiv;
-
-createTestHtml(s) {
-  var div = new DivElement();
-  div.setInnerHtml(s, treeSanitizer: new NullTreeSanitizer());
-  testDiv.append(div);
-
-  for (var node in div.querySelectorAll('*')) {
-    if (isSemanticTemplate(node)) TemplateBindExtension.decorate(node);
-  }
-
-  return div;
-}
-
-createShadowTestHtml(s) {
-  var div = new DivElement();
-  var root = div.createShadowRoot();
-  root.setInnerHtml(s, treeSanitizer: new NullTreeSanitizer());
-  testDiv.append(div);
-
-  for (var node in root.querySelectorAll('*')) {
-    if (isSemanticTemplate(node)) TemplateBindExtension.decorate(node);
-  }
-
-  return root;
-}
-
-/**
- * Sanitizer which does nothing.
- */
-class NullTreeSanitizer implements NodeTreeSanitizer {
-  void sanitizeTree(Node node) {}
-}
-
-clearAllTemplates(node) {
-  if (isSemanticTemplate(node)) {
-    templateBind(node).clear();
-  }
-  for (var child = node.firstChild; child != null; child = child.nextNode) {
-    clearAllTemplates(child);
-  }
-}
diff --git a/packages/unittest/.analysis_options b/packages/unittest/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/unittest/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/unittest/.gitignore b/packages/unittest/.gitignore
index 388eff0..e2552ea 100644
--- a/packages/unittest/.gitignore
+++ b/packages/unittest/.gitignore
@@ -1,8 +1,9 @@
-# Don’t commit the following directories created by pub.
+# Don’t commit the following files and directories created by pub.
 .buildlog
 .pub/
 build/
 packages
+.packages
 
 # Or the files created by dart2js.
 *.dart.js
diff --git a/packages/unittest/CHANGELOG.md b/packages/unittest/CHANGELOG.md
index 8e45401..b60e66b 100644
--- a/packages/unittest/CHANGELOG.md
+++ b/packages/unittest/CHANGELOG.md
@@ -1,3 +1,23 @@
+##0.11.7
+
+* Add separate methods for `expectAysnc` based on number of callback arguments 
+  `expectAsync0`, `expectAsync1`, ... `expectAsync6`.
+* Fix all strong mode warnings.
+
+##0.11.6+4
+
+* Fix some strong mode warnings we missed in the `vm_config.dart` and
+  `html_config.dart` libraries.
+
+##0.11.6+3
+
+* Fix a bug introduced in 0.11.6+2 in which operator matchers broke when taking
+  lists of matchers.
+
+##0.11.6+2
+
+* Fix all strong mode warnings.
+
 ##0.11.6+1
 
 * Give tests more time to start running.
diff --git a/packages/unittest/lib/html_config.dart b/packages/unittest/lib/html_config.dart
index c472d58..dc866a0 100644
--- a/packages/unittest/lib/html_config.dart
+++ b/packages/unittest/lib/html_config.dart
@@ -140,7 +140,7 @@
   void onInit() {
     // For Dart internal tests, we want to turn off stack frame
     // filtering, which we do with this meta-header.
-    var meta = querySelector('meta[name="dart.unittest"]');
+    MetaElement meta = querySelector('meta[name="dart.unittest"]');
     filterStacks =
         meta == null ? true : !meta.content.contains('full-stack-traces');
     _installHandlers();
diff --git a/packages/unittest/lib/src/expected_function.dart b/packages/unittest/lib/src/expected_function.dart
index 7373c75..5a92d14 100644
--- a/packages/unittest/lib/src/expected_function.dart
+++ b/packages/unittest/lib/src/expected_function.dart
@@ -30,7 +30,7 @@
 ///
 /// The wrapper function is accessible via [func]. It supports up to six
 /// optional and/or required positional arguments, but no named arguments.
-class ExpectedFunction {
+class ExpectedFunction<T> {
   /// The wrapped callback.
   final Function _callback;
 
@@ -125,43 +125,60 @@
   /// Returns a function that has the same number of positional arguments as the
   /// wrapped function (up to a total of 6).
   Function get func {
-    if (_callback is _Func6) return _max6;
-    if (_callback is _Func5) return _max5;
-    if (_callback is _Func4) return _max4;
-    if (_callback is _Func3) return _max3;
-    if (_callback is _Func2) return _max2;
-    if (_callback is _Func1) return _max1;
-    if (_callback is _Func0) return _max0;
+    if (_callback is _Func6) return max6;
+    if (_callback is _Func5) return max5;
+    if (_callback is _Func4) return max4;
+    if (_callback is _Func3) return max3;
+    if (_callback is _Func2) return max2;
+    if (_callback is _Func1) return max1;
+    if (_callback is _Func0) return max0;
 
     throw new ArgumentError(
         'The wrapped function has more than 6 required arguments');
   }
 
+  T max0() => max6();
+
   // This indirection is critical. It ensures the returned function has an
   // argument count of zero.
-  _max0() => _max6();
+  T max1([Object a0 = _PLACEHOLDER]) => max6(a0);
 
-  _max1([a0 = _PLACEHOLDER]) => _max6(a0);
+  T max2([Object a0 = _PLACEHOLDER, Object a1 = _PLACEHOLDER]) => max6(a0, a1);
 
-  _max2([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER]) => _max6(a0, a1);
+  T max3(
+          [Object a0 = _PLACEHOLDER, 
+          Object a1 = _PLACEHOLDER, 
+          Object a2 = _PLACEHOLDER]) =>  
+      max6(a0, a1, a2);
 
-  _max3([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER]) =>
-      _max6(a0, a1, a2);
+  T max4(
+          [Object a0 = _PLACEHOLDER,
+          Object a1 = _PLACEHOLDER,
+          Object a2 = _PLACEHOLDER,
+          Object a3 = _PLACEHOLDER]) =>
+      max6(a0, a1, a2, a3);
 
-  _max4([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
-      a3 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3);
+  T max5(
+          [Object a0 = _PLACEHOLDER,
+          Object a1 = _PLACEHOLDER,
+          Object a2 = _PLACEHOLDER,
+          Object a3 = _PLACEHOLDER,
+          Object a4 = _PLACEHOLDER]) =>
+      max6(a0, a1, a2, a3, a4);
 
-  _max5([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
-      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3, a4);
-
-  _max6([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
-      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER, a5 = _PLACEHOLDER]) =>
+  T max6(
+          [Object a0 = _PLACEHOLDER,
+          Object a1 = _PLACEHOLDER,
+          Object a2 = _PLACEHOLDER,
+          Object a3 = _PLACEHOLDER,
+          Object a4 = _PLACEHOLDER,
+          Object a5 = _PLACEHOLDER]) =>
       _run([a0, a1, a2, a3, a4, a5].where((a) => a != _PLACEHOLDER));
 
   /// Runs the wrapped function with [args] and returns its return value.
   ///
   /// This will pass any errors on to [_testCase] and return `null`.
-  _run(Iterable args) {
+  T _run(Iterable args) {
     try {
       _actualCalls++;
       if (_testCase.isComplete) {
@@ -177,10 +194,10 @@
         return null;
       } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) {
         throw new TestFailure('Callback ${_id}called more times than expected '
-                              '($_maxExpectedCalls).$_reason');
+            '($_maxExpectedCalls).$_reason');
       }
 
-      return Function.apply(_callback, args.toList());
+      return Function.apply(_callback, args.toList()) as T;
     } catch (error, stackTrace) {
       _testCase.registerException(error, stackTrace);
       return null;
diff --git a/packages/unittest/lib/src/matcher/iterable_matchers.dart b/packages/unittest/lib/src/matcher/iterable_matchers.dart
index 6a759ec..22465f6 100644
--- a/packages/unittest/lib/src/matcher/iterable_matchers.dart
+++ b/packages/unittest/lib/src/matcher/iterable_matchers.dart
@@ -120,8 +120,8 @@
   final List _expectedValues;
 
   _UnorderedEquals(Iterable expected)
-      : super(expected.map(equals)),
-        _expectedValues = expected.toList();
+      : _expectedValues = expected.toList(),
+        super(expected.map(equals));
 
   Description describe(Description description) => description
       .add('equals ')
diff --git a/packages/unittest/lib/src/matcher/operator_matchers.dart b/packages/unittest/lib/src/matcher/operator_matchers.dart
index 432f905..cb4ee33 100644
--- a/packages/unittest/lib/src/matcher/operator_matchers.dart
+++ b/packages/unittest/lib/src/matcher/operator_matchers.dart
@@ -91,7 +91,7 @@
 }
 
 List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
-  Iterable<Matcher> matchers;
+  Iterable args;
   if (arg0 is List) {
     if (arg1 != null ||
         arg2 != null ||
@@ -103,11 +103,10 @@
           ' null.');
     }
 
-    matchers = arg0;
+    args = arg0;
   } else {
-    matchers =
-        [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
+    args = [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
   }
 
-  return matchers.map((e) => wrapMatcher(e)).toList();
+  return args.map((e) => wrapMatcher(e)).toList();
 }
diff --git a/packages/unittest/lib/src/matcher/util.dart b/packages/unittest/lib/src/matcher/util.dart
index b98c1a8..1550974 100644
--- a/packages/unittest/lib/src/matcher/util.dart
+++ b/packages/unittest/lib/src/matcher/util.dart
@@ -7,6 +7,8 @@
 import 'core_matchers.dart';
 import 'interfaces.dart';
 
+typedef bool _Predicate(value);
+
 /// A [Map] between whitespace characters and their escape sequences.
 const _escapeMap = const {
   '\n': r'\n',
@@ -38,7 +40,7 @@
 Matcher wrapMatcher(x) {
   if (x is Matcher) {
     return x;
-  } else if (x is Function) {
+  } else if (x is _Predicate) {
     return predicate(x);
   } else {
     return equals(x);
diff --git a/packages/unittest/lib/unittest.dart b/packages/unittest/lib/unittest.dart
index 51ccff4..852b60d 100644
--- a/packages/unittest/lib/unittest.dart
+++ b/packages/unittest/lib/unittest.dart
@@ -160,6 +160,246 @@
     {int count: 1, int max: 0, String id, String reason}) =>
         new ExpectedFunction(callback, count, max, id: id, reason: reason).func;
 
+// Functions used to check how many arguments a callback takes.
+typedef T Func0<T>();
+typedef T Func1<T, A>(A a);
+typedef T Func2<T, A, B>(A a, B b);
+typedef T Func3<T, A, B, C>(A a, B b, C c);
+typedef T Func4<T, A, B, C, D>(A a, B b, C c, D d);
+typedef T Func5<T, A, B, C, D, E>(A a, B b, C c, D d, E e);
+typedef T Func6<T, A, B, C, D, E, F>(A a, B b, C c, D d, E e, F f);
+
+/// Informs the framework that the given [callback] of arity 0 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with zero arguments. See also
+/// [expectAsync1], [expectAsync2], [expectAsync3], [expectAsync4],
+/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
+Func0<dynamic/*=T*/ > expectAsync0/*<T>*/(dynamic/*=T*/ callback(),
+    {int count: 1, int max: 0, String id, String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max0;
+}
+
+/// Informs the framework that the given [callback] of arity 1 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with one argument. See also
+/// [expectAsync0], [expectAsync2], [expectAsync3], [expectAsync4],
+/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
+Func1<dynamic/*=T*/, dynamic/*=A*/ > expectAsync1/*<T, A>*/(
+    dynamic/*=T*/ callback(dynamic/*=A*/ a),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max1;
+}
+
+/// Informs the framework that the given [callback] of arity 2 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with two arguments. See also
+/// [expectAsync0], [expectAsync1], [expectAsync3], [expectAsync4],
+/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
+Func2<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/ > expectAsync2/*<T, A, B>*/(
+    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max2;
+}
+
+/// Informs the framework that the given [callback] of arity 3 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with three arguments. See also
+/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync4],
+/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
+Func3<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/ >
+expectAsync3/*<T, A, B, C>*/(
+    dynamic/*=T*/ callback(
+        dynamic/*=A*/ a, dynamic/*=B*/ b, dynamic/*=C*/ c),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max3;
+}
+
+/// Informs the framework that the given [callback] of arity 4 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with four arguments. See also
+/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
+/// [expectAsync5], and [expectAsync6] for callbacks with different arity.
+Func4<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/,
+    dynamic/*=D*/ >
+expectAsync4/*<T, A, B, C, D>*/(
+    dynamic/*=T*/ callback(
+        dynamic/*=A*/ a, dynamic/*=B*/ b, dynamic/*=C*/ c, dynamic/*=D*/ d),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max4;
+}
+
+/// Informs the framework that the given [callback] of arity 5 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with five arguments. See also
+/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
+/// [expectAsync4], and [expectAsync6] for callbacks with different arity.
+Func5<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/, dynamic/*=D*/,
+    dynamic/*=E*/ >
+expectAsync5/*<T, A, B, C, D, E>*/(
+    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b,
+        dynamic/*=C*/ c, dynamic/*=D*/ d, dynamic/*=E*/ e),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max5;
+}
+
+/// Informs the framework that the given [callback] of arity 6 is expected to be
+/// called [count] number of times (by default 1).
+///
+/// Returns a wrapped function that should be used as a replacement of the
+/// original callback.
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+///
+/// This method takes callbacks with six arguments. See also
+/// [expectAsync0], [expectAsync1], [expectAsync2], [expectAsync3],
+/// [expectAsync4], and [expectAsync5] for callbacks with different arity.
+Func6<dynamic/*=T*/, dynamic/*=A*/, dynamic/*=B*/, dynamic/*=C*/, dynamic/*=D*/,
+    dynamic/*=E*/, dynamic/*=F*/ >
+expectAsync6/*<T, A, B, C, D, E, F>*/(
+    dynamic/*=T*/ callback(dynamic/*=A*/ a, dynamic/*=B*/ b,
+        dynamic/*=C*/ c, dynamic/*=D*/ d, dynamic/*=E*/ e, dynamic/*=F*/ f),
+    {int count: 1,
+    int max: 0,
+    String id,
+    String reason}) {
+  return new ExpectedFunction/*<T>*/(callback, count, max,
+      id: id, reason: reason)
+      .max6;
+}
+
 /// Indicate that [callback] is expected to be called until [isDone] returns
 /// true.
 ///
@@ -267,6 +507,8 @@
   }
 }
 
+typedef bool _TestFilter(InternalTestCase arg);
+
 /// Remove any tests that match [testFilter].
 ///
 /// [testFilter] can be a predicate function, a [RegExp], or a [String]. If it's
@@ -276,13 +518,13 @@
 /// This is different from enabling or disabling tests in that it removes the
 /// tests completely.
 void filterTests(testFilter) {
-  var filterFunction;
+  _TestFilter filterFunction;
   if (testFilter is String) {
     var re = new RegExp(testFilter);
     filterFunction = (t) => re.hasMatch(t.description);
   } else if (testFilter is RegExp) {
     filterFunction = (t) => testFilter.hasMatch(t.description);
-  } else if (testFilter is Function) {
+  } else if (testFilter is _TestFilter) {
     filterFunction = testFilter;
   }
   environment.testCases.retainWhere(filterFunction);
diff --git a/packages/unittest/lib/vm_config.dart b/packages/unittest/lib/vm_config.dart
index 77e91e3..de214f3 100644
--- a/packages/unittest/lib/vm_config.dart
+++ b/packages/unittest/lib/vm_config.dart
@@ -20,8 +20,8 @@
   bool useColor;
 
   VMConfiguration()
-      : super(),
-        useColor = stdioType(stdout) == StdioType.TERMINAL;
+      : useColor = stdioType(stdout) == StdioType.TERMINAL,
+        super();
 
   String formatResult(TestCase testCase) {
     String result = super.formatResult(testCase);
diff --git a/packages/unittest/out.js b/packages/unittest/out.js
deleted file mode 100644
index 925e952..0000000
--- a/packages/unittest/out.js
+++ /dev/null
@@ -1,5440 +0,0 @@
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.11.0-edge.131474.
-// The code supports the following hooks:
-// dartPrint(message):
-//    if this function is defined it is called instead of the Dart [print]
-//    method.
-//
-// dartMainRunner(main, args):
-//    if this function is defined, the Dart [main] method will not be invoked
-//    directly. Instead, a closure that will invoke [main], and its arguments
-//    [args] is passed to [dartMainRunner].
-//
-// dartDeferredLibraryLoader(uri, successCallback, errorCallback):
-//    if this function is defined, it will be called when a deferered library
-//    is loaded. It should load and eval the javascript of `uri`, and call
-//    successCallback. If it fails to do so, it should call errorCallback with
-//    an error.
-(function($) {
-var supportsDirectProtoAccess = function() {
-  var cls = function() {
-  };
-  cls.prototype = {p: {}};
-  var object = new cls();
-  return object.__proto__ && object.__proto__.p === cls.prototype.p;
-}();
-;
-function map(x) {
-  x = Object.create(null);
-  x.x = 0;
-  delete x.x;
-  return x;
-}
-var A = map();
-var B = map();
-var C = map();
-var D = map();
-var E = map();
-var F = map();
-var G = map();
-var H = map();
-var J = map();
-var K = map();
-var L = map();
-var M = map();
-var N = map();
-var O = map();
-var P = map();
-var Q = map();
-var R = map();
-var S = map();
-var T = map();
-var U = map();
-var V = map();
-var W = map();
-var X = map();
-var Y = map();
-var Z = map();
-function Isolate() {}
-init();
-
-$ = Isolate.$isolateProperties;
-$.functionThatReturnsNull = function() {
-};
-;
-function setupProgram(programData, typesOffset) {
-  "use strict";
-  function generateAccessor(fieldDescriptor, accessors, cls) {
-    var fieldInformation = fieldDescriptor.split("-");
-    var field = fieldInformation[0];
-    var len = field.length;
-    var code = field.charCodeAt(len - 1);
-    var reflectable;
-    if (fieldInformation.length > 1)
-      reflectable = true;
-    else
-      reflectable = false;
-    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
-    if (code) {
-      var getterCode = code & 3;
-      var setterCode = code >> 2;
-      var accessorName = field = field.substring(0, len - 1);
-      var divider = field.indexOf(":");
-      if (divider > 0) {
-        accessorName = field.substring(0, divider);
-        field = field.substring(divider + 1);
-      }
-      if (getterCode) {
-        var args = getterCode & 2 ? "receiver" : "";
-        var receiver = getterCode & 1 ? "this" : "receiver";
-        var body = "return " + receiver + "." + field;
-        var property = cls + ".prototype.get$" + accessorName + "=";
-        var fn = "function(" + args + "){" + body + "}";
-        if (reflectable)
-          accessors.push(property + "$reflectable(" + fn + ");\n");
-        else
-          accessors.push(property + fn + ";\n");
-      }
-      if (setterCode) {
-        var args = setterCode & 2 ? "receiver, value" : "value";
-        var receiver = setterCode & 1 ? "this" : "receiver";
-        var body = receiver + "." + field + " = value";
-        var property = cls + ".prototype.set$" + accessorName + "=";
-        var fn = "function(" + args + "){" + body + "}";
-        if (reflectable)
-          accessors.push(property + "$reflectable(" + fn + ");\n");
-        else
-          accessors.push(property + fn + ";\n");
-      }
-    }
-    return field;
-  }
-  function defineClass(name, fields) {
-    var accessors = [];
-    var str = "function " + name + "(";
-    var body = "";
-    var fieldNames = "";
-    for (var i = 0; i < fields.length; i++) {
-      if (i != 0)
-        str += ", ";
-      var field = generateAccessor(fields[i], accessors, name);
-      fieldNames += "'" + field + "',";
-      var parameter = "p_" + field;
-      str += parameter;
-      body += "this." + field + " = " + parameter + ";\n";
-    }
-    if (supportsDirectProtoAccess)
-      body += "this." + "$deferredAction" + "();";
-    str += ") {\n" + body + "}\n";
-    str += name + ".builtin$cls=\"" + name + "\";\n";
-    str += "$desc=$collectedClasses." + name + "[1];\n";
-    str += name + ".prototype = $desc;\n";
-    if (typeof defineClass.name != "string")
-      str += name + ".name=\"" + name + "\";\n";
-    str += name + "." + "$__fields__" + "=[" + fieldNames + "];\n";
-    str += accessors.join("");
-    return str;
-  }
-  init.createNewIsolate = function() {
-    return new Isolate();
-  };
-  init.classIdExtractor = function(o) {
-    return o.constructor.name;
-  };
-  init.classFieldsExtractor = function(o) {
-    var fieldNames = o.constructor.$__fields__;
-    if (!fieldNames)
-      return [];
-    var result = [];
-    result.length = fieldNames.length;
-    for (var i = 0; i < fieldNames.length; i++)
-      result[i] = o[fieldNames[i]];
-    return result;
-  };
-  init.instanceFromClassId = function(name) {
-    return new init.allClasses[name]();
-  };
-  init.initializeEmptyInstance = function(name, o, fields) {
-    init.allClasses[name].apply(o, fields);
-    return o;
-  };
-  var inheritFrom = supportsDirectProtoAccess ? function(constructor, superConstructor) {
-    var prototype = constructor.prototype;
-    prototype.__proto__ = superConstructor.prototype;
-    prototype.constructor = constructor;
-    prototype["$is" + constructor.name] = constructor;
-    return convertToFastObject(prototype);
-  } : function() {
-    function tmp() {
-    }
-    return function(constructor, superConstructor) {
-      tmp.prototype = superConstructor.prototype;
-      var object = new tmp();
-      convertToSlowObject(object);
-      var properties = constructor.prototype;
-      var members = Object.keys(properties);
-      for (var i = 0; i < members.length; i++) {
-        var member = members[i];
-        object[member] = properties[member];
-      }
-      object["$is" + constructor.name] = constructor;
-      object.constructor = constructor;
-      constructor.prototype = object;
-      return object;
-    };
-  }();
-  function finishClasses(processedClasses) {
-    var allClasses = init.allClasses;
-    processedClasses.combinedConstructorFunction += "return [\n" + processedClasses.constructorsList.join(",\n  ") + "\n]";
-    var constructors = new Function("$collectedClasses", processedClasses.combinedConstructorFunction)(processedClasses.collected);
-    processedClasses.combinedConstructorFunction = null;
-    for (var i = 0; i < constructors.length; i++) {
-      var constructor = constructors[i];
-      var cls = constructor.name;
-      var desc = processedClasses.collected[cls];
-      var globalObject = desc[0];
-      desc = desc[1];
-      allClasses[cls] = constructor;
-      globalObject[cls] = constructor;
-    }
-    constructors = null;
-    var finishedClasses = init.finishedClasses;
-    function finishClass(cls) {
-      if (finishedClasses[cls])
-        return;
-      finishedClasses[cls] = true;
-      var superclass = processedClasses.pending[cls];
-      if (!superclass || typeof superclass != "string") {
-        var constructor = allClasses[cls];
-        var prototype = constructor.prototype;
-        prototype.constructor = constructor;
-        prototype.$isObject = constructor;
-        prototype.$deferredAction = function() {
-        };
-        return;
-      }
-      finishClass(superclass);
-      var superConstructor = allClasses[superclass];
-      if (!superConstructor)
-        superConstructor = existingIsolateProperties[superclass];
-      var constructor = allClasses[cls];
-      var prototype = inheritFrom(constructor, superConstructor);
-      if (prototype.$isInterceptor)
-        prototype.$deferredAction();
-    }
-    var properties = Object.keys(processedClasses.pending);
-    for (var i = 0; i < properties.length; i++)
-      finishClass(properties[i]);
-  }
-  function finishAddStubsHelper() {
-    var prototype = this;
-    while (!prototype.hasOwnProperty("$deferredAction"))
-      prototype = prototype.__proto__;
-    delete prototype.$deferredAction;
-    var properties = Object.keys(prototype);
-    for (var index = 0; index < properties.length; index++) {
-      var property = properties[index];
-      var firstChar = property.charCodeAt(0);
-      var elem;
-      if (property !== "^" && property !== "$reflectable" && firstChar !== 43 && firstChar !== 42 && (elem = prototype[property]) != null && elem.constructor === Array && property !== "<>")
-        addStubs(prototype, elem, property, false, []);
-    }
-    convertToFastObject(prototype);
-    prototype = prototype.__proto__;
-    prototype.$deferredAction();
-  }
-  function processClassData(cls, descriptor, processedClasses) {
-    descriptor = convertToSlowObject(descriptor);
-    var previousProperty;
-    var properties = Object.keys(descriptor);
-    var hasDeferredWork = false;
-    var shouldDeferWork = supportsDirectProtoAccess && cls != "Object";
-    for (var i = 0; i < properties.length; i++) {
-      var property = properties[i];
-      var firstChar = property.charCodeAt(0);
-      if (property === "static") {
-        processStatics(init.statics[cls] = descriptor.static, processedClasses);
-        delete descriptor.static;
-      } else if (firstChar === 43) {
-        mangledNames[previousProperty] = property.substring(1);
-        var flag = descriptor[property];
-        if (flag > 0)
-          descriptor[previousProperty].$reflectable = flag;
-      } else if (firstChar === 42) {
-        descriptor[previousProperty].$defaultValues = descriptor[property];
-        var optionalMethods = descriptor.$methodsWithOptionalArguments;
-        if (!optionalMethods)
-          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
-        optionalMethods[property] = previousProperty;
-      } else {
-        var elem = descriptor[property];
-        if (property !== "^" && elem != null && elem.constructor === Array && property !== "<>")
-          if (shouldDeferWork)
-            hasDeferredWork = true;
-          else
-            addStubs(descriptor, elem, property, false, []);
-        else
-          previousProperty = property;
-      }
-    }
-    if (hasDeferredWork)
-      descriptor.$deferredAction = finishAddStubsHelper;
-    var classData = descriptor["^"], split, supr, fields = classData;
-    var s = fields.split(";");
-    fields = s[1] == "" ? [] : s[1].split(",");
-    supr = s[0];
-    split = supr.split(":");
-    if (split.length == 2) {
-      supr = split[0];
-      var functionSignature = split[1];
-      if (functionSignature)
-        descriptor.$signature = function(s) {
-          return function() {
-            return init.types[s];
-          };
-        }(functionSignature);
-    }
-    if (supr)
-      processedClasses.pending[cls] = supr;
-    processedClasses.combinedConstructorFunction += defineClass(cls, fields);
-    processedClasses.constructorsList.push(cls);
-    processedClasses.collected[cls] = [globalObject, descriptor];
-    classes.push(cls);
-  }
-  function processStatics(descriptor, processedClasses) {
-    var properties = Object.keys(descriptor);
-    for (var i = 0; i < properties.length; i++) {
-      var property = properties[i];
-      if (property === "^")
-        continue;
-      var element = descriptor[property];
-      var firstChar = property.charCodeAt(0);
-      var previousProperty;
-      if (firstChar === 43) {
-        mangledGlobalNames[previousProperty] = property.substring(1);
-        var flag = descriptor[property];
-        if (flag > 0)
-          descriptor[previousProperty].$reflectable = flag;
-        if (element && element.length)
-          init.typeInformation[previousProperty] = element;
-      } else if (firstChar === 42) {
-        globalObject[previousProperty].$defaultValues = element;
-        var optionalMethods = descriptor.$methodsWithOptionalArguments;
-        if (!optionalMethods)
-          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
-        optionalMethods[property] = previousProperty;
-      } else if (typeof element === "function") {
-        globalObject[previousProperty = property] = element;
-        functions.push(property);
-        init.globalFunctions[property] = element;
-      } else if (element.constructor === Array)
-        addStubs(globalObject, element, property, true, functions);
-      else {
-        previousProperty = property;
-        processClassData(property, element, processedClasses);
-      }
-    }
-  }
-  function addStubs(prototype, array, name, isStatic, functions) {
-    var index = 0, alias = array[index], f;
-    if (typeof alias == "string")
-      f = array[++index];
-    else {
-      f = alias;
-      alias = name;
-    }
-    var funcs = [prototype[name] = prototype[alias] = f];
-    f.$stubName = name;
-    functions.push(name);
-    for (index++; index < array.length; index++) {
-      f = array[index];
-      if (typeof f != "function")
-        break;
-      if (!isStatic)
-        f.$stubName = array[++index];
-      funcs.push(f);
-      if (f.$stubName) {
-        prototype[f.$stubName] = f;
-        functions.push(f.$stubName);
-      }
-    }
-    for (var i = 0; i < funcs.length; index++, i++)
-      funcs[i].$callName = array[index];
-    var getterStubName = array[index];
-    array = array.slice(++index);
-    var requiredParameterInfo = array[0];
-    var requiredParameterCount = requiredParameterInfo >> 1;
-    var isAccessor = (requiredParameterInfo & 1) === 1;
-    var isSetter = requiredParameterInfo === 3;
-    var isGetter = requiredParameterInfo === 1;
-    var optionalParameterInfo = array[1];
-    var optionalParameterCount = optionalParameterInfo >> 1;
-    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
-    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
-    var functionTypeIndex = array[2];
-    if (typeof functionTypeIndex == "number")
-      array[2] = functionTypeIndex + typesOffset;
-    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
-    if (getterStubName) {
-      f = tearOff(funcs, array, isStatic, name, isIntercepted);
-      prototype[name].$getter = f;
-      f.$getterStub = true;
-      if (isStatic) {
-        init.globalFunctions[name] = f;
-        functions.push(getterStubName);
-      }
-      prototype[getterStubName] = f;
-      funcs.push(f);
-      f.$stubName = getterStubName;
-      f.$callName = null;
-    }
-  }
-  function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
-    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
-  }
-  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
-    var cache;
-    return isStatic ? function() {
-      if (cache === void 0)
-        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
-      return cache;
-    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
-  }
-  var functionCounter = 0;
-  if (!init.libraries)
-    init.libraries = [];
-  if (!init.mangledNames)
-    init.mangledNames = map();
-  if (!init.mangledGlobalNames)
-    init.mangledGlobalNames = map();
-  if (!init.statics)
-    init.statics = map();
-  if (!init.typeInformation)
-    init.typeInformation = map();
-  if (!init.globalFunctions)
-    init.globalFunctions = map();
-  var libraries = init.libraries;
-  var mangledNames = init.mangledNames;
-  var mangledGlobalNames = init.mangledGlobalNames;
-  var hasOwnProperty = Object.prototype.hasOwnProperty;
-  var length = programData.length;
-  var processedClasses = map();
-  processedClasses.collected = map();
-  processedClasses.pending = map();
-  processedClasses.constructorsList = [];
-  processedClasses.combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
-  for (var i = 0; i < length; i++) {
-    var data = programData[i];
-    var name = data[0];
-    var uri = data[1];
-    var metadata = data[2];
-    var globalObject = data[3];
-    var descriptor = data[4];
-    var isRoot = !!data[5];
-    var fields = descriptor && descriptor["^"];
-    if (fields instanceof Array)
-      fields = fields[0];
-    var classes = [];
-    var functions = [];
-    processStatics(descriptor, processedClasses);
-    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
-  }
-  finishClasses(processedClasses);
-}
-var dart =[["_foreign_helper", "dart:_foreign_helper",, H, {
-  "^": "",
-  JS_CONST: {
-    "^": "Object;code"
-  }
-}], ["_interceptors", "dart:_interceptors",, J, {
-  "^": "",
-  getInterceptor: function(object) {
-    return void 0;
-  },
-  Interceptor: {
-    "^": "Object;",
-    $eq: function(receiver, other) {
-      return receiver === other;
-    },
-    get$hashCode: function(receiver) {
-      return H.Primitives_objectHashCode(receiver);
-    },
-    toString$0: function(receiver) {
-      return H.Primitives_objectToString(receiver);
-    }
-  },
-  JSBool: {
-    "^": "Interceptor;",
-    toString$0: function(receiver) {
-      return String(receiver);
-    },
-    get$hashCode: function(receiver) {
-      return receiver ? 519018 : 218159;
-    },
-    $isbool: 1
-  },
-  JSNull: {
-    "^": "Interceptor;",
-    $eq: function(receiver, other) {
-      return null == other;
-    },
-    toString$0: function(receiver) {
-      return "null";
-    },
-    get$hashCode: function(receiver) {
-      return 0;
-    }
-  },
-  JavaScriptObject: {
-    "^": "Interceptor;",
-    get$hashCode: function(_) {
-      return 0;
-    },
-    $isJSObject: 1
-  },
-  PlainJavaScriptObject: {
-    "^": "JavaScriptObject;"
-  },
-  UnknownJavaScriptObject: {
-    "^": "JavaScriptObject;",
-    toString$0: function(receiver) {
-      return String(receiver);
-    }
-  },
-  JSArray: {
-    "^": "Interceptor;",
-    checkMutable$1: function(receiver, reason) {
-      if (!!receiver.immutable$list)
-        throw H.wrapException(new P.UnsupportedError(reason));
-    },
-    checkGrowable$1: function(receiver, reason) {
-      if (!!receiver.fixed$length)
-        throw H.wrapException(new P.UnsupportedError(reason));
-    },
-    forEach$1: function(receiver, f) {
-      var end, i;
-      end = receiver.length;
-      for (i = 0; i < end; ++i) {
-        f.call$1(receiver[i]);
-        if (receiver.length !== end)
-          throw H.wrapException(new P.ConcurrentModificationError(receiver));
-      }
-    },
-    map$1: function(receiver, f) {
-      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
-    },
-    elementAt$1: function(receiver, index) {
-      if (index < 0 || index >= receiver.length)
-        return H.ioore(receiver, index);
-      return receiver[index];
-    },
-    get$first: function(receiver) {
-      if (receiver.length > 0)
-        return receiver[0];
-      throw H.wrapException(H.IterableElementError_noElement());
-    },
-    setRange$4: function(receiver, start, end, iterable, skipCount) {
-      var $length, i, t1;
-      this.checkMutable$1(receiver, "set range");
-      P.RangeError_checkValidRange(start, end, receiver.length, null, null, null);
-      $length = end - start;
-      if ($length === 0)
-        return;
-      if (skipCount + $length > iterable.length)
-        throw H.wrapException(new P.StateError("Too few elements"));
-      if (skipCount < start)
-        for (i = $length - 1; i >= 0; --i) {
-          t1 = skipCount + i;
-          if (t1 >= iterable.length)
-            return H.ioore(iterable, t1);
-          receiver[start + i] = iterable[t1];
-        }
-      else
-        for (i = 0; i < $length; ++i) {
-          t1 = skipCount + i;
-          if (t1 >= iterable.length)
-            return H.ioore(iterable, t1);
-          receiver[start + i] = iterable[t1];
-        }
-    },
-    toString$0: function(receiver) {
-      return P.IterableBase_iterableToFullString(receiver, "[", "]");
-    },
-    get$iterator: function(receiver) {
-      return new J.ArrayIterator(receiver, receiver.length, 0, null);
-    },
-    get$hashCode: function(receiver) {
-      return H.Primitives_objectHashCode(receiver);
-    },
-    get$length: function(receiver) {
-      return receiver.length;
-    },
-    set$length: function(receiver, newLength) {
-      this.checkGrowable$1(receiver, "set length");
-      if (newLength < 0)
-        throw H.wrapException(P.RangeError$value(newLength, null, null));
-      receiver.length = newLength;
-    },
-    $index: function(receiver, index) {
-      if (typeof index !== "number" || Math.floor(index) !== index)
-        throw H.wrapException(P.ArgumentError$(index));
-      if (index >= receiver.length || index < 0)
-        throw H.wrapException(P.RangeError$value(index, null, null));
-      return receiver[index];
-    },
-    $indexSet: function(receiver, index, value) {
-      this.checkMutable$1(receiver, "indexed set");
-      if (index >= receiver.length || false)
-        throw H.wrapException(P.RangeError$value(index, null, null));
-      receiver[index] = value;
-    },
-    $isJSIndexable: 1,
-    $isList: 1,
-    $isEfficientLengthIterable: 1
-  },
-  JSUnmodifiableArray: {
-    "^": "JSArray;"
-  },
-  ArrayIterator: {
-    "^": "Object;_iterable,_length,_index,__interceptors$_current",
-    get$current: function() {
-      return this.__interceptors$_current;
-    },
-    moveNext$0: function() {
-      var t1, $length, t2;
-      t1 = this._iterable;
-      $length = t1.length;
-      if (this._length !== $length)
-        throw H.wrapException(new P.ConcurrentModificationError(t1));
-      t2 = this._index;
-      if (t2 >= $length) {
-        this.__interceptors$_current = null;
-        return false;
-      }
-      this.__interceptors$_current = t1[t2];
-      this._index = t2 + 1;
-      return true;
-    }
-  },
-  JSNumber: {
-    "^": "Interceptor;",
-    remainder$1: function(receiver, b) {
-      return receiver % b;
-    },
-    toInt$0: function(receiver) {
-      var t1;
-      if (receiver >= -2147483648 && receiver <= 2147483647)
-        return receiver | 0;
-      if (isFinite(receiver)) {
-        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
-        return t1 + 0;
-      }
-      throw H.wrapException(new P.UnsupportedError("" + receiver));
-    },
-    toString$0: function(receiver) {
-      if (receiver === 0 && 1 / receiver < 0)
-        return "-0.0";
-      else
-        return "" + receiver;
-    },
-    get$hashCode: function(receiver) {
-      return receiver & 0x1FFFFFFF;
-    },
-    $add: function(receiver, other) {
-      if (typeof other !== "number")
-        throw H.wrapException(P.ArgumentError$(other));
-      return receiver + other;
-    },
-    _tdivFast$1: function(receiver, other) {
-      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
-    },
-    _shrOtherPositive$1: function(receiver, other) {
-      var t1;
-      if (receiver > 0)
-        t1 = other > 31 ? 0 : receiver >>> other;
-      else {
-        t1 = other > 31 ? 31 : other;
-        t1 = receiver >> t1 >>> 0;
-      }
-      return t1;
-    },
-    $lt: function(receiver, other) {
-      if (typeof other !== "number")
-        throw H.wrapException(P.ArgumentError$(other));
-      return receiver < other;
-    },
-    $isnum: 1
-  },
-  JSInt: {
-    "^": "JSNumber;",
-    $isnum: 1,
-    $is$int: 1
-  },
-  JSDouble: {
-    "^": "JSNumber;",
-    $isnum: 1
-  },
-  JSString: {
-    "^": "Interceptor;",
-    codeUnitAt$1: function(receiver, index) {
-      if (index >= receiver.length)
-        throw H.wrapException(P.RangeError$value(index, null, null));
-      return receiver.charCodeAt(index);
-    },
-    $add: function(receiver, other) {
-      if (typeof other !== "string")
-        throw H.wrapException(P.ArgumentError$(other));
-      return receiver + other;
-    },
-    substring$2: function(receiver, startIndex, endIndex) {
-      H.checkInt(startIndex);
-      if (endIndex == null)
-        endIndex = receiver.length;
-      H.checkInt(endIndex);
-      if (startIndex < 0)
-        throw H.wrapException(P.RangeError$value(startIndex, null, null));
-      if (typeof endIndex !== "number")
-        return H.iae(endIndex);
-      if (startIndex > endIndex)
-        throw H.wrapException(P.RangeError$value(startIndex, null, null));
-      if (endIndex > receiver.length)
-        throw H.wrapException(P.RangeError$value(endIndex, null, null));
-      return receiver.substring(startIndex, endIndex);
-    },
-    substring$1: function($receiver, startIndex) {
-      return this.substring$2($receiver, startIndex, null);
-    },
-    get$isEmpty: function(receiver) {
-      return receiver.length === 0;
-    },
-    toString$0: function(receiver) {
-      return receiver;
-    },
-    get$hashCode: function(receiver) {
-      var t1, hash, i;
-      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
-        hash = 536870911 & hash + receiver.charCodeAt(i);
-        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
-        hash ^= hash >> 6;
-      }
-      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
-      hash ^= hash >> 11;
-      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
-    },
-    get$length: function(receiver) {
-      return receiver.length;
-    },
-    $index: function(receiver, index) {
-      if (typeof index !== "number" || Math.floor(index) !== index)
-        throw H.wrapException(P.ArgumentError$(index));
-      if (index >= receiver.length || index < 0)
-        throw H.wrapException(P.RangeError$value(index, null, null));
-      return receiver[index];
-    },
-    $isJSIndexable: 1,
-    $isString: 1
-  }
-}], ["_isolate_helper", "dart:_isolate_helper",, H, {
-  "^": "",
-  _callInIsolate: function(isolate, $function) {
-    var result = isolate.eval$1($function);
-    if (!init.globalState.currentContext._isExecutingEvent)
-      init.globalState.topEventLoop.run$0();
-    return result;
-  },
-  leaveJsAsync: function() {
-    --init.globalState.topEventLoop._activeJsAsyncCount;
-  },
-  startRootIsolate: function(entry, args) {
-    var t1, t2, t3, t4, t5, rootContext;
-    t1 = {};
-    t1._captured_args_0 = args;
-    args = args;
-    t1._captured_args_0 = args;
-    if (args == null) {
-      args = [];
-      t1._captured_args_0 = args;
-      t2 = args;
-    } else
-      t2 = args;
-    if (!J.getInterceptor(t2).$isList)
-      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
-    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
-    t2._nativeDetectEnvironment$0();
-    t2.topEventLoop = new H._EventLoop(P.ListQueue$(null, H._IsolateEvent), 0);
-    t2.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
-    t2.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
-    if (t2.isWorker === true) {
-      t2.mainManager = new H._MainManagerStub();
-      t2._nativeInitWorkerMessageHandler$0();
-    }
-    init.globalState = t2;
-    if (init.globalState.isWorker === true)
-      return;
-    t2 = init.globalState.nextIsolateId++;
-    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
-    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
-    t5 = new H.RawReceivePortImpl(0, null, false);
-    rootContext = new H._IsolateContext(t2, t3, t4, init.createNewIsolate(), t5, new H.CapabilityImpl(H.random64()), new H.CapabilityImpl(H.random64()), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
-    t4.add$1(0, 0);
-    rootContext._addRegistration$2(0, t5);
-    init.globalState.rootContext = rootContext;
-    init.globalState.currentContext = rootContext;
-    t2 = H.getDynamicRuntimeType();
-    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
-    if (t3)
-      rootContext.eval$1(new H.startRootIsolate_closure(t1, entry));
-    else {
-      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
-      if (t2)
-        rootContext.eval$1(new H.startRootIsolate_closure0(t1, entry));
-      else
-        rootContext.eval$1(entry);
-    }
-    init.globalState.topEventLoop.run$0();
-  },
-  IsolateNatives_computeThisScript: function() {
-    var currentScript = init.currentScript;
-    if (currentScript != null)
-      return String(currentScript.src);
-    if (init.globalState.isWorker === true)
-      return H.IsolateNatives_computeThisScriptFromTrace();
-    return;
-  },
-  IsolateNatives_computeThisScriptFromTrace: function() {
-    var stack, matches;
-    stack = new Error().stack;
-    if (stack == null) {
-      stack = function() {
-        try {
-          throw new Error();
-        } catch (e) {
-          return e.stack;
-        }
-      }();
-      if (stack == null)
-        throw H.wrapException(new P.UnsupportedError("No stack trace"));
-    }
-    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
-    if (matches != null)
-      return matches[1];
-    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
-    if (matches != null)
-      return matches[1];
-    throw H.wrapException(new P.UnsupportedError("Cannot extract URI from \"" + H.S(stack) + "\""));
-  },
-  IsolateNatives__processWorkerMessage: function(sender, e) {
-    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context;
-    msg = new H._Deserializer(true, []).deserialize$1(e.data);
-    t1 = J.getInterceptor$as(msg);
-    switch (t1.$index(msg, "command")) {
-      case "start":
-        init.globalState.currentManagerId = t1.$index(msg, "id");
-        functionName = t1.$index(msg, "functionName");
-        entryPoint = functionName == null ? init.globalState.entry : H.IsolateNatives__getJSFunctionFromName(functionName);
-        args = t1.$index(msg, "args");
-        message = new H._Deserializer(true, []).deserialize$1(t1.$index(msg, "msg"));
-        isSpawnUri = t1.$index(msg, "isSpawnUri");
-        startPaused = t1.$index(msg, "startPaused");
-        replyTo = new H._Deserializer(true, []).deserialize$1(t1.$index(msg, "replyTo"));
-        t1 = init.globalState.nextIsolateId++;
-        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
-        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
-        t4 = new H.RawReceivePortImpl(0, null, false);
-        context = new H._IsolateContext(t1, t2, t3, init.createNewIsolate(), t4, new H.CapabilityImpl(H.random64()), new H.CapabilityImpl(H.random64()), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
-        t3.add$1(0, 0);
-        context._addRegistration$2(0, t4);
-        init.globalState.topEventLoop.events._add$1(new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
-        init.globalState.currentContext = context;
-        init.globalState.topEventLoop.run$0();
-        break;
-      case "spawn-worker":
-        break;
-      case "message":
-        if (t1.$index(msg, "port") != null)
-          t1.$index(msg, "port").send$1(t1.$index(msg, "msg"));
-        init.globalState.topEventLoop.run$0();
-        break;
-      case "close":
-        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
-        sender.terminate();
-        init.globalState.topEventLoop.run$0();
-        break;
-      case "log":
-        H.IsolateNatives__log(t1.$index(msg, "msg"));
-        break;
-      case "print":
-        if (init.globalState.isWorker === true) {
-          t1 = init.globalState.mainManager;
-          t2 = P.LinkedHashMap__makeLiteral(["command", "print", "msg", msg]);
-          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
-          t1.toString;
-          self.postMessage(t2);
-        } else
-          P.print(t1.$index(msg, "msg"));
-        break;
-      case "error":
-        throw H.wrapException(t1.$index(msg, "msg"));
-    }
-  },
-  IsolateNatives__log: function(msg) {
-    var trace, t1, t2, exception;
-    if (init.globalState.isWorker === true) {
-      t1 = init.globalState.mainManager;
-      t2 = P.LinkedHashMap__makeLiteral(["command", "log", "msg", msg]);
-      t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
-      t1.toString;
-      self.postMessage(t2);
-    } else
-      try {
-        self.console.log(msg);
-      } catch (exception) {
-        H.unwrapException(exception);
-        trace = H.getTraceFromException(exception);
-        throw H.wrapException(P.Exception_Exception(trace));
-      }
-  },
-  IsolateNatives__getJSFunctionFromName: function(functionName) {
-    return init.globalFunctions[functionName]();
-  },
-  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
-    var context, t1, t2, t3;
-    context = init.globalState.currentContext;
-    t1 = context.id;
-    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
-    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
-    t1 = context.controlPort;
-    t2 = init.globalState.currentContext.id;
-    t3 = context.pauseCapability;
-    replyTo.send$1(["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
-    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
-    if (startPaused === true) {
-      context.addPause$2(t3, t3);
-      init.globalState.topEventLoop.events._add$1(new H._IsolateEvent(context, t2, "start isolate"));
-    } else
-      t2.call$0();
-  },
-  _clone: function(message) {
-    return new H._Deserializer(true, []).deserialize$1(new H._Serializer(false, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(message));
-  },
-  startRootIsolate_closure: {
-    "^": "Closure:0;__isolate_helper$_box_0,_captured_entry_1",
-    call$0: function() {
-      this._captured_entry_1.call$1(this.__isolate_helper$_box_0._captured_args_0);
-    }
-  },
-  startRootIsolate_closure0: {
-    "^": "Closure:0;__isolate_helper$_box_0,_captured_entry_2",
-    call$0: function() {
-      this._captured_entry_2.call$2(this.__isolate_helper$_box_0._captured_args_0, null);
-    }
-  },
-  _Manager: {
-    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates,mainManager,managers,entry",
-    _nativeDetectEnvironment$0: function() {
-      var t1, t2, t3;
-      t1 = self.window == null;
-      t2 = self.Worker;
-      t3 = t1 && !!self.postMessage;
-      this.isWorker = t3;
-      if (!t3)
-        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
-      else
-        t2 = true;
-      this.supportsWorkers = t2;
-      this.fromCommandLine = t1 && !t3;
-    },
-    _nativeInitWorkerMessageHandler$0: function() {
-      self.onmessage = function(f, a) {
-        return function(e) {
-          f(a, e);
-        };
-      }(H.IsolateNatives__processWorkerMessage, this.mainManager);
-      self.dartPrint = self.dartPrint || function(serialize) {
-        return function(object) {
-          if (self.console && self.console.log)
-            self.console.log(object);
-          else
-            self.postMessage(serialize(object));
-        };
-      }(H._Manager__serializePrintMessage);
-    },
-    static: {_Manager__serializePrintMessage: function(object) {
-        var t1 = P.LinkedHashMap__makeLiteral(["command", "print", "msg", object]);
-        return new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t1);
-      }}
-  },
-  _IsolateContext: {
-    "^": "Object;id,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized,isPaused,delayedEvents,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
-    addPause$2: function(authentification, resume) {
-      if (!this.pauseCapability.$eq(0, authentification))
-        return;
-      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
-        this.isPaused = true;
-      this._updateGlobalState$0();
-    },
-    removePause$1: function(resume) {
-      var t1, t2, $event, t3, t4, t5;
-      if (!this.isPaused)
-        return;
-      t1 = this.pauseTokens;
-      t1.remove$1(0, resume);
-      if (t1._collection$_length === 0) {
-        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
-          if (0 >= t2)
-            return H.ioore(t1, 0);
-          $event = t1.pop();
-          t2 = init.globalState.topEventLoop.events;
-          t3 = t2._head;
-          t4 = t2._table;
-          t5 = t4.length;
-          t3 = (t3 - 1 & t5 - 1) >>> 0;
-          t2._head = t3;
-          if (t3 < 0 || t3 >= t5)
-            return H.ioore(t4, t3);
-          t4[t3] = $event;
-          if (t3 === t2._tail)
-            t2._grow$0();
-          ++t2._modificationCount;
-        }
-        this.isPaused = false;
-      }
-      this._updateGlobalState$0();
-    },
-    addDoneListener$2: function(responsePort, response) {
-      var t1, i, t2;
-      if (this.doneHandlers == null)
-        this.doneHandlers = [];
-      for (t1 = J.getInterceptor(responsePort), i = 0; t2 = this.doneHandlers, i < t2.length; i += 2)
-        if (t1.$eq(responsePort, t2[i])) {
-          t1 = this.doneHandlers;
-          t2 = i + 1;
-          if (t2 >= t1.length)
-            return H.ioore(t1, t2);
-          t1[t2] = response;
-          return;
-        }
-      t2.push(responsePort);
-      this.doneHandlers.push(response);
-    },
-    removeDoneListener$1: function(responsePort) {
-      var t1, i, t2;
-      if (this.doneHandlers == null)
-        return;
-      for (t1 = J.getInterceptor(responsePort), i = 0; t2 = this.doneHandlers, i < t2.length; i += 2)
-        if (t1.$eq(responsePort, t2[i])) {
-          t1 = this.doneHandlers;
-          t2 = i + 2;
-          t1.toString;
-          if (typeof t1 !== "object" || t1 === null || !!t1.fixed$length)
-            H.throwExpression(new P.UnsupportedError("removeRange"));
-          P.RangeError_checkValidRange(i, t2, t1.length, null, null, null);
-          t1.splice(i, t2 - i);
-          return;
-        }
-    },
-    setErrorsFatal$2: function(authentification, errorsAreFatal) {
-      if (!this.terminateCapability.$eq(0, authentification))
-        return;
-      this.errorsAreFatal = errorsAreFatal;
-    },
-    handlePing$3: function(responsePort, pingType, response) {
-      var t1 = J.getInterceptor(pingType);
-      if (!t1.$eq(pingType, 0))
-        t1 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
-      else
-        t1 = true;
-      if (t1) {
-        responsePort.send$1(response);
-        return;
-      }
-      t1 = this._scheduledControlEvents;
-      if (t1 == null) {
-        t1 = P.ListQueue$(null, null);
-        this._scheduledControlEvents = t1;
-      }
-      t1._add$1(new H._IsolateContext_handlePing_respond(responsePort, response));
-    },
-    handleKill$2: function(authentification, priority) {
-      var t1;
-      if (!this.terminateCapability.$eq(0, authentification))
-        return;
-      t1 = J.getInterceptor(priority);
-      if (!t1.$eq(priority, 0))
-        t1 = t1.$eq(priority, 1) && !this._isExecutingEvent;
-      else
-        t1 = true;
-      if (t1) {
-        this.kill$0();
-        return;
-      }
-      t1 = this._scheduledControlEvents;
-      if (t1 == null) {
-        t1 = P.ListQueue$(null, null);
-        this._scheduledControlEvents = t1;
-      }
-      t1._add$1(this.get$kill());
-    },
-    handleUncaughtError$2: function(error, stackTrace) {
-      var t1, message, t2;
-      t1 = this.errorPorts;
-      if (t1._collection$_length === 0) {
-        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
-          return;
-        if (self.console && self.console.error)
-          self.console.error(error, stackTrace);
-        else {
-          P.print(error);
-          if (stackTrace != null)
-            P.print(stackTrace);
-        }
-        return;
-      }
-      message = Array(2);
-      message.fixed$length = Array;
-      message[0] = J.toString$0(error);
-      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
-      for (t2 = new P.LinkedHashSetIterator(t1, t1._collection$_modifications, null, null), t2._cell = t1._collection$_first; t2.moveNext$0();)
-        t2._collection$_current.send$1(message);
-    },
-    eval$1: function(code) {
-      var old, result, oldIsExecutingEvent, e, s, exception, t1;
-      old = init.globalState.currentContext;
-      init.globalState.currentContext = this;
-      $ = this.isolateStatics;
-      result = null;
-      oldIsExecutingEvent = this._isExecutingEvent;
-      this._isExecutingEvent = true;
-      try {
-        result = code.call$0();
-      } catch (exception) {
-        t1 = H.unwrapException(exception);
-        e = t1;
-        s = H.getTraceFromException(exception);
-        this.handleUncaughtError$2(e, s);
-        if (this.errorsAreFatal === true) {
-          this.kill$0();
-          if (this === init.globalState.rootContext)
-            throw exception;
-        }
-      } finally {
-        this._isExecutingEvent = oldIsExecutingEvent;
-        init.globalState.currentContext = old;
-        if (old != null)
-          $ = old.get$isolateStatics();
-        if (this._scheduledControlEvents != null)
-          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
-            this._scheduledControlEvents.removeFirst$0().call$0();
-      }
-      return result;
-    },
-    lookup$1: function(portId) {
-      return this.ports.$index(0, portId);
-    },
-    _addRegistration$2: function(portId, port) {
-      var t1 = this.ports;
-      if (t1.containsKey$1(portId))
-        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
-      t1.$indexSet(0, portId, port);
-    },
-    _updateGlobalState$0: function() {
-      if (this.ports.__js_helper$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
-        init.globalState.isolates.$indexSet(0, this.id, this);
-      else
-        this.kill$0();
-    },
-    kill$0: [function() {
-      var t1, t2, i, responsePort, t3;
-      t1 = this._scheduledControlEvents;
-      if (t1 != null)
-        t1.clear$0(0);
-      for (t1 = this.ports, t2 = t1.get$values(), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$a(t2.__internal$_iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
-        t2.__internal$_current._close$0();
-      if (t1.__js_helper$_length > 0) {
-        t1._last = null;
-        t1._first = null;
-        t1._rest = null;
-        t1._nums = null;
-        t1._strings = null;
-        t1.__js_helper$_length = 0;
-        t1._modifications = t1._modifications + 1 & 67108863;
-      }
-      this.weakPorts.clear$0(0);
-      init.globalState.isolates.remove$1(0, this.id);
-      this.errorPorts.clear$0(0);
-      if (this.doneHandlers != null) {
-        for (i = 0; t1 = this.doneHandlers, t2 = t1.length, i < t2; i += 2) {
-          responsePort = t1[i];
-          t3 = i + 1;
-          if (t3 >= t2)
-            return H.ioore(t1, t3);
-          responsePort.send$1(t1[t3]);
-        }
-        this.doneHandlers = null;
-      }
-    }, "call$0", "get$kill", 0, 0, 1]
-  },
-  _IsolateContext_handlePing_respond: {
-    "^": "Closure:1;_captured_responsePort_0,_captured_response_1",
-    call$0: function() {
-      this._captured_responsePort_0.send$1(this._captured_response_1);
-    }
-  },
-  _EventLoop: {
-    "^": "Object;events,_activeJsAsyncCount",
-    dequeue$0: function() {
-      var t1 = this.events;
-      if (t1._head === t1._tail)
-        return;
-      return t1.removeFirst$0();
-    },
-    runIteration$0: function() {
-      var $event, t1, t2;
-      $event = this.dequeue$0();
-      if ($event == null) {
-        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports.__js_helper$_length === 0)
-          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
-        t1 = init.globalState;
-        if (t1.isWorker === true && t1.isolates.__js_helper$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
-          t1 = t1.mainManager;
-          t2 = P.LinkedHashMap__makeLiteral(["command", "close"]);
-          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
-          t1.toString;
-          self.postMessage(t2);
-        }
-        return false;
-      }
-      $event.process$0();
-      return true;
-    },
-    _runHelper$0: function() {
-      if (self.window != null)
-        new H._EventLoop__runHelper_next(this).call$0();
-      else
-        for (; this.runIteration$0();)
-          ;
-    },
-    run$0: function() {
-      var e, trace, exception, t1, t2;
-      if (init.globalState.isWorker !== true)
-        this._runHelper$0();
-      else
-        try {
-          this._runHelper$0();
-        } catch (exception) {
-          t1 = H.unwrapException(exception);
-          e = t1;
-          trace = H.getTraceFromException(exception);
-          t1 = init.globalState.mainManager;
-          t2 = P.LinkedHashMap__makeLiteral(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)]);
-          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
-          t1.toString;
-          self.postMessage(t2);
-        }
-    }
-  },
-  _EventLoop__runHelper_next: {
-    "^": "Closure:1;_captured_this_0",
-    call$0: function() {
-      if (!this._captured_this_0.runIteration$0())
-        return;
-      P.Timer_Timer(C.Duration_0, this);
-    }
-  },
-  _IsolateEvent: {
-    "^": "Object;isolate,fn,message",
-    process$0: function() {
-      var t1 = this.isolate;
-      if (t1.isPaused) {
-        t1.delayedEvents.push(this);
-        return;
-      }
-      t1.eval$1(this.fn);
-    }
-  },
-  _MainManagerStub: {
-    "^": "Object;"
-  },
-  IsolateNatives__processWorkerMessage_closure: {
-    "^": "Closure:0;_captured_entryPoint_0,_captured_args_1,_captured_message_2,_captured_isSpawnUri_3,_captured_startPaused_4,_captured_replyTo_5",
-    call$0: function() {
-      H.IsolateNatives__startIsolate(this._captured_entryPoint_0, this._captured_args_1, this._captured_message_2, this._captured_isSpawnUri_3, this._captured_startPaused_4, this._captured_replyTo_5);
-    }
-  },
-  IsolateNatives__startIsolate_runStartFunction: {
-    "^": "Closure:1;_captured_topLevel_0,_captured_args_1,_captured_message_2,_captured_isSpawnUri_3,_captured_context_4",
-    call$0: function() {
-      var t1, t2, t3;
-      this._captured_context_4.initialized = true;
-      if (this._captured_isSpawnUri_3 !== true)
-        this._captured_topLevel_0.call$1(this._captured_message_2);
-      else {
-        t1 = this._captured_topLevel_0;
-        t2 = H.getDynamicRuntimeType();
-        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
-        if (t3)
-          t1.call$2(this._captured_args_1, this._captured_message_2);
-        else {
-          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
-          if (t2)
-            t1.call$1(this._captured_args_1);
-          else
-            t1.call$0();
-        }
-      }
-    }
-  },
-  _BaseSendPort: {
-    "^": "Object;"
-  },
-  _NativeJsSendPort: {
-    "^": "_BaseSendPort;_receivePort,_isolateId",
-    send$1: function(message) {
-      var isolate, t1, msg, t2;
-      isolate = init.globalState.isolates.$index(0, this._isolateId);
-      if (isolate == null)
-        return;
-      t1 = this._receivePort;
-      if (t1.get$_isClosed())
-        return;
-      msg = H._clone(message);
-      if (isolate.get$controlPort() === t1) {
-        t1 = J.getInterceptor$as(msg);
-        switch (t1.$index(msg, 0)) {
-          case "pause":
-            isolate.addPause$2(t1.$index(msg, 1), t1.$index(msg, 2));
-            break;
-          case "resume":
-            isolate.removePause$1(t1.$index(msg, 1));
-            break;
-          case "add-ondone":
-            isolate.addDoneListener$2(t1.$index(msg, 1), t1.$index(msg, 2));
-            break;
-          case "remove-ondone":
-            isolate.removeDoneListener$1(t1.$index(msg, 1));
-            break;
-          case "set-errors-fatal":
-            isolate.setErrorsFatal$2(t1.$index(msg, 1), t1.$index(msg, 2));
-            break;
-          case "ping":
-            isolate.handlePing$3(t1.$index(msg, 1), t1.$index(msg, 2), t1.$index(msg, 3));
-            break;
-          case "kill":
-            isolate.handleKill$2(t1.$index(msg, 1), t1.$index(msg, 2));
-            break;
-          case "getErrors":
-            t1 = t1.$index(msg, 1);
-            isolate.errorPorts.add$1(0, t1);
-            break;
-          case "stopErrors":
-            t1 = t1.$index(msg, 1);
-            isolate.errorPorts.remove$1(0, t1);
-            break;
-        }
-        return;
-      }
-      t1 = init.globalState.topEventLoop;
-      t2 = "receive " + H.S(message);
-      t1.events._add$1(new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(this, msg), t2));
-    },
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      return other instanceof H._NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
-    },
-    get$hashCode: function(_) {
-      return this._receivePort.get$_id();
-    }
-  },
-  _NativeJsSendPort_send_closure: {
-    "^": "Closure:0;_captured_this_0,_captured_msg_1",
-    call$0: function() {
-      var t1 = this._captured_this_0._receivePort;
-      if (!t1.get$_isClosed())
-        t1.__isolate_helper$_add$1(this._captured_msg_1);
-    }
-  },
-  _WorkerSendPort: {
-    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
-    send$1: function(message) {
-      var t1, workerMessage, manager;
-      t1 = P.LinkedHashMap__makeLiteral(["command", "message", "port", this, "msg", message]);
-      workerMessage = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t1);
-      if (init.globalState.isWorker === true) {
-        init.globalState.mainManager.toString;
-        self.postMessage(workerMessage);
-      } else {
-        manager = init.globalState.managers.$index(0, this._workerId);
-        if (manager != null)
-          manager.postMessage(workerMessage);
-      }
-    },
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      return other instanceof H._WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
-    },
-    get$hashCode: function(_) {
-      var t1, t2, t3;
-      t1 = this._workerId;
-      if (typeof t1 !== "number")
-        return t1.$shl();
-      t2 = this._isolateId;
-      if (typeof t2 !== "number")
-        return t2.$shl();
-      t3 = this._receivePortId;
-      if (typeof t3 !== "number")
-        return H.iae(t3);
-      return (t1 << 16 ^ t2 << 8 ^ t3) >>> 0;
-    }
-  },
-  RawReceivePortImpl: {
-    "^": "Object;_id<,_handler,_isClosed<",
-    _close$0: function() {
-      this._isClosed = true;
-      this._handler = null;
-    },
-    __isolate_helper$_add$1: function(dataEvent) {
-      if (this._isClosed)
-        return;
-      this._handler$1(dataEvent);
-    },
-    _handler$1: function(arg0) {
-      return this._handler.call$1(arg0);
-    },
-    $isRawReceivePort: 1
-  },
-  TimerImpl: {
-    "^": "Object;_once,_inEventLoop,_handle",
-    TimerImpl$2: function(milliseconds, callback) {
-      var t1, t2;
-      if (milliseconds === 0)
-        t1 = self.setTimeout == null || init.globalState.isWorker === true;
-      else
-        t1 = false;
-      if (t1) {
-        this._handle = 1;
-        t1 = init.globalState.topEventLoop;
-        t2 = init.globalState.currentContext;
-        t1.events._add$1(new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
-        this._inEventLoop = true;
-      } else if (self.setTimeout != null) {
-        ++init.globalState.topEventLoop._activeJsAsyncCount;
-        this._handle = self.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
-      } else
-        throw H.wrapException(new P.UnsupportedError("Timer greater than 0."));
-    },
-    static: {TimerImpl$: function(milliseconds, callback) {
-        var t1 = new H.TimerImpl(true, false, null);
-        t1.TimerImpl$2(milliseconds, callback);
-        return t1;
-      }}
-  },
-  TimerImpl_internalCallback: {
-    "^": "Closure:1;_captured_this_0,_captured_callback_1",
-    call$0: function() {
-      this._captured_this_0._handle = null;
-      this._captured_callback_1.call$0();
-    }
-  },
-  TimerImpl_internalCallback0: {
-    "^": "Closure:1;_captured_this_2,_captured_callback_3",
-    call$0: function() {
-      this._captured_this_2._handle = null;
-      H.leaveJsAsync();
-      this._captured_callback_3.call$0();
-    }
-  },
-  CapabilityImpl: {
-    "^": "Object;_id<",
-    get$hashCode: function(_) {
-      var hash = this._id;
-      hash = C.JSInt_methods._shrOtherPositive$1(hash, 0) ^ C.JSInt_methods._tdivFast$1(hash, 4294967296);
-      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
-      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
-      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
-      return (hash ^ hash >>> 16) >>> 0;
-    },
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      if (other === this)
-        return true;
-      if (other instanceof H.CapabilityImpl)
-        return this._id === other._id;
-      return false;
-    }
-  },
-  _Serializer: {
-    "^": "Object;_serializeSendPorts,serializedObjectIds",
-    serialize$1: [function(x) {
-      var t1, serializationId, serializeTearOff, t2, $name;
-      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
-        return x;
-      t1 = this.serializedObjectIds;
-      serializationId = t1.$index(0, x);
-      if (serializationId != null)
-        return ["ref", serializationId];
-      t1.$indexSet(0, x, t1.__js_helper$_length);
-      t1 = J.getInterceptor(x);
-      if (!!t1.$isJSIndexable)
-        return this.serializeJSIndexable$1(x);
-      if (!!t1.$isInternalMap) {
-        serializeTearOff = this.get$serialize();
-        t1 = x.get$keys();
-        t1 = H.MappedIterable_MappedIterable(t1, serializeTearOff, H.getRuntimeTypeArgument(t1, "Iterable", 0), null);
-        t1 = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "Iterable", 0));
-        t2 = x.get$values();
-        t2 = H.MappedIterable_MappedIterable(t2, serializeTearOff, H.getRuntimeTypeArgument(t2, "Iterable", 0), null);
-        return ["map", t1, P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "Iterable", 0))];
-      }
-      if (!!t1.$isJSObject)
-        return this.serializeJSObject$1(x);
-      if (!!t1.$isInterceptor)
-        this.unsupported$1(x);
-      if (!!t1.$isRawReceivePort)
-        this.unsupported$2(x, "RawReceivePorts can't be transmitted:");
-      if (!!t1.$is_NativeJsSendPort)
-        return this.serializeJsSendPort$1(x);
-      if (!!t1.$is_WorkerSendPort)
-        return this.serializeWorkerSendPort$1(x);
-      if (!!t1.$isClosure) {
-        $name = x.$name;
-        if ($name == null)
-          this.unsupported$2(x, "Closures can't be transmitted:");
-        return ["function", $name];
-      }
-      return ["dart", init.classIdExtractor(x), this.serializeArrayInPlace$1(init.classFieldsExtractor(x))];
-    }, "call$1", "get$serialize", 2, 0, 2],
-    unsupported$2: function(x, message) {
-      throw H.wrapException(new P.UnsupportedError(H.S(message == null ? "Can't transmit:" : message) + " " + H.S(x)));
-    },
-    unsupported$1: function(x) {
-      return this.unsupported$2(x, null);
-    },
-    serializeJSIndexable$1: function(indexable) {
-      var serialized = this.serializeArray$1(indexable);
-      if (!!indexable.fixed$length)
-        return ["fixed", serialized];
-      if (!indexable.fixed$length)
-        return ["extendable", serialized];
-      if (!indexable.immutable$list)
-        return ["mutable", serialized];
-      if (indexable.constructor === Array)
-        return ["const", serialized];
-      this.unsupported$2(indexable, "Can't serialize indexable: ");
-    },
-    serializeArray$1: function(x) {
-      var serialized, i, t1;
-      serialized = [];
-      C.JSArray_methods.set$length(serialized, x.length);
-      for (i = 0; i < x.length; ++i) {
-        t1 = this.serialize$1(x[i]);
-        if (i >= serialized.length)
-          return H.ioore(serialized, i);
-        serialized[i] = t1;
-      }
-      return serialized;
-    },
-    serializeArrayInPlace$1: function(x) {
-      var i;
-      for (i = 0; i < x.length; ++i)
-        C.JSArray_methods.$indexSet(x, i, this.serialize$1(x[i]));
-      return x;
-    },
-    serializeJSObject$1: function(x) {
-      var keys, values, i, t1;
-      if (!!x.constructor && x.constructor !== Object)
-        this.unsupported$2(x, "Only plain JS Objects are supported:");
-      keys = Object.keys(x);
-      values = [];
-      C.JSArray_methods.set$length(values, keys.length);
-      for (i = 0; i < keys.length; ++i) {
-        t1 = this.serialize$1(x[keys[i]]);
-        if (i >= values.length)
-          return H.ioore(values, i);
-        values[i] = t1;
-      }
-      return ["js-object", keys, values];
-    },
-    serializeWorkerSendPort$1: function(x) {
-      if (this._serializeSendPorts)
-        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
-      return ["raw sendport", x];
-    },
-    serializeJsSendPort$1: function(x) {
-      if (this._serializeSendPorts)
-        return ["sendport", init.globalState.currentManagerId, x._isolateId, x._receivePort.get$_id()];
-      return ["raw sendport", x];
-    }
-  },
-  _Deserializer: {
-    "^": "Object;_adjustSendPorts,deserializedObjects",
-    deserialize$1: [function(x) {
-      var serializationId, t1, result, classId, fields, emptyInstance;
-      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
-        return x;
-      if (typeof x !== "object" || x === null || x.constructor !== Array)
-        throw H.wrapException(P.ArgumentError$("Bad serialized message: " + H.S(x)));
-      switch (C.JSArray_methods.get$first(x)) {
-        case "ref":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          serializationId = x[1];
-          t1 = this.deserializedObjects;
-          if (serializationId >>> 0 !== serializationId || serializationId >= t1.length)
-            return H.ioore(t1, serializationId);
-          return t1[serializationId];
-        case "buffer":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          return result;
-        case "typed":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          return result;
-        case "fixed":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          t1 = this.deserializeArrayInPlace$1(result);
-          t1.$builtinTypeInfo = [null];
-          t1.fixed$length = Array;
-          return t1;
-        case "extendable":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          t1 = this.deserializeArrayInPlace$1(result);
-          t1.$builtinTypeInfo = [null];
-          return t1;
-        case "mutable":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          return this.deserializeArrayInPlace$1(result);
-        case "const":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          t1 = this.deserializeArrayInPlace$1(result);
-          t1.$builtinTypeInfo = [null];
-          t1.fixed$length = Array;
-          return t1;
-        case "map":
-          return this.deserializeMap$1(x);
-        case "sendport":
-          return this.deserializeSendPort$1(x);
-        case "raw sendport":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = x[1];
-          this.deserializedObjects.push(result);
-          return result;
-        case "js-object":
-          return this.deserializeJSObject$1(x);
-        case "function":
-          if (1 >= x.length)
-            return H.ioore(x, 1);
-          result = init.globalFunctions[x[1]]();
-          this.deserializedObjects.push(result);
-          return result;
-        case "dart":
-          t1 = x.length;
-          if (1 >= t1)
-            return H.ioore(x, 1);
-          classId = x[1];
-          if (2 >= t1)
-            return H.ioore(x, 2);
-          fields = x[2];
-          emptyInstance = init.instanceFromClassId(classId);
-          this.deserializedObjects.push(emptyInstance);
-          this.deserializeArrayInPlace$1(fields);
-          return init.initializeEmptyInstance(classId, emptyInstance, fields);
-        default:
-          throw H.wrapException("couldn't deserialize: " + H.S(x));
-      }
-    }, "call$1", "get$deserialize", 2, 0, 2],
-    deserializeArrayInPlace$1: function(x) {
-      var t1, i, t2;
-      t1 = J.getInterceptor$as(x);
-      i = 0;
-      while (true) {
-        t2 = t1.get$length(x);
-        if (typeof t2 !== "number")
-          return H.iae(t2);
-        if (!(i < t2))
-          break;
-        t1.$indexSet(x, i, this.deserialize$1(t1.$index(x, i)));
-        ++i;
-      }
-      return x;
-    },
-    deserializeMap$1: function(x) {
-      var t1, keys, values, result, t2, i;
-      t1 = x.length;
-      if (1 >= t1)
-        return H.ioore(x, 1);
-      keys = x[1];
-      if (2 >= t1)
-        return H.ioore(x, 2);
-      values = x[2];
-      result = P.LinkedHashMap__makeEmpty();
-      this.deserializedObjects.push(result);
-      keys = J.map$1$a(keys, this.get$deserialize()).toList$0(0);
-      for (t1 = J.getInterceptor$as(keys), t2 = J.getInterceptor$as(values), i = 0; i < t1.get$length(keys); ++i) {
-        if (i >= keys.length)
-          return H.ioore(keys, i);
-        result.$indexSet(0, keys[i], this.deserialize$1(t2.$index(values, i)));
-      }
-      return result;
-    },
-    deserializeSendPort$1: function(x) {
-      var t1, managerId, isolateId, receivePortId, isolate, receivePort, result;
-      t1 = x.length;
-      if (1 >= t1)
-        return H.ioore(x, 1);
-      managerId = x[1];
-      if (2 >= t1)
-        return H.ioore(x, 2);
-      isolateId = x[2];
-      if (3 >= t1)
-        return H.ioore(x, 3);
-      receivePortId = x[3];
-      if (J.$eq(managerId, init.globalState.currentManagerId)) {
-        isolate = init.globalState.isolates.$index(0, isolateId);
-        if (isolate == null)
-          return;
-        receivePort = isolate.lookup$1(receivePortId);
-        if (receivePort == null)
-          return;
-        result = new H._NativeJsSendPort(receivePort, isolateId);
-      } else
-        result = new H._WorkerSendPort(managerId, receivePortId, isolateId);
-      this.deserializedObjects.push(result);
-      return result;
-    },
-    deserializeJSObject$1: function(x) {
-      var t1, keys, values, o, t2, i, t3;
-      t1 = x.length;
-      if (1 >= t1)
-        return H.ioore(x, 1);
-      keys = x[1];
-      if (2 >= t1)
-        return H.ioore(x, 2);
-      values = x[2];
-      o = {};
-      this.deserializedObjects.push(o);
-      t1 = J.getInterceptor$as(keys);
-      t2 = J.getInterceptor$as(values);
-      i = 0;
-      while (true) {
-        t3 = t1.get$length(keys);
-        if (typeof t3 !== "number")
-          return H.iae(t3);
-        if (!(i < t3))
-          break;
-        o[t1.$index(keys, i)] = this.deserialize$1(t2.$index(values, i));
-        ++i;
-      }
-      return o;
-    }
-  }
-}], ["_js_helper", "dart:_js_helper",, H, {
-  "^": "",
-  getType: function(index) {
-    return init.types[index];
-  },
-  S: function(value) {
-    var res;
-    if (typeof value === "string")
-      return value;
-    if (typeof value === "number") {
-      if (value !== 0)
-        return "" + value;
-    } else if (true === value)
-      return "true";
-    else if (false === value)
-      return "false";
-    else if (value == null)
-      return "null";
-    res = J.toString$0(value);
-    if (typeof res !== "string")
-      throw H.wrapException(H._argumentError(value));
-    return res;
-  },
-  Primitives_objectHashCode: function(object) {
-    var hash = object.$identityHash;
-    if (hash == null) {
-      hash = Math.random() * 0x3fffffff | 0;
-      object.$identityHash = hash;
-    }
-    return hash;
-  },
-  Primitives_objectTypeName: function(object) {
-    var $name, decompiled;
-    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
-    if ($name === "Object") {
-      decompiled = String(object.constructor).match(/^\s*function\s*([\w$]*)\s*\(/)[1];
-      if (typeof decompiled === "string")
-        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
-    }
-    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
-      $name = C.JSString_methods.substring$1($name, 1);
-    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
-      return init.mangledGlobalNames[m] || m;
-    });
-  },
-  Primitives_objectToString: function(object) {
-    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
-  },
-  Primitives_getProperty: function(object, key) {
-    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
-      throw H.wrapException(H._argumentError(object));
-    return object[key];
-  },
-  Primitives_setProperty: function(object, key, value) {
-    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
-      throw H.wrapException(H._argumentError(object));
-    object[key] = value;
-  },
-  iae: function(argument) {
-    throw H.wrapException(H._argumentError(argument));
-  },
-  ioore: function(receiver, index) {
-    if (receiver == null)
-      J.get$length$as(receiver);
-    if (typeof index !== "number" || Math.floor(index) !== index)
-      H.iae(index);
-    throw H.wrapException(P.RangeError$value(index, null, null));
-  },
-  _argumentError: function(object) {
-    return new P.ArgumentError(true, object, null, null);
-  },
-  checkInt: function(value) {
-    if (typeof value !== "number" || Math.floor(value) !== value)
-      throw H.wrapException(H._argumentError(value));
-    return value;
-  },
-  wrapException: function(ex) {
-    var wrapper;
-    if (ex == null)
-      ex = new P.NullThrownError();
-    wrapper = new Error();
-    wrapper.dartException = ex;
-    if ("defineProperty" in Object) {
-      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
-      wrapper.name = "";
-    } else
-      wrapper.toString = H.toStringWrapper;
-    return wrapper;
-  },
-  toStringWrapper: function() {
-    return J.toString$0(this.dartException);
-  },
-  throwExpression: function(ex) {
-    throw H.wrapException(ex);
-  },
-  unwrapException: function(ex) {
-    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
-    t1 = new H.unwrapException_saveStackTrace(ex);
-    if (ex == null)
-      return;
-    if (ex instanceof H.ExceptionAndStackTrace)
-      return t1.call$1(ex.dartException);
-    if (typeof ex !== "object")
-      return ex;
-    if ("dartException" in ex)
-      return t1.call$1(ex.dartException);
-    else if (!("message" in ex))
-      return ex;
-    message = ex.message;
-    if ("number" in ex && typeof ex.number == "number") {
-      number = ex.number;
-      ieErrorCode = number & 65535;
-      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
-        switch (ieErrorCode) {
-          case 438:
-            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
-          case 445:
-          case 5007:
-            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
-            return t1.call$1(new H.NullError(t2, null));
-        }
-    }
-    if (ex instanceof TypeError) {
-      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
-      t3 = $.get$TypeErrorDecoder_notClosurePattern();
-      t4 = $.get$TypeErrorDecoder_nullCallPattern();
-      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
-      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
-      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
-      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
-      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
-      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
-      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
-      match = t2.matchTypeError$1(message);
-      if (match != null)
-        return t1.call$1(H.JsNoSuchMethodError$(message, match));
-      else {
-        match = t3.matchTypeError$1(message);
-        if (match != null) {
-          match.method = "call";
-          return t1.call$1(H.JsNoSuchMethodError$(message, match));
-        } else {
-          match = t4.matchTypeError$1(message);
-          if (match == null) {
-            match = nullLiteralCall.matchTypeError$1(message);
-            if (match == null) {
-              match = t5.matchTypeError$1(message);
-              if (match == null) {
-                match = t6.matchTypeError$1(message);
-                if (match == null) {
-                  match = t7.matchTypeError$1(message);
-                  if (match == null) {
-                    match = nullLiteralCall.matchTypeError$1(message);
-                    if (match == null) {
-                      match = t8.matchTypeError$1(message);
-                      if (match == null) {
-                        match = t9.matchTypeError$1(message);
-                        t2 = match != null;
-                      } else
-                        t2 = true;
-                    } else
-                      t2 = true;
-                  } else
-                    t2 = true;
-                } else
-                  t2 = true;
-              } else
-                t2 = true;
-            } else
-              t2 = true;
-          } else
-            t2 = true;
-          if (t2)
-            return t1.call$1(new H.NullError(message, match == null ? null : match.method));
-        }
-      }
-      return t1.call$1(new H.UnknownJsTypeError(typeof message === "string" ? message : ""));
-    }
-    if (ex instanceof RangeError) {
-      if (typeof message === "string" && message.indexOf("call stack") !== -1)
-        return new P.StackOverflowError();
-      return t1.call$1(new P.ArgumentError(false, null, null, null));
-    }
-    if (typeof InternalError == "function" && ex instanceof InternalError)
-      if (typeof message === "string" && message === "too much recursion")
-        return new P.StackOverflowError();
-    return ex;
-  },
-  getTraceFromException: function(exception) {
-    if (exception instanceof H.ExceptionAndStackTrace)
-      return exception.stackTrace;
-    return new H._StackTrace(exception, null);
-  },
-  objectHashCode: function(object) {
-    if (object == null || typeof object != 'object')
-      return J.get$hashCode$(object);
-    else
-      return H.Primitives_objectHashCode(object);
-  },
-  fillLiteralMap: function(keyValuePairs, result) {
-    var $length, index, index0, index1;
-    $length = keyValuePairs.length;
-    for (index = 0; index < $length; index = index1) {
-      index0 = index + 1;
-      index1 = index0 + 1;
-      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
-    }
-    return result;
-  },
-  invokeClosure: function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
-    var t1 = J.getInterceptor(numberOfArguments);
-    if (t1.$eq(numberOfArguments, 0))
-      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
-    else if (t1.$eq(numberOfArguments, 1))
-      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
-    else if (t1.$eq(numberOfArguments, 2))
-      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
-    else if (t1.$eq(numberOfArguments, 3))
-      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
-    else if (t1.$eq(numberOfArguments, 4))
-      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
-    else
-      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
-  },
-  convertDartClosureToJS: function(closure, arity) {
-    var $function = closure.$identity;
-    if (!!$function)
-      return $function;
-    $function = function(closure, arity, context, invoke) {
-      return function(a1, a2, a3, a4) {
-        return invoke(closure, context, arity, a1, a2, a3, a4);
-      };
-    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
-    closure.$identity = $function;
-    return $function;
-  },
-  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
-    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
-    $function = functions[0];
-    callName = $function.$callName;
-    if (!!J.getInterceptor(reflectionInfo).$isList) {
-      $function.$reflectionInfo = reflectionInfo;
-      functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
-    } else
-      functionType = reflectionInfo;
-    $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
-    $prototype.$initialize = $prototype.constructor;
-    if (isStatic)
-      $constructor = function() {
-        this.$initialize();
-      };
-    else {
-      t1 = $.Closure_functionCounter;
-      $.Closure_functionCounter = J.$add$ns(t1, 1);
-      t1 = new Function("a,b,c,d", "this.$initialize(a,b,c,d);" + t1);
-      $constructor = t1;
-    }
-    $prototype.constructor = $constructor;
-    $constructor.prototype = $prototype;
-    t1 = !isStatic;
-    if (t1) {
-      isIntercepted = jsArguments.length == 1 && true;
-      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
-      trampoline.$reflectionInfo = reflectionInfo;
-    } else {
-      $prototype.$name = propertyName;
-      trampoline = $function;
-      isIntercepted = false;
-    }
-    if (typeof functionType == "number")
-      signatureFunction = function(t) {
-        return function() {
-          return H.getType(t);
-        };
-      }(functionType);
-    else if (t1 && typeof functionType == "function") {
-      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
-      signatureFunction = function(f, r) {
-        return function() {
-          return f.apply({$receiver: r(this)}, arguments);
-        };
-      }(functionType, getReceiver);
-    } else
-      throw H.wrapException("Error in reflectionInfo.");
-    $prototype.$signature = signatureFunction;
-    $prototype[callName] = trampoline;
-    for (t1 = functions.length, i = 1; i < t1; ++i) {
-      stub = functions[i];
-      stubCallName = stub.$callName;
-      if (stubCallName != null) {
-        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
-        $prototype[stubCallName] = t2;
-      }
-    }
-    $prototype["call*"] = trampoline;
-    $prototype.$requiredArgCount = $function.$requiredArgCount;
-    $prototype.$defaultValues = $function.$defaultValues;
-    return $constructor;
-  },
-  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
-    var getSelf = H.BoundClosure_selfOf;
-    switch (isSuperCall ? -1 : arity) {
-      case 0:
-        return function(n, S) {
-          return function() {
-            return S(this)[n]();
-          };
-        }(stubName, getSelf);
-      case 1:
-        return function(n, S) {
-          return function(a) {
-            return S(this)[n](a);
-          };
-        }(stubName, getSelf);
-      case 2:
-        return function(n, S) {
-          return function(a, b) {
-            return S(this)[n](a, b);
-          };
-        }(stubName, getSelf);
-      case 3:
-        return function(n, S) {
-          return function(a, b, c) {
-            return S(this)[n](a, b, c);
-          };
-        }(stubName, getSelf);
-      case 4:
-        return function(n, S) {
-          return function(a, b, c, d) {
-            return S(this)[n](a, b, c, d);
-          };
-        }(stubName, getSelf);
-      case 5:
-        return function(n, S) {
-          return function(a, b, c, d, e) {
-            return S(this)[n](a, b, c, d, e);
-          };
-        }(stubName, getSelf);
-      default:
-        return function(f, s) {
-          return function() {
-            return f.apply(s(this), arguments);
-          };
-        }($function, getSelf);
-    }
-  },
-  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
-    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
-    if (isIntercepted)
-      return H.Closure_forwardInterceptedCallTo(receiver, $function);
-    stubName = $function.$stubName;
-    arity = $function.length;
-    lookedUpFunction = receiver[stubName];
-    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
-    t2 = !t1 || arity >= 27;
-    if (t2)
-      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
-    if (arity === 0) {
-      t1 = $.BoundClosure_selfFieldNameCache;
-      if (t1 == null) {
-        t1 = H.BoundClosure_computeFieldNamed("self");
-        $.BoundClosure_selfFieldNameCache = t1;
-      }
-      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
-      t2 = $.Closure_functionCounter;
-      $.Closure_functionCounter = J.$add$ns(t2, 1);
-      return new Function(t1 + H.S(t2) + "}")();
-    }
-    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
-    t1 = "return function(" + $arguments + "){return this.";
-    t2 = $.BoundClosure_selfFieldNameCache;
-    if (t2 == null) {
-      t2 = H.BoundClosure_computeFieldNamed("self");
-      $.BoundClosure_selfFieldNameCache = t2;
-    }
-    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
-    t1 = $.Closure_functionCounter;
-    $.Closure_functionCounter = J.$add$ns(t1, 1);
-    return new Function(t2 + H.S(t1) + "}")();
-  },
-  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
-    var getSelf, getReceiver;
-    getSelf = H.BoundClosure_selfOf;
-    getReceiver = H.BoundClosure_receiverOf;
-    switch (isSuperCall ? -1 : arity) {
-      case 0:
-        throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
-      case 1:
-        return function(n, s, r) {
-          return function() {
-            return s(this)[n](r(this));
-          };
-        }($name, getSelf, getReceiver);
-      case 2:
-        return function(n, s, r) {
-          return function(a) {
-            return s(this)[n](r(this), a);
-          };
-        }($name, getSelf, getReceiver);
-      case 3:
-        return function(n, s, r) {
-          return function(a, b) {
-            return s(this)[n](r(this), a, b);
-          };
-        }($name, getSelf, getReceiver);
-      case 4:
-        return function(n, s, r) {
-          return function(a, b, c) {
-            return s(this)[n](r(this), a, b, c);
-          };
-        }($name, getSelf, getReceiver);
-      case 5:
-        return function(n, s, r) {
-          return function(a, b, c, d) {
-            return s(this)[n](r(this), a, b, c, d);
-          };
-        }($name, getSelf, getReceiver);
-      case 6:
-        return function(n, s, r) {
-          return function(a, b, c, d, e) {
-            return s(this)[n](r(this), a, b, c, d, e);
-          };
-        }($name, getSelf, getReceiver);
-      default:
-        return function(f, s, r, a) {
-          return function() {
-            a = [r(this)];
-            Array.prototype.push.apply(a, arguments);
-            return f.apply(s(this), a);
-          };
-        }($function, getSelf, getReceiver);
-    }
-  },
-  Closure_forwardInterceptedCallTo: function(receiver, $function) {
-    var selfField, t1, stubName, arity, lookedUpFunction, t2, t3, $arguments;
-    selfField = H.BoundClosure_selfFieldName();
-    t1 = $.BoundClosure_receiverFieldNameCache;
-    if (t1 == null) {
-      t1 = H.BoundClosure_computeFieldNamed("receiver");
-      $.BoundClosure_receiverFieldNameCache = t1;
-    }
-    stubName = $function.$stubName;
-    arity = $function.length;
-    lookedUpFunction = receiver[stubName];
-    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
-    t3 = !t2 || arity >= 28;
-    if (t3)
-      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
-    if (arity === 1) {
-      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
-      t2 = $.Closure_functionCounter;
-      $.Closure_functionCounter = J.$add$ns(t2, 1);
-      return new Function(t1 + H.S(t2) + "}")();
-    }
-    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
-    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
-    t2 = $.Closure_functionCounter;
-    $.Closure_functionCounter = J.$add$ns(t2, 1);
-    return new Function(t1 + H.S(t2) + "}")();
-  },
-  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
-    var t1;
-    functions.fixed$length = Array;
-    if (!!J.getInterceptor(reflectionInfo).$isList) {
-      reflectionInfo.fixed$length = Array;
-      t1 = reflectionInfo;
-    } else
-      t1 = reflectionInfo;
-    return H.Closure_fromTearOff(receiver, functions, t1, !!isStatic, jsArguments, $name);
-  },
-  throwCyclicInit: function(staticName) {
-    throw H.wrapException(new P.CyclicInitializationError("Cyclic initialization for static " + H.S(staticName)));
-  },
-  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
-    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
-  },
-  getDynamicRuntimeType: function() {
-    return C.C_DynamicRuntimeType;
-  },
-  random64: function() {
-    return (Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296;
-  },
-  asyncHelper: function(object, bodyFunctionOrErrorCode, completer) {
-    var future;
-    if (bodyFunctionOrErrorCode === 0) {
-      completer.complete$1(object);
-      return;
-    } else if (bodyFunctionOrErrorCode === 1) {
-      completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
-      return;
-    }
-    if (!!J.getInterceptor(object).$isFuture)
-      future = object;
-    else {
-      future = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
-      future._asyncComplete$1(object);
-    }
-    future.then$2$onError(H._wrapJsFunctionForAsync(bodyFunctionOrErrorCode, 0), new H.asyncHelper_closure(bodyFunctionOrErrorCode));
-    return completer.get$future();
-  },
-  _wrapJsFunctionForAsync: function($function, errorCode) {
-    return new H._wrapJsFunctionForAsync_closure(errorCode, function(errorCode, result) {
-      while (true)
-        try {
-          $function(errorCode, result);
-          break;
-        } catch (error) {
-          result = error;
-          errorCode = 1;
-        }
-    });
-  },
-  setRuntimeTypeInfo: function(target, typeInfo) {
-    if (target != null)
-      target.$builtinTypeInfo = typeInfo;
-    return target;
-  },
-  getRuntimeTypeInfo: function(target) {
-    if (target == null)
-      return;
-    return target.$builtinTypeInfo;
-  },
-  getRuntimeTypeArguments: function(target, substitutionName) {
-    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
-  },
-  getRuntimeTypeArgument: function(target, substitutionName, index) {
-    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
-    return $arguments == null ? null : $arguments[index];
-  },
-  getTypeArgumentByIndex: function(target, index) {
-    var rti = H.getRuntimeTypeInfo(target);
-    return rti == null ? null : rti[index];
-  },
-  runtimeTypeToString: function(type, onTypeVariable) {
-    if (type == null)
-      return "dynamic";
-    else if (typeof type === "object" && type !== null && type.constructor === Array)
-      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
-    else if (typeof type == "function")
-      return type.builtin$cls;
-    else if (typeof type === "number" && Math.floor(type) === type)
-      return C.JSInt_methods.toString$0(type);
-    else
-      return;
-  },
-  joinArguments: function(types, startIndex, onTypeVariable) {
-    var buffer, index, firstArgument, allDynamic, t1, argument;
-    if (types == null)
-      return "";
-    buffer = new P.StringBuffer("");
-    for (index = startIndex, firstArgument = true, allDynamic = true, t1 = ""; index < types.length; ++index) {
-      if (firstArgument)
-        firstArgument = false;
-      else
-        buffer._contents = t1 + ", ";
-      argument = types[index];
-      if (argument != null)
-        allDynamic = false;
-      t1 = buffer._contents += H.S(H.runtimeTypeToString(argument, onTypeVariable));
-    }
-    return allDynamic ? "" : "<" + H.S(buffer) + ">";
-  },
-  substitute: function(substitution, $arguments) {
-    if (typeof substitution == "function") {
-      substitution = H.invokeOn(substitution, null, $arguments);
-      if (substitution == null || typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
-        $arguments = substitution;
-      else if (typeof substitution == "function")
-        $arguments = H.invokeOn(substitution, null, $arguments);
-    }
-    return $arguments;
-  },
-  areSubtypes: function(s, t) {
-    var len, i;
-    if (s == null || t == null)
-      return true;
-    len = s.length;
-    for (i = 0; i < len; ++i)
-      if (!H.isSubtype(s[i], t[i]))
-        return false;
-    return true;
-  },
-  computeSignature: function(signature, context, contextName) {
-    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
-  },
-  isSubtype: function(s, t) {
-    var t1, typeOfS, t2, typeOfT, substitution;
-    if (s === t)
-      return true;
-    if (s == null || t == null)
-      return true;
-    if ('func' in t)
-      return H.isFunctionSubtype(s, t);
-    if ('func' in s)
-      return t.builtin$cls === "Function";
-    t1 = typeof s === "object" && s !== null && s.constructor === Array;
-    typeOfS = t1 ? s[0] : s;
-    t2 = typeof t === "object" && t !== null && t.constructor === Array;
-    typeOfT = t2 ? t[0] : t;
-    if (typeOfT !== typeOfS) {
-      if (!('$is' + H.runtimeTypeToString(typeOfT, null) in typeOfS.prototype))
-        return false;
-      substitution = typeOfS.prototype["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
-    } else
-      substitution = null;
-    if (!t1 && substitution == null || !t2)
-      return true;
-    t1 = t1 ? s.slice(1) : null;
-    t2 = t2 ? t.slice(1) : null;
-    return H.areSubtypes(H.substitute(substitution, t1), t2);
-  },
-  areAssignable: function(s, t, allowShorter) {
-    var t1, sLength, tLength, i, t2;
-    t1 = t == null;
-    if (t1 && s == null)
-      return true;
-    if (t1)
-      return allowShorter;
-    if (s == null)
-      return false;
-    sLength = s.length;
-    tLength = t.length;
-    if (allowShorter) {
-      if (sLength < tLength)
-        return false;
-    } else if (sLength !== tLength)
-      return false;
-    for (i = 0; i < tLength; ++i) {
-      t1 = s[i];
-      t2 = t[i];
-      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
-        return false;
-    }
-    return true;
-  },
-  areAssignableMaps: function(s, t) {
-    var t1, names, i, $name, tType, sType;
-    if (t == null)
-      return true;
-    if (s == null)
-      return false;
-    t1 = Object.getOwnPropertyNames(t);
-    t1.fixed$length = Array;
-    names = t1;
-    for (t1 = names.length, i = 0; i < t1; ++i) {
-      $name = names[i];
-      if (!Object.hasOwnProperty.call(s, $name))
-        return false;
-      tType = t[$name];
-      sType = s[$name];
-      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
-        return false;
-    }
-    return true;
-  },
-  isFunctionSubtype: function(s, t) {
-    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
-    if (!('func' in s))
-      return false;
-    if ("void" in s) {
-      if (!("void" in t) && "ret" in t)
-        return false;
-    } else if (!("void" in t)) {
-      sReturnType = s.ret;
-      tReturnType = t.ret;
-      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
-        return false;
-    }
-    sParameterTypes = s.args;
-    tParameterTypes = t.args;
-    sOptionalParameterTypes = s.opt;
-    tOptionalParameterTypes = t.opt;
-    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
-    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
-    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
-    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
-    if (sParametersLen > tParametersLen)
-      return false;
-    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
-      return false;
-    if (sParametersLen === tParametersLen) {
-      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
-        return false;
-      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
-        return false;
-    } else {
-      for (pos = 0; pos < sParametersLen; ++pos) {
-        t1 = sParameterTypes[pos];
-        t2 = tParameterTypes[pos];
-        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
-          return false;
-      }
-      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
-        t1 = sOptionalParameterTypes[sPos];
-        t2 = tParameterTypes[tPos];
-        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
-          return false;
-      }
-      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
-        t1 = sOptionalParameterTypes[sPos];
-        t2 = tOptionalParameterTypes[tPos];
-        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
-          return false;
-      }
-    }
-    return H.areAssignableMaps(s.named, t.named);
-  },
-  invokeOn: function($function, receiver, $arguments) {
-    return $function.apply(receiver, $arguments);
-  },
-  ReflectionInfo: {
-    "^": "Object;jsFunction,data,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
-    static: {ReflectionInfo_ReflectionInfo: function(jsFunction) {
-        var data, requiredParametersInfo, optionalParametersInfo;
-        data = jsFunction.$reflectionInfo;
-        if (data == null)
-          return;
-        data.fixed$length = Array;
-        data = data;
-        requiredParametersInfo = data[0];
-        optionalParametersInfo = data[1];
-        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
-      }}
-  },
-  TypeErrorDecoder: {
-    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
-    matchTypeError$1: function(message) {
-      var match, result, t1;
-      match = new RegExp(this._pattern).exec(message);
-      if (match == null)
-        return;
-      result = Object.create(null);
-      t1 = this._arguments;
-      if (t1 !== -1)
-        result.arguments = match[t1 + 1];
-      t1 = this._argumentsExpr;
-      if (t1 !== -1)
-        result.argumentsExpr = match[t1 + 1];
-      t1 = this._expr;
-      if (t1 !== -1)
-        result.expr = match[t1 + 1];
-      t1 = this._method;
-      if (t1 !== -1)
-        result.method = match[t1 + 1];
-      t1 = this._receiver;
-      if (t1 !== -1)
-        result.receiver = match[t1 + 1];
-      return result;
-    },
-    static: {TypeErrorDecoder_extractPattern: function(message) {
-        var match, $arguments, argumentsExpr, expr, method, receiver;
-        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
-        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
-        if (match == null)
-          match = [];
-        $arguments = match.indexOf("\\$arguments\\$");
-        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
-        expr = match.indexOf("\\$expr\\$");
-        method = match.indexOf("\\$method\\$");
-        receiver = match.indexOf("\\$receiver\\$");
-        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
-      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
-        return function($expr$) {
-          var $argumentsExpr$ = '$arguments$';
-          try {
-            $expr$.$method$($argumentsExpr$);
-          } catch (e) {
-            return e.message;
-          }
-        }(expression);
-      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
-        return function($expr$) {
-          try {
-            $expr$.$method$;
-          } catch (e) {
-            return e.message;
-          }
-        }(expression);
-      }}
-  },
-  NullError: {
-    "^": "Error;_message,_method",
-    toString$0: function(_) {
-      var t1 = this._method;
-      if (t1 == null)
-        return "NullError: " + H.S(this._message);
-      return "NullError: method not found: '" + H.S(t1) + "' on null";
-    }
-  },
-  JsNoSuchMethodError: {
-    "^": "Error;_message,_method,_receiver",
-    toString$0: function(_) {
-      var t1, t2;
-      t1 = this._method;
-      if (t1 == null)
-        return "NoSuchMethodError: " + H.S(this._message);
-      t2 = this._receiver;
-      if (t2 == null)
-        return "NoSuchMethodError: method not found: '" + H.S(t1) + "' (" + H.S(this._message) + ")";
-      return "NoSuchMethodError: method not found: '" + H.S(t1) + "' on '" + H.S(t2) + "' (" + H.S(this._message) + ")";
-    },
-    static: {JsNoSuchMethodError$: function(_message, match) {
-        var t1, t2;
-        t1 = match == null;
-        t2 = t1 ? null : match.method;
-        return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
-      }}
-  },
-  UnknownJsTypeError: {
-    "^": "Error;_message",
-    toString$0: function(_) {
-      var t1 = this._message;
-      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
-    }
-  },
-  unwrapException_saveStackTrace: {
-    "^": "Closure:2;_captured_ex_0",
-    call$1: function(error) {
-      if (!!J.getInterceptor(error).$isError)
-        if (error.$thrownJsError == null)
-          error.$thrownJsError = this._captured_ex_0;
-      return error;
-    }
-  },
-  _StackTrace: {
-    "^": "Object;_exception,_trace",
-    toString$0: function(_) {
-      var t1, trace;
-      t1 = this._trace;
-      if (t1 != null)
-        return t1;
-      t1 = this._exception;
-      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
-      t1 = trace == null ? "" : trace;
-      this._trace = t1;
-      return t1;
-    }
-  },
-  invokeClosure_closure: {
-    "^": "Closure:0;_captured_closure_0",
-    call$0: function() {
-      return this._captured_closure_0.call$0();
-    }
-  },
-  invokeClosure_closure0: {
-    "^": "Closure:0;_captured_closure_1,_captured_arg1_2",
-    call$0: function() {
-      return this._captured_closure_1.call$1(this._captured_arg1_2);
-    }
-  },
-  invokeClosure_closure1: {
-    "^": "Closure:0;_captured_closure_3,_captured_arg1_4,_captured_arg2_5",
-    call$0: function() {
-      return this._captured_closure_3.call$2(this._captured_arg1_4, this._captured_arg2_5);
-    }
-  },
-  invokeClosure_closure2: {
-    "^": "Closure:0;_captured_closure_6,_captured_arg1_7,_captured_arg2_8,_captured_arg3_9",
-    call$0: function() {
-      return this._captured_closure_6.call$3(this._captured_arg1_7, this._captured_arg2_8, this._captured_arg3_9);
-    }
-  },
-  invokeClosure_closure3: {
-    "^": "Closure:0;_captured_closure_10,_captured_arg1_11,_captured_arg2_12,_captured_arg3_13,_captured_arg4_14",
-    call$0: function() {
-      return this._captured_closure_10.call$4(this._captured_arg1_11, this._captured_arg2_12, this._captured_arg3_13, this._captured_arg4_14);
-    }
-  },
-  Closure: {
-    "^": "Object;",
-    toString$0: function(_) {
-      return "Closure '" + H.Primitives_objectTypeName(this) + "'";
-    },
-    get$$call: function() {
-      return this;
-    },
-    get$$call: function() {
-      return this;
-    }
-  },
-  TearOffClosure: {
-    "^": "Closure;"
-  },
-  StaticClosure: {
-    "^": "TearOffClosure;",
-    toString$0: function(_) {
-      var $name = this.$name;
-      if ($name == null)
-        return "Closure of unknown static method";
-      return "Closure '" + $name + "'";
-    }
-  },
-  BoundClosure: {
-    "^": "TearOffClosure;_self,_target,_receiver,_name",
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      if (this === other)
-        return true;
-      if (!(other instanceof H.BoundClosure))
-        return false;
-      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
-    },
-    get$hashCode: function(_) {
-      var t1, receiverHashCode;
-      t1 = this._receiver;
-      if (t1 == null)
-        receiverHashCode = H.Primitives_objectHashCode(this._self);
-      else
-        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
-      return (receiverHashCode ^ H.Primitives_objectHashCode(this._target)) >>> 0;
-    },
-    toString$0: function(_) {
-      var receiver = this._receiver;
-      if (receiver == null)
-        receiver = this._self;
-      return "Closure '" + H.S(this._name) + "' of " + H.Primitives_objectToString(receiver);
-    },
-    static: {BoundClosure_selfOf: function(closure) {
-        return closure._self;
-      }, BoundClosure_receiverOf: function(closure) {
-        return closure._receiver;
-      }, BoundClosure_selfFieldName: function() {
-        var t1 = $.BoundClosure_selfFieldNameCache;
-        if (t1 == null) {
-          t1 = H.BoundClosure_computeFieldNamed("self");
-          $.BoundClosure_selfFieldNameCache = t1;
-        }
-        return t1;
-      }, BoundClosure_computeFieldNamed: function(fieldName) {
-        var template, t1, names, i, $name;
-        template = new H.BoundClosure("self", "target", "receiver", "name");
-        t1 = Object.getOwnPropertyNames(template);
-        t1.fixed$length = Array;
-        names = t1;
-        for (t1 = names.length, i = 0; i < t1; ++i) {
-          $name = names[i];
-          if (template[$name] === fieldName)
-            return $name;
-        }
-      }}
-  },
-  RuntimeError: {
-    "^": "Error;message",
-    toString$0: function(_) {
-      return "RuntimeError: " + this.message;
-    }
-  },
-  RuntimeType: {
-    "^": "Object;"
-  },
-  RuntimeFunctionType: {
-    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
-    _isTest$1: function(expression) {
-      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
-      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
-    },
-    _extractFunctionTypeObjectFrom$1: function(o) {
-      var interceptor = J.getInterceptor(o);
-      return "$signature" in interceptor ? interceptor.$signature() : null;
-    },
-    toRti$0: function() {
-      var result, t1, t2, namedRti, keys, i, $name;
-      result = {func: "dynafunc"};
-      t1 = this.returnType;
-      t2 = J.getInterceptor(t1);
-      if (!!t2.$isVoidRuntimeType)
-        result.void = true;
-      else if (!t2.$isDynamicRuntimeType)
-        result.ret = t1.toRti$0();
-      t1 = this.parameterTypes;
-      if (t1 != null && t1.length !== 0)
-        result.args = H.RuntimeFunctionType_listToRti(t1);
-      t1 = this.optionalParameterTypes;
-      if (t1 != null && t1.length !== 0)
-        result.opt = H.RuntimeFunctionType_listToRti(t1);
-      t1 = this.namedParameters;
-      if (t1 != null) {
-        namedRti = Object.create(null);
-        keys = H.extractKeys(t1);
-        for (t2 = keys.length, i = 0; i < t2; ++i) {
-          $name = keys[i];
-          namedRti[$name] = t1[$name].toRti$0();
-        }
-        result.named = namedRti;
-      }
-      return result;
-    },
-    toString$0: function(_) {
-      var t1, t2, result, needsComma, i, type, keys, $name;
-      t1 = this.parameterTypes;
-      if (t1 != null)
-        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
-          type = t1[i];
-          if (needsComma)
-            result += ", ";
-          result += H.S(type);
-        }
-      else {
-        result = "(";
-        needsComma = false;
-      }
-      t1 = this.optionalParameterTypes;
-      if (t1 != null && t1.length !== 0) {
-        result = (needsComma ? result + ", " : result) + "[";
-        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
-          type = t1[i];
-          if (needsComma)
-            result += ", ";
-          result += H.S(type);
-        }
-        result += "]";
-      } else {
-        t1 = this.namedParameters;
-        if (t1 != null) {
-          result = (needsComma ? result + ", " : result) + "{";
-          keys = H.extractKeys(t1);
-          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
-            $name = keys[i];
-            if (needsComma)
-              result += ", ";
-            result += H.S(t1[$name].toRti$0()) + " " + $name;
-          }
-          result += "}";
-        }
-      }
-      return result + (") -> " + H.S(this.returnType));
-    },
-    static: {RuntimeFunctionType_listToRti: function(list) {
-        var result, t1, i;
-        list = list;
-        result = [];
-        for (t1 = list.length, i = 0; i < t1; ++i)
-          result.push(list[i].toRti$0());
-        return result;
-      }}
-  },
-  DynamicRuntimeType: {
-    "^": "RuntimeType;",
-    toString$0: function(_) {
-      return "dynamic";
-    },
-    toRti$0: function() {
-      return;
-    }
-  },
-  ExceptionAndStackTrace: {
-    "^": "Object;dartException,stackTrace<"
-  },
-  asyncHelper_closure: {
-    "^": "Closure:3;_captured_bodyFunctionOrErrorCode_0",
-    call$2: function(error, stackTrace) {
-      H._wrapJsFunctionForAsync(this._captured_bodyFunctionOrErrorCode_0, 1).call$1(new H.ExceptionAndStackTrace(error, stackTrace));
-    }
-  },
-  _wrapJsFunctionForAsync_closure: {
-    "^": "Closure:2;_captured_errorCode_0,_captured_protected_1",
-    call$1: function(result) {
-      this._captured_protected_1(this._captured_errorCode_0, result);
-    }
-  },
-  JsLinkedHashMap: {
-    "^": "Object;__js_helper$_length,_strings,_nums,_rest,_first,_last,_modifications",
-    get$length: function(_) {
-      return this.__js_helper$_length;
-    },
-    get$keys: function() {
-      return H.setRuntimeTypeInfo(new H.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
-    },
-    get$values: function() {
-      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new H.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new H.JsLinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
-    },
-    containsKey$1: function(key) {
-      var nums;
-      if ((key & 0x3ffffff) === key) {
-        nums = this._nums;
-        if (nums == null)
-          return false;
-        return this._containsTableEntry$2(nums, key);
-      } else
-        return this.internalContainsKey$1(key);
-    },
-    internalContainsKey$1: function(key) {
-      var rest = this._rest;
-      if (rest == null)
-        return false;
-      return this.internalFindBucketIndex$2(this._getTableEntry$2(rest, this.internalComputeHashCode$1(key)), key) >= 0;
-    },
-    $index: function(_, key) {
-      var strings, cell, nums;
-      if (typeof key === "string") {
-        strings = this._strings;
-        if (strings == null)
-          return;
-        cell = this._getTableEntry$2(strings, key);
-        return cell == null ? null : cell.get$hashMapCellValue();
-      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
-        nums = this._nums;
-        if (nums == null)
-          return;
-        cell = this._getTableEntry$2(nums, key);
-        return cell == null ? null : cell.get$hashMapCellValue();
-      } else
-        return this.internalGet$1(key);
-    },
-    internalGet$1: function(key) {
-      var rest, bucket, index;
-      rest = this._rest;
-      if (rest == null)
-        return;
-      bucket = this._getTableEntry$2(rest, this.internalComputeHashCode$1(key));
-      index = this.internalFindBucketIndex$2(bucket, key);
-      if (index < 0)
-        return;
-      return bucket[index].get$hashMapCellValue();
-    },
-    $indexSet: function(_, key, value) {
-      var strings, nums;
-      if (typeof key === "string") {
-        strings = this._strings;
-        if (strings == null) {
-          strings = this._newHashTable$0();
-          this._strings = strings;
-        }
-        this.__js_helper$_addHashTableEntry$3(strings, key, value);
-      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
-        nums = this._nums;
-        if (nums == null) {
-          nums = this._newHashTable$0();
-          this._nums = nums;
-        }
-        this.__js_helper$_addHashTableEntry$3(nums, key, value);
-      } else
-        this.internalSet$2(key, value);
-    },
-    internalSet$2: function(key, value) {
-      var rest, hash, bucket, index;
-      rest = this._rest;
-      if (rest == null) {
-        rest = this._newHashTable$0();
-        this._rest = rest;
-      }
-      hash = this.internalComputeHashCode$1(key);
-      bucket = this._getTableEntry$2(rest, hash);
-      if (bucket == null)
-        this._setTableEntry$3(rest, hash, [this.__js_helper$_newLinkedCell$2(key, value)]);
-      else {
-        index = this.internalFindBucketIndex$2(bucket, key);
-        if (index >= 0)
-          bucket[index].set$hashMapCellValue(value);
-        else
-          bucket.push(this.__js_helper$_newLinkedCell$2(key, value));
-      }
-    },
-    remove$1: function(_, key) {
-      if (typeof key === "string")
-        return this._removeHashTableEntry$2(this._strings, key);
-      else if (typeof key === "number" && (key & 0x3ffffff) === key)
-        return this._removeHashTableEntry$2(this._nums, key);
-      else
-        return this.internalRemove$1(key);
-    },
-    internalRemove$1: function(key) {
-      var rest, bucket, index, cell;
-      rest = this._rest;
-      if (rest == null)
-        return;
-      bucket = this._getTableEntry$2(rest, this.internalComputeHashCode$1(key));
-      index = this.internalFindBucketIndex$2(bucket, key);
-      if (index < 0)
-        return;
-      cell = bucket.splice(index, 1)[0];
-      this._unlinkCell$1(cell);
-      return cell.get$hashMapCellValue();
-    },
-    forEach$1: function(_, action) {
-      var cell, modifications;
-      cell = this._first;
-      modifications = this._modifications;
-      for (; cell != null;) {
-        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
-        if (modifications !== this._modifications)
-          throw H.wrapException(new P.ConcurrentModificationError(this));
-        cell = cell.__js_helper$_next;
-      }
-    },
-    __js_helper$_addHashTableEntry$3: function(table, key, value) {
-      var cell = this._getTableEntry$2(table, key);
-      if (cell == null)
-        this._setTableEntry$3(table, key, this.__js_helper$_newLinkedCell$2(key, value));
-      else
-        cell.set$hashMapCellValue(value);
-    },
-    _removeHashTableEntry$2: function(table, key) {
-      var cell;
-      if (table == null)
-        return;
-      cell = this._getTableEntry$2(table, key);
-      if (cell == null)
-        return;
-      this._unlinkCell$1(cell);
-      this._deleteTableEntry$2(table, key);
-      return cell.get$hashMapCellValue();
-    },
-    __js_helper$_newLinkedCell$2: function(key, value) {
-      var cell, last;
-      cell = new H.LinkedHashMapCell(key, value, null, null);
-      if (this._first == null) {
-        this._last = cell;
-        this._first = cell;
-      } else {
-        last = this._last;
-        cell.__js_helper$_previous = last;
-        last.__js_helper$_next = cell;
-        this._last = cell;
-      }
-      ++this.__js_helper$_length;
-      this._modifications = this._modifications + 1 & 67108863;
-      return cell;
-    },
-    _unlinkCell$1: function(cell) {
-      var previous, next;
-      previous = cell.get$__js_helper$_previous();
-      next = cell.__js_helper$_next;
-      if (previous == null)
-        this._first = next;
-      else
-        previous.__js_helper$_next = next;
-      if (next == null)
-        this._last = previous;
-      else
-        next.__js_helper$_previous = previous;
-      --this.__js_helper$_length;
-      this._modifications = this._modifications + 1 & 67108863;
-    },
-    internalComputeHashCode$1: function(key) {
-      return J.get$hashCode$(key) & 0x3ffffff;
-    },
-    internalFindBucketIndex$2: function(bucket, key) {
-      var $length, i;
-      if (bucket == null)
-        return -1;
-      $length = bucket.length;
-      for (i = 0; i < $length; ++i)
-        if (J.$eq(bucket[i].get$hashMapCellKey(), key))
-          return i;
-      return -1;
-    },
-    toString$0: function(_) {
-      return P.Maps_mapToString(this);
-    },
-    _getTableEntry$2: function(table, key) {
-      return table[key];
-    },
-    _setTableEntry$3: function(table, key, value) {
-      table[key] = value;
-    },
-    _deleteTableEntry$2: function(table, key) {
-      delete table[key];
-    },
-    _containsTableEntry$2: function(table, key) {
-      return this._getTableEntry$2(table, key) != null;
-    },
-    _newHashTable$0: function() {
-      var table = Object.create(null);
-      this._setTableEntry$3(table, "<non-identifier-key>", table);
-      this._deleteTableEntry$2(table, "<non-identifier-key>");
-      return table;
-    },
-    $isInternalMap: 1
-  },
-  JsLinkedHashMap_values_closure: {
-    "^": "Closure:2;__js_helper$_captured_this_0",
-    call$1: function(each) {
-      return this.__js_helper$_captured_this_0.$index(0, each);
-    }
-  },
-  LinkedHashMapCell: {
-    "^": "Object;hashMapCellKey<,hashMapCellValue@,__js_helper$_next,__js_helper$_previous<"
-  },
-  LinkedHashMapKeyIterable: {
-    "^": "Iterable;_map",
-    get$length: function(_) {
-      return this._map.__js_helper$_length;
-    },
-    get$iterator: function(_) {
-      var t1, t2;
-      t1 = this._map;
-      t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
-      t2.__js_helper$_cell = t1._first;
-      return t2;
-    },
-    forEach$1: function(_, f) {
-      var t1, cell, modifications;
-      t1 = this._map;
-      cell = t1._first;
-      modifications = t1._modifications;
-      for (; cell != null;) {
-        f.call$1(cell.hashMapCellKey);
-        if (modifications !== t1._modifications)
-          throw H.wrapException(new P.ConcurrentModificationError(t1));
-        cell = cell.__js_helper$_next;
-      }
-    },
-    $isEfficientLengthIterable: 1
-  },
-  LinkedHashMapKeyIterator: {
-    "^": "Object;_map,_modifications,__js_helper$_cell,__js_helper$_current",
-    get$current: function() {
-      return this.__js_helper$_current;
-    },
-    moveNext$0: function() {
-      var t1 = this._map;
-      if (this._modifications !== t1._modifications)
-        throw H.wrapException(new P.ConcurrentModificationError(t1));
-      else {
-        t1 = this.__js_helper$_cell;
-        if (t1 == null) {
-          this.__js_helper$_current = null;
-          return false;
-        } else {
-          this.__js_helper$_current = t1.hashMapCellKey;
-          this.__js_helper$_cell = t1.__js_helper$_next;
-          return true;
-        }
-      }
-    }
-  }
-}], ["dart._internal", "dart:_internal",, H, {
-  "^": "",
-  IterableElementError_noElement: function() {
-    return new P.StateError("No element");
-  },
-  Symbol_getName: function(symbol) {
-    return symbol.get$__internal$_name();
-  },
-  ListIterable: {
-    "^": "Iterable;",
-    get$iterator: function(_) {
-      return new H.ListIterator(this, this.get$length(this), 0, null);
-    },
-    forEach$1: function(_, action) {
-      var $length, i;
-      $length = this.get$length(this);
-      for (i = 0; i < $length; ++i) {
-        action.call$1(this.elementAt$1(0, i));
-        if ($length !== this.get$length(this))
-          throw H.wrapException(new P.ConcurrentModificationError(this));
-      }
-    },
-    map$1: function(_, f) {
-      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
-    },
-    toList$1$growable: function(_, growable) {
-      var result, i, t1;
-      if (growable) {
-        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
-        C.JSArray_methods.set$length(result, this.get$length(this));
-      } else
-        result = H.setRuntimeTypeInfo(Array(this.get$length(this)), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
-      for (i = 0; i < this.get$length(this); ++i) {
-        t1 = this.elementAt$1(0, i);
-        if (i >= result.length)
-          return H.ioore(result, i);
-        result[i] = t1;
-      }
-      return result;
-    },
-    toList$0: function($receiver) {
-      return this.toList$1$growable($receiver, true);
-    },
-    $isEfficientLengthIterable: 1
-  },
-  ListIterator: {
-    "^": "Object;__internal$_iterable,__internal$_length,__internal$_index,__internal$_current",
-    get$current: function() {
-      return this.__internal$_current;
-    },
-    moveNext$0: function() {
-      var t1, $length, t2;
-      t1 = this.__internal$_iterable;
-      $length = t1.get$length(t1);
-      if (this.__internal$_length !== $length)
-        throw H.wrapException(new P.ConcurrentModificationError(t1));
-      t2 = this.__internal$_index;
-      if (t2 >= $length) {
-        this.__internal$_current = null;
-        return false;
-      }
-      this.__internal$_current = t1.elementAt$1(0, t2);
-      ++this.__internal$_index;
-      return true;
-    }
-  },
-  MappedIterable: {
-    "^": "Iterable;__internal$_iterable,_f",
-    get$iterator: function(_) {
-      var t1 = new H.MappedIterator(null, J.get$iterator$a(this.__internal$_iterable), this._f);
-      t1.$builtinTypeInfo = this.$builtinTypeInfo;
-      return t1;
-    },
-    get$length: function(_) {
-      return J.get$length$as(this.__internal$_iterable);
-    },
-    $asIterable: function($S, $T) {
-      return [$T];
-    },
-    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
-        if (!!J.getInterceptor(iterable).$isEfficientLengthIterable)
-          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
-        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
-      }}
-  },
-  EfficientLengthMappedIterable: {
-    "^": "MappedIterable;__internal$_iterable,_f",
-    $isEfficientLengthIterable: 1,
-    $asEfficientLengthIterable: function($S, $T) {
-      return [$T];
-    }
-  },
-  MappedIterator: {
-    "^": "Iterator;__internal$_current,_iterator,_f",
-    moveNext$0: function() {
-      var t1 = this._iterator;
-      if (t1.moveNext$0()) {
-        this.__internal$_current = this._f$1(t1.get$current());
-        return true;
-      }
-      this.__internal$_current = null;
-      return false;
-    },
-    get$current: function() {
-      return this.__internal$_current;
-    },
-    _f$1: function(arg0) {
-      return this._f.call$1(arg0);
-    }
-  },
-  MappedListIterable: {
-    "^": "ListIterable;_source,_f",
-    get$length: function(_) {
-      return J.get$length$as(this._source);
-    },
-    elementAt$1: function(_, index) {
-      return this._f$1(J.elementAt$1$a(this._source, index));
-    },
-    _f$1: function(arg0) {
-      return this._f.call$1(arg0);
-    },
-    $asListIterable: function($S, $T) {
-      return [$T];
-    },
-    $asIterable: function($S, $T) {
-      return [$T];
-    },
-    $asEfficientLengthIterable: function($S, $T) {
-      return [$T];
-    }
-  }
-}], ["dart._js_names", "dart:_js_names",, H, {
-  "^": "",
-  extractKeys: function(victim) {
-    var t1 = H.setRuntimeTypeInfo(victim ? Object.keys(victim) : [], [null]);
-    t1.fixed$length = Array;
-    return t1;
-  }
-}], ["dart.async", "dart:async",, P, {
-  "^": "",
-  _AsyncRun__initializeScheduleImmediate: function() {
-    var t1, div, span;
-    t1 = {};
-    if (self.scheduleImmediate != null)
-      return P._AsyncRun__scheduleImmediateJsOverride$closure();
-    if (self.MutationObserver != null && self.document != null) {
-      div = self.document.createElement("div");
-      span = self.document.createElement("span");
-      t1._captured_storedCallback_0 = null;
-      new self.MutationObserver(H.convertDartClosureToJS(new P._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
-      return new P._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
-    } else if (self.setImmediate != null)
-      return P._AsyncRun__scheduleImmediateWithSetImmediate$closure();
-    return P._AsyncRun__scheduleImmediateWithTimer$closure();
-  },
-  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
-    ++init.globalState.topEventLoop._activeJsAsyncCount;
-    self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
-  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 11],
-  _AsyncRun__scheduleImmediateWithSetImmediate: [function(callback) {
-    ++init.globalState.topEventLoop._activeJsAsyncCount;
-    self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(callback), 0));
-  }, "call$1", "_AsyncRun__scheduleImmediateWithSetImmediate$closure", 2, 0, 11],
-  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
-    P.Timer__createTimer(C.Duration_0, callback);
-  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 11],
-  _registerErrorHandler: function(errorHandler, zone) {
-    var t1 = H.getDynamicRuntimeType();
-    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
-    if (t1) {
-      zone.toString;
-      return errorHandler;
-    } else {
-      zone.toString;
-      return errorHandler;
-    }
-  },
-  Completer_Completer: function($T) {
-    return H.setRuntimeTypeInfo(new P._AsyncCompleter(H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [$T])), [$T]);
-  },
-  _microtaskLoop: function() {
-    var t1, t2;
-    for (; t1 = $._nextCallback, t1 != null;) {
-      $._lastPriorityCallback = null;
-      t2 = t1.next;
-      $._nextCallback = t2;
-      if (t2 == null)
-        $._lastCallback = null;
-      $.Zone__current = t1.zone;
-      t1.callback$0();
-    }
-  },
-  _microtaskLoopEntry: [function() {
-    $._isInCallbackLoop = true;
-    try {
-      P._microtaskLoop();
-    } finally {
-      $.Zone__current = C.C__RootZone;
-      $._lastPriorityCallback = null;
-      $._isInCallbackLoop = false;
-      if ($._nextCallback != null)
-        $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._microtaskLoopEntry$closure());
-    }
-  }, "call$0", "_microtaskLoopEntry$closure", 0, 0, 1],
-  _scheduleAsyncCallback: function(newEntry) {
-    if ($._nextCallback == null) {
-      $._lastCallback = newEntry;
-      $._nextCallback = newEntry;
-      if (!$._isInCallbackLoop)
-        $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._microtaskLoopEntry$closure());
-    } else {
-      $._lastCallback.next = newEntry;
-      $._lastCallback = newEntry;
-    }
-  },
-  scheduleMicrotask: function(callback) {
-    var currentZone, t1;
-    currentZone = $.Zone__current;
-    if (C.C__RootZone === currentZone) {
-      P._rootScheduleMicrotask(null, null, C.C__RootZone, callback);
-      return;
-    }
-    currentZone.toString;
-    if (C.C__RootZone.get$errorZone() === currentZone) {
-      P._rootScheduleMicrotask(null, null, currentZone, callback);
-      return;
-    }
-    t1 = $.Zone__current;
-    P._rootScheduleMicrotask(null, null, t1, t1.bindCallback$2$runGuarded(callback, true));
-  },
-  StreamIterator_StreamIterator: function(stream, $T) {
-    var t1, t2, t3;
-    t1 = H.setRuntimeTypeInfo(new P._StreamIteratorImpl(null, null, null, 0), [$T]);
-    t2 = t1.get$_onData();
-    t3 = t1.get$_onError();
-    t1._subscription = stream.listen$4$cancelOnError$onDone$onError(t2, true, t1.get$_onDone(), t3);
-    return t1;
-  },
-  Timer_Timer: function(duration, callback) {
-    var t1 = $.Zone__current;
-    if (t1 === C.C__RootZone) {
-      t1.toString;
-      return P.Timer__createTimer(duration, callback);
-    }
-    return P.Timer__createTimer(duration, t1.bindCallback$2$runGuarded(callback, true));
-  },
-  Timer__createTimer: function(duration, callback) {
-    var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
-    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
-  },
-  Zone__enter: function(zone) {
-    var previous = $.Zone__current;
-    $.Zone__current = zone;
-    return previous;
-  },
-  _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
-    var entry, t1, t2;
-    entry = new P._AsyncCallbackEntry(new P._rootHandleUncaughtError_closure(error, stackTrace), C.C__RootZone, null);
-    t1 = $._nextCallback;
-    if (t1 == null) {
-      P._scheduleAsyncCallback(entry);
-      $._lastPriorityCallback = $._lastCallback;
-    } else {
-      t2 = $._lastPriorityCallback;
-      if (t2 == null) {
-        entry.next = t1;
-        $._lastPriorityCallback = entry;
-        $._nextCallback = entry;
-      } else {
-        entry.next = t2.next;
-        t2.next = entry;
-        $._lastPriorityCallback = entry;
-        if (entry.next == null)
-          $._lastCallback = entry;
-      }
-    }
-  },
-  _rootRun: function($self, $parent, zone, f) {
-    var old, t1;
-    if ($.Zone__current === zone)
-      return f.call$0();
-    old = P.Zone__enter(zone);
-    try {
-      t1 = f.call$0();
-      return t1;
-    } finally {
-      $.Zone__current = old;
-    }
-  },
-  _rootRunUnary: function($self, $parent, zone, f, arg) {
-    var old, t1;
-    if ($.Zone__current === zone)
-      return f.call$1(arg);
-    old = P.Zone__enter(zone);
-    try {
-      t1 = f.call$1(arg);
-      return t1;
-    } finally {
-      $.Zone__current = old;
-    }
-  },
-  _rootRunBinary: function($self, $parent, zone, f, arg1, arg2) {
-    var old, t1;
-    if ($.Zone__current === zone)
-      return f.call$2(arg1, arg2);
-    old = P.Zone__enter(zone);
-    try {
-      t1 = f.call$2(arg1, arg2);
-      return t1;
-    } finally {
-      $.Zone__current = old;
-    }
-  },
-  _rootScheduleMicrotask: function($self, $parent, zone, f) {
-    var t1 = C.C__RootZone !== zone;
-    if (t1) {
-      f = zone.bindCallback$2$runGuarded(f, !(!t1 || C.C__RootZone.get$errorZone() === zone));
-      zone = C.C__RootZone;
-    }
-    P._scheduleAsyncCallback(new P._AsyncCallbackEntry(f, zone, null));
-  },
-  _AsyncRun__initializeScheduleImmediate_internalCallback: {
-    "^": "Closure:2;_box_0",
-    call$1: function(_) {
-      var t1, f;
-      H.leaveJsAsync();
-      t1 = this._box_0;
-      f = t1._captured_storedCallback_0;
-      t1._captured_storedCallback_0 = null;
-      f.call$0();
-    }
-  },
-  _AsyncRun__initializeScheduleImmediate_closure: {
-    "^": "Closure:4;_box_0,_captured_div_1,_captured_span_2",
-    call$1: function(callback) {
-      var t1, t2;
-      ++init.globalState.topEventLoop._activeJsAsyncCount;
-      this._box_0._captured_storedCallback_0 = callback;
-      t1 = this._captured_div_1;
-      t2 = this._captured_span_2;
-      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
-    }
-  },
-  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
-    "^": "Closure:0;_captured_callback_0",
-    call$0: function() {
-      H.leaveJsAsync();
-      this._captured_callback_0.call$0();
-    }
-  },
-  _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: {
-    "^": "Closure:0;_captured_callback_0",
-    call$0: function() {
-      H.leaveJsAsync();
-      this._captured_callback_0.call$0();
-    }
-  },
-  _UncaughtAsyncError: {
-    "^": "AsyncError;error,stackTrace",
-    toString$0: function(_) {
-      var result, t1;
-      result = "Uncaught Error: " + H.S(this.error);
-      t1 = this.stackTrace;
-      return t1 != null ? result + ("\nStack Trace:\n" + H.S(t1)) : result;
-    },
-    static: {_UncaughtAsyncError__getBestStackTrace: function(error, stackTrace) {
-        if (stackTrace != null)
-          return stackTrace;
-        if (!!J.getInterceptor(error).$isError)
-          return error.get$stackTrace();
-        return;
-      }}
-  },
-  Future: {
-    "^": "Object;"
-  },
-  _Completer: {
-    "^": "Object;future<",
-    completeError$2: function(error, stackTrace) {
-      error = error != null ? error : new P.NullThrownError();
-      if (this.future._state !== 0)
-        throw H.wrapException(new P.StateError("Future already completed"));
-      $.Zone__current.toString;
-      this._completeError$2(error, stackTrace);
-    }
-  },
-  _AsyncCompleter: {
-    "^": "_Completer;future",
-    complete$1: function(value) {
-      var t1 = this.future;
-      if (t1._state !== 0)
-        throw H.wrapException(new P.StateError("Future already completed"));
-      t1._asyncComplete$1(value);
-    },
-    _completeError$2: function(error, stackTrace) {
-      this.future._asyncCompleteError$2(error, stackTrace);
-    }
-  },
-  _FutureListener: {
-    "^": "Object;_nextListener<,result<,state,callback,errorCallback",
-    get$_zone: function() {
-      return this.result._zone;
-    },
-    get$handlesValue: function() {
-      return (this.state & 1) !== 0;
-    },
-    get$hasErrorTest: function() {
-      return this.state === 6;
-    },
-    get$handlesComplete: function() {
-      return this.state === 8;
-    },
-    get$_onValue: function() {
-      return this.callback;
-    },
-    get$_whenCompleteAction: function() {
-      return this.callback;
-    }
-  },
-  _Future: {
-    "^": "Object;_state?,_zone<,_resultOrListeners",
-    get$_hasError: function() {
-      return this._state === 8;
-    },
-    set$_isChained: function(value) {
-      if (value)
-        this._state = 2;
-      else
-        this._state = 0;
-    },
-    then$2$onError: function(f, onError) {
-      var result, t1;
-      result = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
-      t1 = result._zone;
-      if (t1 !== C.C__RootZone) {
-        t1.toString;
-        if (onError != null)
-          onError = P._registerErrorHandler(onError, t1);
-      }
-      this._addListener$1(new P._FutureListener(null, result, onError == null ? 1 : 3, f, onError));
-      return result;
-    },
-    _markPendingCompletion$0: function() {
-      if (this._state !== 0)
-        throw H.wrapException(new P.StateError("Future already completed"));
-      this._state = 1;
-    },
-    get$_value: function() {
-      return this._resultOrListeners;
-    },
-    get$_error: function() {
-      return this._resultOrListeners;
-    },
-    _setValue$1: function(value) {
-      this._state = 4;
-      this._resultOrListeners = value;
-    },
-    _setErrorObject$1: function(error) {
-      this._state = 8;
-      this._resultOrListeners = error;
-    },
-    _setError$2: function(error, stackTrace) {
-      this._setErrorObject$1(new P.AsyncError(error, stackTrace));
-    },
-    _addListener$1: function(listener) {
-      var t1;
-      if (this._state >= 4) {
-        t1 = this._zone;
-        t1.toString;
-        P._rootScheduleMicrotask(null, null, t1, new P._Future__addListener_closure(this, listener));
-      } else {
-        listener._nextListener = this._resultOrListeners;
-        this._resultOrListeners = listener;
-      }
-    },
-    _removeListeners$0: function() {
-      var current, prev, next;
-      current = this._resultOrListeners;
-      this._resultOrListeners = null;
-      for (prev = null; current != null; prev = current, current = next) {
-        next = current.get$_nextListener();
-        current._nextListener = prev;
-      }
-      return prev;
-    },
-    _complete$1: function(value) {
-      var t1, listeners;
-      t1 = J.getInterceptor(value);
-      if (!!t1.$isFuture)
-        if (!!t1.$is_Future)
-          P._Future__chainCoreFuture(value, this);
-        else
-          P._Future__chainForeignFuture(value, this);
-      else {
-        listeners = this._removeListeners$0();
-        this._setValue$1(value);
-        P._Future__propagateToListeners(this, listeners);
-      }
-    },
-    _completeWithValue$1: function(value) {
-      var listeners = this._removeListeners$0();
-      this._setValue$1(value);
-      P._Future__propagateToListeners(this, listeners);
-    },
-    _completeError$2: function(error, stackTrace) {
-      var listeners = this._removeListeners$0();
-      this._setErrorObject$1(new P.AsyncError(error, stackTrace));
-      P._Future__propagateToListeners(this, listeners);
-    },
-    _asyncComplete$1: function(value) {
-      var t1;
-      if (value == null)
-        ;
-      else {
-        t1 = J.getInterceptor(value);
-        if (!!t1.$isFuture) {
-          if (!!t1.$is_Future) {
-            t1 = value._state;
-            if (t1 >= 4 && t1 === 8) {
-              this._markPendingCompletion$0();
-              t1 = this._zone;
-              t1.toString;
-              P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncComplete_closure(this, value));
-            } else
-              P._Future__chainCoreFuture(value, this);
-          } else
-            P._Future__chainForeignFuture(value, this);
-          return;
-        }
-      }
-      this._markPendingCompletion$0();
-      t1 = this._zone;
-      t1.toString;
-      P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncComplete_closure0(this, value));
-    },
-    _asyncCompleteError$2: function(error, stackTrace) {
-      var t1;
-      this._markPendingCompletion$0();
-      t1 = this._zone;
-      t1.toString;
-      P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncCompleteError_closure(this, error, stackTrace));
-    },
-    $isFuture: 1,
-    static: {_Future__chainForeignFuture: function(source, target) {
-        var e, s, exception, t1;
-        target.set$_state(2);
-        try {
-          source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
-        } catch (exception) {
-          t1 = H.unwrapException(exception);
-          e = t1;
-          s = H.getTraceFromException(exception);
-          P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(target, e, s));
-        }
-      }, _Future__chainCoreFuture: function(source, target) {
-        var listener;
-        target._state = 2;
-        listener = new P._FutureListener(null, target, 0, null, null);
-        if (source._state >= 4)
-          P._Future__propagateToListeners(source, listener);
-        else
-          source._addListener$1(listener);
-      }, _Future__propagateToListeners: function(source, listeners) {
-        var t1, t2, t3, hasError, asyncError, t4, listeners0, sourceValue, zone, oldZone, chainSource, result;
-        t1 = {};
-        t1._captured_source_4 = source;
-        for (t2 = source; true;) {
-          t3 = {};
-          hasError = t2.get$_hasError();
-          if (listeners == null) {
-            if (hasError) {
-              asyncError = t1._captured_source_4.get$_error();
-              t2 = t1._captured_source_4.get$_zone();
-              t3 = asyncError.get$error();
-              t4 = asyncError.get$stackTrace();
-              t2.toString;
-              P._rootHandleUncaughtError(null, null, t2, t3, t4);
-            }
-            return;
-          }
-          for (; listeners.get$_nextListener() != null; listeners = listeners0) {
-            listeners0 = listeners._nextListener;
-            listeners._nextListener = null;
-            P._Future__propagateToListeners(t1._captured_source_4, listeners);
-          }
-          t3._captured_listenerHasValue_1 = true;
-          sourceValue = hasError ? null : t1._captured_source_4.get$_value();
-          t3._captured_listenerValueOrError_2 = sourceValue;
-          t3._captured_isPropagationAborted_3 = false;
-          t2 = !hasError;
-          if (!t2 || listeners.get$handlesValue() || listeners.state === 8) {
-            zone = listeners.get$_zone();
-            if (hasError) {
-              t4 = t1._captured_source_4.get$_zone();
-              t4.toString;
-              if (t4 == null ? zone != null : t4 !== zone) {
-                t4 = t4.get$errorZone();
-                zone.toString;
-                t4 = t4 === zone;
-              } else
-                t4 = true;
-              t4 = !t4;
-            } else
-              t4 = false;
-            if (t4) {
-              asyncError = t1._captured_source_4.get$_error();
-              t2 = t1._captured_source_4.get$_zone();
-              t3 = asyncError.get$error();
-              t4 = asyncError.get$stackTrace();
-              t2.toString;
-              P._rootHandleUncaughtError(null, null, t2, t3, t4);
-              return;
-            }
-            oldZone = $.Zone__current;
-            if (oldZone == null ? zone != null : oldZone !== zone)
-              $.Zone__current = zone;
-            else
-              oldZone = null;
-            if (t2) {
-              if (listeners.get$handlesValue())
-                t3._captured_listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
-            } else
-              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
-            if (listeners.get$handlesComplete())
-              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
-            if (oldZone != null)
-              $.Zone__current = oldZone;
-            if (t3._captured_isPropagationAborted_3)
-              return;
-            if (t3._captured_listenerHasValue_1 === true) {
-              t2 = t3._captured_listenerValueOrError_2;
-              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
-            } else
-              t2 = false;
-            if (t2) {
-              chainSource = t3._captured_listenerValueOrError_2;
-              result = listeners.result;
-              if (chainSource instanceof P._Future)
-                if (chainSource._state >= 4) {
-                  result._state = 2;
-                  t1._captured_source_4 = chainSource;
-                  listeners = new P._FutureListener(null, result, 0, null, null);
-                  t2 = chainSource;
-                  continue;
-                } else
-                  P._Future__chainCoreFuture(chainSource, result);
-              else
-                P._Future__chainForeignFuture(chainSource, result);
-              return;
-            }
-          }
-          result = listeners.result;
-          listeners = result._removeListeners$0();
-          t2 = t3._captured_listenerHasValue_1;
-          t3 = t3._captured_listenerValueOrError_2;
-          if (t2 === true) {
-            result._state = 4;
-            result._resultOrListeners = t3;
-          } else {
-            result._state = 8;
-            result._resultOrListeners = t3;
-          }
-          t1._captured_source_4 = result;
-          t2 = result;
-        }
-      }}
-  },
-  _Future__addListener_closure: {
-    "^": "Closure:0;_async$_captured_this_0,_captured_listener_1",
-    call$0: function() {
-      P._Future__propagateToListeners(this._async$_captured_this_0, this._captured_listener_1);
-    }
-  },
-  _Future__chainForeignFuture_closure: {
-    "^": "Closure:2;_captured_target_0",
-    call$1: function(value) {
-      this._captured_target_0._completeWithValue$1(value);
-    }
-  },
-  _Future__chainForeignFuture_closure0: {
-    "^": "Closure:5;_captured_target_1",
-    call$2: function(error, stackTrace) {
-      this._captured_target_1._completeError$2(error, stackTrace);
-    },
-    call$1: function(error) {
-      return this.call$2(error, null);
-    }
-  },
-  _Future__chainForeignFuture_closure1: {
-    "^": "Closure:0;_captured_target_2,_captured_e_3,_captured_s_4",
-    call$0: function() {
-      this._captured_target_2._completeError$2(this._captured_e_3, this._captured_s_4);
-    }
-  },
-  _Future__asyncComplete_closure: {
-    "^": "Closure:0;_async$_captured_this_0,_captured_coreFuture_1",
-    call$0: function() {
-      P._Future__chainCoreFuture(this._captured_coreFuture_1, this._async$_captured_this_0);
-    }
-  },
-  _Future__asyncComplete_closure0: {
-    "^": "Closure:0;_async$_captured_this_2,_captured_value_3",
-    call$0: function() {
-      this._async$_captured_this_2._completeWithValue$1(this._captured_value_3);
-    }
-  },
-  _Future__asyncCompleteError_closure: {
-    "^": "Closure:0;_async$_captured_this_0,_captured_error_1,_captured_stackTrace_2",
-    call$0: function() {
-      this._async$_captured_this_0._completeError$2(this._captured_error_1, this._captured_stackTrace_2);
-    }
-  },
-  _Future__propagateToListeners_handleValueCallback: {
-    "^": "Closure:6;_box_1,_captured_listener_3,_captured_sourceValue_4,_captured_zone_5",
-    call$0: function() {
-      var e, s, exception, t1;
-      try {
-        this._box_1._captured_listenerValueOrError_2 = this._captured_zone_5.runUnary$2(this._captured_listener_3.get$_onValue(), this._captured_sourceValue_4);
-        return true;
-      } catch (exception) {
-        t1 = H.unwrapException(exception);
-        e = t1;
-        s = H.getTraceFromException(exception);
-        this._box_1._captured_listenerValueOrError_2 = new P.AsyncError(e, s);
-        return false;
-      }
-    }
-  },
-  _Future__propagateToListeners_handleError: {
-    "^": "Closure:1;_box_2,_box_1,_captured_listener_6,_captured_zone_7",
-    call$0: function() {
-      var asyncError, matchesTest, test, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
-      asyncError = this._box_2._captured_source_4.get$_error();
-      matchesTest = true;
-      t1 = this._captured_listener_6;
-      if (t1.get$hasErrorTest()) {
-        test = t1.callback;
-        try {
-          matchesTest = this._captured_zone_7.runUnary$2(test, asyncError.get$error());
-        } catch (exception) {
-          t1 = H.unwrapException(exception);
-          e = t1;
-          s = H.getTraceFromException(exception);
-          t1 = asyncError.get$error();
-          t2 = e;
-          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P.AsyncError(e, s);
-          t1 = this._box_1;
-          t1._captured_listenerValueOrError_2 = listenerValueOrError;
-          t1._captured_listenerHasValue_1 = false;
-          return;
-        }
-      }
-      errorCallback = t1.errorCallback;
-      if (matchesTest === true && errorCallback != null) {
-        try {
-          t1 = errorCallback;
-          t2 = H.getDynamicRuntimeType();
-          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
-          t3 = this._captured_zone_7;
-          t4 = this._box_1;
-          if (t2)
-            t4._captured_listenerValueOrError_2 = t3.runBinary$3(errorCallback, asyncError.get$error(), asyncError.get$stackTrace());
-          else
-            t4._captured_listenerValueOrError_2 = t3.runUnary$2(errorCallback, asyncError.get$error());
-        } catch (exception) {
-          t1 = H.unwrapException(exception);
-          e0 = t1;
-          s0 = H.getTraceFromException(exception);
-          t1 = asyncError.get$error();
-          t2 = e0;
-          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P.AsyncError(e0, s0);
-          t1 = this._box_1;
-          t1._captured_listenerValueOrError_2 = listenerValueOrError;
-          t1._captured_listenerHasValue_1 = false;
-          return;
-        }
-        this._box_1._captured_listenerHasValue_1 = true;
-      } else {
-        t1 = this._box_1;
-        t1._captured_listenerValueOrError_2 = asyncError;
-        t1._captured_listenerHasValue_1 = false;
-      }
-    }
-  },
-  _Future__propagateToListeners_handleWhenCompleteCallback: {
-    "^": "Closure:1;_box_2,_box_1,_captured_hasError_8,_captured_listener_9,_captured_zone_10",
-    call$0: function() {
-      var t1, e, s, completeResult, t2, exception, result;
-      t1 = {};
-      t1._captured_completeResult_0 = null;
-      try {
-        completeResult = this._captured_zone_10.run$1(this._captured_listener_9.get$_whenCompleteAction());
-        t1._captured_completeResult_0 = completeResult;
-        t2 = completeResult;
-      } catch (exception) {
-        t1 = H.unwrapException(exception);
-        e = t1;
-        s = H.getTraceFromException(exception);
-        if (this._captured_hasError_8) {
-          t1 = this._box_2._captured_source_4.get$_error().get$error();
-          t2 = e;
-          t2 = t1 == null ? t2 == null : t1 === t2;
-          t1 = t2;
-        } else
-          t1 = false;
-        t2 = this._box_1;
-        if (t1)
-          t2._captured_listenerValueOrError_2 = this._box_2._captured_source_4.get$_error();
-        else
-          t2._captured_listenerValueOrError_2 = new P.AsyncError(e, s);
-        t2._captured_listenerHasValue_1 = false;
-        return;
-      }
-      if (!!J.getInterceptor(t2).$isFuture) {
-        result = this._captured_listener_9.get$result();
-        result.set$_isChained(true);
-        this._box_1._captured_isPropagationAborted_3 = true;
-        t2.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this._box_2, result), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, result));
-      }
-    }
-  },
-  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
-    "^": "Closure:2;_box_2,_captured_result_11",
-    call$1: function(ignored) {
-      P._Future__propagateToListeners(this._box_2._captured_source_4, new P._FutureListener(null, this._captured_result_11, 0, null, null));
-    }
-  },
-  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
-    "^": "Closure:5;_box_0,_captured_result_12",
-    call$2: function(error, stackTrace) {
-      var t1, completeResult;
-      t1 = this._box_0;
-      if (!(t1._captured_completeResult_0 instanceof P._Future)) {
-        completeResult = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
-        t1._captured_completeResult_0 = completeResult;
-        completeResult._setError$2(error, stackTrace);
-      }
-      P._Future__propagateToListeners(t1._captured_completeResult_0, new P._FutureListener(null, this._captured_result_12, 0, null, null));
-    },
-    call$1: function(error) {
-      return this.call$2(error, null);
-    }
-  },
-  _AsyncCallbackEntry: {
-    "^": "Object;callback,zone,next",
-    callback$0: function() {
-      return this.callback.call$0();
-    }
-  },
-  StreamSubscription: {
-    "^": "Object;"
-  },
-  _EventSink: {
-    "^": "Object;"
-  },
-  _DelayedEvent: {
-    "^": "Object;"
-  },
-  _StreamIteratorImpl: {
-    "^": "Object;_subscription,_current,_futureOrPrefetch,_state?",
-    _clear$0: function() {
-      this._subscription = null;
-      this._futureOrPrefetch = null;
-      this._current = null;
-      this._state = 1;
-    },
-    _onData$1: [function(data) {
-      var hasNext;
-      if (this._state === 2) {
-        this._current = data;
-        hasNext = this._futureOrPrefetch;
-        this._futureOrPrefetch = null;
-        this._state = 0;
-        hasNext._complete$1(true);
-        return;
-      }
-      this._subscription.pause$0();
-      this._futureOrPrefetch = data;
-      this._state = 3;
-    }, "call$1", "get$_onData", 2, 0, function() {
-      return H.computeSignature(function(T) {
-        return {func: 1, void: true, args: [T]};
-      }, this.$receiver, "_StreamIteratorImpl");
-    }],
-    _onError$2: [function(error, stackTrace) {
-      var hasNext;
-      if (this._state === 2) {
-        hasNext = this._futureOrPrefetch;
-        this._clear$0();
-        hasNext._completeError$2(error, stackTrace);
-        return;
-      }
-      this._subscription.pause$0();
-      this._futureOrPrefetch = new P.AsyncError(error, stackTrace);
-      this._state = 4;
-    }, function(error) {
-      return this._onError$2(error, null);
-    }, "_onError$1", "call$2", "call$1", "get$_onError", 2, 2, 7, 0],
-    _onDone$0: [function() {
-      if (this._state === 2) {
-        var hasNext = this._futureOrPrefetch;
-        this._clear$0();
-        hasNext._complete$1(false);
-        return;
-      }
-      this._subscription.pause$0();
-      this._futureOrPrefetch = null;
-      this._state = 5;
-    }, "call$0", "get$_onDone", 0, 0, 1]
-  },
-  AsyncError: {
-    "^": "Object;error<,stackTrace<",
-    toString$0: function(_) {
-      return H.S(this.error);
-    },
-    $isError: 1
-  },
-  _Zone: {
-    "^": "Object;"
-  },
-  _rootHandleUncaughtError_closure: {
-    "^": "Closure:0;_captured_error_0,_captured_stackTrace_1",
-    call$0: function() {
-      var t1 = this._captured_error_0;
-      throw H.wrapException(new P._UncaughtAsyncError(t1, P._UncaughtAsyncError__getBestStackTrace(t1, this._captured_stackTrace_1)));
-    }
-  },
-  _RootZone: {
-    "^": "_Zone;",
-    get$errorZone: function() {
-      return this;
-    },
-    runGuarded$1: function(f) {
-      var e, s, t1, exception;
-      try {
-        if (C.C__RootZone === $.Zone__current) {
-          t1 = f.call$0();
-          return t1;
-        }
-        t1 = P._rootRun(null, null, this, f);
-        return t1;
-      } catch (exception) {
-        t1 = H.unwrapException(exception);
-        e = t1;
-        s = H.getTraceFromException(exception);
-        return P._rootHandleUncaughtError(null, null, this, e, s);
-      }
-    },
-    bindCallback$2$runGuarded: function(f, runGuarded) {
-      if (runGuarded)
-        return new P._RootZone_bindCallback_closure(this, f);
-      else
-        return new P._RootZone_bindCallback_closure0(this, f);
-    },
-    $index: function(_, key) {
-      return;
-    },
-    run$1: function(f) {
-      if ($.Zone__current === C.C__RootZone)
-        return f.call$0();
-      return P._rootRun(null, null, this, f);
-    },
-    runUnary$2: function(f, arg) {
-      if ($.Zone__current === C.C__RootZone)
-        return f.call$1(arg);
-      return P._rootRunUnary(null, null, this, f, arg);
-    },
-    runBinary$3: function(f, arg1, arg2) {
-      if ($.Zone__current === C.C__RootZone)
-        return f.call$2(arg1, arg2);
-      return P._rootRunBinary(null, null, this, f, arg1, arg2);
-    }
-  },
-  _RootZone_bindCallback_closure: {
-    "^": "Closure:0;_async$_captured_this_0,_captured_f_1",
-    call$0: function() {
-      return this._async$_captured_this_0.runGuarded$1(this._captured_f_1);
-    }
-  },
-  _RootZone_bindCallback_closure0: {
-    "^": "Closure:0;_async$_captured_this_2,_captured_f_3",
-    call$0: function() {
-      return this._async$_captured_this_2.run$1(this._captured_f_3);
-    }
-  }
-}], ["dart.collection", "dart:collection",, P, {
-  "^": "",
-  LinkedHashMap__makeEmpty: function() {
-    return H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [null, null]);
-  },
-  LinkedHashMap__makeLiteral: function(keyValuePairs) {
-    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [null, null]));
-  },
-  _defaultEquals: [function(a, b) {
-    return J.$eq(a, b);
-  }, "call$2", "_defaultEquals$closure", 4, 0, 12],
-  _defaultHashCode: [function(a) {
-    return J.get$hashCode$(a);
-  }, "call$1", "_defaultHashCode$closure", 2, 0, 13],
-  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
-    var parts, t1;
-    if (P._isToStringVisiting(iterable)) {
-      if (leftDelimiter === "(" && rightDelimiter === ")")
-        return "(...)";
-      return leftDelimiter + "..." + rightDelimiter;
-    }
-    parts = [];
-    t1 = $.get$_toStringVisiting();
-    t1.push(iterable);
-    try {
-      P._iterablePartsToStrings(iterable, parts);
-    } finally {
-      if (0 >= t1.length)
-        return H.ioore(t1, 0);
-      t1.pop();
-    }
-    t1 = P.StringBuffer__writeAll(leftDelimiter, parts, ", ") + rightDelimiter;
-    return t1.charCodeAt(0) == 0 ? t1 : t1;
-  },
-  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
-    var buffer, t1, t2;
-    if (P._isToStringVisiting(iterable))
-      return leftDelimiter + "..." + rightDelimiter;
-    buffer = new P.StringBuffer(leftDelimiter);
-    t1 = $.get$_toStringVisiting();
-    t1.push(iterable);
-    try {
-      t2 = buffer;
-      t2._contents = P.StringBuffer__writeAll(t2.get$_contents(), iterable, ", ");
-    } finally {
-      if (0 >= t1.length)
-        return H.ioore(t1, 0);
-      t1.pop();
-    }
-    t1 = buffer;
-    t1._contents = t1.get$_contents() + rightDelimiter;
-    t1 = buffer.get$_contents();
-    return t1.charCodeAt(0) == 0 ? t1 : t1;
-  },
-  _isToStringVisiting: function(o) {
-    var i, t1;
-    for (i = 0; t1 = $.get$_toStringVisiting(), i < t1.length; ++i)
-      if (o === t1[i])
-        return true;
-    return false;
-  },
-  _iterablePartsToStrings: function(iterable, parts) {
-    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
-    it = iterable.get$iterator(iterable);
-    $length = 0;
-    count = 0;
-    while (true) {
-      if (!($length < 80 || count < 3))
-        break;
-      if (!it.moveNext$0())
-        return;
-      next = H.S(it.get$current());
-      parts.push(next);
-      $length += next.length + 2;
-      ++count;
-    }
-    if (!it.moveNext$0()) {
-      if (count <= 5)
-        return;
-      if (0 >= parts.length)
-        return H.ioore(parts, 0);
-      ultimateString = parts.pop();
-      if (0 >= parts.length)
-        return H.ioore(parts, 0);
-      penultimateString = parts.pop();
-    } else {
-      penultimate = it.get$current();
-      ++count;
-      if (!it.moveNext$0()) {
-        if (count <= 4) {
-          parts.push(H.S(penultimate));
-          return;
-        }
-        ultimateString = H.S(penultimate);
-        if (0 >= parts.length)
-          return H.ioore(parts, 0);
-        penultimateString = parts.pop();
-        $length += ultimateString.length + 2;
-      } else {
-        ultimate = it.get$current();
-        ++count;
-        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
-          ultimate0 = it.get$current();
-          ++count;
-          if (count > 100) {
-            while (true) {
-              if (!($length > 75 && count > 3))
-                break;
-              if (0 >= parts.length)
-                return H.ioore(parts, 0);
-              $length -= parts.pop().length + 2;
-              --count;
-            }
-            parts.push("...");
-            return;
-          }
-        }
-        penultimateString = H.S(penultimate);
-        ultimateString = H.S(ultimate);
-        $length += ultimateString.length + penultimateString.length + 4;
-      }
-    }
-    if (count > parts.length + 2) {
-      $length += 5;
-      elision = "...";
-    } else
-      elision = null;
-    while (true) {
-      if (!($length > 80 && parts.length > 3))
-        break;
-      if (0 >= parts.length)
-        return H.ioore(parts, 0);
-      $length -= parts.pop().length + 2;
-      if (elision == null) {
-        $length += 5;
-        elision = "...";
-      }
-    }
-    if (elision != null)
-      parts.push(elision);
-    parts.push(penultimateString);
-    parts.push(ultimateString);
-  },
-  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
-    return H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
-  },
-  LinkedHashMap_LinkedHashMap$identity: function($K, $V) {
-    return H.setRuntimeTypeInfo(new P._LinkedIdentityHashMap(0, null, null, null, null, null, 0), [$K, $V]);
-  },
-  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
-    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
-  },
-  Maps_mapToString: function(m) {
-    var t1, result, t2;
-    t1 = {};
-    if (P._isToStringVisiting(m))
-      return "{...}";
-    result = new P.StringBuffer("");
-    try {
-      $.get$_toStringVisiting().push(m);
-      t2 = result;
-      t2._contents = t2.get$_contents() + "{";
-      t1._captured_first_0 = true;
-      J.forEach$1$a(m, new P.Maps_mapToString_closure(t1, result));
-      t1 = result;
-      t1._contents = t1.get$_contents() + "}";
-    } finally {
-      t1 = $.get$_toStringVisiting();
-      if (0 >= t1.length)
-        return H.ioore(t1, 0);
-      t1.pop();
-    }
-    t1 = result.get$_contents();
-    return t1.charCodeAt(0) == 0 ? t1 : t1;
-  },
-  _LinkedIdentityHashMap: {
-    "^": "JsLinkedHashMap;__js_helper$_length,_strings,_nums,_rest,_first,_last,_modifications",
-    internalComputeHashCode$1: function(key) {
-      return H.objectHashCode(key) & 0x3ffffff;
-    },
-    internalFindBucketIndex$2: function(bucket, key) {
-      var $length, i, t1;
-      if (bucket == null)
-        return -1;
-      $length = bucket.length;
-      for (i = 0; i < $length; ++i) {
-        t1 = bucket[i].get$hashMapCellKey();
-        if (t1 == null ? key == null : t1 === key)
-          return i;
-      }
-      return -1;
-    }
-  },
-  _LinkedHashSet: {
-    "^": "_HashSetBase;_collection$_length,_collection$_strings,_collection$_nums,_collection$_rest,_collection$_first,_collection$_last,_collection$_modifications",
-    get$iterator: function(_) {
-      var t1 = new P.LinkedHashSetIterator(this, this._collection$_modifications, null, null);
-      t1._cell = this._collection$_first;
-      return t1;
-    },
-    get$length: function(_) {
-      return this._collection$_length;
-    },
-    contains$1: function(_, object) {
-      var strings, nums;
-      if (typeof object === "string" && object !== "__proto__") {
-        strings = this._collection$_strings;
-        if (strings == null)
-          return false;
-        return strings[object] != null;
-      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
-        nums = this._collection$_nums;
-        if (nums == null)
-          return false;
-        return nums[object] != null;
-      } else
-        return this._contains$1(object);
-    },
-    _contains$1: function(object) {
-      var rest = this._collection$_rest;
-      if (rest == null)
-        return false;
-      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
-    },
-    lookup$1: function(object) {
-      var t1;
-      if (!(typeof object === "string" && object !== "__proto__"))
-        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
-      else
-        t1 = true;
-      if (t1)
-        return this.contains$1(0, object) ? object : null;
-      else
-        return this._lookup$1(object);
-    },
-    _lookup$1: function(object) {
-      var rest, bucket, index;
-      rest = this._collection$_rest;
-      if (rest == null)
-        return;
-      bucket = rest[this._computeHashCode$1(object)];
-      index = this._findBucketIndex$2(bucket, object);
-      if (index < 0)
-        return;
-      return J.$index$as(bucket, index).get$_element();
-    },
-    forEach$1: function(_, action) {
-      var cell, modifications;
-      cell = this._collection$_first;
-      modifications = this._collection$_modifications;
-      for (; cell != null;) {
-        action.call$1(cell._element);
-        if (modifications !== this._collection$_modifications)
-          throw H.wrapException(new P.ConcurrentModificationError(this));
-        cell = cell._next;
-      }
-    },
-    add$1: function(_, element) {
-      var strings, nums;
-      if (typeof element === "string" && element !== "__proto__") {
-        strings = this._collection$_strings;
-        if (strings == null) {
-          strings = P._LinkedHashSet__newHashTable();
-          this._collection$_strings = strings;
-        }
-        return this._addHashTableEntry$2(strings, element);
-      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
-        nums = this._collection$_nums;
-        if (nums == null) {
-          nums = P._LinkedHashSet__newHashTable();
-          this._collection$_nums = nums;
-        }
-        return this._addHashTableEntry$2(nums, element);
-      } else
-        return this._add$1(element);
-    },
-    _add$1: function(element) {
-      var rest, hash, bucket;
-      rest = this._collection$_rest;
-      if (rest == null) {
-        rest = P._LinkedHashSet__newHashTable();
-        this._collection$_rest = rest;
-      }
-      hash = this._computeHashCode$1(element);
-      bucket = rest[hash];
-      if (bucket == null)
-        rest[hash] = [this._newLinkedCell$1(element)];
-      else {
-        if (this._findBucketIndex$2(bucket, element) >= 0)
-          return false;
-        bucket.push(this._newLinkedCell$1(element));
-      }
-      return true;
-    },
-    remove$1: function(_, object) {
-      if (typeof object === "string" && object !== "__proto__")
-        return this._collection$_removeHashTableEntry$2(this._collection$_strings, object);
-      else if (typeof object === "number" && (object & 0x3ffffff) === object)
-        return this._collection$_removeHashTableEntry$2(this._collection$_nums, object);
-      else
-        return this._remove$1(object);
-    },
-    _remove$1: function(object) {
-      var rest, bucket, index;
-      rest = this._collection$_rest;
-      if (rest == null)
-        return false;
-      bucket = rest[this._computeHashCode$1(object)];
-      index = this._findBucketIndex$2(bucket, object);
-      if (index < 0)
-        return false;
-      this._collection$_unlinkCell$1(bucket.splice(index, 1)[0]);
-      return true;
-    },
-    clear$0: function(_) {
-      if (this._collection$_length > 0) {
-        this._collection$_last = null;
-        this._collection$_first = null;
-        this._collection$_rest = null;
-        this._collection$_nums = null;
-        this._collection$_strings = null;
-        this._collection$_length = 0;
-        this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
-      }
-    },
-    _addHashTableEntry$2: function(table, element) {
-      if (table[element] != null)
-        return false;
-      table[element] = this._newLinkedCell$1(element);
-      return true;
-    },
-    _collection$_removeHashTableEntry$2: function(table, element) {
-      var cell;
-      if (table == null)
-        return false;
-      cell = table[element];
-      if (cell == null)
-        return false;
-      this._collection$_unlinkCell$1(cell);
-      delete table[element];
-      return true;
-    },
-    _newLinkedCell$1: function(element) {
-      var cell, last;
-      cell = new P.LinkedHashSetCell(element, null, null);
-      if (this._collection$_first == null) {
-        this._collection$_last = cell;
-        this._collection$_first = cell;
-      } else {
-        last = this._collection$_last;
-        cell._previous = last;
-        last._next = cell;
-        this._collection$_last = cell;
-      }
-      ++this._collection$_length;
-      this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
-      return cell;
-    },
-    _collection$_unlinkCell$1: function(cell) {
-      var previous, next;
-      previous = cell.get$_previous();
-      next = cell._next;
-      if (previous == null)
-        this._collection$_first = next;
-      else
-        previous._next = next;
-      if (next == null)
-        this._collection$_last = previous;
-      else
-        next._previous = previous;
-      --this._collection$_length;
-      this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
-    },
-    _computeHashCode$1: function(element) {
-      return J.get$hashCode$(element) & 0x3ffffff;
-    },
-    _findBucketIndex$2: function(bucket, element) {
-      var $length, i;
-      if (bucket == null)
-        return -1;
-      $length = bucket.length;
-      for (i = 0; i < $length; ++i)
-        if (J.$eq(bucket[i].get$_element(), element))
-          return i;
-      return -1;
-    },
-    $isEfficientLengthIterable: 1,
-    static: {_LinkedHashSet__newHashTable: function() {
-        var table = Object.create(null);
-        table["<non-identifier-key>"] = table;
-        delete table["<non-identifier-key>"];
-        return table;
-      }}
-  },
-  LinkedHashSetCell: {
-    "^": "Object;_element<,_next,_previous<"
-  },
-  LinkedHashSetIterator: {
-    "^": "Object;_set,_collection$_modifications,_cell,_collection$_current",
-    get$current: function() {
-      return this._collection$_current;
-    },
-    moveNext$0: function() {
-      var t1 = this._set;
-      if (this._collection$_modifications !== t1._collection$_modifications)
-        throw H.wrapException(new P.ConcurrentModificationError(t1));
-      else {
-        t1 = this._cell;
-        if (t1 == null) {
-          this._collection$_current = null;
-          return false;
-        } else {
-          this._collection$_current = t1._element;
-          this._cell = t1._next;
-          return true;
-        }
-      }
-    }
-  },
-  _HashSetBase: {
-    "^": "SetBase;"
-  },
-  Maps_mapToString_closure: {
-    "^": "Closure:8;_collection$_box_0,_captured_result_1",
-    call$2: function(k, v) {
-      var t1, t2;
-      t1 = this._collection$_box_0;
-      if (!t1._captured_first_0)
-        this._captured_result_1._contents += ", ";
-      t1._captured_first_0 = false;
-      t1 = this._captured_result_1;
-      t2 = t1._contents += H.S(k);
-      t1._contents = t2 + ": ";
-      t1._contents += H.S(v);
-    }
-  },
-  ListQueue: {
-    "^": "Iterable;_table,_head,_tail,_modificationCount",
-    get$iterator: function(_) {
-      return new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
-    },
-    forEach$1: function(_, action) {
-      var modificationCount, i, t1;
-      modificationCount = this._modificationCount;
-      for (i = this._head; i !== this._tail; i = (i + 1 & this._table.length - 1) >>> 0) {
-        t1 = this._table;
-        if (i < 0 || i >= t1.length)
-          return H.ioore(t1, i);
-        action.call$1(t1[i]);
-        if (modificationCount !== this._modificationCount)
-          H.throwExpression(new P.ConcurrentModificationError(this));
-      }
-    },
-    get$isEmpty: function(_) {
-      return this._head === this._tail;
-    },
-    get$length: function(_) {
-      return (this._tail - this._head & this._table.length - 1) >>> 0;
-    },
-    clear$0: function(_) {
-      var i, t1, t2, t3, t4;
-      i = this._head;
-      t1 = this._tail;
-      if (i !== t1) {
-        for (t2 = this._table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
-          if (i < 0 || i >= t3)
-            return H.ioore(t2, i);
-          t2[i] = null;
-        }
-        this._tail = 0;
-        this._head = 0;
-        ++this._modificationCount;
-      }
-    },
-    toString$0: function(_) {
-      return P.IterableBase_iterableToFullString(this, "{", "}");
-    },
-    removeFirst$0: function() {
-      var t1, t2, t3, result;
-      t1 = this._head;
-      if (t1 === this._tail)
-        throw H.wrapException(H.IterableElementError_noElement());
-      ++this._modificationCount;
-      t2 = this._table;
-      t3 = t2.length;
-      if (t1 >= t3)
-        return H.ioore(t2, t1);
-      result = t2[t1];
-      t2[t1] = null;
-      this._head = (t1 + 1 & t3 - 1) >>> 0;
-      return result;
-    },
-    _add$1: function(element) {
-      var t1, t2, t3;
-      t1 = this._table;
-      t2 = this._tail;
-      t3 = t1.length;
-      if (t2 >= t3)
-        return H.ioore(t1, t2);
-      t1[t2] = element;
-      t3 = (t2 + 1 & t3 - 1) >>> 0;
-      this._tail = t3;
-      if (this._head === t3)
-        this._grow$0();
-      ++this._modificationCount;
-    },
-    _grow$0: function() {
-      var t1, newTable, t2, split;
-      t1 = Array(this._table.length * 2);
-      t1.fixed$length = Array;
-      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
-      t1 = this._table;
-      t2 = this._head;
-      split = t1.length - t2;
-      C.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
-      C.JSArray_methods.setRange$4(newTable, split, split + this._head, this._table, 0);
-      this._head = 0;
-      this._tail = this._table.length;
-      this._table = newTable;
-    },
-    ListQueue$1: function(initialCapacity, $E) {
-      var t1 = Array(8);
-      t1.fixed$length = Array;
-      this._table = H.setRuntimeTypeInfo(t1, [$E]);
-    },
-    $isEfficientLengthIterable: 1,
-    static: {ListQueue$: function(initialCapacity, $E) {
-        var t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [$E]);
-        t1.ListQueue$1(initialCapacity, $E);
-        return t1;
-      }}
-  },
-  _ListQueueIterator: {
-    "^": "Object;_queue,_end,_modificationCount,_position,_collection$_current",
-    get$current: function() {
-      return this._collection$_current;
-    },
-    moveNext$0: function() {
-      var t1, t2, t3;
-      t1 = this._queue;
-      if (this._modificationCount !== t1._modificationCount)
-        H.throwExpression(new P.ConcurrentModificationError(t1));
-      t2 = this._position;
-      if (t2 === this._end) {
-        this._collection$_current = null;
-        return false;
-      }
-      t1 = t1._table;
-      t3 = t1.length;
-      if (t2 >= t3)
-        return H.ioore(t1, t2);
-      this._collection$_current = t1[t2];
-      this._position = (t2 + 1 & t3 - 1) >>> 0;
-      return true;
-    }
-  },
-  SetMixin: {
-    "^": "Object;",
-    map$1: function(_, f) {
-      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
-    },
-    toString$0: function(_) {
-      return P.IterableBase_iterableToFullString(this, "{", "}");
-    },
-    forEach$1: function(_, f) {
-      var t1;
-      for (t1 = this.get$iterator(this); t1.moveNext$0();)
-        f.call$1(t1._collection$_current);
-    },
-    $isEfficientLengthIterable: 1
-  },
-  SetBase: {
-    "^": "SetMixin;"
-  }
-}], ["dart.core", "dart:core",, P, {
-  "^": "",
-  _symbolToString: function(symbol) {
-    return H.Symbol_getName(symbol);
-  },
-  Error_safeToString: function(object) {
-    if (typeof object === "number" || typeof object === "boolean" || null == object)
-      return J.toString$0(object);
-    if (typeof object === "string")
-      return JSON.stringify(object);
-    return P.Error__objectToString(object);
-  },
-  Error__objectToString: function(object) {
-    var t1 = J.getInterceptor(object);
-    if (!!t1.$isClosure)
-      return t1.toString$0(object);
-    return H.Primitives_objectToString(object);
-  },
-  Exception_Exception: function(message) {
-    return new P._ExceptionImplementation(message);
-  },
-  identical: [function(a, b) {
-    return a == null ? b == null : a === b;
-  }, "call$2", "identical$closure", 4, 0, 14],
-  identityHashCode: [function(object) {
-    return H.objectHashCode(object);
-  }, "call$1", "identityHashCode$closure", 2, 0, 15],
-  List_List$from: function(elements, growable, $E) {
-    var list, t1;
-    list = H.setRuntimeTypeInfo([], [$E]);
-    for (t1 = J.get$iterator$a(elements); t1.moveNext$0();)
-      list.push(t1.get$current());
-    if (growable)
-      return list;
-    list.fixed$length = Array;
-    return list;
-  },
-  print: function(object) {
-    var line = H.S(object);
-    H.printString(line);
-  },
-  NoSuchMethodError_toString_closure: {
-    "^": "Closure:9;_core$_box_0,_captured_sb_1",
-    call$2: function(key, value) {
-      this._captured_sb_1._contents += this._core$_box_0._captured_comma_0;
-      P._symbolToString(key);
-    }
-  },
-  bool: {
-    "^": "Object;"
-  },
-  "+bool": 0,
-  $double: {
-    "^": "num;"
-  },
-  "+double": 0,
-  Duration: {
-    "^": "Object;_duration",
-    $add: function(_, other) {
-      return new P.Duration(C.JSInt_methods.$add(this._duration, other.get$_duration()));
-    },
-    $lt: function(_, other) {
-      return C.JSInt_methods.$lt(this._duration, other.get$_duration());
-    },
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      if (!(other instanceof P.Duration))
-        return false;
-      return this._duration === other._duration;
-    },
-    get$hashCode: function(_) {
-      return this._duration & 0x1FFFFFFF;
-    },
-    toString$0: function(_) {
-      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
-      t1 = new P.Duration_toString_twoDigits();
-      t2 = this._duration;
-      if (t2 < 0)
-        return "-" + new P.Duration(-t2).toString$0(0);
-      twoDigitMinutes = t1.call$1(C.JSInt_methods.remainder$1(C.JSInt_methods._tdivFast$1(t2, 60000000), 60));
-      twoDigitSeconds = t1.call$1(C.JSInt_methods.remainder$1(C.JSInt_methods._tdivFast$1(t2, 1000000), 60));
-      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSInt_methods.remainder$1(t2, 1000000));
-      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
-    }
-  },
-  Duration_toString_sixDigits: {
-    "^": "Closure:10;",
-    call$1: function(n) {
-      if (n >= 100000)
-        return "" + n;
-      if (n >= 10000)
-        return "0" + n;
-      if (n >= 1000)
-        return "00" + n;
-      if (n >= 100)
-        return "000" + n;
-      if (n >= 10)
-        return "0000" + n;
-      return "00000" + n;
-    }
-  },
-  Duration_toString_twoDigits: {
-    "^": "Closure:10;",
-    call$1: function(n) {
-      if (n >= 10)
-        return "" + n;
-      return "0" + n;
-    }
-  },
-  Error: {
-    "^": "Object;",
-    get$stackTrace: function() {
-      return H.getTraceFromException(this.$thrownJsError);
-    }
-  },
-  NullThrownError: {
-    "^": "Error;",
-    toString$0: function(_) {
-      return "Throw of null.";
-    }
-  },
-  ArgumentError: {
-    "^": "Error;_hasValue,invalidValue,name,message",
-    get$_errorName: function() {
-      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
-    },
-    get$_errorExplanation: function() {
-      return "";
-    },
-    toString$0: function(_) {
-      var t1, nameString, message, prefix, explanation, errorValue;
-      t1 = this.name;
-      nameString = t1 != null ? " (" + H.S(t1) + ")" : "";
-      t1 = this.message;
-      message = t1 == null ? "" : ": " + H.S(t1);
-      prefix = this.get$_errorName() + nameString + message;
-      if (!this._hasValue)
-        return prefix;
-      explanation = this.get$_errorExplanation();
-      errorValue = P.Error_safeToString(this.invalidValue);
-      return prefix + explanation + ": " + H.S(errorValue);
-    },
-    static: {ArgumentError$: function(message) {
-        return new P.ArgumentError(false, null, null, message);
-      }}
-  },
-  RangeError: {
-    "^": "ArgumentError;start,end,_hasValue,invalidValue,name,message",
-    get$_errorName: function() {
-      return "RangeError";
-    },
-    get$_errorExplanation: function() {
-      var t1, explanation, t2;
-      t1 = this.start;
-      if (t1 == null) {
-        t1 = this.end;
-        explanation = t1 != null ? ": Not less than or equal to " + H.S(t1) : "";
-      } else {
-        t2 = this.end;
-        if (t2 == null)
-          explanation = ": Not greater than or equal to " + H.S(t1);
-        else {
-          if (typeof t2 !== "number")
-            return t2.$gt();
-          if (typeof t1 !== "number")
-            return H.iae(t1);
-          if (t2 > t1)
-            explanation = ": Not in range " + t1 + ".." + t2 + ", inclusive";
-          else
-            explanation = t2 < t1 ? ": Valid value range is empty" : ": Only valid value is " + t1;
-        }
-      }
-      return explanation;
-    },
-    static: {RangeError$value: function(value, $name, message) {
-        return new P.RangeError(null, null, true, value, $name, "Value not in range");
-      }, RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
-        return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
-      }, RangeError_checkValidRange: function(start, end, $length, startName, endName, message) {
-        if (0 > start || start > $length)
-          throw H.wrapException(P.RangeError$range(start, 0, $length, "start", message));
-        if (start > end || end > $length)
-          throw H.wrapException(P.RangeError$range(end, start, $length, "end", message));
-        return end;
-      }}
-  },
-  IndexError: {
-    "^": "ArgumentError;indexable,length>,_hasValue,invalidValue,name,message",
-    get$_errorName: function() {
-      return "RangeError";
-    },
-    get$_errorExplanation: function() {
-      P.Error_safeToString(this.indexable);
-      var explanation = ": index should be less than " + H.S(this.length);
-      return J.$lt$n(this.invalidValue, 0) ? ": index must not be negative" : explanation;
-    },
-    static: {IndexError$: function(invalidValue, indexable, $name, message, $length) {
-        var t1 = $length != null ? $length : J.get$length$as(indexable);
-        return new P.IndexError(indexable, t1, true, invalidValue, $name, "Index out of range");
-      }}
-  },
-  UnsupportedError: {
-    "^": "Error;message",
-    toString$0: function(_) {
-      return "Unsupported operation: " + this.message;
-    }
-  },
-  StateError: {
-    "^": "Error;message",
-    toString$0: function(_) {
-      return "Bad state: " + this.message;
-    }
-  },
-  ConcurrentModificationError: {
-    "^": "Error;modifiedObject",
-    toString$0: function(_) {
-      var t1 = this.modifiedObject;
-      if (t1 == null)
-        return "Concurrent modification during iteration.";
-      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
-    }
-  },
-  StackOverflowError: {
-    "^": "Object;",
-    toString$0: function(_) {
-      return "Stack Overflow";
-    },
-    get$stackTrace: function() {
-      return;
-    },
-    $isError: 1
-  },
-  CyclicInitializationError: {
-    "^": "Error;variableName",
-    toString$0: function(_) {
-      return "Reading static variable '" + this.variableName + "' during its initialization";
-    }
-  },
-  _ExceptionImplementation: {
-    "^": "Object;message",
-    toString$0: function(_) {
-      var t1 = this.message;
-      if (t1 == null)
-        return "Exception";
-      return "Exception: " + H.S(t1);
-    }
-  },
-  Expando: {
-    "^": "Object;name",
-    toString$0: function(_) {
-      return "Expando:" + H.S(this.name);
-    },
-    $index: function(_, object) {
-      var values = H.Primitives_getProperty(object, "expando$values");
-      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
-    },
-    $indexSet: function(_, object, value) {
-      var values = H.Primitives_getProperty(object, "expando$values");
-      if (values == null) {
-        values = new P.Object();
-        H.Primitives_setProperty(object, "expando$values", values);
-      }
-      H.Primitives_setProperty(values, this._getKey$0(), value);
-    },
-    _getKey$0: function() {
-      var key, t1;
-      key = H.Primitives_getProperty(this, "expando$key");
-      if (key == null) {
-        t1 = $.Expando__keyCount;
-        $.Expando__keyCount = t1 + 1;
-        key = "expando$key$" + t1;
-        H.Primitives_setProperty(this, "expando$key", key);
-      }
-      return key;
-    }
-  },
-  $int: {
-    "^": "num;"
-  },
-  "+int": 0,
-  Iterable: {
-    "^": "Object;",
-    map$1: function(_, f) {
-      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "Iterable", 0), null);
-    },
-    forEach$1: function(_, f) {
-      var t1;
-      for (t1 = this.get$iterator(this); t1.moveNext$0();)
-        f.call$1(t1.get$current());
-    },
-    toList$1$growable: function(_, growable) {
-      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "Iterable", 0));
-    },
-    toList$0: function($receiver) {
-      return this.toList$1$growable($receiver, true);
-    },
-    get$length: function(_) {
-      var it, count;
-      it = this.get$iterator(this);
-      for (count = 0; it.moveNext$0();)
-        ++count;
-      return count;
-    },
-    elementAt$1: function(_, index) {
-      var t1, elementIndex, element;
-      if (index < 0)
-        H.throwExpression(P.RangeError$range(index, 0, null, "index", null));
-      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
-        element = t1.get$current();
-        if (index === elementIndex)
-          return element;
-        ++elementIndex;
-      }
-      throw H.wrapException(P.IndexError$(index, this, "index", null, elementIndex));
-    },
-    toString$0: function(_) {
-      return P.IterableBase_iterableToShortString(this, "(", ")");
-    }
-  },
-  Iterator: {
-    "^": "Object;"
-  },
-  List: {
-    "^": "Object;",
-    $isEfficientLengthIterable: 1
-  },
-  "+List": 0,
-  Null: {
-    "^": "Object;",
-    toString$0: function(_) {
-      return "null";
-    }
-  },
-  "+Null": 0,
-  num: {
-    "^": "Object;"
-  },
-  "+num": 0,
-  Object: {
-    "^": ";",
-    $eq: function(_, other) {
-      return this === other;
-    },
-    get$hashCode: function(_) {
-      return H.Primitives_objectHashCode(this);
-    },
-    toString$0: function(_) {
-      return H.Primitives_objectToString(this);
-    }
-  },
-  StackTrace: {
-    "^": "Object;"
-  },
-  String: {
-    "^": "Object;"
-  },
-  "+String": 0,
-  StringBuffer: {
-    "^": "Object;_contents<",
-    get$length: function(_) {
-      return this._contents.length;
-    },
-    toString$0: function(_) {
-      var t1 = this._contents;
-      return t1.charCodeAt(0) == 0 ? t1 : t1;
-    },
-    static: {StringBuffer__writeAll: function(string, objects, separator) {
-        var iterator = J.get$iterator$a(objects);
-        if (!iterator.moveNext$0())
-          return string;
-        if (separator.length === 0) {
-          do
-            string += H.S(iterator.get$current());
-          while (iterator.moveNext$0());
-        } else {
-          string += H.S(iterator.get$current());
-          for (; iterator.moveNext$0();)
-            string = string + separator + H.S(iterator.get$current());
-        }
-        return string;
-      }}
-  },
-  Symbol: {
-    "^": "Object;"
-  }
-}], ["dart.isolate", "dart:isolate",, P, {
-  "^": "",
-  Capability: {
-    "^": "Object;"
-  }
-}], ["dart2js._js_primitives", "dart:_js_primitives",, H, {
-  "^": "",
-  printString: function(string) {
-    if (typeof dartPrint == "function") {
-      dartPrint(string);
-      return;
-    }
-    if (typeof console == "object" && typeof console.log != "undefined") {
-      console.log(string);
-      return;
-    }
-    if (typeof window == "object")
-      return;
-    if (typeof print == "function") {
-      print(string);
-      return;
-    }
-    throw "Unable to print message: " + String(string);
-  }
-}], ["", "test.dart",, V, {
-  "^": "",
-  main: [function() {
-    var $goto = 0, completer = new P.Completer_Completer(), $returnValue, handler = 2, currentError;
-    function main(errorCode, result) {
-      if (errorCode === 1) {
-        currentError = result;
-        $goto = handler;
-      }
-      while (true)
-        switch ($goto) {
-          case 0:
-            // Function start
-            // goto return
-            $goto = 1;
-            break;
-          case 1:
-            // return
-            return H.asyncHelper($returnValue, 0, completer, null);
-          case 2:
-            // rethrow
-            return H.asyncHelper(currentError, 1, completer);
-        }
-    }
-    return H.asyncHelper(null, main, completer, null);
-  }, "call$0", "main$closure", 0, 0, 16]
-}, 1]];
-setupProgram(dart, 0);
-// getInterceptor methods
-J.getInterceptor = function(receiver) {
-  if (typeof receiver == "number") {
-    if (Math.floor(receiver) == receiver)
-      return J.JSInt.prototype;
-    return J.JSDouble.prototype;
-  }
-  if (typeof receiver == "string")
-    return J.JSString.prototype;
-  if (receiver == null)
-    return J.JSNull.prototype;
-  if (typeof receiver == "boolean")
-    return J.JSBool.prototype;
-  if (receiver.constructor == Array)
-    return J.JSArray.prototype;
-  if (!(receiver instanceof P.Object))
-    return J.UnknownJavaScriptObject.prototype;
-  return receiver;
-};
-J.getInterceptor$a = function(receiver) {
-  if (receiver == null)
-    return receiver;
-  if (receiver.constructor == Array)
-    return J.JSArray.prototype;
-  if (!(receiver instanceof P.Object))
-    return J.UnknownJavaScriptObject.prototype;
-  return receiver;
-};
-J.getInterceptor$as = function(receiver) {
-  if (typeof receiver == "string")
-    return J.JSString.prototype;
-  if (receiver == null)
-    return receiver;
-  if (receiver.constructor == Array)
-    return J.JSArray.prototype;
-  if (!(receiver instanceof P.Object))
-    return J.UnknownJavaScriptObject.prototype;
-  return receiver;
-};
-J.getInterceptor$n = function(receiver) {
-  if (typeof receiver == "number")
-    return J.JSNumber.prototype;
-  if (receiver == null)
-    return receiver;
-  if (!(receiver instanceof P.Object))
-    return J.UnknownJavaScriptObject.prototype;
-  return receiver;
-};
-J.getInterceptor$ns = function(receiver) {
-  if (typeof receiver == "number")
-    return J.JSNumber.prototype;
-  if (typeof receiver == "string")
-    return J.JSString.prototype;
-  if (receiver == null)
-    return receiver;
-  if (!(receiver instanceof P.Object))
-    return J.UnknownJavaScriptObject.prototype;
-  return receiver;
-};
-J.$add$ns = function(receiver, a0) {
-  if (typeof receiver == "number" && typeof a0 == "number")
-    return receiver + a0;
-  return J.getInterceptor$ns(receiver).$add(receiver, a0);
-};
-J.$eq = function(receiver, a0) {
-  if (receiver == null)
-    return a0 == null;
-  if (typeof receiver != "object")
-    return a0 != null && receiver === a0;
-  return J.getInterceptor(receiver).$eq(receiver, a0);
-};
-J.$index$as = function(receiver, a0) {
-  if (receiver.constructor == Array || typeof receiver == "string")
-    if (a0 >>> 0 === a0 && a0 < receiver.length)
-      return receiver[a0];
-  return J.getInterceptor$as(receiver).$index(receiver, a0);
-};
-J.$lt$n = function(receiver, a0) {
-  if (typeof receiver == "number" && typeof a0 == "number")
-    return receiver < a0;
-  return J.getInterceptor$n(receiver).$lt(receiver, a0);
-};
-J.elementAt$1$a = function(receiver, a0) {
-  return J.getInterceptor$a(receiver).elementAt$1(receiver, a0);
-};
-J.forEach$1$a = function(receiver, a0) {
-  return J.getInterceptor$a(receiver).forEach$1(receiver, a0);
-};
-J.get$hashCode$ = function(receiver) {
-  return J.getInterceptor(receiver).get$hashCode(receiver);
-};
-J.get$iterator$a = function(receiver) {
-  return J.getInterceptor$a(receiver).get$iterator(receiver);
-};
-J.get$length$as = function(receiver) {
-  return J.getInterceptor$as(receiver).get$length(receiver);
-};
-J.map$1$a = function(receiver, a0) {
-  return J.getInterceptor$a(receiver).map$1(receiver, a0);
-};
-J.toString$0 = function(receiver) {
-  return J.getInterceptor(receiver).toString$0(receiver);
-};
-C.JSArray_methods = J.JSArray.prototype;
-C.JSInt_methods = J.JSInt.prototype;
-C.JSString_methods = J.JSString.prototype;
-C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
-C.C__RootZone = new P._RootZone();
-C.Duration_0 = new P.Duration(0);
-C.JS_CONST_8ZY = function getTagFallback(o) {
-  var constructor = o.constructor;
-  if (typeof constructor == "function") {
-    var name = constructor.name;
-    if (typeof name == "string" &&
-        name.length > 2 &&
-        name !== "Object" &&
-        name !== "Function.prototype") {
-      return name;
-    }
-  }
-  var s = Object.prototype.toString.call(o);
-  return s.substring(8, s.length - 1);
-};
-{
-  init.isHunkLoaded = function(hunkHash) {
-    return !!$dart_deferred_initializers[hunkHash];
-  };
-  init.deferredInitialized = new Object(null);
-  init.isHunkInitialized = function(hunkHash) {
-    return init.deferredInitialized[hunkHash];
-  };
-  init.initializeLoadedHunk = function(hunkHash) {
-    $dart_deferred_initializers[hunkHash](globalsHolder, $);
-    init.deferredInitialized[hunkHash] = true;
-  };
-}
-init.deferredLibraryUris = {};
-init.deferredLibraryHashes = {};
-$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
-$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
-$.Closure_functionCounter = 0;
-$.BoundClosure_selfFieldNameCache = null;
-$.BoundClosure_receiverFieldNameCache = null;
-$._nextCallback = null;
-$._lastCallback = null;
-$._lastPriorityCallback = null;
-$._isInCallbackLoop = false;
-$.Zone__current = C.C__RootZone;
-$.Expando__keyCount = 0;
-(function(lazies) {
-  var descriptorLength = 4;
-  for (var i = 0; i < lazies.length; i += descriptorLength) {
-    var fieldName = lazies[i];
-    var getterName = lazies[i + 1];
-    var lazyValue = lazies[i + 2];
-    var staticName = lazies[i + 3];
-    Isolate.$lazy(fieldName, getterName, lazyValue, staticName);
-  }
-})(["IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
-  return H.IsolateNatives_computeThisScript();
-}, "thisScript", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
-  return new P.Expando(null);
-}, "workerIds", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
-      return "$receiver$";
-    }}));
-}, "noSuchMethodPattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
-      return "$receiver$";
-    }}));
-}, "notClosurePattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
-}, "nullCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(function() {
-    var $argumentsExpr$ = '$arguments$';
-    try {
-      null.$method$($argumentsExpr$);
-    } catch (e) {
-      return e.message;
-    }
-  }());
-}, "nullLiteralCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
-}, "undefinedCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(function() {
-    var $argumentsExpr$ = '$arguments$';
-    try {
-      (void 0).$method$($argumentsExpr$);
-    } catch (e) {
-      return e.message;
-    }
-  }());
-}, "undefinedLiteralCallPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
-}, "nullPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(function() {
-    try {
-      null.$method$;
-    } catch (e) {
-      return e.message;
-    }
-  }());
-}, "nullLiteralPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
-}, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
-  return H.TypeErrorDecoder_extractPattern(function() {
-    try {
-      (void 0).$method$;
-    } catch (e) {
-      return e.message;
-    }
-  }());
-}, "undefinedLiteralPropertyPattern", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
-  return P._AsyncRun__initializeScheduleImmediate();
-}, "scheduleImmediateClosure", "_toStringVisiting", "get$_toStringVisiting", function() {
-  return [];
-}, "_toStringVisiting"]);
-;
-
-{
-  init.metadata = [null];
-  init.types = [{func: 1}, {func: 1, void: true}, {func: 1, args: [,]}, {func: 1, args: [, P.StackTrace]}, {func: 1, args: [{func: 1, void: true}]}, {func: 1, args: [,], opt: [,]}, {func: 1, ret: P.bool}, {func: 1, void: true, args: [P.Object], opt: [P.StackTrace]}, {func: 1, args: [,,]}, {func: 1, args: [P.Symbol,,]}, {func: 1, ret: P.String, args: [P.$int]}, {func: 1, void: true, args: [{func: 1, void: true}]}, {func: 1, ret: P.bool, args: [,,]}, {func: 1, ret: P.$int, args: [,]}, {func: 1, ret: P.bool, args: [P.Object, P.Object]}, {func: 1, ret: P.$int, args: [P.Object]}, {func: 1, ret: P.Future}];
-}
-
-$ = null;
-Isolate = Isolate.$finishIsolateConstructor(Isolate);
-$ = new Isolate();
-function convertToFastObject(properties) {
-  function MyClass() {
-  }
-  MyClass.prototype = properties;
-  new MyClass();
-  return properties;
-}
-;
-function convertToSlowObject(properties) {
-  properties.__MAGIC_SLOW_PROPERTY = 1;
-  delete properties.__MAGIC_SLOW_PROPERTY;
-  return properties;
-}
-;
-A = convertToFastObject(A);
-B = convertToFastObject(B);
-C = convertToFastObject(C);
-D = convertToFastObject(D);
-E = convertToFastObject(E);
-F = convertToFastObject(F);
-G = convertToFastObject(G);
-H = convertToFastObject(H);
-J = convertToFastObject(J);
-K = convertToFastObject(K);
-L = convertToFastObject(L);
-M = convertToFastObject(M);
-N = convertToFastObject(N);
-O = convertToFastObject(O);
-P = convertToFastObject(P);
-Q = convertToFastObject(Q);
-R = convertToFastObject(R);
-S = convertToFastObject(S);
-T = convertToFastObject(T);
-U = convertToFastObject(U);
-V = convertToFastObject(V);
-W = convertToFastObject(W);
-X = convertToFastObject(X);
-Y = convertToFastObject(Y);
-Z = convertToFastObject(Z);
-function init() {
-  Isolate.$isolateProperties = Object.create(null);
-  init.allClasses = Object.create(null);
-  init.getTypeFromName = function(name) {
-    return init.allClasses[name];
-  };
-  init.interceptorsByTag = Object.create(null);
-  init.leafTags = Object.create(null);
-  init.finishedClasses = Object.create(null);
-  Isolate.$lazy = function(fieldName, getterName, lazyValue, staticName, prototype) {
-    if (!init.lazies)
-      init.lazies = Object.create(null);
-    init.lazies[fieldName] = getterName;
-    prototype = prototype || Isolate.$isolateProperties;
-    var sentinelUndefined = {};
-    var sentinelInProgress = {};
-    prototype[fieldName] = sentinelUndefined;
-    prototype[getterName] = function() {
-      var result = this[fieldName];
-      try {
-        if (result === sentinelUndefined) {
-          this[fieldName] = sentinelInProgress;
-          try {
-            result = this[fieldName] = lazyValue();
-          } finally {
-            if (result === sentinelUndefined)
-              this[fieldName] = null;
-          }
-        } else
-          if (result === sentinelInProgress)
-            H.throwCyclicInit(staticName || fieldName);
-        return result;
-      } finally {
-        this[getterName] = function() {
-          return this[fieldName];
-        };
-      }
-    };
-  };
-  Isolate.$finishIsolateConstructor = function(oldIsolate) {
-    var isolateProperties = oldIsolate.$isolateProperties;
-    function Isolate() {
-      var staticNames = Object.keys(isolateProperties);
-      for (var i = 0; i < staticNames.length; i++) {
-        var staticName = staticNames[i];
-        this[staticName] = isolateProperties[staticName];
-      }
-      var lazies = init.lazies;
-      var lazyInitializers = lazies ? Object.keys(lazies) : [];
-      for (var i = 0; i < lazyInitializers.length; i++)
-        this[lazies[lazyInitializers[i]]] = null;
-      function ForceEfficientMap() {
-      }
-      ForceEfficientMap.prototype = this;
-      new ForceEfficientMap();
-      for (var i = 0; i < lazyInitializers.length; i++) {
-        var lazyInitName = lazies[lazyInitializers[i]];
-        this[lazyInitName] = isolateProperties[lazyInitName];
-      }
-    }
-    Isolate.prototype = oldIsolate.prototype;
-    Isolate.prototype.constructor = Isolate;
-    Isolate.$isolateProperties = isolateProperties;
-    return Isolate;
-  };
-}
-;// BEGIN invoke [main].
-(function(callback) {
-  if (typeof document === "undefined") {
-    callback(null);
-    return;
-  }
-  if (document.currentScript) {
-    callback(document.currentScript);
-    return;
-  }
-  var scripts = document.scripts;
-  function onLoad(event) {
-    for (var i = 0; i < scripts.length; ++i)
-      scripts[i].removeEventListener("load", onLoad, false);
-    callback(event.target);
-  }
-  for (var i = 0; i < scripts.length; ++i)
-    scripts[i].addEventListener("load", onLoad, false);
-})(function(currentScript) {
-  init.currentScript = currentScript;
-  if (typeof dartMainRunner === "function")
-    dartMainRunner(function(a) {
-      H.startRootIsolate(V.main$closure(), a);
-    }, []);
-  else
-    (function(a) {
-      H.startRootIsolate(V.main$closure(), a);
-    })([]);
-});
-;
-// END invoke [main].
-})()
-
-//# sourceMappingURL=out.js.map
diff --git a/packages/unittest/pubspec.yaml b/packages/unittest/pubspec.yaml
index 0f971d2..bc94363 100644
--- a/packages/unittest/pubspec.yaml
+++ b/packages/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.11.6+1
+version: 0.11.7
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://github.com/dart-lang/old_unittest
diff --git a/packages/unittest/test.dart b/packages/unittest/test.dart
deleted file mode 100644
index f1bc9a8..0000000
--- a/packages/unittest/test.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-import 'dart:async';
-
-main() async {
-  try {
-    try {
-      await new Future.error('error');
-    } catch (error) {
-      print("caught once");
-      throw 'error';
-    }
-  } catch (error) {
-    print("caught twice");
-    throw 'error';
-  }
-}
diff --git a/packages/unittest/test/expect_async_args_test.dart b/packages/unittest/test/expect_async_args_test.dart
index 8e814dc..682852a 100644
--- a/packages/unittest/test/expect_async_args_test.dart
+++ b/packages/unittest/test/expect_async_args_test.dart
@@ -17,7 +17,7 @@
     var count = 0;
     List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
       count++;
-      return [a, b, c, d, e, f];
+      return <int>[a, b, c, d, e, f];
     }
 
     test('expect async args', () {
diff --git a/packages/unittest/test/pretty_print_test.dart b/packages/unittest/test/pretty_print_test.dart
index 6717a56..682547d 100644
--- a/packages/unittest/test/pretty_print_test.dart
+++ b/packages/unittest/test/pretty_print_test.dart
@@ -105,7 +105,7 @@
     });
 
     test("that's recursive", () {
-      var list = [1, 2, 3];
+      var list = <Object>[1, 2, 3];
       list.add(list);
       expect(prettyPrint(list), equals("[1, 2, 3, (recursive)]"));
     });
diff --git a/packages/unittest/test/test_common.dart b/packages/unittest/test/test_common.dart
index 7d7d70b..4f9cd7c 100644
--- a/packages/unittest/test/test_common.dart
+++ b/packages/unittest/test/test_common.dart
@@ -22,7 +22,7 @@
 
   SimpleIterable(this.count);
 
-  bool contains(int val) => count < val ? false : true;
+  bool contains(Object val) => val is int && val <= count;
 
   bool any(bool f(element)) {
     for (var i = 0; i <= count; i++) {
@@ -33,7 +33,7 @@
 
   String toString() => "<[$count]>";
 
-  Iterator get iterator {
+  Iterator<int> get iterator {
     return new _SimpleIterator(count);
   }
 }
diff --git a/packages/unittest/test/test_utils.dart b/packages/unittest/test/test_utils.dart
index d0adda2..f36533b 100644
--- a/packages/unittest/test/test_utils.dart
+++ b/packages/unittest/test/test_utils.dart
@@ -41,7 +41,7 @@
   }
 
   if (isAsync) {
-    Timer.run(expectAsync(afterTest));
+    Timer.run(expectAsync0(afterTest));
   } else {
     afterTest();
   }
@@ -57,7 +57,7 @@
     expect(_errorCount, equals(0));
   }
   if (isAsync) {
-    Timer.run(expectAsync(afterTest));
+    Timer.run(expectAsync0(afterTest));
   } else {
     afterTest();
   }
diff --git a/packages/usage/.gitignore b/packages/usage/.gitignore
index f8192d2..a9df6e6 100644
--- a/packages/usage/.gitignore
+++ b/packages/usage/.gitignore
@@ -1,8 +1,6 @@
+.packages
+.idea/
+.pub/
 build/
 doc/api/
-.packages
-packages
-.buildlog
 pubspec.lock
-.settings/
-.pub/
diff --git a/packages/usage/.travis.yml b/packages/usage/.travis.yml
index 75b3aac..96ba4fc 100644
--- a/packages/usage/.travis.yml
+++ b/packages/usage/.travis.yml
@@ -1,12 +1,4 @@
 language: dart
-dart:
-  - stable
-  - dev
+dart: dev
 sudo: false
-
-# before_install:
-#   - "export CHROME_ARGS=--no-sandbox"
-#   - "export DISPLAY=:99.0"
-#   - "sh -e /etc/init.d/xvfb start"
-
 script: ./tool/travis.sh
diff --git a/packages/usage/AUTHORS b/packages/usage/AUTHORS
index 15ce90e..862ddda 100644
--- a/packages/usage/AUTHORS
+++ b/packages/usage/AUTHORS
@@ -5,3 +5,4 @@
 
 Google Inc.
 Oliver Sand <oliver.sand@tentaclelabs.com>
+Kasper Peulen <kasperpeulen@gmail.com>
diff --git a/packages/usage/analysis_options.yaml b/packages/usage/analysis_options.yaml
new file mode 100644
index 0000000..2ef22c9
--- /dev/null
+++ b/packages/usage/analysis_options.yaml
@@ -0,0 +1,8 @@
+analyzer:
+  strong-mode: true
+linter:
+  rules:
+    - annotate_overrides
+    - directives_ordering
+    - empty_constructor_bodies
+    - empty_statements
diff --git a/packages/usage/changelog.md b/packages/usage/changelog.md
index b20ef31..351cb38 100644
--- a/packages/usage/changelog.md
+++ b/packages/usage/changelog.md
@@ -1,5 +1,69 @@
 # Changelog
 
+## 3.3.0
+- added a `close()` method to the `Analytics` class
+- change our minimum SDK from `1.24.0-dev` to `1.24.0` stable
+
+## 3.2.0
+- expose the `Analytics.applicationName` and `Analytics.applicationVersion`
+  properties
+- make it easier for clients to extend the `AnalyticsIO` class
+- allow for custom parameters when sending a screenView
+
+## 3.1.1
+- make Analytics.clientId available immediately
+
+## 3.1.0
+- switch the technique we use to determine the locale to the new dart:io
+  `Platform.localeName` field
+- change our minimum SDK version to `1.24.0`
+
+## 3.0.1
+- expose the `Analytics.clientId` field
+
+## 3.0.0+1
+- fixed an NPE in the `usage_io` `getPlatformLocale()` method
+
+## 3.0.0
+- removed the use of configurable imports
+- removed the Flutter specific entry-point; Flutter apps can now use the
+  regular `dart:io` entrypoint (AnalyticsIO)
+- moved the uuid library from `lib/src/` to `lib/uuid/`
+- fixed an issue with reporting the user language for the dart:io provider
+- changed to send additional lines for reported exceptions
+
+## 2.2.2
+- adjust the Flutter usage client to Flutter API changes
+
+## 2.2.1
+- improve the user agent string for the CLI client
+
+## 2.2.0+1
+- bug fix to prevent frequently changing the settings file
+
+## 2.2.0
+- added `Analytics.firstRun`
+- added `Analytics.enabled`
+- removed `Analytics.optIn`
+
+## 2.1.0
+- added `Analytics.getSessionValue()`
+- added `Analytics.onSend`
+- added `AnalyticsImpl.sendRaw()`
+
+## 2.0.0
+- added a `usage` implementation for Flutter (uses conditional directives)
+- removed `lib/usage_html.dart`; use the new Analytics.create() static method
+- removed `lib/usage_io.dart`; use the new Analytics.create() static method
+- bumped to `2.0.0` for API changes and library refactorings
+
+## 1.2.0
+- added an optional `analyticsUrl` parameter to the usage constructors
+
+## 1.1.0
+- fix two strong mode analysis issues (overriding a field declaration with a
+  setter/getter pair)
+
 ## 1.0.1
 - make strong mode compliant
 - update some dev package dependencies
diff --git a/packages/usage/example/example.dart b/packages/usage/example/example.dart
index d570341..06578c3 100644
--- a/packages/usage/example/example.dart
+++ b/packages/usage/example/example.dart
@@ -2,9 +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.
 
-/**
- * A simple web app to hand-test the usage library.
- */
+/// A simple web app to hand-test the usage library.
 library usage_example;
 
 import 'dart:html';
@@ -16,9 +14,9 @@
 int _count = 0;
 
 void main() {
-  querySelector('#foo').onClick.listen((_) => _handleFoo(getAnalytics()));
-  querySelector('#bar').onClick.listen((_) => _handleBar(getAnalytics()));
-  querySelector('#page').onClick.listen((_) => _changePage(getAnalytics()));
+  querySelector('#foo').onClick.listen((_) => _handleFoo());
+  querySelector('#bar').onClick.listen((_) => _handleBar());
+  querySelector('#page').onClick.listen((_) => _changePage());
 }
 
 String _ua() => (querySelector('#ua') as InputElement).value.trim();
@@ -33,15 +31,18 @@
   return _analytics;
 }
 
-void _handleFoo(Analytics analytics) {
+void _handleFoo() {
+  Analytics analytics = getAnalytics();
   analytics.sendEvent('main', 'foo');
 }
 
-void _handleBar(Analytics analytics) {
+void _handleBar() {
+  Analytics analytics = getAnalytics();
   analytics.sendEvent('main', 'bar');
 }
 
-void _changePage(Analytics analytics) {
+void _changePage() {
+  Analytics analytics = getAnalytics();
   window.history.pushState(null, 'new page', '${++_count}.html');
   analytics.sendScreenView(window.location.pathname);
 }
diff --git a/packages/usage/example/ga.dart b/packages/usage/example/ga.dart
index dcd9110..ad64249 100644
--- a/packages/usage/example/ga.dart
+++ b/packages/usage/example/ga.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * A simple command-line app to hand-test the usage library.
- */
+/// A simple command-line app to hand-test the usage library.
 library usage_ga;
 
 import 'package:usage/usage_io.dart';
 
-void main(List args) {
+main(List args) async {
   final String DEFAULT_UA = 'UA-55029513-1';
 
   if (args.isEmpty) {
@@ -21,18 +19,17 @@
 
   String ua = args.isEmpty ? DEFAULT_UA : args.first;
 
-  Analytics ga = new AnalyticsIO(ua, 'ga_test', '1.0');
-  ga.optIn = true;
+  Analytics ga = new AnalyticsIO(ua, 'ga_test', '3.0');
 
-  ga.sendScreenView('home').then((_) {
-    return ga.sendScreenView('files');
-  }).then((_) {
-    return ga.sendException('foo exception, line 123:56');
-  }).then((_) {
-    return ga.sendTiming('writeDuration', 123);
-  }).then((_) {
-    return ga.sendEvent('create', 'consoleapp', label: 'Console App');
-  }).then((_) {
-    print('pinged ${ua}');
-  });
+  await ga.sendScreenView('home');
+  await ga.sendScreenView('files');
+  await ga
+      .sendException('foo error:\n${sanitizeStacktrace(StackTrace.current)}');
+  await ga.sendTiming('writeDuration', 123);
+  await ga.sendEvent('create', 'consoleapp', label: 'Console App');
+  print('pinged ${ua}');
+
+  await ga.waitForLastPing();
+
+  ga.close();
 }
diff --git a/packages/usage/lib/src/usage_impl.dart b/packages/usage/lib/src/usage_impl.dart
index 307b6ba..df529e3 100644
--- a/packages/usage/lib/src/usage_impl.dart
+++ b/packages/usage/lib/src/usage_impl.dart
@@ -2,15 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library usage_impl;
-
 import 'dart:async';
 import 'dart:math' as math;
 
-import 'uuid.dart';
 import '../usage.dart';
-
-final int _MAX_EXCEPTION_LENGTH = 100;
+import '../uuid/uuid.dart';
 
 String postEncode(Map<String, dynamic> map) {
   // &foo=bar
@@ -21,11 +17,11 @@
 }
 
 /**
- * A throttling algorithim. This models the throttling after a bucket with
+ * A throttling algorithm. This models the throttling after a bucket with
  * water dripping into it at the rate of 1 drop per second. If the bucket has
  * water when an operation is requested, 1 drop of water is removed and the
- * operation is performed. If not the operation is skipped. This algorithim
- * lets operations be peformed in bursts without throttling, but holds the
+ * operation is performed. If not the operation is skipped. This algorithm
+ * lets operations be performed in bursts without throttling, but holds the
  * overall average rate of operations to 1 per second.
  */
 class ThrottlingBucket {
@@ -60,11 +56,16 @@
   }
 }
 
-abstract class AnalyticsImpl extends Analytics {
-  static const String _GA_URL = 'https://www.google-analytics.com/collect';
+class AnalyticsImpl implements Analytics {
+  static const String _defaultAnalyticsUrl =
+      'https://www.google-analytics.com/collect';
 
-  /// Tracking ID / Property ID.
+  @override
   final String trackingId;
+  @override
+  final String applicationName;
+  @override
+  final String applicationVersion;
 
   final PersistentProperties properties;
   final PostHandler postHandler;
@@ -74,60 +75,100 @@
 
   final List<Future> _futures = [];
 
+  @override
+  AnalyticsOpt analyticsOpt = AnalyticsOpt.optOut;
+
+  String _url;
+
+  StreamController<Map<String, dynamic>> _sendController =
+      new StreamController.broadcast(sync: true);
+
   AnalyticsImpl(this.trackingId, this.properties, this.postHandler,
-      {String applicationName, String applicationVersion}) {
+      {this.applicationName, this.applicationVersion, String analyticsUrl}) {
     assert(trackingId != null);
 
     if (applicationName != null) setSessionValue('an', applicationName);
     if (applicationVersion != null) setSessionValue('av', applicationVersion);
+
+    _url = analyticsUrl ?? _defaultAnalyticsUrl;
   }
 
-  bool get optIn => properties['optIn'] == true;
+  bool _firstRun;
 
-  set optIn(bool value) {
-    properties['optIn'] = value;
+  @override
+  bool get firstRun {
+    if (_firstRun == null) {
+      _firstRun = properties['firstRun'] == null;
+
+      if (properties['firstRun'] != false) {
+        properties['firstRun'] = false;
+      }
+    }
+
+    return _firstRun;
   }
 
-  bool get hasSetOptIn => properties['optIn'] != null;
+  @override
+  bool get enabled {
+    bool optIn = analyticsOpt == AnalyticsOpt.optIn;
+    return optIn
+        ? properties['enabled'] == true
+        : properties['enabled'] != false;
+  }
 
-  Future sendScreenView(String viewName) {
+  @override
+  set enabled(bool value) {
+    properties['enabled'] = value;
+  }
+
+  @override
+  Future sendScreenView(String viewName, {Map<String, String> parameters}) {
     Map<String, dynamic> args = {'cd': viewName};
+    if (parameters != null) {
+      args.addAll(parameters);
+    }
     return _sendPayload('screenview', args);
   }
 
-  Future sendEvent(String category, String action, {String label, int value}) {
-    if (!optIn) return new Future.value();
-
+  @override
+  Future sendEvent(String category, String action,
+      {String label, int value, Map<String, String> parameters}) {
     Map<String, dynamic> args = {'ec': category, 'ea': action};
     if (label != null) args['el'] = label;
     if (value != null) args['ev'] = value;
+    if (parameters != null) {
+      args.addAll(parameters);
+    }
     return _sendPayload('event', args);
   }
 
+  @override
   Future sendSocial(String network, String action, String target) {
-    if (!optIn) return new Future.value();
-
     Map<String, dynamic> args = {'sn': network, 'sa': action, 'st': target};
     return _sendPayload('social', args);
   }
 
-  Future sendTiming(String variableName, int time, {String category,
-        String label}) {
-    if (!optIn) return new Future.value();
-
+  @override
+  Future sendTiming(String variableName, int time,
+      {String category, String label}) {
     Map<String, dynamic> args = {'utv': variableName, 'utt': time};
     if (label != null) args['utl'] = label;
     if (category != null) args['utc'] = category;
     return _sendPayload('timing', args);
   }
 
-  AnalyticsTimer startTimer(String variableName, {String category, String label}) {
-    return new AnalyticsTimer(this,
-        variableName, category: category, label: label);
+  @override
+  AnalyticsTimer startTimer(String variableName,
+      {String category, String label}) {
+    return new AnalyticsTimer(this, variableName,
+        category: category, label: label);
   }
 
+  @override
   Future sendException(String description, {bool fatal}) {
-    if (!optIn) return new Future.value();
+    // We trim exceptions to a max length; google analytics will apply it's own
+    // truncation, likely around 150 chars or so.
+    const int maxExceptionLength = 1000;
 
     // In order to ensure that the client of this API is not sending any PII
     // data, we strip out any stack trace that may reference a path on the
@@ -136,8 +177,10 @@
       description = description.substring(0, description.indexOf('file:/'));
     }
 
-    if (description != null && description.length > _MAX_EXCEPTION_LENGTH) {
-      description = description.substring(0, _MAX_EXCEPTION_LENGTH);
+    description = description.replaceAll('\n', '; ');
+
+    if (description.length > maxExceptionLength) {
+      description = description.substring(0, maxExceptionLength);
     }
 
     Map<String, dynamic> args = {'exd': description};
@@ -145,6 +188,10 @@
     return _sendPayload('exception', args);
   }
 
+  @override
+  dynamic getSessionValue(String param) => _variableMap[param];
+
+  @override
   void setSessionValue(String param, dynamic value) {
     if (value == null) {
       _variableMap.remove(param);
@@ -153,6 +200,10 @@
     }
   }
 
+  @override
+  Stream<Map<String, dynamic>> get onSend => _sendController.stream;
+
+  @override
   Future waitForLastPing({Duration timeout}) {
     Future f = Future.wait(_futures).catchError((e) => null);
 
@@ -163,33 +214,43 @@
     return f;
   }
 
-  /**
-   * Anonymous Client ID. The value of this field should be a random UUID v4.
-   */
-  String get _clientId => properties['clientId'];
+  @override
+  void close() => postHandler.close();
 
-  void _initClientId() {
-    if (_clientId == null) {
-      properties['clientId'] = new Uuid().generateV4();
-    }
+  @override
+  String get clientId => properties['clientId'] ??= new Uuid().generateV4();
+
+  /**
+   * Send raw data to analytics. Callers should generally use one of the typed
+   * methods (`sendScreenView`, `sendEvent`, ...).
+   *
+   * Valid values for [hitType] are: 'pageview', 'screenview', 'event',
+   * 'transaction', 'item', 'social', 'exception', and 'timing'.
+   */
+  Future sendRaw(String hitType, Map<String, dynamic> args) {
+    return _sendPayload(hitType, args);
   }
 
-  // Valid values for [hitType] are: 'pageview', 'screenview', 'event',
-  // 'transaction', 'item', 'social', 'exception', and 'timing'.
+  /**
+   * Valid values for [hitType] are: 'pageview', 'screenview', 'event',
+   * 'transaction', 'item', 'social', 'exception', and 'timing'.
+   */
   Future _sendPayload(String hitType, Map<String, dynamic> args) {
-    if (_bucket.removeDrop()) {
-      _initClientId();
+    if (!enabled) return new Future.value();
 
+    if (_bucket.removeDrop()) {
       _variableMap.forEach((key, value) {
         args[key] = value;
       });
 
       args['v'] = '1'; // protocol version
       args['tid'] = trackingId;
-      args['cid'] = _clientId;
+      args['cid'] = clientId;
       args['t'] = hitType;
 
-      return _recordFuture(postHandler.sendPost(_GA_URL, args));
+      _sendController.add(args);
+
+      return _recordFuture(postHandler.sendPost(_url, args));
     } else {
       return new Future.value();
     }
@@ -206,7 +267,7 @@
  * of these injected into it. There are default implementations for `dart:io`
  * and `dart:html` clients.
  *
- * The [name] paramater is used to uniquely store these properties on disk /
+ * The [name] parameter is used to uniquely store these properties on disk /
  * persistent storage.
  */
 abstract class PersistentProperties {
@@ -214,8 +275,12 @@
 
   PersistentProperties(this.name);
 
-  dynamic operator[](String key);
-  void operator[]=(String key, dynamic value);
+  dynamic operator [](String key);
+  void operator []=(String key, dynamic value);
+
+  /// Re-read settings from the backing store. This may be a no-op on some
+  /// platforms.
+  void syncSettings();
 }
 
 /**
@@ -229,4 +294,7 @@
  */
 abstract class PostHandler {
   Future sendPost(String url, Map<String, dynamic> parameters);
+
+  /// Free any used resources.
+  void close();
 }
diff --git a/packages/usage/lib/src/usage_impl_html.dart b/packages/usage/lib/src/usage_impl_html.dart
index e3f6496..c15cde6 100644
--- a/packages/usage/lib/src/usage_impl_html.dart
+++ b/packages/usage/lib/src/usage_impl_html.dart
@@ -2,19 +2,43 @@
 // for 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 usage_impl_html;
-
 import 'dart:async';
 import 'dart:convert' show JSON;
 import 'dart:html';
 
 import 'usage_impl.dart';
 
+/// An interface to a Google Analytics session, suitable for use in web apps.
+///
+/// [analyticsUrl] is an optional replacement for the default Google Analytics
+/// URL (`https://www.google-analytics.com/collect`).
+class AnalyticsHtml extends AnalyticsImpl {
+  AnalyticsHtml(
+      String trackingId, String applicationName, String applicationVersion,
+      {String analyticsUrl})
+      : super(trackingId, new HtmlPersistentProperties(applicationName),
+            new HtmlPostHandler(),
+            applicationName: applicationName,
+            applicationVersion: applicationVersion,
+            analyticsUrl: analyticsUrl) {
+    int screenWidth = window.screen.width;
+    int screenHeight = window.screen.height;
+
+    setSessionValue('sr', '${screenWidth}x$screenHeight');
+    setSessionValue('sd', '${window.screen.pixelDepth}-bits');
+    setSessionValue('ul', window.navigator.language);
+  }
+}
+
+typedef Future<HttpRequest> HttpRequestor(String url,
+    {String method, sendData});
+
 class HtmlPostHandler extends PostHandler {
-  final Function mockRequestor;
+  final HttpRequestor mockRequestor;
 
-  HtmlPostHandler({Function this.mockRequestor});
+  HtmlPostHandler({this.mockRequestor});
 
+  @override
   Future sendPost(String url, Map<String, dynamic> parameters) {
     int viewportWidth = document.documentElement.clientWidth;
     int viewportHeight = document.documentElement.clientHeight;
@@ -22,12 +46,16 @@
     parameters['vp'] = '${viewportWidth}x$viewportHeight';
 
     String data = postEncode(parameters);
-    var request = mockRequestor == null ? HttpRequest.request : mockRequestor;
-    return request(url, method: 'POST', sendData: data).catchError((e) {
+    HttpRequestor requestor =
+        mockRequestor == null ? HttpRequest.request : mockRequestor;
+    return requestor(url, method: 'POST', sendData: data).catchError((e) {
       // Catch errors that can happen during a request, but that we can't do
-      // anything about, e.g. a missing internet conenction.
+      // anything about, e.g. a missing internet connection.
     });
   }
+
+  @override
+  void close() {}
 }
 
 class HtmlPersistentProperties extends PersistentProperties {
@@ -39,9 +67,11 @@
     _map = JSON.decode(str);
   }
 
-  dynamic operator[](String key) => _map[key];
+  @override
+  dynamic operator [](String key) => _map[key];
 
-  void operator[]=(String key, dynamic value) {
+  @override
+  void operator []=(String key, dynamic value) {
     if (value == null) {
       _map.remove(key);
     } else {
@@ -50,4 +80,7 @@
 
     window.localStorage[name] = JSON.encode(_map);
   }
+
+  @override
+  void syncSettings() {}
 }
diff --git a/packages/usage/lib/src/usage_impl_io.dart b/packages/usage/lib/src/usage_impl_io.dart
index d59793e..6e82d41 100644
--- a/packages/usage/lib/src/usage_impl_io.dart
+++ b/packages/usage/lib/src/usage_impl_io.dart
@@ -2,31 +2,71 @@
 // for 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 usage_impl_io;
-
 import 'dart:async';
-import 'dart:convert' show JSON;
+import 'dart:convert' show JSON, JsonEncoder;
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
 
 import 'usage_impl.dart';
 
-String _createUserAgent() {
-  // Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en)
-  // Dart/1.8.0-edge.41170 (macos; macos; macos; null)
-  String os = Platform.operatingSystem;
-  String locale = Platform.environment['LANG'];
-  return "Dart/${_dartVersion()} (${os}; ${os}; ${os}; ${locale})";
+/// An interface to a Google Analytics session, suitable for use in command-line
+/// applications.
+///
+/// `trackingId`, `applicationName`, and `applicationVersion` values should be supplied.
+/// `analyticsUrl` is optional, and lets user's substitute their own analytics URL for
+/// the default.
+///
+/// `documentDirectory` is where the analytics settings are stored. It
+/// defaults to the user home directory. For regular `dart:io` apps this doesn't need to
+/// be supplied. For Flutter applications, you should pass in a value like
+/// `PathProvider.getApplicationDocumentsDirectory()`.
+class AnalyticsIO extends AnalyticsImpl {
+  AnalyticsIO(
+      String trackingId, String applicationName, String applicationVersion,
+      {String analyticsUrl, Directory documentDirectory})
+      : super(
+            trackingId,
+            new IOPersistentProperties(applicationName,
+                documentDirPath: documentDirectory?.path),
+            new IOPostHandler(),
+            applicationName: applicationName,
+            applicationVersion: applicationVersion,
+            analyticsUrl: analyticsUrl) {
+    final String locale = getPlatformLocale();
+    if (locale != null) {
+      setSessionValue('ul', locale);
+    }
+  }
 }
 
-String _userHomeDir() {
+String _createUserAgent() {
+  final String locale = getPlatformLocale() ?? '';
+
+  if (Platform.isAndroid) {
+    return 'Mozilla/5.0 (Android; Mobile; ${locale})';
+  } else if (Platform.isIOS) {
+    return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS like Mac OS X; ${locale})';
+  } else if (Platform.isMacOS) {
+    return 'Mozilla/5.0 (Macintosh; Intel Mac OS X; Macintosh; ${locale})';
+  } else if (Platform.isWindows) {
+    return 'Mozilla/5.0 (Windows; Windows; Windows; ${locale})';
+  } else if (Platform.isLinux) {
+    return 'Mozilla/5.0 (Linux; Linux; Linux; ${locale})';
+  } else {
+    // Dart/1.8.0 (macos; macos; macos; en_US)
+    String os = Platform.operatingSystem;
+    return "Dart/${getDartVersion()} (${os}; ${os}; ${os}; ${locale})";
+  }
+}
+
+String userHomeDir() {
   String envKey = Platform.operatingSystem == 'windows' ? 'APPDATA' : 'HOME';
   String value = Platform.environment[envKey];
   return value == null ? '.' : value;
 }
 
-String _dartVersion() {
+String getDartVersion() {
   String ver = Platform.version;
   int index = ver.indexOf(' ');
   if (index != -1) ver = ver.substring(0, index);
@@ -37,51 +77,103 @@
   final String _userAgent;
   final HttpClient mockClient;
 
-  IOPostHandler({HttpClient this.mockClient}) : _userAgent = _createUserAgent();
+  HttpClient _client;
 
-  Future sendPost(String url, Map<String, dynamic> parameters) {
-    // Add custom parameters for OS and the Dart version.
-    parameters['cd1'] = Platform.operatingSystem;
-    parameters['cd2'] = 'dart ${_dartVersion()}';
+  IOPostHandler({this.mockClient}) : _userAgent = _createUserAgent();
 
+  @override
+  Future sendPost(String url, Map<String, dynamic> parameters) async {
     String data = postEncode(parameters);
 
-    HttpClient client = mockClient != null ? mockClient : new HttpClient();
-    client.userAgent = _userAgent;
-    return client.postUrl(Uri.parse(url)).then((HttpClientRequest req) {
+    if (_client == null) {
+      _client = mockClient != null ? mockClient : new HttpClient();
+      _client.userAgent = _userAgent;
+    }
+
+    try {
+      HttpClientRequest req = await _client.postUrl(Uri.parse(url));
       req.write(data);
-      return req.close();
-    }).then((HttpClientResponse response) {
+      HttpClientResponse response = await req.close();
       response.drain();
-    }).catchError((e) {
+    } catch (exception) {
       // Catch errors that can happen during a request, but that we can't do
-      // anything about, e.g. a missing internet conenction.
-    });
+      // anything about, e.g. a missing internet connection.
+    }
   }
+
+  @override
+  void close() => _client?.close();
 }
 
+JsonEncoder _jsonEncoder = new JsonEncoder.withIndent('  ');
+
 class IOPersistentProperties extends PersistentProperties {
   File _file;
   Map _map;
 
-  IOPersistentProperties(String name) : super(name) {
+  IOPersistentProperties(String name, {String documentDirPath}) : super(name) {
     String fileName = '.${name.replaceAll(' ', '_')}';
-    _file = new File(path.join(_userHomeDir(), fileName));
-    _file.createSync();
-    String contents = _file.readAsStringSync();
-    if (contents.isEmpty) contents = '{}';
-    _map = JSON.decode(contents);
+    documentDirPath ??= userHomeDir();
+    _file = new File(path.join(documentDirPath, fileName));
+    if (!_file.existsSync()) {
+      _file.createSync();
+    }
+    syncSettings();
   }
 
-  dynamic operator[](String key) => _map[key];
+  IOPersistentProperties.fromFile(File file) : super(path.basename(file.path)) {
+    _file = file;
+    if (!_file.existsSync()) {
+      _file.createSync();
+    }
+    syncSettings();
+  }
 
-  void operator[]=(String key, dynamic value) {
+  @override
+  dynamic operator [](String key) => _map[key];
+
+  @override
+  void operator []=(String key, dynamic value) {
+    if (value == null && !_map.containsKey(key)) return;
+    if (_map[key] == value) return;
+
     if (value == null) {
       _map.remove(key);
     } else {
       _map[key] = value;
     }
 
-    _file.writeAsStringSync(JSON.encode(_map) + '\n');
+    try {
+      _file.writeAsStringSync(_jsonEncoder.convert(_map) + '\n');
+    } catch (_) {}
   }
+
+  @override
+  void syncSettings() {
+    try {
+      String contents = _file.readAsStringSync();
+      if (contents.isEmpty) contents = '{}';
+      _map = JSON.decode(contents);
+    } catch (_) {
+      _map = {};
+    }
+  }
+}
+
+/// Return the string for the platform's locale; return's `null` if the locale
+/// can't be determined.
+String getPlatformLocale() {
+  String locale = Platform.localeName;
+  if (locale == null) return null;
+
+  if (locale != null) {
+    // Convert `en_US.UTF-8` to `en_US`.
+    int index = locale.indexOf('.');
+    if (index != -1) locale = locale.substring(0, index);
+
+    // Convert `en_US` to `en-us`.
+    locale = locale.replaceAll('_', '-').toLowerCase();
+  }
+
+  return locale;
 }
diff --git a/packages/usage/lib/src/uuid.dart b/packages/usage/lib/src/uuid.dart
deleted file mode 100644
index 66e99ac..0000000
--- a/packages/usage/lib/src/uuid.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * A UUID generator library.
- */
-library usage.uuid;
-
-import 'dart:math' show Random;
-
-/**
- * A UUID generator. This will generate unique IDs in the format:
- *
- *     f47ac10b-58cc-4372-a567-0e02b2c3d479
- *
- * The generated uuids are 128 bit numbers encoded in a specific string format.
- *
- * For more information, see
- * http://en.wikipedia.org/wiki/Universally_unique_identifier.
- */
-class Uuid {
-  Random _random = new Random();
-
-  /**
-   * Generate a version 4 (random) uuid. This is a uuid scheme that only uses
-   * random numbers as the source of the generated uuid.
-   */
-  String generateV4() {
-    // Generate xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx / 8-4-4-4-12.
-    int special = 8 + _random.nextInt(4);
-
-    return
-        '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}-'
-        '${_bitsDigits(16, 4)}-'
-        '4${_bitsDigits(12, 3)}-'
-        '${_printDigits(special,  1)}${_bitsDigits(12, 3)}-'
-        '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}';
-  }
-
-  String _bitsDigits(int bitCount, int digitCount) =>
-      _printDigits(_generateBits(bitCount), digitCount);
-
-  int _generateBits(int bitCount) => _random.nextInt(1 << bitCount);
-
-  String _printDigits(int value, int count) =>
-      value.toRadixString(16).padLeft(count, '0');
-}
diff --git a/packages/usage/lib/usage.dart b/packages/usage/lib/usage.dart
index 9a4279b..e79701c 100644
--- a/packages/usage/lib/usage.dart
+++ b/packages/usage/lib/usage.dart
@@ -29,10 +29,13 @@
 // Matches file:/, non-ws, /, non-ws, .dart
 final RegExp _pathRegex = new RegExp(r'file:/\S+/(\S+\.dart)');
 
+// Match multiple tabs or spaces.
+final RegExp _tabOrSpaceRegex = new RegExp(r'[\t ]+');
+
 /**
  * An interface to a Google Analytics session. [AnalyticsHtml] and [AnalyticsIO]
  * are concrete implementations of this interface. [AnalyticsMock] can be used
- * for testing or for some varients of an opt-in workflow.
+ * for testing or for some variants of an opt-in workflow.
  *
  * The analytics information is sent on a best-effort basis. So, failures to
  * send the GA information will not result in errors from the asynchronous
@@ -44,27 +47,57 @@
    */
   String get trackingId;
 
-  /**
-   * Whether the user has opt-ed in to additional analytics.
-   */
-  bool optIn;
+  /// The application name.
+  String get applicationName;
+
+  /// The application version.
+  String get applicationVersion;
 
   /**
-   * Whether the [optIn] value has been explicitly set (either `true` or
-   * `false`).
+   * Is this the first time the tool has run?
    */
-  bool get hasSetOptIn;
+  bool get firstRun;
+
+  /**
+   * Whether the [Analytics] instance is configured in an opt-in or opt-out manner.
+   */
+  AnalyticsOpt analyticsOpt = AnalyticsOpt.optOut;
+
+  /**
+   * Will analytics data be sent.
+   */
+  bool get enabled;
+
+  /**
+   * Enable or disable sending of analytics data.
+   */
+  set enabled(bool value);
+
+  /**
+   * Anonymous client ID in UUID v4 format.
+   *
+   * The value is randomly-generated and should be reasonably stable for the
+   * computer sending analytics data.
+   */
+  String get clientId;
 
   /**
    * Sends a screen view hit to Google Analytics.
+   *
+   * [parameters] can be any analytics key/value pair. Useful
+   * for custom dimensions, etc.
    */
-  Future sendScreenView(String viewName);
+  Future sendScreenView(String viewName, {Map<String, String> parameters});
 
   /**
    * Sends an Event hit to Google Analytics. [label] specifies the event label.
    * [value] specifies the event value. Values must be non-negative.
+   *
+   * [parameters] can be any analytics key/value pair. Useful
+   * for custom dimensions, etc.
    */
-  Future sendEvent(String category, String action, {String label, int value});
+  Future sendEvent(String category, String action,
+      {String label, int value, Map<String, String> parameters});
 
   /**
    * Sends a Social hit to Google Analytics. [network] specifies the social
@@ -81,8 +114,8 @@
    * milliseconds). [category] specifies the category of the timing. [label]
    * specifies the label of the timing.
    */
-  Future sendTiming(String variableName, int time, {String category,
-      String label});
+  Future sendTiming(String variableName, int time,
+      {String category, String label});
 
   /**
    * Start a timer. The time won't be calculated, and the analytics information
@@ -99,6 +132,11 @@
   Future sendException(String description, {bool fatal});
 
   /**
+   * Gets a session variable value.
+   */
+  dynamic getSessionValue(String param);
+
+  /**
    * Sets a session variable value. The value is persistent for the life of the
    * [Analytics] instance. This variable will be sent in with every analytics
    * hit. A list of valid variable names can be found here:
@@ -107,6 +145,16 @@
   void setSessionValue(String param, dynamic value);
 
   /**
+   * Fires events when the usage library sends any data over the network. This
+   * will not fire if analytics has been disabled or if the throttling algorithm
+   * has been engaged.
+   *
+   * This method is public to allow library clients to more easily test their
+   * analytics implementations.
+   */
+  Stream<Map<String, dynamic>> get onSend;
+
+  /**
    * Wait for all of the outstanding analytics pings to complete. The returned
    * `Future` will always complete without errors. You can pass in an optional
    * `Duration` to specify to only wait for a certain amount of time.
@@ -116,9 +164,27 @@
    * users won't want their CLI app to pause at the end of the process waiting
    * for Google analytics requests to complete. This method allows CLI apps to
    * delay for a short time waiting for GA requests to complete, and then do
-   * something like call `exit()` explicitly themselves.
+   * something like call `dart:io`'s `exit()` explicitly themselves (or the
+   * [close] method below).
    */
   Future waitForLastPing({Duration timeout});
+
+  /// Free any used resources.
+  ///
+  /// The [Analytics] instance should not be used after this call.
+  void close();
+}
+
+enum AnalyticsOpt {
+  /**
+   * Users must opt-in before any analytics data is sent.
+   */
+  optIn,
+
+  /**
+   * Users must opt-out for analytics data to not be sent.
+   */
+  optOut
 }
 
 /**
@@ -155,8 +221,8 @@
     if (_endMillis != null) return new Future.value();
 
     _endMillis = new DateTime.now().millisecondsSinceEpoch;
-    return analytics.sendTiming(
-        variableName, currentElapsedMillis, category: category, label: label);
+    return analytics.sendTiming(variableName, currentElapsedMillis,
+        category: category, label: label);
   }
 }
 
@@ -165,11 +231,20 @@
  * stand-in for that will never ping the GA server, or as a mock in test code.
  */
 class AnalyticsMock implements Analytics {
+  @override
   String get trackingId => 'UA-0';
+  @override
+  String get applicationName => 'mock-app';
+  @override
+  String get applicationVersion => '1.0.0';
+
   final bool logCalls;
 
-  bool optIn = false;
-  bool hasSetOptIn = true;
+  /**
+   * Events are never added to this controller for the mock implementation.
+   */
+  StreamController<Map<String, dynamic>> _sendController =
+      new StreamController.broadcast();
 
   /**
    * Create a new [AnalyticsMock]. If [logCalls] is true, all calls will be
@@ -177,36 +252,76 @@
    */
   AnalyticsMock([this.logCalls = false]);
 
-  Future sendScreenView(String viewName) =>
-      _log('screenView', {'viewName': viewName});
+  @override
+  bool get firstRun => false;
 
-  Future sendEvent(String category, String action, {String label, int value}) {
-    return _log('event', {'category': category, 'action': action,
-      'label': label, 'value': value});
+  @override
+  AnalyticsOpt analyticsOpt = AnalyticsOpt.optOut;
+
+  @override
+  bool enabled = true;
+
+  @override
+  String get clientId => '00000000-0000-4000-0000-000000000000';
+
+  @override
+  Future sendScreenView(String viewName, {Map<String, String> parameters}) {
+    parameters ??= <String, String>{};
+    parameters['viewName'] = viewName;
+    return _log('screenView', parameters);
   }
 
+  @override
+  Future sendEvent(String category, String action,
+      {String label, int value, Map<String, String> parameters}) {
+    parameters ??= <String, String>{};
+    return _log(
+        'event',
+        {'category': category, 'action': action, 'label': label, 'value': value}
+          ..addAll(parameters));
+  }
+
+  @override
   Future sendSocial(String network, String action, String target) =>
       _log('social', {'network': network, 'action': action, 'target': target});
 
-  Future sendTiming(String variableName, int time, {String category,
-      String label}) {
-    return _log('timing', {'variableName': variableName, 'time': time,
-      'category': category, 'label': label});
+  @override
+  Future sendTiming(String variableName, int time,
+      {String category, String label}) {
+    return _log('timing', {
+      'variableName': variableName,
+      'time': time,
+      'category': category,
+      'label': label
+    });
   }
 
+  @override
   AnalyticsTimer startTimer(String variableName,
       {String category, String label}) {
-    return new AnalyticsTimer(this,
-        variableName, category: category, label: label);
+    return new AnalyticsTimer(this, variableName,
+        category: category, label: label);
   }
 
+  @override
   Future sendException(String description, {bool fatal}) =>
       _log('exception', {'description': description, 'fatal': fatal});
 
-  void setSessionValue(String param, dynamic value) { }
+  @override
+  dynamic getSessionValue(String param) => null;
 
+  @override
+  void setSessionValue(String param, dynamic value) {}
+
+  @override
+  Stream<Map<String, dynamic>> get onSend => _sendController.stream;
+
+  @override
   Future waitForLastPing({Duration timeout}) => new Future.value();
 
+  @override
+  void close() {}
+
   Future _log(String hitType, Map m) {
     if (logCalls) {
       print('analytics: ${hitType} ${m}');
@@ -234,16 +349,13 @@
 
   for (Match match in iter) {
     String replacement = match.group(1);
-    str = str.substring(0, match.start)
-        + replacement + str.substring(match.end);
+    str =
+        str.substring(0, match.start) + replacement + str.substring(match.end);
   }
 
   if (shorten) {
     // Shorten the stacktrace up a bit.
-    str = str
-        .replaceAll('(package:', '(')
-        .replaceAll('(dart:', '(')
-        .replaceAll(new RegExp(r'\s+'), ' ');
+    str = str.replaceAll(_tabOrSpaceRegex, ' ');
   }
 
   return str;
diff --git a/packages/usage/lib/usage_html.dart b/packages/usage/lib/usage_html.dart
index be0641d..569c1eb 100644
--- a/packages/usage/lib/usage_html.dart
+++ b/packages/usage/lib/usage_html.dart
@@ -2,38 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * In order to use this library import the `usage_html.dart` file and
- * instantiate the [AnalyticsHtml] class.
- *
- * You'll need to provide a Google Analytics tracking ID, the application name,
- * and the application version.
- */
+/// In order to use this library import the `usage_html.dart` file and
+/// instantiate the [AnalyticsHtml] class.
+///
+/// You'll need to provide a Google Analytics tracking ID, the application name,
+/// and the application version.
 library usage_html;
 
-import 'dart:html';
-
-import 'src/usage_impl.dart';
-import 'src/usage_impl_html.dart';
-
+export 'src/usage_impl_html.dart' show AnalyticsHtml;
 export 'usage.dart';
-
-/**
- * An interface to a Google Analytics session, suitable for use in web apps.
- */
-class AnalyticsHtml extends AnalyticsImpl {
-  AnalyticsHtml(String trackingId, String applicationName, String applicationVersion) :
-    super(
-      trackingId,
-      new HtmlPersistentProperties(applicationName),
-      new HtmlPostHandler(),
-      applicationName: applicationName,
-      applicationVersion: applicationVersion) {
-    int screenWidth = window.screen.width;
-    int screenHeight = window.screen.height;
-
-    setSessionValue('sr', '${screenWidth}x$screenHeight');
-    setSessionValue('sd', '${window.screen.pixelDepth}-bits');
-    setSessionValue('ul', window.navigator.language);
-  }
-}
diff --git a/packages/usage/lib/usage_io.dart b/packages/usage/lib/usage_io.dart
index b68b216..5e35e94 100644
--- a/packages/usage/lib/usage_io.dart
+++ b/packages/usage/lib/usage_io.dart
@@ -2,30 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * In order to use this library import the `usage_io.dart` file and
- * instantiate the [AnalyticsIO] class.
- *
- * You'll need to provide a Google Analytics tracking ID, the application name,
- * and the application version.
- */
+/// In order to use this library import the `usage_io.dart` file and
+/// instantiate the [AnalyticsIO] class.
+///
+/// You'll need to provide a Google Analytics tracking ID, the application name,
+/// and the application version.
 library usage_io;
 
-import 'src/usage_impl.dart';
-import 'src/usage_impl_io.dart';
-
+export 'src/usage_impl_io.dart' show AnalyticsIO;
 export 'usage.dart';
-
-/**
- * An interface to a Google Analytics session, suitable for use in command-line
- * applications.
- */
-class AnalyticsIO extends AnalyticsImpl {
-  AnalyticsIO(String trackingId, String applicationName, String applicationVersion) :
-    super(
-      trackingId,
-      new IOPersistentProperties(applicationName),
-      new IOPostHandler(),
-      applicationName: applicationName,
-      applicationVersion: applicationVersion);
-}
diff --git a/packages/usage/lib/uuid/uuid.dart b/packages/usage/lib/uuid/uuid.dart
new file mode 100644
index 0000000..eaafeb2
--- /dev/null
+++ b/packages/usage/lib/uuid/uuid.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A UUID generator library.
+library uuid;
+
+import 'dart:math' show Random;
+
+/// A UUID generator.
+///
+/// This will generate unique IDs in the format:
+///
+///     f47ac10b-58cc-4372-a567-0e02b2c3d479
+///
+/// The generated uuids are 128 bit numbers encoded in a specific string format.
+/// For more information, see
+/// [en.wikipedia.org/wiki/Universally_unique_identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier).
+class Uuid {
+  final Random _random = new Random();
+
+  /// Generate a version 4 (random) uuid. This is a uuid scheme that only uses
+  /// random numbers as the source of the generated uuid.
+  String generateV4() {
+    // Generate xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx / 8-4-4-4-12.
+    int special = 8 + _random.nextInt(4);
+
+    return '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}-'
+        '${_bitsDigits(16, 4)}-'
+        '4${_bitsDigits(12, 3)}-'
+        '${_printDigits(special,  1)}${_bitsDigits(12, 3)}-'
+        '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}';
+  }
+
+  String _bitsDigits(int bitCount, int digitCount) =>
+      _printDigits(_generateBits(bitCount), digitCount);
+
+  int _generateBits(int bitCount) => _random.nextInt(1 << bitCount);
+
+  String _printDigits(int value, int count) =>
+      value.toRadixString(16).padLeft(count, '0');
+}
diff --git a/packages/usage/pubspec.yaml b/packages/usage/pubspec.yaml
index 4d6ca7b..564ba2e 100644
--- a/packages/usage/pubspec.yaml
+++ b/packages/usage/pubspec.yaml
@@ -3,15 +3,18 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: usage
-version: 1.0.1
-description: A Google Analytics wrapper for both command-line and web apps.
+version: 3.3.0
+description: A Google Analytics wrapper for both command-line, web, and Flutter apps.
 homepage: https://github.com/dart-lang/usage
 author: Dart Team <misc@dartlang.org>
 
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.24.0 <2.0.0'
+
+dependencies:
+  path: ^1.4.0
 
 dev_dependencies:
   browser: ^0.10.0
-  grinder: ^0.7.0
+  grinder: ^0.8.0
   test: ^0.12.0
diff --git a/packages/usage/readme.md b/packages/usage/readme.md
index 63a365a..931f91f 100644
--- a/packages/usage/readme.md
+++ b/packages/usage/readme.md
@@ -1,8 +1,8 @@
 # usage
 
-`usage` is a wrapper around Google Analytics for both command-line apps and web
-apps.
+`usage` is a wrapper around Google Analytics for command-line, web, and Flutter apps.
 
+[![pub package](https://img.shields.io/pub/v/usage.svg)](https://pub.dartlang.org/packages/usage)
 [![Build Status](https://travis-ci.org/dart-lang/usage.svg)](https://travis-ci.org/dart-lang/usage)
 [![Coverage Status](https://img.shields.io/coveralls/dart-lang/usage.svg)](https://coveralls.io/r/dart-lang/usage?branch=master)
 
@@ -11,6 +11,28 @@
 To use this library as a web app, import the `usage_html.dart` library and
 instantiate the `AnalyticsHtml` class.
 
+When you are creating a new property at [google analytics](https://www.google.com/analytics/)
+make sure to select the **mobile app** option, not the website option.
+
+## For Flutter apps
+
+Flutter applications can use the `AnalyticsIO` version of this library. They will need
+to specify the documents directory in the constructor in order to tell the library where
+to save the analytics preferences:
+
+```dart
+import 'package:flutter/services.dart';
+import 'package:usage/usage_io.dart';
+
+void main() {
+  final String UA = ...;
+
+  Analytics ga = new AnalyticsIO(UA, 'ga_test', '3.0',
+    documentsDirectory: PathProvider.getApplicationDocumentsDirectory());
+  ...
+}
+```
+
 ## For command-line apps
 
 To use this library as a command-line app, import the `usage_io.dart` library
@@ -30,9 +52,15 @@
 something like:
 
 ```dart
-analytics.waitForLastPing(timeout: new Duration(milliseconds: 500)).then((_) {
-  exit(0);
-});
+await analytics.waitForLastPing(timeout: new Duration(milliseconds: 200));
+analytics.close();
+```
+
+or:
+
+```dart
+await analytics.waitForLastPing(timeout: new Duration(milliseconds: 200));
+exit(0);
 ```
 
 ## Using the API
@@ -48,7 +76,7 @@
 ```dart
 final String UA = ...;
 
-Analytics ga = new AnalyticsIO(UA, 'ga_test', '1.0');
+Analytics ga = new AnalyticsIO(UA, 'ga_test', '3.0');
 ga.optIn = true;
 
 ga.sendScreenView('home');
@@ -61,21 +89,17 @@
 
 ## When do we send analytics data?
 
-We use an opt-in method for sending analytics information. There are essentially
-three states for when we send information:
+You can use this library in an opt-in manner or an opt-out one. It defaults to
+opt-out - data will be sent to Google Analytics unless the user explicitly
+opts-out. The mode can be adjusted by changing the value of the
+`Analytics.analyticsOpt` field.
 
-*Sending screen views* If the user has not opted in, the library will only send
-information about screen views. This allows tools to do things like version
-checks, but does not send any additional information.
+*Opt-out* In opt-out mode, if the user does not explicitly opt-out of collecting
+analytics (`Analytics.enabled = false`), the usage library will send usage data.
 
-*Opt-in* If the user opts-in to analytics collection the library sends all
-requested analytics info. This includes screen views, events, timing
-information, and exceptions.
-
-*Opt-ing out* In order to not send analytics information, either do not call the
-analytics methods, or create and use the `AnalyticsMock` class. This provides
-an instance you can use in place of a real analytics object but each analytics
-method is a no-op.
+*Opt-in* In opt-in mode, no data will be sent until the user explicitly opt-in
+to collection (`Analytics.enabled = true`). This includes screen views, events,
+timing information, and exceptions.
 
 ## Other info
 
@@ -92,6 +116,10 @@
 For more information, please see the Google Analytics Measurement Protocol
 [Policy](https://developers.google.com/analytics/devguides/collection/protocol/policy).
 
+## Contributing
+
+Tests can be run using `pub run test`.
+
 ## Issues and bugs
 
 Please file reports on the
diff --git a/packages/usage/test/all.dart b/packages/usage/test/all.dart
index 393640a..9f93051 100644
--- a/packages/usage/test/all.dart
+++ b/packages/usage/test/all.dart
@@ -5,15 +5,15 @@
 library usage.all_test;
 
 import 'hit_types_test.dart' as hit_types_test;
-import 'usage_test.dart' as usage_test;
-import 'usage_impl_test.dart' as usage_impl_test;
 import 'usage_impl_io_test.dart' as usage_impl_io_test;
+import 'usage_impl_test.dart' as usage_impl_test;
+import 'usage_test.dart' as usage_test;
 import 'uuid_test.dart' as uuid_test;
 
 void main() {
   hit_types_test.defineTests();
-  usage_test.defineTests();
-  usage_impl_test.defineTests();
   usage_impl_io_test.defineTests();
+  usage_impl_test.defineTests();
+  usage_test.defineTests();
   uuid_test.defineTests();
 }
diff --git a/packages/usage/test/hit_types_test.dart b/packages/usage/test/hit_types_test.dart
index 4bfb608..e8bf241 100644
--- a/packages/usage/test/hit_types_test.dart
+++ b/packages/usage/test/hit_types_test.dart
@@ -21,6 +21,13 @@
       expect(mock.mockProperties['clientId'], isNotNull);
       expect(mock.mockPostHandler.sentValues, isNot(isEmpty));
     });
+    test('with parameters', () {
+      AnalyticsImplMock mock = createMock();
+      mock.sendScreenView('withParams', parameters: {'cd1': 'foo'});
+      expect(mock.mockProperties['clientId'], isNotNull);
+      expect(mock.mockPostHandler.sentValues, isNot(isEmpty));
+      has(mock.last, 'cd1');
+    });
   });
 
   group('event', () {
@@ -33,6 +40,16 @@
       has(mock.last, 'ea');
     });
 
+    test('with parameters', () {
+      AnalyticsImplMock mock = createMock();
+      mock.sendEvent('withParams', 'save', parameters: {'cd1': 'foo'});
+      expect(mock.mockPostHandler.sentValues, isNot(isEmpty));
+      was(mock.last, 'event');
+      has(mock.last, 'ec');
+      has(mock.last, 'ea');
+      has(mock.last, 'cd1');
+    });
+
     test('optional args', () {
       AnalyticsImplMock mock = createMock();
       mock.sendEvent('files', 'save', label: 'File Save', value: 23);
@@ -78,26 +95,25 @@
       has(mock.last, 'utl');
     });
 
-    test('timer', () {
+    test('timer', () async {
       AnalyticsImplMock mock = createMock();
       AnalyticsTimer timer =
           mock.startTimer('compile', category: 'Build', label: 'Compile');
 
-      return new Future.delayed(new Duration(milliseconds: 20), () {
-        return timer.finish().then((_) {
-          expect(mock.mockPostHandler.sentValues, isNot(isEmpty));
-          was(mock.last, 'timing');
-          has(mock.last, 'utv');
-          has(mock.last, 'utt');
-          has(mock.last, 'utc');
-          has(mock.last, 'utl');
-          int time = timer.currentElapsedMillis;
-          expect(time, greaterThan(10));
-          return new Future.delayed(new Duration(milliseconds: 10), () {
-            expect(timer.currentElapsedMillis, time);
-          });
-        });
-      });
+      await new Future.delayed(new Duration(milliseconds: 20));
+
+      await timer.finish();
+      expect(mock.mockPostHandler.sentValues, isNot(isEmpty));
+      was(mock.last, 'timing');
+      has(mock.last, 'utv');
+      has(mock.last, 'utt');
+      has(mock.last, 'utc');
+      has(mock.last, 'utl');
+      int time = timer.currentElapsedMillis;
+      expect(time, greaterThan(10));
+
+      await new Future.delayed(new Duration(milliseconds: 10));
+      expect(timer.currentElapsedMillis, time);
     });
   });
 
@@ -124,12 +140,5 @@
       mock.sendException('foo bar (file:///Users/foobar/tmp/error.dart:3:13)');
       expect(mock.last['exd'], 'foo bar (');
     });
-
-    test('long description trimmed', () {
-      String str = '0123456789abcdefghijklmnopqrstuvwxyz';
-      AnalyticsImplMock mock = createMock();
-      mock.sendException(str + str + str + str + str);
-      expect(mock.last['exd'].length, 100);
-    });
   });
 }
diff --git a/packages/usage/test/src/common.dart b/packages/usage/test/src/common.dart
index 238ce6d..7799394 100644
--- a/packages/usage/test/src/common.dart
+++ b/packages/usage/test/src/common.dart
@@ -9,22 +9,20 @@
 import 'package:test/test.dart';
 import 'package:usage/src/usage_impl.dart';
 
-AnalyticsImplMock createMock({bool setOptIn: true}) =>
-    new AnalyticsImplMock('UA-0', setOptIn: setOptIn);
+AnalyticsImplMock createMock({Map<String, dynamic> props}) =>
+    new AnalyticsImplMock('UA-0', props: props);
 
-void was(Map m, String type) => expect(m['t'], type);
-void has(Map m, String key) => expect(m[key], isNotNull);
-void hasnt(Map m, String key) => expect(m[key], isNull);
+was(Map m, String type) => expect(m['t'], type);
+has(Map m, String key) => expect(m[key], isNotNull);
+hasnt(Map m, String key) => expect(m[key], isNull);
 
 class AnalyticsImplMock extends AnalyticsImpl {
   MockProperties get mockProperties => properties;
   MockPostHandler get mockPostHandler => postHandler;
 
-  AnalyticsImplMock(String trackingId, {bool setOptIn: true}) :
-      super(trackingId, new MockProperties(), new MockPostHandler(),
-      applicationName: 'Test App', applicationVersion: '0.1') {
-    if (setOptIn) optIn = true;
-  }
+  AnalyticsImplMock(String trackingId, {Map<String, dynamic> props})
+      : super(trackingId, new MockProperties(props), new MockPostHandler(),
+            applicationName: 'Test App', applicationVersion: '0.1');
 
   Map<String, dynamic> get last => mockPostHandler.last;
 }
@@ -32,18 +30,26 @@
 class MockProperties extends PersistentProperties {
   Map<String, dynamic> props = {};
 
-  MockProperties() : super('mock');
+  MockProperties([Map<String, dynamic> props]) : super('mock') {
+    if (props != null) this.props.addAll(props);
+  }
 
-  dynamic operator[](String key) => props[key];
+  @override
+  dynamic operator [](String key) => props[key];
 
-  void operator[]=(String key, dynamic value) {
+  @override
+  void operator []=(String key, dynamic value) {
     props[key] = value;
   }
+
+  @override
+  void syncSettings() {}
 }
 
 class MockPostHandler extends PostHandler {
   List<Map<String, dynamic>> sentValues = [];
 
+  @override
   Future sendPost(String url, Map<String, dynamic> parameters) {
     sentValues.add(parameters);
 
@@ -51,4 +57,7 @@
   }
 
   Map<String, dynamic> get last => sentValues.last;
+
+  @override
+  void close() {}
 }
diff --git a/packages/usage/test/usage_impl_io_test.dart b/packages/usage/test/usage_impl_io_test.dart
index e41f241..8889077 100644
--- a/packages/usage/test/usage_impl_io_test.dart
+++ b/packages/usage/test/usage_impl_io_test.dart
@@ -2,6 +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.
 
+@TestOn('!browser')
 library usage.usage_impl_io_test;
 
 import 'dart:async';
@@ -14,13 +15,12 @@
 
 void defineTests() {
   group('IOPostHandler', () {
-    test('sendPost', () {
+    test('sendPost', () async {
       var httpClient = new MockHttpClient();
       IOPostHandler postHandler = new IOPostHandler(mockClient: httpClient);
       Map<String, dynamic> args = {'utv': 'varName', 'utt': 123};
-      return postHandler.sendPost('http://www.google.com', args).then((_) {
-        expect(httpClient.sendCount, 1);
-      });
+      await postHandler.sendPost('http://www.google.com', args);
+      expect(httpClient.sendCount, 1);
     });
   });
 
@@ -39,38 +39,65 @@
       expect(props['foo'], null);
     });
   });
+
+  group('usage_impl_io', () {
+    test('getDartVersion', () {
+      expect(getDartVersion(), isNotNull);
+    });
+
+    test('getPlatformLocale', () {
+      expect(getPlatformLocale(), isNotNull);
+    });
+  });
 }
 
 class MockHttpClient implements HttpClient {
+  @override
   String userAgent;
   int sendCount = 0;
   int writeCount = 0;
   bool closed = false;
+
+  @override
   Future<HttpClientRequest> postUrl(Uri url) {
     return new Future.value(new MockHttpClientRequest(this));
   }
-  noSuchMethod(Invocation invocation) { }
+
+  @override
+  noSuchMethod(Invocation invocation) {}
 }
 
 class MockHttpClientRequest implements HttpClientRequest {
   final MockHttpClient client;
+
   MockHttpClientRequest(this.client);
+
+  @override
   void write(Object obj) {
     client.writeCount++;
   }
+
+  @override
   Future<HttpClientResponse> close() {
     client.closed = true;
     return new Future.value(new MockHttpClientResponse(client));
   }
-  noSuchMethod(Invocation invocation) { }
+
+  @override
+  noSuchMethod(Invocation invocation) {}
 }
 
 class MockHttpClientResponse implements HttpClientResponse {
   final MockHttpClient client;
+
   MockHttpClientResponse(this.client);
-  Future drain([var futureValue]) {
+
+  @override
+  Future/*<E>*/ drain/*<E>*/([/*=E*/ futureValue]) {
     client.sendCount++;
     return new Future.value();
   }
-  noSuchMethod(Invocation invocation) { }
+
+  @override
+  noSuchMethod(Invocation invocation) {}
 }
diff --git a/packages/usage/test/usage_impl_test.dart b/packages/usage/test/usage_impl_test.dart
index b8c0f05..a4ca3ac 100644
--- a/packages/usage/test/usage_impl_test.dart
+++ b/packages/usage/test/usage_impl_test.dart
@@ -28,19 +28,34 @@
   });
 
   group('AnalyticsImpl', () {
+    test('trackingId', () {
+      AnalyticsImplMock mock = createMock();
+      expect(mock.trackingId, isNotNull);
+    });
+
+    test('applicationName', () {
+      AnalyticsImplMock mock = createMock();
+      expect(mock.applicationName, isNotNull);
+    });
+
+    test('applicationVersion', () {
+      AnalyticsImplMock mock = createMock();
+      expect(mock.applicationVersion, isNotNull);
+    });
+
     test('respects disabled', () {
       AnalyticsImplMock mock = createMock();
-      mock.optIn = false;
+      mock.enabled = false;
       mock.sendException('FooBar exception');
-      expect(mock.optIn, false);
+      expect(mock.enabled, false);
       expect(mock.mockPostHandler.sentValues, isEmpty);
     });
 
-    test('hasSetOptIn', () {
-      AnalyticsImplMock mock = createMock(setOptIn: false);
-      expect(mock.hasSetOptIn, false);
-      mock.optIn = false;
-      expect(mock.hasSetOptIn, true);
+    test('firstRun', () {
+      AnalyticsImplMock mock = createMock();
+      expect(mock.firstRun, true);
+      mock = createMock(props: {'firstRun': false});
+      expect(mock.firstRun, false);
     });
 
     test('setSessionValue', () {
@@ -62,6 +77,28 @@
       mock.sendScreenView('baz');
       return mock.waitForLastPing(timeout: new Duration(milliseconds: 100));
     });
+
+    group('clientId', () {
+      test('is available immediately', () {
+        AnalyticsImplMock mock = createMock();
+        expect(mock.clientId, isNotEmpty);
+      });
+
+      test('is memoized', () {
+        AnalyticsImplMock mock = createMock();
+        final value1 = mock.clientId;
+        final value2 = mock.clientId;
+        expect(value1, isNotEmpty);
+        expect(value1, value2);
+      });
+
+      test('is stored in properties', () {
+        AnalyticsImplMock mock = createMock();
+        expect(mock.properties['clientId'], isNull);
+        final value = mock.clientId;
+        expect(mock.properties['clientId'], value);
+      });
+    });
   });
 
   group('postEncode', () {
diff --git a/packages/usage/test/usage_test.dart b/packages/usage/test/usage_test.dart
index bdbd6f1..37500a9 100644
--- a/packages/usage/test/usage_test.dart
+++ b/packages/usage/test/usage_test.dart
@@ -14,7 +14,10 @@
     test('simple', () {
       AnalyticsMock mock = new AnalyticsMock();
       mock.sendScreenView('main');
+      mock.sendScreenView('withParameters', parameters: {'cd1': 'custom'});
       mock.sendEvent('files', 'save');
+      mock.sendEvent('eventWithParameters', 'save',
+          parameters: {'cd1': 'custom'});
       mock.sendSocial('g+', 'plus', 'userid');
       mock.sendTiming('compile', 123);
       mock.startTimer('compile').finish();
@@ -26,38 +29,38 @@
 
   group('sanitizeStacktrace', () {
     test('replace file', () {
-      expect(sanitizeStacktrace(
-          '(file:///Users/foo/tmp/error.dart:3:13)',
-          shorten: false),
+      expect(
+          sanitizeStacktrace('(file:///Users/foo/tmp/error.dart:3:13)',
+              shorten: false),
           '(error.dart:3:13)');
     });
 
     test('replace files', () {
-      expect(sanitizeStacktrace(
-          'foo (file:///Users/foo/tmp/error.dart:3:13)\n'
-          'bar (file:///Users/foo/tmp/error.dart:3:13)',
-          shorten: false),
+      expect(
+          sanitizeStacktrace(
+              'foo (file:///Users/foo/tmp/error.dart:3:13)\n'
+              'bar (file:///Users/foo/tmp/error.dart:3:13)',
+              shorten: false),
           'foo (error.dart:3:13)\nbar (error.dart:3:13)');
     });
 
     test('shorten 1', () {
-      expect(sanitizeStacktrace(
-          '(file:///Users/foo/tmp/error.dart:3:13)'),
+      expect(sanitizeStacktrace('(file:///Users/foo/tmp/error.dart:3:13)'),
           '(error.dart:3:13)');
     });
 
     test('shorten 2', () {
-      expect(sanitizeStacktrace(
-          'foo (file:///Users/foo/tmp/error.dart:3:13)\n'
-          'bar (file:///Users/foo/tmp/error.dart:3:13)'),
-          'foo (error.dart:3:13) bar (error.dart:3:13)');
+      expect(
+          sanitizeStacktrace('foo (file:///Users/foo/tmp/error.dart:3:13)\n'
+              'bar (file:///Users/foo/tmp/error.dart:3:13)'),
+          'foo (error.dart:3:13)\nbar (error.dart:3:13)');
     });
 
     test('shorten 3', () {
-      expect(sanitizeStacktrace(
-          'foo (package:foo/foo.dart:3:13)\n'
-          'bar (dart:async/schedule_microtask.dart:41)'),
-          'foo (foo/foo.dart:3:13) bar (async/schedule_microtask.dart:41)');
+      expect(
+          sanitizeStacktrace('foo (package:foo/foo.dart:3:13)\n'
+              'bar (dart:async/schedule_microtask.dart:41)'),
+          'foo (package:foo/foo.dart:3:13)\nbar (dart:async/schedule_microtask.dart:41)');
     });
   });
 }
diff --git a/packages/usage/test/uuid_test.dart b/packages/usage/test/uuid_test.dart
index 335d878..98dbab8 100644
--- a/packages/usage/test/uuid_test.dart
+++ b/packages/usage/test/uuid_test.dart
@@ -5,7 +5,7 @@
 library usage.uuid_test;
 
 import 'package:test/test.dart';
-import 'package:usage/src/uuid.dart';
+import 'package:usage/uuid/uuid.dart';
 
 main() => defineTests();
 
diff --git a/packages/usage/test/web_test.dart b/packages/usage/test/web_test.dart
index 5a9cd98..8d91ae9 100644
--- a/packages/usage/test/web_test.dart
+++ b/packages/usage/test/web_test.dart
@@ -6,6 +6,7 @@
 library usage.web_test;
 
 import 'dart:async';
+import 'dart:html';
 
 import 'package:test/test.dart';
 import 'package:usage/src/usage_impl_html.dart';
@@ -22,32 +23,34 @@
   usage_impl_test.defineTests();
   uuid_test.defineTests();
 
-  // Define some web specfic tests.
+  // Define some web specific tests.
   defineWebTests();
 }
 
 void defineWebTests() {
   group('HtmlPostHandler', () {
-    test('sendPost', () {
+    test('sendPost', () async {
       MockRequestor client = new MockRequestor();
-      HtmlPostHandler postHandler = new HtmlPostHandler(
-          mockRequestor: client.request);
-      Map args = {'utv': 'varName', 'utt': 123};
-      return postHandler.sendPost('http://www.google.com', args).then((_) {
-        expect(client.sendCount, 1);
-      });
+      HtmlPostHandler postHandler =
+          new HtmlPostHandler(mockRequestor: client.request);
+      Map<String, dynamic> args = {'utv': 'varName', 'utt': 123};
+
+      await postHandler.sendPost('http://www.google.com', args);
+      expect(client.sendCount, 1);
     });
   });
 
   group('HtmlPersistentProperties', () {
     test('add', () {
-      HtmlPersistentProperties props = new HtmlPersistentProperties('foo_props');
+      HtmlPersistentProperties props =
+          new HtmlPersistentProperties('foo_props');
       props['foo'] = 'bar';
       expect(props['foo'], 'bar');
     });
 
     test('remove', () {
-      HtmlPersistentProperties props = new HtmlPersistentProperties('foo_props');
+      HtmlPersistentProperties props =
+          new HtmlPersistentProperties('foo_props');
       props['foo'] = 'bar';
       expect(props['foo'], 'bar');
       props['foo'] = null;
@@ -59,7 +62,7 @@
 class MockRequestor {
   int sendCount = 0;
 
-  Future request(String url, {String method, String sendData}) {
+  Future<HttpRequest> request(String url, {String method, sendData}) {
     expect(url, isNotEmpty);
     expect(method, isNotEmpty);
     expect(sendData, isNotEmpty);
diff --git a/packages/usage/tool/drone.sh b/packages/usage/tool/drone.sh
deleted file mode 100755
index ff46f4f..0000000
--- a/packages/usage/tool/drone.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-# Fast fail the script on failures.
-set -e
-
-# Display installed versions.
-dart --version
-
-# Get our packages.
-pub get
-
-# Verify that the libraries are error free.
-dartanalyzer --fatal-warnings \
-  lib/usage.dart \
-  lib/usage_html.dart \
-  lib/usage_io.dart \
-  test/all.dart
-
-# Run the tests.
-dart test/all.dart
-
-# Measure the size of the compiled JS, for the dart:html version of the library.
-dart tool/grind.dart build
diff --git a/packages/usage/tool/grind.dart b/packages/usage/tool/grind.dart
index f1d8121..f93261b 100644
--- a/packages/usage/tool/grind.dart
+++ b/packages/usage/tool/grind.dart
@@ -12,31 +12,24 @@
 
 main(List<String> args) => grind(args);
 
-@Task('Do any necessary build set up')
-void init() {
-  // Verify we're running in the project root.
-  if (!getDir('lib').existsSync() || !getFile('pubspec.yaml').existsSync()) {
-    context.fail('This script must be run from the project root.');
-  }
-
-  _buildExampleDir.createSync(recursive: true);
-}
+@Task()
+void init() => _buildExampleDir.createSync(recursive: true);
 
 @Task()
 @Depends(init)
 void build() {
   // Compile `test/web_test.dart` to the `build/test` dir; measure its size.
   File srcFile = new File('example/example.dart');
-  Dart2js.compile(srcFile, outDir: _buildExampleDir, minify: true);
+  Dart2js.compile(srcFile,
+      outDir: _buildExampleDir,
+      minify: true,
+      extraArgs: ['--conditional-directives']);
   File outFile = joinFile(_buildExampleDir, ['example.dart.js']);
 
-  context.log('${outFile.path} compiled to ${_printSize(outFile)}');
+  log('${outFile.path} compiled to ${_printSize(outFile)}');
 }
 
-@Task('Delete all generated artifacts')
-void clean() {
-  // Delete the build/ dir.
-  delete(buildDir);
-}
+@Task()
+void clean() => delete(buildDir);
 
 String _printSize(File file) => '${(file.lengthSync() + 1023) ~/ 1024}k';
diff --git a/packages/usage/tool/travis.sh b/packages/usage/tool/travis.sh
index 5b6e2dd..a3f3082 100755
--- a/packages/usage/tool/travis.sh
+++ b/packages/usage/tool/travis.sh
@@ -9,22 +9,14 @@
 
 # Verify that the libraries are error free.
 dartanalyzer --fatal-warnings \
+  example/example.dart \
+  example/ga.dart \
   lib/usage.dart \
-  lib/usage_html.dart \
-  lib/usage_io.dart \
   test/all.dart
 
 # Run the tests.
 dart -c test/all.dart
 
-# Run the UI/web tests as well.
-#pub build test
-#pub run grinder:test build/test/web.html
-
-# Verify against DDC.
-pub global activate dev_compiler
-pub global run dev_compiler lib/usage_html.dart
-
 # Measure the size of the compiled JS, for the dart:html version of the library.
 dart tool/grind.dart build
 
diff --git a/packages/utf/.gitignore b/packages/utf/.gitignore
new file mode 100644
index 0000000..4232a2f
--- /dev/null
+++ b/packages/utf/.gitignore
@@ -0,0 +1,4 @@
+.packages
+.pub/
+packages
+pubspec.lock
diff --git a/packages/collection/.status b/packages/utf/.status
similarity index 100%
rename from packages/collection/.status
rename to packages/utf/.status
diff --git a/packages/utf/.test_config b/packages/utf/.test_config
new file mode 100644
index 0000000..20d6a22
--- /dev/null
+++ b/packages/utf/.test_config
@@ -0,0 +1,3 @@
+{
+  test_package: true
+}
diff --git a/packages/utf/AUTHORS b/packages/utf/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/packages/utf/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/packages/utf/CHANGELOG.md b/packages/utf/CHANGELOG.md
new file mode 100644
index 0000000..028311f
--- /dev/null
+++ b/packages/utf/CHANGELOG.md
@@ -0,0 +1,7 @@
+## 0.9.0+3
+
+* Code cleanup.
+
+## 0.9.0+2
+
+* ChangeLog starts here.
diff --git a/packages/utf/CONTRIBUTING.md b/packages/utf/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/packages/utf/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/packages/utf/LICENSE b/packages/utf/LICENSE
index 5c60afe..de31e1a 100644
--- a/packages/utf/LICENSE
+++ b/packages/utf/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2014, the Dart project authors. All rights reserved.
+Copyright 2015, the Dart project authors. All rights reserved.
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
diff --git a/packages/utf/README.md b/packages/utf/README.md
index fc68063..06165e4 100644
--- a/packages/utf/README.md
+++ b/packages/utf/README.md
@@ -1,5 +1,7 @@
-A Unicode manipulation library for Dart.
+Provides common operations for manipulating Unicode sequences.
 
-The utf package provides common operations for manipulating Unicode sequences.
-In its initial form it is a copy of the `dart:utf` library before that was
-deprecated.
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/utf/issues
diff --git a/packages/observe/codereview.settings b/packages/utf/codereview.settings
similarity index 60%
rename from packages/observe/codereview.settings
rename to packages/utf/codereview.settings
index ade7e33..b55fcbd 100644
--- a/packages/observe/codereview.settings
+++ b/packages/utf/codereview.settings
@@ -1,3 +1,3 @@
 CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/observe/commit/
+VIEW_VC: https://github.com/dart-lang/utf/commit/
 CC_LIST: reviews@dartlang.org
diff --git a/packages/utf/lib/src/list_range.dart b/packages/utf/lib/src/list_range.dart
index 2f3b34d..159512d 100644
--- a/packages/utf/lib/src/list_range.dart
+++ b/packages/utf/lib/src/list_range.dart
@@ -13,15 +13,15 @@
  */
 // TODO(floitsch): Consider removing the extend and switch to implements since
 // that's cheaper to allocate.
-class ListRange extends IterableBase {
-  final List _source;
+class ListRange extends IterableBase<int> {
+  final List<int> _source;
   final int _offset;
   final int _length;
 
-  ListRange(source, [offset = 0, length]) :
-      this._source = source,
-      this._offset = offset,
-      this._length = (length == null ? source.length - offset : length) {
+  ListRange(List<int> source, [offset = 0, length])
+      : this._source = source,
+        this._offset = offset,
+        this._length = (length == null ? source.length - offset : length) {
     if (_offset < 0 || _offset > _source.length) {
       throw new RangeError.value(_offset);
     }
diff --git a/packages/utf/lib/src/shared.dart b/packages/utf/lib/src/shared.dart
new file mode 100644
index 0000000..257def3
--- /dev/null
+++ b/packages/utf/lib/src/shared.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2015, 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 'util.dart';
+
+// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
+/**
+ * Provide a list of Unicode codepoints for a given string.
+ */
+List<int> stringToCodepoints(String str) {
+  // Note: str.codeUnits gives us 16-bit code units on all Dart implementations.
+  // So we need to convert.
+  return utf16CodeUnitsToCodepoints(str.codeUnits);
+}
diff --git a/packages/utf/lib/src/utf/utf16.dart b/packages/utf/lib/src/utf16.dart
similarity index 79%
rename from packages/utf/lib/src/utf/utf16.dart
rename to packages/utf/lib/src/utf16.dart
index 8ddd4dd..87ba12a 100644
--- a/packages/utf/lib/src/utf/utf16.dart
+++ b/packages/utf/lib/src/utf16.dart
@@ -2,17 +2,14 @@
 // for 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 utf;
+library utf.utf16;
 
-// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
-/**
- * Provide a list of Unicode codepoints for a given string.
- */
-List<int> stringToCodepoints(String str) {
-  // Note: str.codeUnits gives us 16-bit code units on all Dart implementations.
-  // So we need to convert.
-  return utf16CodeUnitsToCodepoints(str.codeUnits);
-}
+import "dart:collection";
+
+import 'constants.dart';
+import 'list_range.dart';
+import 'utf_16_code_unit_decoder.dart';
+import 'util.dart';
 
 /**
  * Generate a string from the provided Unicode codepoints.
@@ -23,6 +20,7 @@
 String codepointsToString(List<int> codepoints) {
   return new String.fromCharCodes(codepoints);
 }
+
 /**
  * Decodes the UTF-16 bytes as an iterable. Thus, the consumer can only convert
  * as much of the input as needed. Determines the byte order from the BOM,
@@ -31,12 +29,14 @@
  * rather than replace the bad value. The default value for
  * [replacementCodepoint] is U+FFFD.
  */
-IterableUtf16Decoder decodeUtf16AsIterable(List<int> bytes, [int offset = 0,
-    int length, int replacementCodepoint =
-    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+IterableUtf16Decoder decodeUtf16AsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new IterableUtf16Decoder._(
-      () => new Utf16BytesToCodeUnitsDecoder(bytes, offset, length,
-      replacementCodepoint), replacementCodepoint);
+      () => new Utf16BytesToCodeUnitsDecoder(
+          bytes, offset, length, replacementCodepoint),
+      replacementCodepoint);
 }
 
 /**
@@ -47,12 +47,15 @@
  * ArgumentError rather than replace the bad value. The default
  * value for the [replacementCodepoint] is U+FFFD.
  */
-IterableUtf16Decoder decodeUtf16beAsIterable(List<int> bytes, [int offset = 0,
-    int length, bool stripBom = true, int replacementCodepoint =
-    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+IterableUtf16Decoder decodeUtf16beAsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
+    bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new IterableUtf16Decoder._(
-      () => new Utf16beBytesToCodeUnitsDecoder(bytes, offset, length, stripBom,
-      replacementCodepoint), replacementCodepoint);
+      () => new Utf16beBytesToCodeUnitsDecoder(
+          bytes, offset, length, stripBom, replacementCodepoint),
+      replacementCodepoint);
 }
 
 /**
@@ -63,12 +66,15 @@
  * ArgumentError rather than replace the bad value. The default
  * value for the [replacementCodepoint] is U+FFFD.
  */
-IterableUtf16Decoder decodeUtf16leAsIterable(List<int> bytes, [int offset = 0,
-    int length, bool stripBom = true, int replacementCodepoint =
-    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+IterableUtf16Decoder decodeUtf16leAsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
+    bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new IterableUtf16Decoder._(
-      () => new Utf16leBytesToCodeUnitsDecoder(bytes, offset, length, stripBom,
-      replacementCodepoint), replacementCodepoint);
+      () => new Utf16leBytesToCodeUnitsDecoder(
+          bytes, offset, length, stripBom, replacementCodepoint),
+      replacementCodepoint);
 }
 
 /**
@@ -77,10 +83,12 @@
  * ArgumentError rather than replace the bad value. The default
  * value for the [replacementCodepoint] is U+FFFD.
  */
-String decodeUtf16(List<int> bytes, [int offset = 0, int length,
+String decodeUtf16(List<int> bytes,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  Utf16BytesToCodeUnitsDecoder decoder = new Utf16BytesToCodeUnitsDecoder(bytes,
-      offset, length, replacementCodepoint);
+  Utf16BytesToCodeUnitsDecoder decoder = new Utf16BytesToCodeUnitsDecoder(
+      bytes, offset, length, replacementCodepoint);
   List<int> codeunits = decoder.decodeRest();
   return new String.fromCharCodes(
       utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
@@ -93,11 +101,14 @@
  * null to throw an ArgumentError rather than replace the bad value.
  * The default value for the [replacementCodepoint] is U+FFFD.
  */
-String decodeUtf16be(List<int> bytes, [int offset = 0, int length,
+String decodeUtf16be(List<int> bytes,
+    [int offset = 0,
+    int length,
     bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  List<int> codeunits = (new Utf16beBytesToCodeUnitsDecoder(bytes, offset,
-      length, stripBom, replacementCodepoint)).decodeRest();
+  List<int> codeunits = (new Utf16beBytesToCodeUnitsDecoder(
+          bytes, offset, length, stripBom, replacementCodepoint))
+      .decodeRest();
   return new String.fromCharCodes(
       utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
 }
@@ -109,11 +120,14 @@
  * null to throw an ArgumentError rather than replace the bad value.
  * The default value for the [replacementCodepoint] is U+FFFD.
  */
-String decodeUtf16le(List<int> bytes, [int offset = 0, int length,
+String decodeUtf16le(List<int> bytes,
+    [int offset = 0,
+    int length,
     bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  List<int> codeunits = (new Utf16leBytesToCodeUnitsDecoder(bytes, offset,
-      length, stripBom, replacementCodepoint)).decodeRest();
+  List<int> codeunits = (new Utf16leBytesToCodeUnitsDecoder(
+          bytes, offset, length, stripBom, replacementCodepoint))
+      .decodeRest();
   return new String.fromCharCodes(
       utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
 }
@@ -122,8 +136,7 @@
  * Produce a list of UTF-16 encoded bytes. This method prefixes the resulting
  * bytes with a big-endian byte-order-marker.
  */
-List<int> encodeUtf16(String str) =>
-    encodeUtf16be(str, true);
+List<int> encodeUtf16(String str) => encodeUtf16be(str, true);
 
 /**
  * Produce a list of UTF-16BE encoded bytes. By default, this method produces
@@ -216,8 +229,8 @@
   IterableUtf16Decoder._(this.codeunitsProvider, this.replacementCodepoint);
 
   Utf16CodeUnitDecoder get iterator =>
-      new Utf16CodeUnitDecoder.fromListRangeIterator(codeunitsProvider(),
-          replacementCodepoint);
+      new Utf16CodeUnitDecoder.fromListRangeIterator(
+          codeunitsProvider(), replacementCodepoint);
 }
 
 /**
@@ -234,8 +247,9 @@
   Utf16BytesToCodeUnitsDecoder._fromListRangeIterator(
       this.utf16EncodedBytesIterator, this.replacementCodepoint);
 
-  factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
-      int offset = 0, int length,
+  factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes,
+      [int offset = 0,
+      int length,
       int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
     if (length == null) {
       length = utf16EncodedBytes.length - offset;
@@ -247,8 +261,8 @@
       return new Utf16leBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
           length - 2, false, replacementCodepoint);
     } else {
-      return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset,
-          length, false, replacementCodepoint);
+      return new Utf16beBytesToCodeUnitsDecoder(
+          utf16EncodedBytes, offset, length, false, replacementCodepoint);
     }
   }
 
@@ -315,12 +329,14 @@
  * to produce the code unit (0-(2^16)-1).
  */
 class Utf16beBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
-  Utf16beBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
-      int offset = 0, int length, bool stripBom = true,
-      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      super._fromListRangeIterator(
-          (new ListRange(utf16EncodedBytes, offset, length)).iterator,
-          replacementCodepoint) {
+  Utf16beBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes,
+      [int offset = 0,
+      int length,
+      bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : super._fromListRangeIterator(
+            (new ListRange(utf16EncodedBytes, offset, length)).iterator,
+            replacementCodepoint) {
     if (stripBom && hasUtf16beBom(utf16EncodedBytes, offset, length)) {
       skip();
     }
@@ -340,12 +356,14 @@
  * to produce the code unit (0-(2^16)-1).
  */
 class Utf16leBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
-  Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
-      int offset = 0, int length, bool stripBom = true,
-      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      super._fromListRangeIterator(
-          (new ListRange(utf16EncodedBytes, offset, length)).iterator,
-          replacementCodepoint) {
+  Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes,
+      [int offset = 0,
+      int length,
+      bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : super._fromListRangeIterator(
+            (new ListRange(utf16EncodedBytes, offset, length)).iterator,
+            replacementCodepoint) {
     if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) {
       skip();
     }
diff --git a/packages/utf/lib/src/utf/utf32.dart b/packages/utf/lib/src/utf32.dart
similarity index 76%
rename from packages/utf/lib/src/utf/utf32.dart
rename to packages/utf/lib/src/utf32.dart
index e51009d..68370c7 100644
--- a/packages/utf/lib/src/utf/utf32.dart
+++ b/packages/utf/lib/src/utf32.dart
@@ -2,7 +2,13 @@
 // for 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 utf;
+library utf.utf32;
+
+import "dart:collection";
+
+import 'constants.dart';
+import 'list_range.dart';
+import 'shared.dart';
 
 /**
  * Decodes the UTF-32 bytes as an iterable. Thus, the consumer can only convert
@@ -11,8 +17,9 @@
  * Set the replacementCharacter to null to throw an ArgumentError
  * rather than replace the bad value.
  */
-IterableUtf32Decoder decodeUtf32AsIterable(List<int> bytes, [
-    int offset = 0, int length,
+IterableUtf32Decoder decodeUtf32AsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new IterableUtf32Decoder._(
       () => new Utf32BytesDecoder(bytes, offset, length, replacementCodepoint));
@@ -25,12 +32,13 @@
  * Set the replacementCharacter to null to throw an ArgumentError
  * rather than replace the bad value.
  */
-IterableUtf32Decoder decodeUtf32beAsIterable(List<int> bytes, [
-    int offset = 0, int length, bool stripBom = true,
+IterableUtf32Decoder decodeUtf32beAsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
+    bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return new IterableUtf32Decoder._(
-      () => new Utf32beBytesDecoder(bytes, offset, length, stripBom,
-          replacementCodepoint));
+  return new IterableUtf32Decoder._(() => new Utf32beBytesDecoder(
+      bytes, offset, length, stripBom, replacementCodepoint));
 }
 
 /**
@@ -40,12 +48,13 @@
  * Set the replacementCharacter to null to throw an ArgumentError
  * rather than replace the bad value.
  */
-IterableUtf32Decoder decodeUtf32leAsIterable(List<int> bytes, [
-    int offset = 0, int length, bool stripBom = true,
+IterableUtf32Decoder decodeUtf32leAsIterable(List<int> bytes,
+    [int offset = 0,
+    int length,
+    bool stripBom = true,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return new IterableUtf32Decoder._(
-      () => new Utf32leBytesDecoder(bytes, offset, length, stripBom,
-          replacementCodepoint));
+  return new IterableUtf32Decoder._(() => new Utf32leBytesDecoder(
+      bytes, offset, length, stripBom, replacementCodepoint));
 }
 
 /**
@@ -55,11 +64,15 @@
  * replacement character. Set the replacementCharacter to null to throw an
  * ArgumentError rather than replace the bad value.
  */
-String decodeUtf32(List<int> bytes, [int offset = 0, int length,
+String decodeUtf32(List<int> bytes,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return new String.fromCharCodes((new Utf32BytesDecoder(bytes, offset, length,
-      replacementCodepoint)).decodeRest());
+  return new String.fromCharCodes(
+      (new Utf32BytesDecoder(bytes, offset, length, replacementCodepoint))
+          .decodeRest());
 }
+
 /**
  * Produce a String from a sequence of UTF-32BE encoded bytes. The parameters
  * allow an offset into a list of bytes (as int), limiting the length of the
@@ -67,11 +80,14 @@
  * replacement character. Set the replacementCharacter to null to throw an
  * ArgumentError rather than replace the bad value.
  */
-String decodeUtf32be(
-    List<int> bytes, [int offset = 0, int length, bool stripBom = true,
-    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
-  new String.fromCharCodes((new Utf32beBytesDecoder(bytes, offset, length,
-    stripBom, replacementCodepoint)).decodeRest());
+String decodeUtf32be(List<int> bytes,
+        [int offset = 0,
+        int length,
+        bool stripBom = true,
+        int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
+    new String.fromCharCodes((new Utf32beBytesDecoder(
+            bytes, offset, length, stripBom, replacementCodepoint))
+        .decodeRest());
 
 /**
  * Produce a String from a sequence of UTF-32LE encoded bytes. The parameters
@@ -80,18 +96,20 @@
  * replacement character. Set the replacementCharacter to null to throw an
  * ArgumentError rather than replace the bad value.
  */
-String decodeUtf32le(
-    List<int> bytes, [int offset = 0, int length, bool stripBom = true,
-    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
-    new String.fromCharCodes((new Utf32leBytesDecoder(bytes, offset, length,
-      stripBom, replacementCodepoint)).decodeRest());
+String decodeUtf32le(List<int> bytes,
+        [int offset = 0,
+        int length,
+        bool stripBom = true,
+        int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
+    new String.fromCharCodes((new Utf32leBytesDecoder(
+            bytes, offset, length, stripBom, replacementCodepoint))
+        .decodeRest());
 
 /**
  * Produce a list of UTF-32 encoded bytes. This method prefixes the resulting
  * bytes with a big-endian byte-order-marker.
  */
-List<int> encodeUtf32(String str) =>
-    encodeUtf32be(str, true);
+List<int> encodeUtf32(String str) => encodeUtf32be(str, true);
 
 /**
  * Produce a list of UTF-32BE encoded bytes. By default, this method produces
@@ -99,8 +117,8 @@
  */
 List<int> encodeUtf32be(String str, [bool writeBOM = false]) {
   List<int> utf32CodeUnits = stringToCodepoints(str);
-  List<int> encoding = new List<int>(4 * utf32CodeUnits.length +
-      (writeBOM ? 4 : 0));
+  List<int> encoding =
+      new List<int>(4 * utf32CodeUnits.length + (writeBOM ? 4 : 0));
   int i = 0;
   if (writeBOM) {
     encoding[i++] = 0;
@@ -123,8 +141,8 @@
  */
 List<int> encodeUtf32le(String str, [bool writeBOM = false]) {
   List<int> utf32CodeUnits = stringToCodepoints(str);
-  List<int> encoding = new List<int>(4 * utf32CodeUnits.length +
-      (writeBOM ? 4 : 0));
+  List<int> encoding =
+      new List<int>(4 * utf32CodeUnits.length + (writeBOM ? 4 : 0));
   int i = 0;
   if (writeBOM) {
     encoding[i++] = UNICODE_UTF_BOM_LO;
@@ -145,8 +163,7 @@
  * Identifies whether a List of bytes starts (based on offset) with a
  * byte-order marker (BOM).
  */
-bool hasUtf32Bom(
-    List<int> utf32EncodedBytes, [int offset = 0, int length]) {
+bool hasUtf32Bom(List<int> utf32EncodedBytes, [int offset = 0, int length]) {
   return hasUtf32beBom(utf32EncodedBytes, offset, length) ||
       hasUtf32leBom(utf32EncodedBytes, offset, length);
 }
@@ -158,7 +175,8 @@
 bool hasUtf32beBom(List<int> utf32EncodedBytes, [int offset = 0, int length]) {
   int end = length != null ? offset + length : utf32EncodedBytes.length;
   return (offset + 4) <= end &&
-      utf32EncodedBytes[offset] == 0 && utf32EncodedBytes[offset + 1] == 0 &&
+      utf32EncodedBytes[offset] == 0 &&
+      utf32EncodedBytes[offset + 1] == 0 &&
       utf32EncodedBytes[offset + 2] == UNICODE_UTF_BOM_HI &&
       utf32EncodedBytes[offset + 3] == UNICODE_UTF_BOM_LO;
 }
@@ -172,7 +190,8 @@
   return (offset + 4) <= end &&
       utf32EncodedBytes[offset] == UNICODE_UTF_BOM_LO &&
       utf32EncodedBytes[offset + 1] == UNICODE_UTF_BOM_HI &&
-      utf32EncodedBytes[offset + 2] == 0 && utf32EncodedBytes[offset + 3] == 0;
+      utf32EncodedBytes[offset + 2] == 0 &&
+      utf32EncodedBytes[offset + 3] == 0;
 }
 
 typedef Utf32BytesDecoder Utf32BytesDecoderProvider();
@@ -204,8 +223,9 @@
   Utf32BytesDecoder._fromListRangeIterator(
       this.utf32EncodedBytesIterator, this.replacementCodepoint);
 
-  factory Utf32BytesDecoder(List<int> utf32EncodedBytes, [
-      int offset = 0, int length,
+  factory Utf32BytesDecoder(List<int> utf32EncodedBytes,
+      [int offset = 0,
+      int length,
       int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
     if (length == null) {
       length = utf32EncodedBytes.length - offset;
@@ -217,8 +237,8 @@
       return new Utf32leBytesDecoder(utf32EncodedBytes, offset + 4, length - 4,
           false, replacementCodepoint);
     } else {
-      return new Utf32beBytesDecoder(utf32EncodedBytes, offset, length, false,
-          replacementCodepoint);
+      return new Utf32beBytesDecoder(
+          utf32EncodedBytes, offset, length, false, replacementCodepoint);
     }
   }
 
@@ -243,8 +263,8 @@
     if (remaining < 4) {
       utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining);
       if (replacementCodepoint != null) {
-          _current = replacementCodepoint;
-          return true;
+        _current = replacementCodepoint;
+        return true;
       } else {
         throw new ArgumentError(
             "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
@@ -283,12 +303,14 @@
  * to produce the unicode codepoint.
  */
 class Utf32beBytesDecoder extends Utf32BytesDecoder {
-  Utf32beBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
-      int length, bool stripBom = true,
-      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      super._fromListRangeIterator(
-          (new ListRange(utf32EncodedBytes, offset, length)).iterator,
-          replacementCodepoint) {
+  Utf32beBytesDecoder(List<int> utf32EncodedBytes,
+      [int offset = 0,
+      int length,
+      bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : super._fromListRangeIterator(
+            (new ListRange(utf32EncodedBytes, offset, length)).iterator,
+            replacementCodepoint) {
     if (stripBom && hasUtf32beBom(utf32EncodedBytes, offset, length)) {
       skip();
     }
@@ -312,12 +334,14 @@
  * to produce the unicode codepoint.
  */
 class Utf32leBytesDecoder extends Utf32BytesDecoder {
-  Utf32leBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
-      int length, bool stripBom = true,
-      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      super._fromListRangeIterator(
-          (new ListRange(utf32EncodedBytes, offset, length)).iterator,
-          replacementCodepoint) {
+  Utf32leBytesDecoder(List<int> utf32EncodedBytes,
+      [int offset = 0,
+      int length,
+      bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : super._fromListRangeIterator(
+            (new ListRange(utf32EncodedBytes, offset, length)).iterator,
+            replacementCodepoint) {
     if (stripBom && hasUtf32leBom(utf32EncodedBytes, offset, length)) {
       skip();
     }
@@ -339,5 +363,5 @@
 bool _validCodepoint(int codepoint) {
   return (codepoint >= 0 && codepoint < UNICODE_UTF16_RESERVED_LO) ||
       (codepoint > UNICODE_UTF16_RESERVED_HI &&
-      codepoint < UNICODE_VALID_RANGE_MAX);
+          codepoint < UNICODE_VALID_RANGE_MAX);
 }
diff --git a/packages/utf/lib/src/utf/utf8.dart b/packages/utf/lib/src/utf8.dart
similarity index 79%
rename from packages/utf/lib/src/utf/utf8.dart
rename to packages/utf/lib/src/utf8.dart
index ff1b1ed..ecf8707 100644
--- a/packages/utf/lib/src/utf/utf8.dart
+++ b/packages/utf/lib/src/utf8.dart
@@ -2,7 +2,13 @@
 // for 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 utf;
+library utf.utf8;
+
+import "dart:collection";
+
+import 'constants.dart';
+import 'list_range.dart';
+import 'shared.dart';
 
 const int _UTF8_ONE_BYTE_MAX = 0x7f;
 const int _UTF8_TWO_BYTE_MAX = 0x7ff;
@@ -28,7 +34,8 @@
  * as much of the input as needed. Set the replacementCharacter to null to
  * throw an ArgumentError rather than replace the bad value.
  */
-IterableUtf8Decoder decodeUtf8AsIterable(List<int> bytes, [int offset = 0,
+IterableUtf8Decoder decodeUtf8AsIterable(List<int> bytes,
+    [int offset = 0,
     int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new IterableUtf8Decoder(bytes, offset, length, replacementCodepoint);
@@ -41,23 +48,24 @@
  * Set the replacementCharacter to null to throw an ArgumentError
  * rather than replace the bad value.
  */
-String decodeUtf8(List<int> bytes, [int offset = 0, int length,
+String decodeUtf8(List<int> bytes,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   return new String.fromCharCodes(
       (new Utf8Decoder(bytes, offset, length, replacementCodepoint))
-      .decodeRest());
+          .decodeRest());
 }
 
 /**
  * Produce a sequence of UTF-8 encoded bytes from the provided string.
  */
-List<int> encodeUtf8(String str) =>
-  codepointsToUtf8(stringToCodepoints(str));
+List<int> encodeUtf8(String str) => codepointsToUtf8(stringToCodepoints(str));
 
 int _addToEncoding(int offset, int bytes, int value, List<int> buffer) {
   while (bytes > 0) {
-    buffer[offset + bytes] = _UTF8_SUBSEQUENT_BYTE_BASE |
-        (value & _UTF8_LO_SIX_BIT_MASK);
+    buffer[offset + bytes] =
+        _UTF8_SUBSEQUENT_BYTE_BASE | (value & _UTF8_LO_SIX_BIT_MASK);
     value = value >> 6;
     bytes--;
   }
@@ -67,8 +75,7 @@
 /**
  * Encode code points as UTF-8 code units.
  */
-List<int> codepointsToUtf8(
-    List<int> codepoints, [int offset = 0, int length]) {
+List<int> codepointsToUtf8(List<int> codepoints, [int offset = 0, int length]) {
   ListRange source = new ListRange(codepoints, offset, length);
 
   int encodedLength = 0;
@@ -96,19 +103,19 @@
       encoded[insertAt] = value;
       insertAt++;
     } else if (value <= _UTF8_TWO_BYTE_MAX) {
-      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_TWO_BASE | (
-          _UTF8_FIRST_BYTE_OF_TWO_MASK &
-          _addToEncoding(insertAt, 1, value, encoded));
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_TWO_BASE |
+          (_UTF8_FIRST_BYTE_OF_TWO_MASK &
+              _addToEncoding(insertAt, 1, value, encoded));
       insertAt += 2;
     } else if (value <= _UTF8_THREE_BYTE_MAX) {
-      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_THREE_BASE | (
-          _UTF8_FIRST_BYTE_OF_THREE_MASK &
-          _addToEncoding(insertAt, 2, value, encoded));
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_THREE_BASE |
+          (_UTF8_FIRST_BYTE_OF_THREE_MASK &
+              _addToEncoding(insertAt, 2, value, encoded));
       insertAt += 3;
     } else if (value <= UNICODE_VALID_RANGE_MAX) {
-      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_FOUR_BASE | (
-          _UTF8_FIRST_BYTE_OF_FOUR_MASK &
-          _addToEncoding(insertAt, 3, value, encoded));
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_FOUR_BASE |
+          (_UTF8_FIRST_BYTE_OF_FOUR_MASK &
+              _addToEncoding(insertAt, 3, value, encoded));
       insertAt += 4;
     }
   }
@@ -117,11 +124,12 @@
 
 // Because UTF-8 specifies byte order, we do not have to follow the pattern
 // used by UTF-16 & UTF-32 regarding byte order.
-List<int> utf8ToCodepoints(
-    List<int> utf8EncodedBytes, [int offset = 0, int length,
+List<int> utf8ToCodepoints(List<int> utf8EncodedBytes,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-  return new Utf8Decoder(utf8EncodedBytes, offset, length,
-      replacementCodepoint).decodeRest();
+  return new Utf8Decoder(utf8EncodedBytes, offset, length, replacementCodepoint)
+      .decodeRest();
 }
 
 /**
@@ -137,7 +145,9 @@
   final int length;
   final int replacementCodepoint;
 
-  IterableUtf8Decoder(this.bytes, [this.offset = 0, this.length = null,
+  IterableUtf8Decoder(this.bytes,
+      [this.offset = 0,
+      this.length = null,
       this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
 
   Utf8Decoder get iterator =>
@@ -158,17 +168,16 @@
   final int replacementCodepoint;
   int _current = null;
 
-  Utf8Decoder(List<int> utf8EncodedBytes, [int offset = 0, int length,
-      this.replacementCodepoint =
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      utf8EncodedBytesIterator =
-          (new ListRange(utf8EncodedBytes, offset, length)).iterator;
+  Utf8Decoder(List<int> utf8EncodedBytes,
+      [int offset = 0,
+      int length,
+      this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : utf8EncodedBytesIterator =
+            (new ListRange(utf8EncodedBytes, offset, length)).iterator;
 
-
-  Utf8Decoder._fromListRangeIterator(ListRange source, [
-      this.replacementCodepoint =
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      utf8EncodedBytesIterator = source.iterator;
+  Utf8Decoder._fromListRangeIterator(ListRange source,
+      [this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : utf8EncodedBytesIterator = source.iterator;
 
   /** Decode the remaininder of the characters in this decoder
     * into a [List<int>].
@@ -254,11 +263,10 @@
       }
       j++;
     }
-    bool validSequence = (j == additionalBytes && (
-        value < UNICODE_UTF16_RESERVED_LO ||
-        value > UNICODE_UTF16_RESERVED_HI));
-    bool nonOverlong =
-        (additionalBytes == 1 && value > _UTF8_ONE_BYTE_MAX) ||
+    bool validSequence = (j == additionalBytes &&
+        (value < UNICODE_UTF16_RESERVED_LO ||
+            value > UNICODE_UTF16_RESERVED_HI));
+    bool nonOverlong = (additionalBytes == 1 && value > _UTF8_ONE_BYTE_MAX) ||
         (additionalBytes == 2 && value > _UTF8_TWO_BYTE_MAX) ||
         (additionalBytes == 3 && value > _UTF8_THREE_BYTE_MAX);
     bool inRange = value <= UNICODE_VALID_RANGE_MAX;
diff --git a/packages/utf/lib/src/utf_16_code_unit_decoder.dart b/packages/utf/lib/src/utf_16_code_unit_decoder.dart
index a0a4b3c..7d9e98f 100644
--- a/packages/utf/lib/src/utf_16_code_unit_decoder.dart
+++ b/packages/utf/lib/src/utf_16_code_unit_decoder.dart
@@ -19,11 +19,12 @@
   final int replacementCodepoint;
   int _current = null;
 
-  Utf16CodeUnitDecoder(List<int> utf16CodeUnits, [int offset = 0, int length,
-      int this.replacementCodepoint =
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
-      utf16CodeUnitIterator =
-          (new ListRange(utf16CodeUnits, offset, length)).iterator;
+  Utf16CodeUnitDecoder(List<int> utf16CodeUnits,
+      [int offset = 0,
+      int length,
+      int this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : utf16CodeUnitIterator =
+            (new ListRange(utf16CodeUnits, offset, length)).iterator;
 
   Utf16CodeUnitDecoder.fromListRangeIterator(
       ListRangeIterator this.utf16CodeUnitIterator,
@@ -61,7 +62,7 @@
         _current = value;
       } else {
         if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_0_BASE &&
-           nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) {
+            nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) {
           utf16CodeUnitIterator.backup();
         }
         if (replacementCodepoint != null) {
@@ -80,4 +81,3 @@
     return true;
   }
 }
-
diff --git a/packages/utf/lib/src/utf/utf_stream.dart b/packages/utf/lib/src/utf_stream.dart
similarity index 84%
rename from packages/utf/lib/src/utf/utf_stream.dart
rename to packages/utf/lib/src/utf_stream.dart
index 0936616..83e442f 100644
--- a/packages/utf/lib/src/utf/utf_stream.dart
+++ b/packages/utf/lib/src/utf_stream.dart
@@ -2,7 +2,12 @@
 // for 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 utf;
+library utf.utf_stream;
+
+import 'dart:async';
+
+import 'constants.dart';
+import 'util.dart';
 
 // TODO(floitsch): make this transformer reusable.
 abstract class _StringDecoder
@@ -16,15 +21,14 @@
   _StringDecoder(int this._replacementChar);
 
   Stream<String> bind(Stream<List<int>> stream) {
-    return new Stream.eventTransformed(
-        stream,
+    return new Stream<String>.eventTransformed(stream,
         (EventSink<String> sink) {
-          if (_outSink != null) {
-            throw new StateError("String decoder already used");
-          }
-          _outSink = sink;
-          return this;
-        });
+      if (_outSink != null) {
+        throw new StateError("String decoder already used");
+      }
+      _outSink = sink;
+      return this;
+    });
   }
 
   void add(List<int> bytes) {
@@ -117,31 +121,36 @@
 class Utf8DecoderTransformer extends _StringDecoder {
   Utf8DecoderTransformer(
       [int replacementChar = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
-    : super(replacementChar);
+      : super(replacementChar);
 
   int _processBytes(int getNext()) {
     int value = getNext();
-    if ((value & 0xFF) != value) return -1;  // Not a byte.
+    if ((value & 0xFF) != value) return -1; // Not a byte.
     if ((value & 0x80) == 0x80) {
       int additionalBytes;
       int min;
-      if ((value & 0xe0) == 0xc0) {  // 110xxxxx
+      if ((value & 0xe0) == 0xc0) {
+        // 110xxxxx
         value = value & 0x1F;
         additionalBytes = 1;
         min = 0x80;
-      } else if ((value & 0xf0) == 0xe0) {  // 1110xxxx
+      } else if ((value & 0xf0) == 0xe0) {
+        // 1110xxxx
         value = value & 0x0F;
         additionalBytes = 2;
         min = 0x800;
-      } else if ((value & 0xf8) == 0xf0) {  // 11110xxx
+      } else if ((value & 0xf8) == 0xf0) {
+        // 11110xxx
         value = value & 0x07;
         additionalBytes = 3;
         min = 0x10000;
-      } else if ((value & 0xfc) == 0xf8) {  // 111110xx
+      } else if ((value & 0xfc) == 0xf8) {
+        // 111110xx
         value = value & 0x03;
         additionalBytes = 4;
         min = 0x200000;
-      } else if ((value & 0xfe) == 0xfc) {  // 1111110x
+      } else if ((value & 0xfe) == 0xfc) {
+        // 1111110x
         value = value & 0x01;
         additionalBytes = 5;
         min = 0x4000000;
@@ -150,7 +159,7 @@
       }
       for (int i = 0; i < additionalBytes; i++) {
         int next = getNext();
-        if (next == null) return 0;  // Not enough chars, reset.
+        if (next == null) return 0; // Not enough chars, reset.
         if ((next & 0xc0) != 0x80 || (next & 0xff) != next) return -1;
         value = value << 6 | (next & 0x3f);
         if (additionalBytes >= 3 && i == 0 && value << 12 > 0x10FFFF) {
@@ -167,22 +176,19 @@
   }
 }
 
-
 abstract class _StringEncoder
     implements StreamTransformer<String, List<int>>, EventSink<String> {
-
   EventSink<List<int>> _outSink;
 
   Stream<List<int>> bind(Stream<String> stream) {
-    return new Stream.eventTransformed(
-        stream,
+    return new Stream<List<int>>.eventTransformed(stream,
         (EventSink<List<int>> sink) {
-          if (_outSink != null) {
-            throw new StateError("String encoder already used");
-          }
-          _outSink = sink;
-          return this;
-        });
+      if (_outSink != null) {
+        throw new StateError("String encoder already used");
+      }
+      _outSink = sink;
+      return this;
+    });
   }
 
   void add(String data) {
@@ -193,7 +199,9 @@
     _outSink.addError(error, stackTrace);
   }
 
-  void close() { _outSink.close(); }
+  void close() {
+    _outSink.close();
+  }
 
   List<int> _processString(String string);
 }
@@ -204,7 +212,6 @@
 class Utf8EncoderTransformer extends _StringEncoder {
   List<int> _processString(String string) {
     var bytes = <int>[];
-    int pos = 0;
     List<int> codepoints = utf16CodeUnitsToCodepoints(string.codeUnits);
     int length = codepoints.length;
     for (int i = 0; i < length; i++) {
@@ -219,7 +226,7 @@
         additionalBytes = 1;
       } else if (charCode <= 0xFFFF) {
         // 1110xxxx (xxxx is top 4 bits)
-        bytes.add(((charCode >> 12) & 0x0F)| 0xE0);
+        bytes.add(((charCode >> 12) & 0x0F) | 0xE0);
         additionalBytes = 2;
       } else {
         // 11110xxx (xxx is top 3 bits)
@@ -230,7 +237,6 @@
         // 10xxxxxx (xxxxxx is next 6 bits from the top).
         bytes.add(((charCode >> (6 * (i - 1))) & 0x3F) | 0x80);
       }
-      pos += additionalBytes + 1;
     }
     return bytes;
   }
diff --git a/packages/utf/lib/src/util.dart b/packages/utf/lib/src/util.dart
index 17427d5..f94f576 100644
--- a/packages/utf/lib/src/util.dart
+++ b/packages/utf/lib/src/util.dart
@@ -11,13 +11,14 @@
 /**
  * Decodes the utf16 codeunits to codepoints.
  */
-List<int> utf16CodeUnitsToCodepoints(
-    List<int> utf16CodeUnits, [int offset = 0, int length,
+List<int> utf16CodeUnitsToCodepoints(List<int> utf16CodeUnits,
+    [int offset = 0,
+    int length,
     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   ListRangeIterator source =
       (new ListRange(utf16CodeUnits, offset, length)).iterator;
-  Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder
-      .fromListRangeIterator(source, replacementCodepoint);
+  Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder.fromListRangeIterator(
+      source, replacementCodepoint);
   List<int> codepoints = new List<int>(source.remaining);
   int i = 0;
   while (decoder.moveNext()) {
@@ -35,12 +36,10 @@
 /**
  * Encode code points as UTF16 code units.
  */
-List<int> codepointsToUtf16CodeUnits(
-    List<int> codepoints,
+List<int> codepointsToUtf16CodeUnits(List<int> codepoints,
     [int offset = 0,
-     int length,
-     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
-
+    int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
   ListRange listRange = new ListRange(codepoints, offset, length);
   int encodedLength = 0;
   for (int value in listRange) {
@@ -66,8 +65,8 @@
       int base = value - UNICODE_UTF16_OFFSET;
       codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
           ((base & UNICODE_UTF16_HI_MASK) >> 10);
-      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_1_BASE +
-          (base & UNICODE_UTF16_LO_MASK);
+      codeUnitsBuffer[j++] =
+          UNICODE_UTF16_SURROGATE_UNIT_1_BASE + (base & UNICODE_UTF16_LO_MASK);
     } else if (replacementCodepoint != null) {
       codeUnitsBuffer[j++] = replacementCodepoint;
     } else {
diff --git a/packages/utf/lib/utf.dart b/packages/utf/lib/utf.dart
index 30d5db5..40ffcfe 100644
--- a/packages/utf/lib/utf.dart
+++ b/packages/utf/lib/utf.dart
@@ -8,18 +8,10 @@
  */
 library utf;
 
-import "dart:async";
-import "dart:collection";
-
-import "src/constants.dart";
-import 'src/utf_16_code_unit_decoder.dart';
-import 'src/list_range.dart';
-import 'src/util.dart';
-
 export 'src/constants.dart';
+export 'src/shared.dart';
 export 'src/utf_16_code_unit_decoder.dart';
-
-part "src/utf/utf_stream.dart";
-part "src/utf/utf8.dart";
-part "src/utf/utf16.dart";
-part "src/utf/utf32.dart";
+export 'src/utf_stream.dart';
+export 'src/utf16.dart';
+export 'src/utf32.dart';
+export 'src/utf8.dart';
diff --git a/packages/utf/pubspec.yaml b/packages/utf/pubspec.yaml
index 519bed4..8fb2c51 100644
--- a/packages/utf/pubspec.yaml
+++ b/packages/utf/pubspec.yaml
@@ -1,9 +1,10 @@
 name: utf
-version: 0.9.0+2
+version: 0.9.0+3
 author: Dart Team <misc@dartlang.org>
 description: >
- A Unicode library. Intended for advanced use where the built-in facilities
- are too limiting.
-homepage: https://pub.dartlang.org/packages/utf
+ Provides common operations for manipulating Unicode sequences
+homepage: https://www.github.com/dart-lang/utf
 environment:
   sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  test: ^0.12.0
diff --git a/packages/utf/test/expect.dart b/packages/utf/test/expect.dart
new file mode 100644
index 0000000..9978969
--- /dev/null
+++ b/packages/utf/test/expect.dart
@@ -0,0 +1,17 @@
+import 'package:test/test.dart' as ut;
+
+void listEquals(a, b, [String message]) {
+  ut.expect(b, ut.orderedEquals(a), reason: message);
+}
+
+void equals(a, b) {
+  ut.expect(b, ut.equals(a));
+}
+
+void stringEquals(String a, String b, [String message]) {
+  ut.expect(b, ut.equals(a), reason: message);
+}
+
+void isFalse(value) {
+  ut.expect(value, ut.isFalse);
+}
diff --git a/packages/utf/test/unicode_core_test.dart b/packages/utf/test/unicode_core_test.dart
index 6e13e96..24cc710 100755
--- a/packages/utf/test/unicode_core_test.dart
+++ b/packages/utf/test/unicode_core_test.dart
@@ -4,32 +4,30 @@
 
 library utf.unicode_core_test;
 
-import 'package:expect/expect.dart';
-
+import 'package:test/test.dart';
 import 'package:utf/utf.dart';
 import 'package:utf/src/util.dart';
 
+import 'expect.dart' as Expect;
+
 void main() {
-  testCodepointsToUtf16CodeUnits();
-  testUtf16bytesToCodepoints();
+  test('codepoints to utf16 codepoints', testCodepointsToUtf16CodeUnits);
+  test('utf16 bytes to codepoints', testUtf16bytesToCodepoints);
 }
 
 void testCodepointsToUtf16CodeUnits() {
   // boundary conditions
   Expect.listEquals([], codepointsToUtf16CodeUnits([]), "no input");
   Expect.listEquals([0x0], codepointsToUtf16CodeUnits([0x0]), "0");
-  Expect.listEquals([0xd800, 0xdc00],
-      codepointsToUtf16CodeUnits([0x10000]), "10000");
+  Expect.listEquals(
+      [0xd800, 0xdc00], codepointsToUtf16CodeUnits([0x10000]), "10000");
 
-  Expect.listEquals([0xffff],
-      codepointsToUtf16CodeUnits([0xffff]), "ffff");
-  Expect.listEquals([0xdbff, 0xdfff],
-      codepointsToUtf16CodeUnits([0x10ffff]), "10ffff");
+  Expect.listEquals([0xffff], codepointsToUtf16CodeUnits([0xffff]), "ffff");
+  Expect.listEquals(
+      [0xdbff, 0xdfff], codepointsToUtf16CodeUnits([0x10ffff]), "10ffff");
 
-  Expect.listEquals([0xd7ff],
-      codepointsToUtf16CodeUnits([0xd7ff]), "d7ff");
-  Expect.listEquals([0xe000],
-      codepointsToUtf16CodeUnits([0xe000]), "e000");
+  Expect.listEquals([0xd7ff], codepointsToUtf16CodeUnits([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000], codepointsToUtf16CodeUnits([0xe000]), "e000");
 
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       codepointsToUtf16CodeUnits([0xd800]), "d800");
@@ -41,52 +39,49 @@
   // boundary conditions: First possible values
   Expect.listEquals([], utf16CodeUnitsToCodepoints([]), "no input");
   Expect.listEquals([0x0], utf16CodeUnitsToCodepoints([0x0]), "0");
-  Expect.listEquals([0x10000],
-      utf16CodeUnitsToCodepoints([0xd800, 0xdc00]), "10000");
+  Expect.listEquals(
+      [0x10000], utf16CodeUnitsToCodepoints([0xd800, 0xdc00]), "10000");
 
   // boundary conditions: Last possible sequence of a certain length
-  Expect.listEquals([0xffff],
-      utf16CodeUnitsToCodepoints([0xffff]), "ffff");
-  Expect.listEquals([0x10ffff],
-      utf16CodeUnitsToCodepoints([0xdbff, 0xdfff]), "10ffff");
+  Expect.listEquals([0xffff], utf16CodeUnitsToCodepoints([0xffff]), "ffff");
+  Expect.listEquals(
+      [0x10ffff], utf16CodeUnitsToCodepoints([0xdbff, 0xdfff]), "10ffff");
 
   // other boundary conditions
-  Expect.listEquals([0xd7ff],
-      utf16CodeUnitsToCodepoints([0xd7ff]), "d7ff");
-  Expect.listEquals([0xe000],
-      utf16CodeUnitsToCodepoints([0xe000]), "e000");
+  Expect.listEquals([0xd7ff], utf16CodeUnitsToCodepoints([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000], utf16CodeUnitsToCodepoints([0xe000]), "e000");
 
   // unexpected continuation bytes
-  Expect.listEquals([0xfffd],
-      utf16CodeUnitsToCodepoints([0xdc00]),
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdc00]),
       "dc00 first unexpected continuation byte");
-  Expect.listEquals([0xfffd],
-      utf16CodeUnitsToCodepoints([0xdfff]),
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdfff]),
       "dfff last unexpected continuation byte");
-  Expect.listEquals([0xfffd],
-      utf16CodeUnitsToCodepoints([0xdc00]),
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdc00]),
       "1 unexpected continuation bytes");
-  Expect.listEquals([0xfffd, 0xfffd],
+  Expect.listEquals(
+      [0xfffd, 0xfffd],
       utf16CodeUnitsToCodepoints([0xdc00, 0xdc00]),
       "2 unexpected continuation bytes");
-  Expect.listEquals([0xfffd, 0xfffd ,0xfffd],
+  Expect.listEquals(
+      [0xfffd, 0xfffd, 0xfffd],
       utf16CodeUnitsToCodepoints([0xdc00, 0xdc00, 0xdc00]),
       "3 unexpected continuation bytes");
 
   // incomplete sequences
-  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xd800]),
-      "d800 last byte missing");
-  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdbff]),
-      "dbff last byte missing");
+  Expect.listEquals(
+      [0xfffd], utf16CodeUnitsToCodepoints([0xd800]), "d800 last byte missing");
+  Expect.listEquals(
+      [0xfffd], utf16CodeUnitsToCodepoints([0xdbff]), "dbff last byte missing");
 
   // concatenation of incomplete sequences
-  Expect.listEquals([0xfffd, 0xfffd],
+  Expect.listEquals(
+      [0xfffd, 0xfffd],
       utf16CodeUnitsToCodepoints([0xd800, 0xdbff]),
       "d800 dbff last byte missing");
 
   // impossible bytes
-  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0x110000]),
-      "110000 out of bounds");
+  Expect.listEquals(
+      [0xfffd], utf16CodeUnitsToCodepoints([0x110000]), "110000 out of bounds");
 
   // overlong sequences not possible in utf16 (nothing < x10000)
   // illegal code positions d800-dfff not encodable (< x10000)
diff --git a/packages/utf/test/utf16_test.dart b/packages/utf/test/utf16_test.dart
index 43971ca..f2274e6 100755
--- a/packages/utf/test/utf16_test.dart
+++ b/packages/utf/test/utf16_test.dart
@@ -4,9 +4,11 @@
 
 library utf.utf16_test;
 
-import 'package:expect/expect.dart';
+import 'package:test/test.dart';
 import 'package:utf/utf.dart';
 
+import 'expect.dart' as Expect;
+
 const String testKoreanCharSubset = """
 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
 개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
@@ -14,90 +16,89 @@
 
 const String testHanWater = "水";
 
-const List<int> testKoreanCharSubsetUtf16beBom = const<int>[
-    0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02,
-    0xac, 0x03, 0xac, 0x04, 0xac, 0x05, 0xac, 0x06,
-    0xac, 0x07, 0xac, 0x08, 0xac, 0x09, 0xac, 0x0a,
-    0xac, 0x0b, 0xac, 0x0c, 0xac, 0x0d, 0xac, 0x0e,
-    0xac, 0x0f, 0xac, 0x10, 0xac, 0x11, 0xac, 0x12,
-    0xac, 0x13, 0xac, 0x14, 0xac, 0x15, 0xac, 0x16,
-    0xac, 0x17, 0xac, 0x18, 0xac, 0x19, 0xac, 0x1a,
-    0xac, 0x1b, 0x00, 0x0a, 0xac, 0x1c, 0xac, 0x1d,
-    0xac, 0x1e, 0xac, 0x1f, 0xac, 0x20, 0xac, 0x21,
-    0xac, 0x22, 0xac, 0x23, 0xac, 0x24, 0xac, 0x25,
-    0xac, 0x26, 0xac, 0x27, 0xac, 0x28, 0xac, 0x29,
-    0xac, 0x2a, 0xac, 0x2b, 0xac, 0x2c, 0xac, 0x2d,
-    0xac, 0x2e, 0xac, 0x2f, 0xac, 0x30, 0xac, 0x31,
-    0xac, 0x32, 0xac, 0x33, 0xac, 0x34, 0xac, 0x35,
-    0xac, 0x36, 0xac, 0x37, 0x00, 0x0a, 0xac, 0x38,
-    0xac, 0x39, 0xac, 0x3a, 0xac, 0x3b, 0xac, 0x3c,
-    0xac, 0x3d, 0xac, 0x3e, 0xac, 0x3f, 0xac, 0x40,
-    0xac, 0x41, 0xac, 0x42, 0xac, 0x43, 0xac, 0x44,
-    0xac, 0x45, 0xac, 0x46, 0xac, 0x47, 0xac, 0x48,
-    0xac, 0x49, 0xac, 0x4a, 0xac, 0x4b, 0xac, 0x4c,
-    0xac, 0x4d, 0xac, 0x4e, 0xac, 0x4f, 0xac, 0x50,
-    0xac, 0x51, 0xac, 0x52, 0xac, 0x53];
+const List<int> testKoreanCharSubsetUtf16beBom = const <int>[
+  0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02, // 8
+  0xac, 0x03, 0xac, 0x04, 0xac, 0x05, 0xac, 0x06,
+  0xac, 0x07, 0xac, 0x08, 0xac, 0x09, 0xac, 0x0a,
+  0xac, 0x0b, 0xac, 0x0c, 0xac, 0x0d, 0xac, 0x0e,
+  0xac, 0x0f, 0xac, 0x10, 0xac, 0x11, 0xac, 0x12,
+  0xac, 0x13, 0xac, 0x14, 0xac, 0x15, 0xac, 0x16,
+  0xac, 0x17, 0xac, 0x18, 0xac, 0x19, 0xac, 0x1a,
+  0xac, 0x1b, 0x00, 0x0a, 0xac, 0x1c, 0xac, 0x1d,
+  0xac, 0x1e, 0xac, 0x1f, 0xac, 0x20, 0xac, 0x21,
+  0xac, 0x22, 0xac, 0x23, 0xac, 0x24, 0xac, 0x25,
+  0xac, 0x26, 0xac, 0x27, 0xac, 0x28, 0xac, 0x29,
+  0xac, 0x2a, 0xac, 0x2b, 0xac, 0x2c, 0xac, 0x2d,
+  0xac, 0x2e, 0xac, 0x2f, 0xac, 0x30, 0xac, 0x31,
+  0xac, 0x32, 0xac, 0x33, 0xac, 0x34, 0xac, 0x35,
+  0xac, 0x36, 0xac, 0x37, 0x00, 0x0a, 0xac, 0x38,
+  0xac, 0x39, 0xac, 0x3a, 0xac, 0x3b, 0xac, 0x3c,
+  0xac, 0x3d, 0xac, 0x3e, 0xac, 0x3f, 0xac, 0x40,
+  0xac, 0x41, 0xac, 0x42, 0xac, 0x43, 0xac, 0x44,
+  0xac, 0x45, 0xac, 0x46, 0xac, 0x47, 0xac, 0x48,
+  0xac, 0x49, 0xac, 0x4a, 0xac, 0x4b, 0xac, 0x4c,
+  0xac, 0x4d, 0xac, 0x4e, 0xac, 0x4f, 0xac, 0x50,
+  0xac, 0x51, 0xac, 0x52, 0xac, 0x53
+];
 
-const List<int> testKoreanCharSubsetUtf16le = const<int>    [
-    0x00, 0xac, 0x01, 0xac, 0x02, 0xac, 0x03, 0xac,
-    0x04, 0xac, 0x05, 0xac, 0x06, 0xac, 0x07, 0xac,
-    0x08, 0xac, 0x09, 0xac, 0x0a, 0xac, 0x0b, 0xac,
-    0x0c, 0xac, 0x0d, 0xac, 0x0e, 0xac, 0x0f, 0xac,
-    0x10, 0xac, 0x11, 0xac, 0x12, 0xac, 0x13, 0xac,
-    0x14, 0xac, 0x15, 0xac, 0x16, 0xac, 0x17, 0xac,
-    0x18, 0xac, 0x19, 0xac, 0x1a, 0xac, 0x1b, 0xac,
-    0x0a, 0x00, 0x1c, 0xac, 0x1d, 0xac, 0x1e, 0xac,
-    0x1f, 0xac, 0x20, 0xac, 0x21, 0xac, 0x22, 0xac,
-    0x23, 0xac, 0x24, 0xac, 0x25, 0xac, 0x26, 0xac,
-    0x27, 0xac, 0x28, 0xac, 0x29, 0xac, 0x2a, 0xac,
-    0x2b, 0xac, 0x2c, 0xac, 0x2d, 0xac, 0x2e, 0xac,
-    0x2f, 0xac, 0x30, 0xac, 0x31, 0xac, 0x32, 0xac,
-    0x33, 0xac, 0x34, 0xac, 0x35, 0xac, 0x36, 0xac,
-    0x37, 0xac, 0x0a, 0x00, 0x38, 0xac, 0x39, 0xac,
-    0x3a, 0xac, 0x3b, 0xac, 0x3c, 0xac, 0x3d, 0xac,
-    0x3e, 0xac, 0x3f, 0xac, 0x40, 0xac, 0x41, 0xac,
-    0x42, 0xac, 0x43, 0xac, 0x44, 0xac, 0x45, 0xac,
-    0x46, 0xac, 0x47, 0xac, 0x48, 0xac, 0x49, 0xac,
-    0x4a, 0xac, 0x4b, 0xac, 0x4c, 0xac, 0x4d, 0xac,
-    0x4e, 0xac, 0x4f, 0xac, 0x50, 0xac, 0x51, 0xac,
-    0x52, 0xac, 0x53, 0xac];
+const List<int> testKoreanCharSubsetUtf16le = const <int>[
+  0x00, 0xac, 0x01, 0xac, 0x02, 0xac, 0x03, 0xac, // 8
+  0x04, 0xac, 0x05, 0xac, 0x06, 0xac, 0x07, 0xac,
+  0x08, 0xac, 0x09, 0xac, 0x0a, 0xac, 0x0b, 0xac,
+  0x0c, 0xac, 0x0d, 0xac, 0x0e, 0xac, 0x0f, 0xac,
+  0x10, 0xac, 0x11, 0xac, 0x12, 0xac, 0x13, 0xac,
+  0x14, 0xac, 0x15, 0xac, 0x16, 0xac, 0x17, 0xac,
+  0x18, 0xac, 0x19, 0xac, 0x1a, 0xac, 0x1b, 0xac,
+  0x0a, 0x00, 0x1c, 0xac, 0x1d, 0xac, 0x1e, 0xac,
+  0x1f, 0xac, 0x20, 0xac, 0x21, 0xac, 0x22, 0xac,
+  0x23, 0xac, 0x24, 0xac, 0x25, 0xac, 0x26, 0xac,
+  0x27, 0xac, 0x28, 0xac, 0x29, 0xac, 0x2a, 0xac,
+  0x2b, 0xac, 0x2c, 0xac, 0x2d, 0xac, 0x2e, 0xac,
+  0x2f, 0xac, 0x30, 0xac, 0x31, 0xac, 0x32, 0xac,
+  0x33, 0xac, 0x34, 0xac, 0x35, 0xac, 0x36, 0xac,
+  0x37, 0xac, 0x0a, 0x00, 0x38, 0xac, 0x39, 0xac,
+  0x3a, 0xac, 0x3b, 0xac, 0x3c, 0xac, 0x3d, 0xac,
+  0x3e, 0xac, 0x3f, 0xac, 0x40, 0xac, 0x41, 0xac,
+  0x42, 0xac, 0x43, 0xac, 0x44, 0xac, 0x45, 0xac,
+  0x46, 0xac, 0x47, 0xac, 0x48, 0xac, 0x49, 0xac,
+  0x4a, 0xac, 0x4b, 0xac, 0x4c, 0xac, 0x4d, 0xac,
+  0x4e, 0xac, 0x4f, 0xac, 0x50, 0xac, 0x51, 0xac,
+  0x52, 0xac, 0x53, 0xac
+];
 
 void main() {
-  testEncodeToUtf16();
-  testUtf16BytesToString();
-  testIterableMethods();
+  test('encode to utf16', testEncodeToUtf16);
+  test('utf16 bytes to string', testUtf16BytesToString);
+  test('iterable methods', testIterableMethods);
 }
 
 void testEncodeToUtf16() {
-  Expect.listEquals([], encodeUtf16be("")); // TODO(dcarlson) should we skip bom if empty?
+  Expect.listEquals(
+      [], encodeUtf16be("")); // TODO(dcarlson) should we skip bom if empty?
   Expect.listEquals(testKoreanCharSubsetUtf16beBom,
-      encodeUtf16(testKoreanCharSubset),
-      "encode UTF-16(BE by default) Korean");
+      encodeUtf16(testKoreanCharSubset), "encode UTF-16(BE by default) Korean");
 
   Expect.listEquals(testKoreanCharSubsetUtf16le,
-      encodeUtf16le(testKoreanCharSubset),
-      "encode UTF-16LE Korean");
+      encodeUtf16le(testKoreanCharSubset), "encode UTF-16LE Korean");
 }
 
 void testUtf16BytesToString() {
   Expect.stringEquals("", decodeUtf16([]));
-  Expect.stringEquals(testHanWater, decodeUtf16([0x6C, 0x34]),
-      "Water variation 1");
-  Expect.stringEquals(testHanWater, decodeUtf16([0xFE, 0xFF, 0x6C, 0x34]),
-      "Water variation 2");
-  Expect.stringEquals(testHanWater, decodeUtf16([0xFF, 0xFE, 0x34, 0x6C]),
-      "Water variation 3");
+  Expect.stringEquals(
+      testHanWater, decodeUtf16([0x6C, 0x34]), "Water variation 1");
+  Expect.stringEquals(
+      testHanWater, decodeUtf16([0xFE, 0xFF, 0x6C, 0x34]), "Water variation 2");
+  Expect.stringEquals(
+      testHanWater, decodeUtf16([0xFF, 0xFE, 0x34, 0x6C]), "Water variation 3");
 
-  Expect.stringEquals(testHanWater, decodeUtf16be([0x6C, 0x34]),
-      "Water variation 4");
-  Expect.stringEquals(testHanWater,
-      decodeUtf16be([0xFE, 0xFF, 0x6C, 0x34]),
+  Expect.stringEquals(
+      testHanWater, decodeUtf16be([0x6C, 0x34]), "Water variation 4");
+  Expect.stringEquals(testHanWater, decodeUtf16be([0xFE, 0xFF, 0x6C, 0x34]),
       "Water variation 5");
 
-  Expect.stringEquals(testHanWater, decodeUtf16le([0x34, 0x6C]),
-      "Water variation 6");
-  Expect.stringEquals(testHanWater,
-      decodeUtf16le([0xFF, 0xFE, 0x34, 0x6C]),
+  Expect.stringEquals(
+      testHanWater, decodeUtf16le([0x34, 0x6C]), "Water variation 6");
+  Expect.stringEquals(testHanWater, decodeUtf16le([0xFF, 0xFE, 0x34, 0x6C]),
       "Water variation 7");
 
   Expect.stringEquals(testKoreanCharSubset,
@@ -109,7 +110,7 @@
   Expect.isFalse(decodeUtf16AsIterable([]).iterator.moveNext());
 
   IterableUtf16Decoder koreanDecoder =
-    decodeUtf16AsIterable(testKoreanCharSubsetUtf16beBom);
+      decodeUtf16AsIterable(testKoreanCharSubsetUtf16beBom);
   // get the first character
   Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
   // get the whole translation using the Iterable interface
@@ -117,12 +118,17 @@
       new String.fromCharCodes(new List<int>.from(koreanDecoder)));
 
   // specify types
-  Expect.equals(44032, (new List<int>
-      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom)))[0]);
-  Expect.equals(44032, (new List<int>
-      .from(decodeUtf16leAsIterable(testKoreanCharSubsetUtf16le)))[0]);
+  Expect.equals(
+      44032,
+      (new List<int>.from(
+          decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom)))[0]);
+  Expect.equals(
+      44032,
+      (new List<int>.from(
+          decodeUtf16leAsIterable(testKoreanCharSubsetUtf16le)))[0]);
   bool stripBom = false;
-  Expect.equals(UNICODE_BOM, (new List<int>
-      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom,
-            0, null, stripBom)))[0]);
+  Expect.equals(
+      UNICODE_BOM,
+      (new List<int>.from(decodeUtf16beAsIterable(
+          testKoreanCharSubsetUtf16beBom, 0, null, stripBom)))[0]);
 }
diff --git a/packages/utf/test/utf32_test.dart b/packages/utf/test/utf32_test.dart
index 1a60a6f..7f3d7ab 100755
--- a/packages/utf/test/utf32_test.dart
+++ b/packages/utf/test/utf32_test.dart
@@ -4,9 +4,11 @@
 
 library utf.utf32_test;
 
-import 'package:expect/expect.dart';
+import 'package:test/test.dart';
 import 'package:utf/utf.dart';
 
+import 'expect.dart' as Expect;
+
 const String testKoreanCharSubset = """
 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
 개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
@@ -14,109 +16,112 @@
 
 const String testHanTwice = "二";
 
-const List<int> testKoreanCharSubsetUtf32beBom = const<int>[
-    0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00,
-    0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
-    0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
-    0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
-    0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
-    0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
-    0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
-    0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
-    0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
-    0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
-    0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
-    0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
-    0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
-    0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
-    0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
-    0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
-    0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
-    0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
-    0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
-    0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
-    0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
-    0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
-    0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
-    0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
-    0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
-    0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
-    0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
-    0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
-    0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
-    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
-    0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
-    0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
-    0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
-    0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
-    0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
-    0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
-    0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
-    0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
-    0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
-    0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
-    0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
-    0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
-    0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
-    0x00, 0x00, 0xac, 0x53];
+const List<int> testKoreanCharSubsetUtf32beBom = const <int>[
+  0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00, // 8
+  0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
+  0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
+  0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
+  0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
+  0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
+  0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
+  0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
+  0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
+  0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
+  0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
+  0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
+  0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
+  0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
+  0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
+  0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
+  0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
+  0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
+  0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
+  0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
+  0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
+  0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
+  0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
+  0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
+  0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
+  0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
+  0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
+  0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
+  0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
+  0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
+  0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
+  0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
+  0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
+  0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
+  0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
+  0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
+  0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
+  0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
+  0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
+  0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
+  0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
+  0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
+  0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
+  0x00, 0x00, 0xac, 0x53
+];
 
-const List<int> testKoreanCharSubsetUtf32le = const<int>[
-    0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00,
-    0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
-    0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
-    0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
-    0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
-    0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
-    0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
-    0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
-    0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
-    0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
-    0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
-    0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
-    0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
-    0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
-    0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
-    0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
-    0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
-    0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
-    0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
-    0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
-    0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
-    0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
-    0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
-    0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
-    0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
-    0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
-    0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
-    0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
-    0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
-    0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
-    0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
-    0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
-    0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
-    0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
-    0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
-    0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
-    0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
-    0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
-    0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
-    0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
-    0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
-    0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
-    0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00];
+const List<int> testKoreanCharSubsetUtf32le = const <int>[
+  0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00, // 8
+  0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
+  0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
+  0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
+  0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
+  0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
+  0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
+  0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
+  0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
+  0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
+  0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
+  0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
+  0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
+  0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
+  0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
+  0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
+  0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
+  0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
+  0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
+  0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
+  0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
+  0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
+  0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
+  0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
+  0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
+  0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
+  0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
+  0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
+  0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+  0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
+  0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
+  0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
+  0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
+  0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
+  0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
+  0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
+  0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
+  0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
+  0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
+  0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
+  0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
+  0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
+  0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00
+];
 
 void main() {
-  testUtf32BytesToString();
-  testEncodeToUtf32();
-  testIterableMethods();
+  test('utf32 bytes to string', testUtf32BytesToString);
+  test('encode to utf32', testEncodeToUtf32);
+  test('iterable methods', testIterableMethods);
 }
 
 void testEncodeToUtf32() {
-  Expect.listEquals([], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
+  Expect.listEquals(
+      [], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
   Expect.listEquals(testKoreanCharSubsetUtf32beBom,
-      encodeUtf32(testKoreanCharSubset),
-      "encode UTF-32(BE by default) Korean");
-  Expect.listEquals(testKoreanCharSubsetUtf32le,
+      encodeUtf32(testKoreanCharSubset), "encode UTF-32(BE by default) Korean");
+  Expect.listEquals(
+      testKoreanCharSubsetUtf32le,
       encodeUtf32le(testKoreanCharSubset),
       "encode UTF-32(LE by default) Korean");
 }
@@ -124,35 +129,29 @@
 void testUtf32BytesToString() {
   Expect.stringEquals("", decodeUtf32([]), "no input");
   Expect.stringEquals("\ufffd", decodeUtf32([0]), "single byte");
-  Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]),
-      "short a byte");
-  Expect.stringEquals("\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]),
-      "extra byte");
+  Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]), "short a byte");
+  Expect.stringEquals(
+      "\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]), "extra byte");
 
-  Expect.stringEquals(testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]),
-      "twice variation 1");
+  Expect.stringEquals(
+      testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]), "twice variation 1");
   Expect.stringEquals(testHanTwice,
-      decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
-      "twice variation 2");
+      decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]), "twice variation 2");
   Expect.stringEquals(testHanTwice,
-      decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
-      "twice variation 3");
+      decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]), "twice variation 3");
 
-  Expect.stringEquals(testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]),
-      "twice variation 4");
+  Expect.stringEquals(
+      testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]), "twice variation 4");
   Expect.stringEquals(testHanTwice,
-      decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
-      "twice variation 5");
+      decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]), "twice variation 5");
 
-  Expect.stringEquals(testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]),
-      "twice variation 6");
+  Expect.stringEquals(
+      testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]), "twice variation 6");
   Expect.stringEquals(testHanTwice,
-      decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
-      "twice variation 7");
+      decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]), "twice variation 7");
 
   Expect.stringEquals(testKoreanCharSubset,
-      decodeUtf32(testKoreanCharSubsetUtf32beBom),
-      "UTF-32BE Korean");
+      decodeUtf32(testKoreanCharSubsetUtf32beBom), "UTF-32BE Korean");
 }
 
 void testIterableMethods() {
@@ -160,7 +159,7 @@
   Expect.isFalse(decodeUtf32AsIterable([]).iterator.moveNext());
 
   IterableUtf32Decoder koreanDecoder =
-    decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
+      decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
   // get the first character
   Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
   // get the whole translation using the Iterable interface
@@ -168,12 +167,17 @@
       new String.fromCharCodes(new List<int>.from(koreanDecoder)));
 
   // specify types
-  Expect.equals(44032, (new List<int>
-      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
-  Expect.equals(44032, (new List<int>
-      .from(decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
+  Expect.equals(
+      44032,
+      (new List<int>.from(
+          decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
+  Expect.equals(
+      44032,
+      (new List<int>.from(
+          decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
   bool stripBom = false;
-  Expect.equals(UNICODE_BOM, (new List<int>
-      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom,
-          0, null, stripBom)))[0]);
+  Expect.equals(
+      UNICODE_BOM,
+      (new List<int>.from(decodeUtf32beAsIterable(
+          testKoreanCharSubsetUtf32beBom, 0, null, stripBom)))[0]);
 }
diff --git a/packages/utf/test/utf82_test.dart b/packages/utf/test/utf82_test.dart
index 7f8cec4..214c58e 100755
--- a/packages/utf/test/utf82_test.dart
+++ b/packages/utf/test/utf82_test.dart
@@ -4,184 +4,187 @@
 
 library utf.utf82_test;
 
-import 'package:expect/expect.dart';
+import 'package:test/test.dart';
 import 'package:utf/utf.dart';
 
-const String testEnglishPhrase =
-    "The quick brown fox jumps over the lazy dog.";
+import 'expect.dart' as Expect;
 
-const List<int> testEnglishUtf8 = const<int> [
-    0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
-    0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
-    0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
-    0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
-    0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
-    0x64, 0x6f, 0x67, 0x2e];
+const String testEnglishPhrase = "The quick brown fox jumps over the lazy dog.";
+
+const List<int> testEnglishUtf8 = const <int>[
+  0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, // 8
+  0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
+  0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
+  0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
+  0x64, 0x6f, 0x67, 0x2e
+];
 
 const String testDanishPhrase = "Quizdeltagerne spiste jordbær med "
     "fløde mens cirkusklovnen Wolther spillede på xylofon.";
 
-const List<int> testDanishUtf8 = const<int>[
-    0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
-    0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
-    0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
-    0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
-    0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
-    0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
-    0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
-    0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
-    0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
-    0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
-    0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
-    0x6e, 0x2e];
+const List<int> testDanishUtf8 = const <int>[
+  0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74, // 8
+  0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
+  0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
+  0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
+  0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
+  0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
+  0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
+  0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
+  0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
+  0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
+  0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
+  0x6e, 0x2e
+];
 
 // unusual formatting due to strange editor interaction w/ text direction.
-const String
-    testHebrewPhrase = "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
+const String testHebrewPhrase =
+    "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
 
-const List<int> testHebrewUtf8 = const<int>[
-    0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
-    0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
-    0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
-    0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
-    0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
-    0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
-    0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
-    0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
-    0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
-    0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
-    0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
-    0xd7, 0x94];
+const List<int> testHebrewUtf8 = const <int>[
+  0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7, // 8
+  0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
+  0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
+  0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
+  0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
+  0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
+  0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
+  0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
+  0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
+  0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
+  0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
+  0xd7, 0x94
+];
 
 const String testRussianPhrase = "Съешь же ещё этих мягких "
     "французских булок да выпей чаю";
 
-const List<int> testRussianUtf8 = const<int>[
-    0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
-    0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
-    0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
-    0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
-    0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
-    0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
-    0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
-    0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
-    0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
-    0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
-    0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
-    0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
-    0x87, 0xd0, 0xb0, 0xd1, 0x8e];
+const List<int> testRussianUtf8 = const <int>[
+  0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88, // 8
+  0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
+  0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
+  0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
+  0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
+  0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
+  0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
+  0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
+  0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
+  0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
+  0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
+  0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
+  0x87, 0xd0, 0xb0, 0xd1, 0x8e
+];
 
 const String testGreekPhrase = "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ "
     "στὸ χρυσαφὶ ξέφωτο";
 
-const List<int> testGreekUtf8 = const<int>[
-    0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
-    0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
-    0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
-    0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
-    0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
-    0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
-    0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
-    0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
-    0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
-    0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
-    0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
-    0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
-    0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
+const List<int> testGreekUtf8 = const <int>[
+  0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad, // 8
+  0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
+  0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
+  0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
+  0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
+  0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
+  0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
+  0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
+  0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
+  0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
+  0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
+  0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
+  0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf
+];
 
 const String testKatakanaPhrase = """
 イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
 ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン""";
 
-const List<int> testKatakanaUtf8 = const<int>[
-    0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
-    0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
-    0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
-    0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
-    0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
-    0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
-    0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
-    0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
-    0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
-    0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
-    0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
-    0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
-    0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
-    0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
-    0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
-    0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
-    0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
-    0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
-    0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
+const List<int> testKatakanaUtf8 = const <int>[
+  0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83, // 8
+  0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
+  0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
+  0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
+  0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
+  0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
+  0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
+  0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
+  0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
+  0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
+  0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
+  0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
+  0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
+  0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
+  0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
+  0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
+  0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
+  0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
+  0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3
+];
 
 void main() {
-  testUtf8bytesToCodepoints();
-  testUtf8BytesToString();
-  testEncodeToUtf8();
-  testIterableMethods();
+  test('utf8 bytes to codepoints', testUtf8bytesToCodepoints);
+  test('utf8 bytes to string', testUtf8BytesToString);
+  test('encode to utf8', testEncodeToUtf8);
+  test('iterable methods', testIterableMethods);
 }
 
 void testEncodeToUtf8() {
-  Expect.listEquals(testEnglishUtf8, encodeUtf8(testEnglishPhrase),
-      "english to utf8");
+  Expect.listEquals(
+      testEnglishUtf8, encodeUtf8(testEnglishPhrase), "english to utf8");
 
-  Expect.listEquals(testDanishUtf8, encodeUtf8(testDanishPhrase),
-      "encode danish to utf8");
+  Expect.listEquals(
+      testDanishUtf8, encodeUtf8(testDanishPhrase), "encode danish to utf8");
 
-  Expect.listEquals(testHebrewUtf8, encodeUtf8(testHebrewPhrase),
-      "Hebrew to utf8");
+  Expect.listEquals(
+      testHebrewUtf8, encodeUtf8(testHebrewPhrase), "Hebrew to utf8");
 
-  Expect.listEquals(testRussianUtf8, encodeUtf8(testRussianPhrase),
-      "Russian to utf8");
+  Expect.listEquals(
+      testRussianUtf8, encodeUtf8(testRussianPhrase), "Russian to utf8");
 
-  Expect.listEquals(testGreekUtf8, encodeUtf8(testGreekPhrase),
-      "Greek to utf8");
+  Expect.listEquals(
+      testGreekUtf8, encodeUtf8(testGreekPhrase), "Greek to utf8");
 
-  Expect.listEquals(testKatakanaUtf8, encodeUtf8(testKatakanaPhrase),
-      "Katakana to utf8");
+  Expect.listEquals(
+      testKatakanaUtf8, encodeUtf8(testKatakanaPhrase), "Katakana to utf8");
 }
 
 void testUtf8bytesToCodepoints() {
-  Expect.listEquals([954, 972, 963, 956, 949],
-      utf8ToCodepoints([0xce, 0xba, 0xcf, 0x8c, 0xcf,
-      0x83, 0xce, 0xbc, 0xce, 0xb5]), "κόσμε");
+  Expect.listEquals(
+      [954, 972, 963, 956, 949],
+      utf8ToCodepoints(
+          [0xce, 0xba, 0xcf, 0x8c, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5]),
+      "κόσμε");
 
   // boundary conditions: First possible sequence of a certain length
   Expect.listEquals([], utf8ToCodepoints([]), "no input");
   Expect.listEquals([0x0], utf8ToCodepoints([0x0]), "0");
   Expect.listEquals([0x80], utf8ToCodepoints([0xc2, 0x80]), "80");
-  Expect.listEquals([0x800],
-      utf8ToCodepoints([0xe0, 0xa0, 0x80]), "800");
-  Expect.listEquals([0x10000],
-      utf8ToCodepoints([0xf0, 0x90, 0x80, 0x80]), "10000");
+  Expect.listEquals([0x800], utf8ToCodepoints([0xe0, 0xa0, 0x80]), "800");
+  Expect.listEquals(
+      [0x10000], utf8ToCodepoints([0xf0, 0x90, 0x80, 0x80]), "10000");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80, 0x80]), "200000");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]),
-      "4000000");
+      utf8ToCodepoints([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]), "4000000");
 
   // boundary conditions: Last possible sequence of a certain length
   Expect.listEquals([0x7f], utf8ToCodepoints([0x7f]), "7f");
   Expect.listEquals([0x7ff], utf8ToCodepoints([0xdf, 0xbf]), "7ff");
-  Expect.listEquals([0xffff],
-      utf8ToCodepoints([0xef, 0xbf, 0xbf]), "ffff");
+  Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]), "ffff");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf7, 0xbf, 0xbf, 0xbf]), "1fffff");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf, 0xbf]), "3ffffff");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]),
-      "4000000");
+      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]), "4000000");
 
   // other boundary conditions
-  Expect.listEquals([0xd7ff],
-      utf8ToCodepoints([0xed, 0x9f, 0xbf]), "d7ff");
-  Expect.listEquals([0xe000],
-      utf8ToCodepoints([0xee, 0x80, 0x80]), "e000");
+  Expect.listEquals([0xd7ff], utf8ToCodepoints([0xed, 0x9f, 0xbf]), "d7ff");
+  Expect.listEquals([0xe000], utf8ToCodepoints([0xee, 0x80, 0x80]), "e000");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xef, 0xbf, 0xbd]), "fffd");
-  Expect.listEquals([0x10ffff],
-      utf8ToCodepoints([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
+  Expect.listEquals(
+      [0x10ffff], utf8ToCodepoints([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf4, 0x90, 0x80, 0x80]), "110000");
 
@@ -197,7 +200,8 @@
     allContinuationBytes.add(i);
     matchingReplacementChars.add(UNICODE_REPLACEMENT_CHARACTER_CODEPOINT);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allContinuationBytes),
       "80 - bf => replacement character x 64");
 
@@ -205,10 +209,10 @@
   matchingReplacementChars = <int>[];
   for (int i = 0xc0; i < 0xe0; i++) {
     allFirstTwoByteSeq.addAll([i, 0x20]);
-    matchingReplacementChars.addAll(
-        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+    matchingReplacementChars.addAll([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allFirstTwoByteSeq),
       "c0 - df + space => replacement character + space x 32");
 
@@ -216,10 +220,10 @@
   matchingReplacementChars = <int>[];
   for (int i = 0xe0; i < 0xf0; i++) {
     allFirstThreeByteSeq.addAll([i, 0x20]);
-    matchingReplacementChars.addAll(
-        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+    matchingReplacementChars.addAll([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allFirstThreeByteSeq),
       "e0 - ef + space => replacement character x 16");
 
@@ -227,10 +231,10 @@
   matchingReplacementChars = <int>[];
   for (int i = 0xf0; i < 0xf8; i++) {
     allFirstFourByteSeq.addAll([i, 0x20]);
-    matchingReplacementChars.addAll(
-        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+    matchingReplacementChars.addAll([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allFirstFourByteSeq),
       "f0 - f7 + space => replacement character x 8");
 
@@ -238,10 +242,10 @@
   matchingReplacementChars = <int>[];
   for (int i = 0xf8; i < 0xfc; i++) {
     allFirstFiveByteSeq.addAll([i, 0x20]);
-    matchingReplacementChars.addAll(
-        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+    matchingReplacementChars.addAll([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allFirstFiveByteSeq),
       "f8 - fb + space => replacement character x 4");
 
@@ -249,49 +253,53 @@
   matchingReplacementChars = <int>[];
   for (int i = 0xfc; i < 0xfe; i++) {
     allFirstSixByteSeq.addAll([i, 0x20]);
-    matchingReplacementChars.addAll(
-        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+    matchingReplacementChars.addAll([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
   }
-  Expect.listEquals(matchingReplacementChars,
+  Expect.listEquals(
+      matchingReplacementChars,
       utf8ToCodepoints(allFirstSixByteSeq),
       "fc - fd + space => replacement character x 2");
 
   // Sequences with last continuation byte missing
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xc2]),
-      "2-byte sequence with last byte missing");
+      utf8ToCodepoints([0xc2]), "2-byte sequence with last byte missing");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xe0, 0x80]),
-      "3-byte sequence with last byte missing");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80]), "3-byte sequence with last byte missing");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf0, 0x80, 0x80]),
       "4-byte sequence with last byte missing");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80]),
       "5-byte sequence with last byte missing");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80]),
       "6-byte sequence with last byte missing");
 
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xdf]),
-      "2-byte sequence with last byte missing (hi)");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xdf]), "2-byte sequence with last byte missing (hi)");
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xef, 0xbf]),
       "3-byte sequence with last byte missing (hi)");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf7, 0xbf, 0xbf]),
       "4-byte sequence with last byte missing (hi)");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf]),
       "5-byte sequence with last byte missing (hi)");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf]),
       "6-byte sequence with last byte missing (hi)");
 
   // Concatenation of incomplete sequences
   Expect.listEquals(
-      [ UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      [
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
@@ -300,19 +308,22 @@
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
         UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT ],
-      utf8ToCodepoints(
-          [ 0xc2,
-            0xe0, 0x80,
-            0xf0, 0x80, 0x80,
-            0xf8, 0x88, 0x80, 0x80,
-            0xfc, 0x80, 0x80, 0x80, 0x80,
-            0xdf,
-            0xef, 0xbf,
-            0xf7, 0xbf, 0xbf,
-            0xfb, 0xbf, 0xbf, 0xbf,
-            0xfd, 0xbf, 0xbf, 0xbf, 0xbf ]),
-          "Concatenation of incomplete sequences");
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+      ],
+      utf8ToCodepoints([
+        0xc2, // 1
+        0xe0, 0x80,
+        0xf0, 0x80, 0x80,
+        0xf8, 0x88, 0x80, 0x80,
+        0xfc, 0x80, 0x80, 0x80, 0x80,
+        0xdf,
+        0xef, 0xbf,
+        0xf7, 0xbf, 0xbf,
+        0xfb, 0xbf, 0xbf, 0xbf,
+        0xfd, 0xbf, 0xbf, 0xbf, 0xbf
+      ]),
+      "Concatenation of incomplete sequences");
 
   // Impossible bytes
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
@@ -320,11 +331,11 @@
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xff]), "ff");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
 
   // Overlong sequences
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
@@ -335,7 +346,8 @@
       utf8ToCodepoints([0xf0, 0x80, 0x80, 0xaf]), "f0 80 80 af");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0xaf]), "f8 80 80 80 af");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf]),
       "fc 80 80 80 80 af");
 
@@ -347,7 +359,8 @@
       utf8ToCodepoints([0xf0, 0x8f, 0xbf, 0xbf]), "f0 8f bf bf");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf8, 0x87, 0xbf, 0xbf, 0xbf]), "f8 87 bf bf bf");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfc, 0x83, 0xbf, 0xbf, 0xbf, 0xbf]),
       "fc 83 bf bf bf bf");
 
@@ -359,7 +372,8 @@
       utf8ToCodepoints([0xf0, 0x80, 0x80, 0x80]), "f0 80 80 80");
   Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0x80]), "f8 80 80 80 80");
-  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+  Expect.listEquals(
+      [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
       utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0x80]),
       "fc 80 80 80 80 80");
 
@@ -381,71 +395,58 @@
 
   // Paired UTF-16 surrogates
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80]),
-      "U+D800 U+DC00");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80]), "U+D800 U+DC00");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf]),
-      "U+D800 U+DFFF");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf]), "U+D800 U+DFFF");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xb0, 0x80]),
-      "U+DB7F U+DC00");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xb0, 0x80]), "U+DB7F U+DC00");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xbf, 0xbf]),
-      "U+DB7F U+DFFF");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xbf, 0xbf]), "U+DB7F U+DFFF");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xb0, 0x80]),
-      "U+DB80 U+DC00");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xb0, 0x80]), "U+DB80 U+DC00");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xbf, 0xbf]),
-      "U+DB80 U+DFFF");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xbf, 0xbf]), "U+DB80 U+DFFF");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xb0, 0x80]),
-      "U+DBFF U+DC00");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xb0, 0x80]), "U+DBFF U+DC00");
   Expect.listEquals([
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
-      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
-      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf]),
-      "U+DBFF U+DFFF");
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT
+  ], utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf]), "U+DBFF U+DFFF");
 
   // Other illegal code positions (???)
-  Expect.listEquals([0xfffe], utf8ToCodepoints([0xef, 0xbf, 0xbe]),
-      "U+FFFE");
-  Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]),
-      "U+FFFF");
+  Expect.listEquals([0xfffe], utf8ToCodepoints([0xef, 0xbf, 0xbe]), "U+FFFE");
+  Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]), "U+FFFF");
 }
 
 void testUtf8BytesToString() {
-  Expect.stringEquals(testEnglishPhrase,
-      decodeUtf8(testEnglishUtf8), "English");
+  Expect.stringEquals(
+      testEnglishPhrase, decodeUtf8(testEnglishUtf8), "English");
 
-  Expect.stringEquals(testDanishPhrase,
-      decodeUtf8(testDanishUtf8), "Danish");
+  Expect.stringEquals(testDanishPhrase, decodeUtf8(testDanishUtf8), "Danish");
 
-  Expect.stringEquals(testHebrewPhrase,
-      decodeUtf8(testHebrewUtf8), "Hebrew");
+  Expect.stringEquals(testHebrewPhrase, decodeUtf8(testHebrewUtf8), "Hebrew");
 
-  Expect.stringEquals(testRussianPhrase,
-      decodeUtf8(testRussianUtf8), "Russian");
+  Expect.stringEquals(
+      testRussianPhrase, decodeUtf8(testRussianUtf8), "Russian");
 
-  Expect.stringEquals(testGreekPhrase,
-      decodeUtf8(testGreekUtf8), "Greek");
+  Expect.stringEquals(testGreekPhrase, decodeUtf8(testGreekUtf8), "Greek");
 
-  Expect.stringEquals(testKatakanaPhrase,
-      decodeUtf8(testKatakanaUtf8), "Katakana");
+  Expect.stringEquals(
+      testKatakanaPhrase, decodeUtf8(testKatakanaUtf8), "Katakana");
 }
 
 void testIterableMethods() {
diff --git a/packages/utf/test/utf8_test.dart b/packages/utf/test/utf8_test.dart
index 3e8c87e..306efe4 100644
--- a/packages/utf/test/utf8_test.dart
+++ b/packages/utf/test/utf8_test.dart
@@ -4,45 +4,59 @@
 
 library utf.utf8_test;
 
-import "package:expect/expect.dart";
+import 'package:test/test.dart';
 import "package:utf/utf.dart";
 
+import 'expect.dart' as Expect;
+
 String decode(List<int> bytes) => decodeUtf8(bytes);
 
-main() {
-  // Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
-  String string = decode([0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72,
-                          0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xc3,
-                          0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4, 0xbc, 0xc3, 0xae,
-                          0xc5, 0xbe, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xe1,
-                          0xbb, 0x9d, 0xc3, 0xb1]);
-  Expect.stringEquals("Îñţérñåţîöñåļîžåţîờñ", string);
+void main() {
+  test('Google favorite: "Îñţérñåţîöñåļîžåţîờñ"', () {
+    String string = decode([
+      0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72, // 8
+      0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xc3,
+      0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4, 0xbc, 0xc3, 0xae,
+      0xc5, 0xbe, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xe1,
+      0xbb, 0x9d, 0xc3, 0xb1
+    ]);
+    Expect.stringEquals("Îñţérñåţîöñåļîžåţîờñ", string);
+  });
 
-  // Blueberry porridge in Danish: "blåbærgrød".
-  string = decode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6, 0x72, 0x67, 0x72,
-                   0xc3, 0xb8, 0x64]);
-  Expect.stringEquals("blåbærgrød", string);
+  test('Blueberry porridge in Danish: "blåbærgrød"', () {
+    var string = decode([
+      0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6, 0x72, 0x67, 0x72, // 8
+      0xc3, 0xb8, 0x64
+    ]);
+    Expect.stringEquals("blåbærgrød", string);
+  });
 
-  // "சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.
-  string = decode([0xe0, 0xae, 0x9a, 0xe0, 0xae, 0xbf, 0xe0, 0xae, 0xb5, 0xe0,
-                   0xae, 0xbe, 0x20, 0xe0, 0xae, 0x85, 0xe0, 0xae, 0xa3, 0xe0,
-                   0xae, 0xbe, 0xe0, 0xae, 0xae, 0xe0, 0xae, 0xbe, 0xe0, 0xaf,
-                   0x88, 0xe0, 0xae, 0xb2]);
-  Expect.stringEquals("சிவா அணாமாைல", string);
+  test('"சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.', () {
+    var string = decode([
+      0xe0, 0xae, 0x9a, 0xe0, 0xae, 0xbf, 0xe0, 0xae, 0xb5, 0xe0, // 8
+      0xae, 0xbe, 0x20, 0xe0, 0xae, 0x85, 0xe0, 0xae, 0xa3, 0xe0,
+      0xae, 0xbe, 0xe0, 0xae, 0xae, 0xe0, 0xae, 0xbe, 0xe0, 0xaf,
+      0x88, 0xe0, 0xae, 0xb2
+    ]);
+    Expect.stringEquals("சிவா அணாமாைல", string);
+  });
 
-  // "िसवा अणामालै", that is "Siva Annamalai" in Devanagari.
-  string = decode([0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0,
-                   0xa4, 0xbe, 0x20, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa3, 0xe0,
-                   0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
-                   0xb2, 0xe0, 0xa5, 0x88]);
-  Expect.stringEquals("िसवा अणामालै", string);
+  test('"िसवा अणामालै", that is "Siva Annamalai" in Devanagari', () {
+    var string = decode([
+      0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0, // 8
+      0xa4, 0xbe, 0x20, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa3, 0xe0,
+      0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+      0xb2, 0xe0, 0xa5, 0x88
+    ]);
+    Expect.stringEquals("िसवा अणामालै", string);
+  });
 
-  // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
-  // UTF-8: F0 90 90 92
-  string = decode([0xf0, 0x90, 0x90, 0x92]);
-  Expect.equals(string.length, 2);
-  Expect.equals("𐐒".length, 2);
-  Expect.stringEquals("𐐒", string);
-
+  test('DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12', () {
+    // UTF-8: F0 90 90 92
+    var string = decode([0xf0, 0x90, 0x90, 0x92]);
+    Expect.equals(string.length, 2);
+    Expect.equals("𐐒".length, 2);
+    Expect.stringEquals("𐐒", string);
+  });
   // TODO(ahe): Add tests of bad input.
 }
diff --git a/packages/utf/test/utf_test.dart b/packages/utf/test/utf_test.dart
index 86d08e4..ccda151 100644
--- a/packages/utf/test/utf_test.dart
+++ b/packages/utf/test/utf_test.dart
@@ -4,13 +4,17 @@
 
 library utf.utf_test;
 
-import "package:expect/expect.dart";
+import 'package:test/test.dart';
 import "package:utf/utf.dart";
 
+import "expect.dart" as Expect;
+
 main() {
-  String str = new String.fromCharCodes([0x1d537]);
-  // String.codeUnits gives 16-bit code units, but stringToCodepoints gives
-  // back the original code points.
-  Expect.listEquals([0xd835, 0xdd37], str.codeUnits);
-  Expect.listEquals([0x1d537], stringToCodepoints(str));
+  test('utf', () {
+    String str = new String.fromCharCodes([0x1d537]);
+    // String.codeUnits gives 16-bit code units, but stringToCodepoints gives
+    // back the original code points.
+    Expect.listEquals([0xd835, 0xdd37], str.codeUnits);
+    Expect.listEquals([0x1d537], stringToCodepoints(str));
+  });
 }
diff --git a/packages/watcher/.analysis_options b/packages/watcher/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/watcher/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/watcher/CHANGELOG.md b/packages/watcher/CHANGELOG.md
index 30762a0..c3acaf5 100644
--- a/packages/watcher/CHANGELOG.md
+++ b/packages/watcher/CHANGELOG.md
@@ -1,3 +1,16 @@
+# 0.9.7+3
+
+* Fix a crashing bug on Linux.
+
+# 0.9.7+2
+
+* Narrow the constraint on `async` to reflect the APIs this package is actually
+  using.
+
+# 0.9.7+1
+
+* Fix all strong-mode warnings.
+
 # 0.9.7
 
 * Fix a bug in `FileWatcher` where events could be added after watchers were
diff --git a/packages/watcher/benchmark/path_set.dart b/packages/watcher/benchmark/path_set.dart
new file mode 100644
index 0000000..aba3ed7
--- /dev/null
+++ b/packages/watcher/benchmark/path_set.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2015, 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.
+
+/// Benchmarks for the PathSet class.
+library watcher.benchmark.path_set;
+
+import 'dart:io';
+import 'dart:math' as math;
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:watcher/src/path_set.dart';
+
+final String root = Platform.isWindows ? r"C:\root" : "/root";
+
+/// Base class for benchmarks on [PathSet].
+abstract class PathSetBenchmark extends BenchmarkBase {
+  PathSetBenchmark(String method) : super("PathSet.$method");
+
+  final PathSet pathSet = new PathSet(root);
+
+  /// Use a fixed [Random] with a constant seed to ensure the tests are
+  /// deterministic.
+  final math.Random random = new math.Random(1234);
+
+  /// Walks over a virtual directory [depth] levels deep invoking [callback]
+  /// for each "file".
+  ///
+  /// Each virtual directory contains ten entries: either subdirectories or
+  /// files.
+  void walkTree(int depth, callback(String path)) {
+    recurse(path, remainingDepth) {
+      for (var i = 0; i < 10; i++) {
+        var padded = i.toString().padLeft(2, '0');
+        if (remainingDepth == 0) {
+          callback(p.join(path, "file_$padded.txt"));
+        } else {
+          var subdir = p.join(path, "subdirectory_$padded");
+          recurse(subdir, remainingDepth - 1);
+        }
+      }
+    }
+
+    recurse(root, depth);
+  }
+}
+
+class AddBenchmark extends PathSetBenchmark {
+  AddBenchmark() : super("add()");
+
+  final List<String> paths = [];
+
+  void setup() {
+    // Make a bunch of paths in about the same order we expect to get them from
+    // Directory.list().
+    walkTree(3, paths.add);
+  }
+
+  void run() {
+    for (var path in paths) pathSet.add(path);
+  }
+}
+
+class ContainsBenchmark extends PathSetBenchmark {
+  ContainsBenchmark() : super("contains()");
+
+  final List<String> paths = [];
+
+  void setup() {
+    // Add a bunch of paths to the set.
+    walkTree(3, (path) {
+      pathSet.add(path);
+      paths.add(path);
+    });
+
+    // Add some non-existent paths to test the false case.
+    for (var i = 0; i < 100; i++) {
+      paths.addAll([
+        "/nope",
+        "/root/nope",
+        "/root/subdirectory_04/nope",
+        "/root/subdirectory_04/subdirectory_04/nope",
+        "/root/subdirectory_04/subdirectory_04/subdirectory_04/nope",
+        "/root/subdirectory_04/subdirectory_04/subdirectory_04/nope/file_04.txt",
+      ]);
+    }
+  }
+
+  void run() {
+    var contained = 0;
+    for (var path in paths) {
+      if (pathSet.contains(path)) contained++;
+    }
+
+    if (contained != 10000) throw "Wrong result: $contained";
+  }
+}
+
+class PathsBenchmark extends PathSetBenchmark {
+  PathsBenchmark() : super("toSet()");
+
+  void setup() {
+    walkTree(3, pathSet.add);
+  }
+
+  void run() {
+    var count = 0;
+    for (var _ in pathSet.paths) {
+      count++;
+    }
+
+    if (count != 10000) throw "Wrong result: $count";
+  }
+}
+
+class RemoveBenchmark extends PathSetBenchmark {
+  RemoveBenchmark() : super("remove()");
+
+  final List<String> paths = [];
+
+  void setup() {
+    // Make a bunch of paths. Do this here so that we don't spend benchmarked
+    // time synthesizing paths.
+    walkTree(3, (path) {
+      pathSet.add(path);
+      paths.add(path);
+    });
+
+    // Shuffle the paths so that we delete them in a random order that
+    // hopefully mimics real-world file system usage. Do the shuffling here so
+    // that we don't spend benchmarked time shuffling.
+    paths.shuffle(random);
+  }
+
+  void run() {
+    for (var path in paths) pathSet.remove(path);
+  }
+}
+
+main() {
+  new AddBenchmark().report();
+  new ContainsBenchmark().report();
+  new PathsBenchmark().report();
+  new RemoveBenchmark().report();
+}
diff --git a/packages/watcher/lib/src/async_queue.dart b/packages/watcher/lib/src/async_queue.dart
index b83493d..adf6671 100644
--- a/packages/watcher/lib/src/async_queue.dart
+++ b/packages/watcher/lib/src/async_queue.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.async_queue;
-
 import 'dart:async';
 import 'dart:collection';
 
diff --git a/packages/watcher/lib/src/constructable_file_system_event.dart b/packages/watcher/lib/src/constructable_file_system_event.dart
index d00a1dc..63b51c1 100644
--- a/packages/watcher/lib/src/constructable_file_system_event.dart
+++ b/packages/watcher/lib/src/constructable_file_system_event.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.constructable_file_system_event;
-
 import 'dart:io';
 
 abstract class _ConstructableFileSystemEvent implements FileSystemEvent {
diff --git a/packages/watcher/lib/src/directory_watcher.dart b/packages/watcher/lib/src/directory_watcher.dart
index 8283785..6beebd0 100644
--- a/packages/watcher/lib/src/directory_watcher.dart
+++ b/packages/watcher/lib/src/directory_watcher.dart
@@ -2,11 +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.
 
-library watcher.directory_watcher;
-
 import 'dart:io';
 
-import 'watch_event.dart';
 import '../watcher.dart';
 import 'directory_watcher/linux.dart';
 import 'directory_watcher/mac_os.dart';
diff --git a/packages/watcher/lib/src/directory_watcher/linux.dart b/packages/watcher/lib/src/directory_watcher/linux.dart
index a747839..df1365c 100644
--- a/packages/watcher/lib/src/directory_watcher/linux.dart
+++ b/packages/watcher/lib/src/directory_watcher/linux.dart
@@ -2,12 +2,13 @@
 // for 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 watcher.directory_watcher.linux;
-
 import 'dart:async';
 import 'dart:io';
 
+import 'package:async/async.dart';
+
 import '../directory_watcher.dart';
+import '../path_set.dart';
 import '../resubscribable.dart';
 import '../utils.dart';
 import '../watch_event.dart';
@@ -32,8 +33,8 @@
 
 class _LinuxDirectoryWatcher
     implements DirectoryWatcher, ManuallyClosedWatcher {
-  String get directory => path;
-  final String path;
+  String get directory => _files.root;
+  String get path => _files.root;
 
   Stream<WatchEvent> get events => _eventsController.stream;
   final _eventsController = new StreamController<WatchEvent>.broadcast();
@@ -43,15 +44,17 @@
   Future get ready => _readyCompleter.future;
   final _readyCompleter = new Completer();
 
-  /// The last known state for each entry in this directory.
-  ///
-  /// The keys in this map are the paths to the directory entries; the values
-  /// are [_EntryState]s indicating whether the entries are files or
-  /// directories.
-  final _entries = new Map<String, _EntryState>();
+  /// A stream group for the [Directory.watch] events of [path] and all its
+  /// subdirectories.
+  var _nativeEvents = new StreamGroup<FileSystemEvent>();
 
-  /// The watchers for subdirectories of [directory].
-  final _subWatchers = new Map<String, _LinuxDirectoryWatcher>();
+  /// All known files recursively within [path].
+  final PathSet _files;
+
+  /// [Directory.watch] streams for [path]'s subdirectories, indexed by name.
+  ///
+  /// A stream is in this map if and only if it's also in [_nativeEvents].
+  final _subdirStreams = <String, Stream<FileSystemEvent>>{};
 
   /// A set of all subscriptions that this watcher subscribes to.
   ///
@@ -59,93 +62,51 @@
   /// watcher is closed.
   final _subscriptions = new Set<StreamSubscription>();
 
-  _LinuxDirectoryWatcher(this.path) {
-    // Batch the inotify changes together so that we can dedup events.
-    var innerStream = new Directory(path).watch()
-        .transform(new BatchedStreamTransformer<FileSystemEvent>());
-    _listen(innerStream, _onBatch,
-        onError: _eventsController.addError,
-        onDone: _onDone);
+  _LinuxDirectoryWatcher(String path)
+      : _files = new PathSet(path) {
+    _nativeEvents.add(new Directory(path).watch().transform(
+        new StreamTransformer.fromHandlers(handleDone: (sink) {
+      // Handle the done event here rather than in the call to [_listen] because
+      // [innerStream] won't close until we close the [StreamGroup]. However, if
+      // we close the [StreamGroup] here, we run the risk of new-directory
+      // events being fired after the group is closed, since batching delays
+      // those events. See b/30768513.
+      _onDone();
+    })));
 
-    _listen(new Directory(path).list(), (entity) {
-      _entries[entity.path] = new _EntryState(entity is Directory);
-      if (entity is! Directory) return;
-      _watchSubdir(entity.path);
+    // Batch the inotify changes together so that we can dedup events.
+    var innerStream = _nativeEvents.stream
+        .transform(new BatchedStreamTransformer<FileSystemEvent>());
+    _listen(innerStream, _onBatch, onError: _eventsController.addError);
+
+    _listen(new Directory(path).list(recursive: true), (entity) {
+      if (entity is Directory) {
+        _watchSubdir(entity.path);
+      } else {
+        _files.add(entity.path);
+      }
     }, onError: (error, stackTrace) {
       _eventsController.addError(error, stackTrace);
       close();
     }, onDone: () {
-      _waitUntilReady().then((_) => _readyCompleter.complete());
+      _readyCompleter.complete();
     }, cancelOnError: true);
   }
 
-  /// Returns a [Future] that completes once all the subdirectory watchers are
-  /// fully initialized.
-  Future _waitUntilReady() {
-    return Future.wait(_subWatchers.values.map((watcher) => watcher.ready))
-        .then((_) {
-      if (_subWatchers.values.every((watcher) => watcher.isReady)) return null;
-      return _waitUntilReady();
-    });
-  }
-
   void close() {
     for (var subscription in _subscriptions) {
       subscription.cancel();
     }
-    for (var watcher in _subWatchers.values) {
-      watcher.close();
-    }
 
-    _subWatchers.clear();
     _subscriptions.clear();
+    _subdirStreams.clear();
+    _files.clear();
+    _nativeEvents.close();
     _eventsController.close();
   }
 
-  /// Returns all files (not directories) that this watcher knows of are
-  /// recursively in the watched directory.
-  Set<String> get _allFiles {
-    var files = new Set<String>();
-    _getAllFiles(files);
-    return files;
-  }
-
-  /// Helper function for [_allFiles].
-  ///
-  /// Adds all files that this watcher knows of to [files].
-  void _getAllFiles(Set<String> files) {
-    files.addAll(_entries.keys
-        .where((path) => _entries[path] == _EntryState.FILE).toSet());
-    for (var watcher in _subWatchers.values) {
-      watcher._getAllFiles(files);
-    }
-  }
-
   /// Watch a subdirectory of [directory] for changes.
-  ///
-  /// If the subdirectory was added after [this] began emitting events, its
-  /// contents will be emitted as ADD events.
   void _watchSubdir(String path) {
-    if (_subWatchers.containsKey(path)) return;
-    var watcher = new _LinuxDirectoryWatcher(path);
-    _subWatchers[path] = watcher;
-
-    // TODO(nweiz): Catch any errors here that indicate that the directory in
-    // question doesn't exist and silently stop watching it instead of
-    // propagating the errors.
-    _listen(watcher.events, (event) {
-      if (isReady) _eventsController.add(event);
-    }, onError: (error, stackTrace) {
-      _eventsController.addError(error, stackTrace);
-      close();
-    }, onDone: () {
-      if (_subWatchers[path] == watcher) _subWatchers.remove(path);
-
-      // It's possible that a directory was removed and recreated very quickly.
-      // If so, make sure we're still watching it.
-      if (new Directory(path).existsSync()) _watchSubdir(path);
-    });
-
     // TODO(nweiz): Right now it's possible for the watcher to emit an event for
     // a file before the directory list is complete. This could lead to the user
     // seeing a MODIFY or REMOVE event for a file before they see an ADD event,
@@ -157,96 +118,110 @@
     // top-level clients such as barback as well, and could be implemented with
     // a wrapper similar to how listening/canceling works now.
 
-    // If a directory is added after we're finished with the initial scan, emit
-    // an event for each entry in it. This gives the user consistently gets an
-    // event for every new file.
-    watcher.ready.then((_) {
-      if (!isReady || _eventsController.isClosed) return;
-      _listen(new Directory(path).list(recursive: true), (entry) {
-        if (entry is Directory) return;
-        _eventsController.add(new WatchEvent(ChangeType.ADD, entry.path));
-      }, onError: (error, stackTrace) {
-        // Ignore an exception caused by the dir not existing. It's fine if it
-        // was added and then quickly removed.
-        if (error is FileSystemException) return;
-
-        _eventsController.addError(error, stackTrace);
-        close();
-      }, cancelOnError: true);
-    });
+    // TODO(nweiz): Catch any errors here that indicate that the directory in
+    // question doesn't exist and silently stop watching it instead of
+    // propagating the errors.
+    var stream = new Directory(path).watch();
+    _subdirStreams[path] = stream;
+    _nativeEvents.add(stream);
   }
 
   /// The callback that's run when a batch of changes comes in.
   void _onBatch(List<FileSystemEvent> batch) {
-    var changedEntries = new Set<String>();
-    var oldEntries = new Map.from(_entries);
+    var files = new Set<String>();
+    var dirs = new Set<String>();
+    var changed = new Set<String>();
 
     // inotify event batches are ordered by occurrence, so we treat them as a
-    // log of what happened to a file.
+    // log of what happened to a file. We only emit events based on the
+    // difference between the state before the batch and the state after it, not
+    // the intermediate state.
     for (var event in batch) {
       // If the watched directory is deleted or moved, we'll get a deletion
       // event for it. Ignore it; we handle closing [this] when the underlying
       // stream is closed.
       if (event.path == path) continue;
 
-      changedEntries.add(event.path);
+      changed.add(event.path);
 
       if (event is FileSystemMoveEvent) {
-        changedEntries.add(event.destination);
-        _changeEntryState(event.path, ChangeType.REMOVE, event.isDirectory);
-        _changeEntryState(event.destination, ChangeType.ADD, event.isDirectory);
-      } else {
-        _changeEntryState(event.path, _changeTypeFor(event), event.isDirectory);
-      }
-    }
+        files.remove(event.path);
+        dirs.remove(event.path);
 
-    for (var path in changedEntries) {
-      emitEvent(ChangeType type) {
-        if (isReady) _eventsController.add(new WatchEvent(type, path));
-      }
-
-      var oldState = oldEntries[path];
-      var newState = _entries[path];
-
-      if (oldState != _EntryState.FILE && newState == _EntryState.FILE) {
-        emitEvent(ChangeType.ADD);
-      } else if (oldState == _EntryState.FILE && newState == _EntryState.FILE) {
-        emitEvent(ChangeType.MODIFY);
-      } else if (oldState == _EntryState.FILE && newState != _EntryState.FILE) {
-        emitEvent(ChangeType.REMOVE);
-      }
-
-      if (oldState == _EntryState.DIRECTORY) {
-        var watcher = _subWatchers.remove(path);
-        if (watcher == null) continue;
-        for (var path in watcher._allFiles) {
-          _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+        changed.add(event.destination);
+        if (event.isDirectory) {
+          files.remove(event.destination);
+          dirs.add(event.destination);
+        } else {
+          files.add(event.destination);
+          dirs.remove(event.destination);
         }
-        watcher.close();
+      } else if (event is FileSystemDeleteEvent) {
+        files.remove(event.path);
+        dirs.remove(event.path);
+      } else if (event.isDirectory) {
+        files.remove(event.path);
+        dirs.add(event.path);
+      } else {
+        files.add(event.path);
+        dirs.remove(event.path);
       }
+    }
 
-      if (newState == _EntryState.DIRECTORY) _watchSubdir(path);
+    _applyChanges(files, dirs, changed);
+  }
+
+  /// Applies the net changes computed for a batch.
+  ///
+  /// The [files] and [dirs] sets contain the files and directories that now
+  /// exist, respectively. The [changed] set contains all files and directories
+  /// that have changed (including being removed), and so is a superset of
+  /// [files] and [dirs].
+  void _applyChanges(Set<String> files, Set<String> dirs, Set<String> changed) {
+    for (var path in changed) {
+      var stream = _subdirStreams.remove(path);
+      if (stream != null) _nativeEvents.add(stream);
+
+      // Unless [path] was a file and still is, emit REMOVE events for it or its
+      // contents,
+      if (files.contains(path) && _files.contains(path)) continue;
+      for (var file in _files.remove(path)) {
+        _emit(ChangeType.REMOVE, file);
+      }
+    }
+
+    for (var file in files) {
+      if (_files.contains(file)) {
+        _emit(ChangeType.MODIFY, file);
+      } else {
+        _emit(ChangeType.ADD, file);
+        _files.add(file);
+      }
+    }
+
+    for (var dir in dirs) {
+      _watchSubdir(dir);
+      _addSubdir(dir);
     }
   }
 
-  /// Changes the known state of the entry at [path] based on [change] and
-  /// [isDir].
-  void _changeEntryState(String path, ChangeType change, bool isDir) {
-    if (change == ChangeType.ADD || change == ChangeType.MODIFY) {
-      _entries[path] = new _EntryState(isDir);
-    } else {
-      assert(change == ChangeType.REMOVE);
-      _entries.remove(path);
-    }
-  }
+  /// Emits [ChangeType.ADD] events for the recursive contents of [path].
+  void _addSubdir(String path) {
+    _listen(new Directory(path).list(recursive: true), (entity) {
+      if (entity is Directory) {
+        _watchSubdir(entity.path);
+      } else {
+        _files.add(entity.path);
+        _emit(ChangeType.ADD, entity.path);
+      }
+    }, onError: (error, stackTrace) {
+      // Ignore an exception caused by the dir not existing. It's fine if it
+      // was added and then quickly removed.
+      if (error is FileSystemException) return;
 
-  /// Determines the [ChangeType] associated with [event].
-  ChangeType _changeTypeFor(FileSystemEvent event) {
-    if (event is FileSystemDeleteEvent) return ChangeType.REMOVE;
-    if (event is FileSystemCreateEvent) return ChangeType.ADD;
-
-    assert(event is FileSystemModifyEvent);
-    return ChangeType.MODIFY;
+      _eventsController.addError(error, stackTrace);
+      close();
+    }, cancelOnError: true);
   }
 
   /// Handles the underlying event stream closing, indicating that the directory
@@ -254,28 +229,23 @@
   void _onDone() {
     // Most of the time when a directory is removed, its contents will get
     // individual REMOVE events before the watch stream is closed -- in that
-    // case, [_entries] will be empty here. However, if the directory's removal
-    // is caused by a MOVE, we need to manually emit events.
+    // case, [_files] will be empty here. However, if the directory's removal is
+    // caused by a MOVE, we need to manually emit events.
     if (isReady) {
-      _entries.forEach((path, state) {
-        if (state == _EntryState.DIRECTORY) return;
-        _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
-      });
+      for (var file in _files.paths) {
+        _emit(ChangeType.REMOVE, file);
+      }
     }
 
-    // The parent directory often gets a close event before the subdirectories
-    // are done emitting events. We wait for them to finish before we close
-    // [events] so that we can be sure to emit a remove event for every file
-    // that used to exist.
-    Future.wait(_subWatchers.values.map((watcher) {
-      try {
-        return watcher.events.toList();
-      } on StateError catch (_) {
-        // It's possible that [watcher.events] is closed but the onDone event
-        // hasn't reached us yet. It's fine if so.
-        return new Future.value();
-      }
-    })).then((_) => close());
+    close();
+  }
+
+  /// Emits a [WatchEvent] with [type] and [path] if this watcher is in a state
+  /// to emit events.
+  void _emit(ChangeType type, String path) {
+    if (!isReady) return;
+    if (_eventsController.isClosed) return;
+    _eventsController.add(new WatchEvent(type, path));
   }
 
   /// Like [Stream.listen], but automatically adds the subscription to
@@ -290,22 +260,3 @@
     _subscriptions.add(subscription);
   }
 }
-
-/// An enum for the possible states of entries in a watched directory.
-class _EntryState {
-  final String _name;
-
-  /// The entry is a file.
-  static const FILE = const _EntryState._("file");
-
-  /// The entry is a directory.
-  static const DIRECTORY = const _EntryState._("directory");
-
-  const _EntryState._(this._name);
-
-  /// Returns [DIRECTORY] if [isDir] is true, and [FILE] otherwise.
-  factory _EntryState(bool isDir) =>
-      isDir ? _EntryState.DIRECTORY : _EntryState.FILE;
-
-  String toString() => _name;
-}
diff --git a/packages/watcher/lib/src/directory_watcher/mac_os.dart b/packages/watcher/lib/src/directory_watcher/mac_os.dart
index 487225e..8a17e2e 100644
--- a/packages/watcher/lib/src/directory_watcher/mac_os.dart
+++ b/packages/watcher/lib/src/directory_watcher/mac_os.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.directory_watcher.mac_os;
-
 import 'dart:async';
 import 'dart:io';
 
@@ -58,7 +56,7 @@
   ///
   /// This is separate from [_subscriptions] because this stream occasionally
   /// needs to be resubscribed in order to work around issue 14849.
-  StreamSubscription<FileSystemEvent> _watchSubscription;
+  StreamSubscription<List<FileSystemEvent>> _watchSubscription;
 
   /// The subscription to the [Directory.list] call for the initial listing of
   /// the directory to determine its initial state.
@@ -116,9 +114,9 @@
       return;
     }
 
-    _sortEvents(batch).forEach((path, events) {
-      var canonicalEvent = _canonicalEvent(events);
-      events = canonicalEvent == null ?
+    _sortEvents(batch).forEach((path, eventSet) {
+      var canonicalEvent = _canonicalEvent(eventSet);
+      var events = canonicalEvent == null ?
           _eventsBasedOnFileSystem(path) : [canonicalEvent];
 
       for (var event in events) {
@@ -139,7 +137,7 @@
 
           if (_files.containsDir(path)) continue;
 
-          var subscription;
+          StreamSubscription<FileSystemEntity> subscription;
           subscription = new Directory(path).list(recursive: true)
               .listen((entity) {
             if (entity is Directory) return;
@@ -175,7 +173,7 @@
   /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
   /// contain any events relating to [path].
   Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
-    var eventsForPaths = {};
+    var eventsForPaths = <String, Set>{};
 
     // FSEvents can report past events, including events on the root directory
     // such as it being created. We want to ignore these. If the directory is
@@ -187,8 +185,10 @@
     // events. Emitting them could cause useless or out-of-order events.
     var directories = unionAll(batch.map((event) {
       if (!event.isDirectory) return new Set();
-      if (event is! FileSystemMoveEvent) return new Set.from([event.path]);
-      return new Set.from([event.path, event.destination]);
+      if (event is FileSystemMoveEvent) {
+        return new Set.from([event.path, event.destination]);
+      }
+      return new Set.from([event.path]);
     }));
 
     isInModifiedDirectory(path) =>
@@ -294,7 +294,7 @@
     var fileExists = new File(path).existsSync();
     var dirExists = new Directory(path).existsSync();
 
-    var events = [];
+    var events = <FileSystemEvent>[];
     if (fileExisted) {
       if (fileExists) {
         events.add(new ConstructableFileSystemModifyEvent(path, false, false));
@@ -337,7 +337,7 @@
     // FSEvents can fail to report the contents of the directory being removed
     // when the directory itself is removed, so we need to manually mark the
     // files as removed.
-    for (var file in _files.toSet()) {
+    for (var file in _files.paths) {
       _emitEvent(ChangeType.REMOVE, file);
     }
     _files.clear();
diff --git a/packages/watcher/lib/src/directory_watcher/polling.dart b/packages/watcher/lib/src/directory_watcher/polling.dart
index 7f417d6..ebc1709 100644
--- a/packages/watcher/lib/src/directory_watcher/polling.dart
+++ b/packages/watcher/lib/src/directory_watcher/polling.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.directory_watcher.polling;
-
 import 'dart:async';
 import 'dart:io';
 
diff --git a/packages/watcher/lib/src/directory_watcher/windows.dart b/packages/watcher/lib/src/directory_watcher/windows.dart
index 0899519..67a2741 100644
--- a/packages/watcher/lib/src/directory_watcher/windows.dart
+++ b/packages/watcher/lib/src/directory_watcher/windows.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.

 // TODO(rnystrom): Merge with mac_os version.

 

-library watcher.directory_watcher.windows;

-

 import 'dart:async';

 import 'dart:collection';

 import 'dart:io';

@@ -136,7 +134,7 @@
           event is FileSystemDeleteEvent ||

           (FileSystemEntity.typeSync(path) ==

            FileSystemEntityType.NOT_FOUND)) {

-        for (var path in _files.toSet()) {

+        for (var path in _files.paths) {

           _emitEvent(ChangeType.REMOVE, path);

         }

         _files.clear();

@@ -163,10 +161,10 @@
 

   /// The callback that's run when [Directory.watch] emits a batch of events.

   void _onBatch(List<FileSystemEvent> batch) {

-    _sortEvents(batch).forEach((path, events) {

+    _sortEvents(batch).forEach((path, eventSet) {

 

-      var canonicalEvent = _canonicalEvent(events);

-      events = canonicalEvent == null ?

+      var canonicalEvent = _canonicalEvent(eventSet);

+      var events = canonicalEvent == null ?

           _eventsBasedOnFileSystem(path) : [canonicalEvent];

 

       for (var event in events) {

@@ -182,20 +180,20 @@
           if (_files.containsDir(path)) continue;

 

           var stream = new Directory(path).list(recursive: true);

-          var sub;

-          sub = stream.listen((entity) {

+          StreamSubscription<FileSystemEntity> subscription;

+          subscription = stream.listen((entity) {

             if (entity is Directory) return;

             if (_files.contains(path)) return;

 

             _emitEvent(ChangeType.ADD, entity.path);

             _files.add(entity.path);

           }, onDone: () {

-            _listSubscriptions.remove(sub);

+            _listSubscriptions.remove(subscription);

           }, onError: (e, stackTrace) {

-            _listSubscriptions.remove(sub);

+            _listSubscriptions.remove(subscription);

             _emitError(e, stackTrace);

           }, cancelOnError: true);

-          _listSubscriptions.add(sub);

+          _listSubscriptions.add(subscription);

         } else if (event is FileSystemModifyEvent) {

           if (!event.isDirectory) {

             _emitEvent(ChangeType.MODIFY, path);

@@ -219,15 +217,17 @@
   /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it

   /// contain any events relating to [path].

   Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {

-    var eventsForPaths = {};

+    var eventsForPaths = <String, Set>{};

 

     // Events within directories that already have events are superfluous; the

     // directory's full contents will be examined anyway, so we ignore such

     // events. Emitting them could cause useless or out-of-order events.

     var directories = unionAll(batch.map((event) {

       if (!event.isDirectory) return new Set();

-      if (event is! FileSystemMoveEvent) return new Set.from([event.path]);

-      return new Set.from([event.path, event.destination]);

+      if (event is FileSystemMoveEvent) {

+        return new Set.from([event.path, event.destination]);

+      }

+      return new Set.from([event.path]);

     }));

 

     isInModifiedDirectory(path) =>

@@ -322,7 +322,7 @@
     var fileExists = new File(path).existsSync();

     var dirExists = new Directory(path).existsSync();

 

-    var events = [];

+    var events = <FileSystemEvent>[];

     if (fileExisted) {

       if (fileExists) {

         events.add(new ConstructableFileSystemModifyEvent(path, false, false));

@@ -357,7 +357,7 @@
     _watchSubscription = null;

 

     // Emit remove events for any remaining files.

-    for (var file in _files.toSet()) {

+    for (var file in _files.paths) {

       _emitEvent(ChangeType.REMOVE, file);

     }

     _files.clear();

diff --git a/packages/watcher/lib/src/file_watcher.dart b/packages/watcher/lib/src/file_watcher.dart
index 9b31537..17c5f2e 100644
--- a/packages/watcher/lib/src/file_watcher.dart
+++ b/packages/watcher/lib/src/file_watcher.dart
@@ -2,11 +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.
 
-library watcher.file_watcher;
-
 import 'dart:io';
 
-import 'watch_event.dart';
 import '../watcher.dart';
 import 'file_watcher/native.dart';
 import 'file_watcher/polling.dart';
diff --git a/packages/watcher/lib/src/file_watcher/native.dart b/packages/watcher/lib/src/file_watcher/native.dart
index 1862e7b..f413a72 100644
--- a/packages/watcher/lib/src/file_watcher/native.dart
+++ b/packages/watcher/lib/src/file_watcher/native.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.file_watcher.native;
-
 import 'dart:async';
 import 'dart:io';
 
diff --git a/packages/watcher/lib/src/file_watcher/polling.dart b/packages/watcher/lib/src/file_watcher/polling.dart
index 3480ae2..3f2e9f1 100644
--- a/packages/watcher/lib/src/file_watcher/polling.dart
+++ b/packages/watcher/lib/src/file_watcher/polling.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.file_watcher.polling;
-
 import 'dart:async';
 import 'dart:io';
 
diff --git a/packages/watcher/lib/src/path_set.dart b/packages/watcher/lib/src/path_set.dart
index e9f7d32..3726e1f 100644
--- a/packages/watcher/lib/src/path_set.dart
+++ b/packages/watcher/lib/src/path_set.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.path_dart;
-
 import 'dart:collection';
 
 import 'package:path/path.dart' as p;
@@ -21,32 +19,24 @@
 
   /// The path set's directory hierarchy.
   ///
-  /// Each level of this hierarchy has the same structure: a map from strings to
-  /// other maps, which are further levels of the hierarchy. A map with no
-  /// elements indicates a path that was added to the set that has no paths
-  /// beneath it. Such a path should not be treated as a directory by
-  /// [containsDir].
-  final _entries = new Map<String, Map>();
-
-  /// The set of paths that were explicitly added to this set.
-  ///
-  /// This is needed to disambiguate a directory that was explicitly added to
-  /// the set from a directory that was implicitly added by adding a path
-  /// beneath it.
-  final _paths = new Set<String>();
+  /// Each entry represents a directory or file. It may be a file or directory
+  /// that was explicitly added, or a parent directory that was implicitly
+  /// added in order to add a child.
+  final _Entry _entries = new _Entry();
 
   PathSet(this.root);
 
   /// Adds [path] to the set.
   void add(String path) {
     path = _normalize(path);
-    _paths.add(path);
 
-    var parts = _split(path);
-    var dir = _entries;
+    var parts = p.split(path);
+    var entry = _entries;
     for (var part in parts) {
-      dir = dir.putIfAbsent(part, () => {});
+      entry = entry.contents.putIfAbsent(part, () => new _Entry());
     }
+
+    entry.isExplicit = true;
   }
 
   /// Removes [path] and any paths beneath it from the set and returns the
@@ -59,110 +49,140 @@
   /// empty set.
   Set<String> remove(String path) {
     path = _normalize(path);
-    var parts = new Queue.from(_split(path));
+    var parts = new Queue.from(p.split(path));
 
     // Remove the children of [dir], as well as [dir] itself if necessary.
     //
     // [partialPath] is the path to [dir], and a prefix of [path]; the remaining
     // components of [path] are in [parts].
-    recurse(dir, partialPath) {
+    Set<String> recurse(dir, partialPath) {
       if (parts.length > 1) {
         // If there's more than one component left in [path], recurse down to
         // the next level.
         var part = parts.removeFirst();
-        var entry = dir[part];
-        if (entry == null || entry.isEmpty) return new Set();
+        var entry = dir.contents[part];
+        if (entry == null || entry.contents.isEmpty) return new Set();
 
         partialPath = p.join(partialPath, part);
         var paths = recurse(entry, partialPath);
         // After removing this entry's children, if it has no more children and
         // it's not in the set in its own right, remove it as well.
-        if (entry.isEmpty && !_paths.contains(partialPath)) dir.remove(part);
+        if (entry.contents.isEmpty && !entry.isExplicit) {
+          dir.contents.remove(part);
+        }
         return paths;
       }
 
       // If there's only one component left in [path], we should remove it.
-      var entry = dir.remove(parts.first);
+      var entry = dir.contents.remove(parts.first);
       if (entry == null) return new Set();
 
-      if (entry.isEmpty) {
-        _paths.remove(path);
-        return new Set.from([path]);
+      if (entry.contents.isEmpty) {
+        return new Set.from([p.join(root, path)]);
       }
 
-      var set = _removePathsIn(entry, path);
-      if (_paths.contains(path)) {
-        _paths.remove(path);
-        set.add(path);
+      var set = _explicitPathsWithin(entry, path);
+      if (entry.isExplicit) {
+        set.add(p.join(root, path));
       }
+
       return set;
     }
 
     return recurse(_entries, root);
   }
 
-  /// Recursively removes and returns all paths in [dir].
+  /// Recursively lists all of the explicit paths within [dir].
   ///
-  /// [root] should be the path to [dir].
-  Set<String> _removePathsIn(Map dir, String root) {
-    var removedPaths = new Set();
+  /// [dirPath] should be the path to [dir].
+  Set<String> _explicitPathsWithin(_Entry dir, String dirPath) {
+    var paths = new Set<String>();
     recurse(dir, path) {
-      dir.forEach((name, entry) {
+      dir.contents.forEach((name, entry) {
         var entryPath = p.join(path, name);
-        if (_paths.remove(entryPath)) removedPaths.add(entryPath);
+        if (entry.isExplicit) paths.add(p.join(root, entryPath));
+
         recurse(entry, entryPath);
       });
     }
 
-    recurse(dir, root);
-    return removedPaths;
+    recurse(dir, dirPath);
+    return paths;
   }
 
   /// Returns whether [this] contains [path].
   ///
   /// This only returns true for paths explicitly added to [this].
   /// Implicitly-added directories can be inspected using [containsDir].
-  bool contains(String path) => _paths.contains(_normalize(path));
+  bool contains(String path) {
+    path = _normalize(path);
+    var entry = _entries;
+
+    for (var part in p.split(path)) {
+      entry = entry.contents[part];
+      if (entry == null) return false;
+    }
+
+    return entry.isExplicit;
+  }
 
   /// Returns whether [this] contains paths beneath [path].
   bool containsDir(String path) {
     path = _normalize(path);
-    var dir = _entries;
+    var entry = _entries;
 
-    for (var part in _split(path)) {
-      dir = dir[part];
-      if (dir == null) return false;
+    for (var part in p.split(path)) {
+      entry = entry.contents[part];
+      if (entry == null) return false;
     }
 
-    return !dir.isEmpty;
+    return !entry.contents.isEmpty;
   }
 
-  /// Returns a [Set] of all paths in [this].
-  Set<String> toSet() => _paths.toSet();
+  /// All of the paths explicitly added to this set.
+  List<String> get paths {
+    var result = <String>[];
+
+    recurse(dir, path) {
+      for (var name in dir.contents.keys) {
+        var entry = dir.contents[name];
+        var entryPath = p.join(path, name);
+        if (entry.isExplicit) result.add(entryPath);
+        recurse(entry, entryPath);
+      }
+    }
+
+    recurse(_entries, root);
+    return result;
+  }
 
   /// Removes all paths from [this].
   void clear() {
-    _paths.clear();
-    _entries.clear();
+    _entries.contents.clear();
   }
 
-  String toString() => _paths.toString();
-
   /// Returns a normalized version of [path].
   ///
   /// This removes any extra ".." or "."s and ensure that the returned path
   /// begins with [root]. It's an error if [path] isn't within [root].
   String _normalize(String path) {
-    var relative = p.relative(p.normalize(path), from: root);
-    var parts = p.split(relative);
-    // TODO(nweiz): replace this with [p.isWithin] when that exists (issue
-    // 14980).
-    if (!p.isRelative(relative) || parts.first == '..' || parts.first == '.') {
-      throw new ArgumentError('Path "$path" is not inside "$root".');
-    }
-    return p.join(root, relative);
-  }
+    assert(p.isWithin(root, path));
 
-  /// Returns the segments of [path] beneath [root].
-  List<String> _split(String path) => p.split(p.relative(path, from: root));
+    return p.relative(p.normalize(path), from: root);
+  }
+}
+
+/// A virtual file system entity tracked by the [PathSet].
+///
+/// It may have child entries in [contents], which implies it's a directory.
+class _Entry {
+  /// The child entries contained in this directory.
+  final Map<String, _Entry> contents = {};
+
+  /// If this entry was explicitly added as a leaf file system entity, this
+  /// will be true.
+  ///
+  /// Otherwise, it represents a parent directory that was implicitly added
+  /// when added some child of it.
+  bool isExplicit = false;
 }
diff --git a/packages/watcher/lib/src/resubscribable.dart b/packages/watcher/lib/src/resubscribable.dart
index 2844c1e..aeefe93 100644
--- a/packages/watcher/lib/src/resubscribable.dart
+++ b/packages/watcher/lib/src/resubscribable.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.resubscribable;
-
 import 'dart:async';
 
 import '../watcher.dart';
diff --git a/packages/watcher/lib/src/stat.dart b/packages/watcher/lib/src/stat.dart
index d36eff3..05ee9ba 100644
--- a/packages/watcher/lib/src/stat.dart
+++ b/packages/watcher/lib/src/stat.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.stat;
-
 import 'dart:async';
 import 'dart:io';
 
diff --git a/packages/watcher/lib/src/utils.dart b/packages/watcher/lib/src/utils.dart
index 007c84c..6f3ff02 100644
--- a/packages/watcher/lib/src/utils.dart
+++ b/packages/watcher/lib/src/utils.dart
@@ -2,12 +2,12 @@
 // for 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 watcher.utils;
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:collection';
 
+import 'package:async/async.dart';
+
 /// Returns `true` if [error] is a [FileSystemException] for a missing
 /// directory.
 bool isDirectoryNotFoundException(error) {
@@ -31,17 +31,18 @@
 /// If [broadcast] is true, a broadcast stream is returned. This assumes that
 /// the stream returned by [future] will be a broadcast stream as well.
 /// [broadcast] defaults to false.
-Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+Stream/*<T>*/ futureStream/*<T>*/(Future<Stream/*<T>*/> future,
+    {bool broadcast: false}) {
   var subscription;
-  var controller;
+  StreamController/*<T>*/ controller;
 
-  future = future.catchError((e, stackTrace) {
+  future = DelegatingFuture.typed(future.catchError((e, stackTrace) {
     // Since [controller] is synchronous, it's likely that emitting an error
     // will cause it to be cancelled before we call close.
     if (controller != null) controller.addError(e, stackTrace);
     if (controller != null) controller.close();
     controller = null;
-  });
+  }));
 
   onListen() {
     future.then((stream) {
@@ -94,7 +95,7 @@
 /// microtasks.
 class BatchedStreamTransformer<T> implements StreamTransformer<T, List<T>> {
   Stream<List<T>> bind(Stream<T> input) {
-    var batch = new Queue();
+    var batch = new Queue<T>();
     return new StreamTransformer<T, List<T>>.fromHandlers(
         handleData: (event, sink) {
       batch.add(event);
diff --git a/packages/watcher/lib/src/watch_event.dart b/packages/watcher/lib/src/watch_event.dart
index be6d70c..54093a5 100644
--- a/packages/watcher/lib/src/watch_event.dart
+++ b/packages/watcher/lib/src/watch_event.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.watch_event;
-
 /// An event describing a single change to the file system.
 class WatchEvent {
   /// The manner in which the file at [path] has changed.
diff --git a/packages/watcher/lib/watcher.dart b/packages/watcher/lib/watcher.dart
index 79dcc0d..b3cebe6 100644
--- a/packages/watcher/lib/watcher.dart
+++ b/packages/watcher/lib/watcher.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher;
-
 import 'dart:async';
 import 'dart:io';
 
diff --git a/packages/watcher/pubspec.yaml b/packages/watcher/pubspec.yaml
index 2e033f1..bee3546 100644
--- a/packages/watcher/pubspec.yaml
+++ b/packages/watcher/pubspec.yaml
@@ -1,14 +1,17 @@
 name: watcher
-version: 0.9.7
+version: 0.9.7+3
 author: Dart Team <misc@dartlang.org>
-homepage: http://github.com/dart-lang/watcher
+homepage: https://github.com/dart-lang/watcher
 description: >
   A file system watcher. It monitors changes to contents of directories and
   sends notifications when files have been added, removed, or modified.
 environment:
   sdk: '>=1.9.0 <2.0.0'
 dependencies:
+  async: '^1.10.0'
+  collection: '^1.0.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
+  benchmark_harness: '^1.0.4'
   scheduled_test: '^0.12.0'
   test: '^0.12.0'
diff --git a/packages/watcher/test/directory_watcher/shared.dart b/packages/watcher/test/directory_watcher/shared.dart
index ff48cb2..148eee2 100644
--- a/packages/watcher/test/directory_watcher/shared.dart
+++ b/packages/watcher/test/directory_watcher/shared.dart
@@ -92,6 +92,23 @@
     ]);
   });
 
+  // Regression test for b/30768513.
+  test("doesn't crash when the directory is moved immediately after a subdir "
+      "is added", () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(path: "dir");
+
+    createDir("dir/subdir");
+    renameDir("dir", "moved_dir");
+    createDir("dir");
+    inAnyOrder([
+      isRemoveEvent("dir/a.txt"),
+      isRemoveEvent("dir/b.txt")
+    ]);
+  });
+
   group("moves", () {
     test('notifies when a file is moved within the watched directory', () {
       writeFile("old.txt");
@@ -246,6 +263,37 @@
       expectModifyEvent("new/file.txt");
     });
 
+    test('notifies when a file is replaced by a subdirectory', () {
+      writeFile("new");
+      writeFile("old/file.txt");
+      startWatcher();
+
+      deleteFile("new");
+      renameDir("old", "new");
+      inAnyOrder([
+        isRemoveEvent("new"),
+        isRemoveEvent("old/file.txt"),
+        isAddEvent("new/file.txt")
+      ]);
+    });
+
+    test('notifies when a subdirectory is replaced by a file', () {
+      writeFile("old");
+      writeFile("new/file.txt");
+      startWatcher();
+
+      renameDir("new", "newer");
+      renameFile("old", "new");
+      inAnyOrder([
+        isRemoveEvent("new/file.txt"),
+        isAddEvent("newer/file.txt"),
+        isRemoveEvent("old"),
+        isAddEvent("new")
+      ]);
+    }, onPlatform: {
+      "mac-os": new Skip("https://github.com/dart-lang/watcher/issues/21")
+    });
+
     test('emits events for many nested files added at once', () {
       withPermutations((i, j, k) =>
           writeFile("sub/sub-$i/sub-$j/file-$k.txt"));
diff --git a/packages/watcher/test/file_watcher/native_test.dart b/packages/watcher/test/file_watcher/native_test.dart
index 30d0eca..cbf11b6 100644
--- a/packages/watcher/test/file_watcher/native_test.dart
+++ b/packages/watcher/test/file_watcher/native_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:watcher/src/file_watcher/native.dart';
-import 'package:watcher/watcher.dart';
 
 import 'shared.dart';
 import '../utils.dart';
diff --git a/packages/watcher/test/no_subscription/mac_os_test.dart b/packages/watcher/test/no_subscription/mac_os_test.dart
index d5b1c8e..499aff3 100644
--- a/packages/watcher/test/no_subscription/mac_os_test.dart
+++ b/packages/watcher/test/no_subscription/mac_os_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @TestOn('mac-os')
+@Skip("Flaky due to sdk#23877")
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:watcher/src/directory_watcher/mac_os.dart';
diff --git a/packages/watcher/test/path_set_test.dart b/packages/watcher/test/path_set_test.dart
index 13e797c..d3420d3 100644
--- a/packages/watcher/test/path_set_test.dart
+++ b/packages/watcher/test/path_set_test.dart
@@ -6,8 +6,6 @@
 import 'package:test/test.dart';
 import 'package:watcher/src/path_set.dart';
 
-import 'utils.dart';
-
 Matcher containsPath(String path) => predicate((set) =>
     set is PathSet && set.contains(path),
     'set contains "$path"');
@@ -42,10 +40,6 @@
       set.add(p.absolute("root/path/to/file"));
       expect(set, containsPath("root/path/to/file"));
     });
-
-    test("that's not beneath the root throws an error", () {
-      expect(() => set.add("path/to/file"), throwsArgumentError);
-    });
   });
 
   group("removing a path", () {
@@ -78,7 +72,7 @@
       expect(set, isNot(containsPath("root/path/to/two")));
       expect(set, isNot(containsPath("root/path/to/sub/three")));
     });
-  
+
     test("that's a directory in the set removes and returns it and all files "
         "beneath it", () {
       set.add("root/path");
@@ -110,10 +104,6 @@
       expect(set.remove(p.absolute("root/path/to/file")),
           unorderedEquals([p.normalize("root/path/to/file")]));
     });
-
-    test("that's not beneath the root throws an error", () {
-      expect(() => set.remove("path/to/file"), throwsArgumentError);
-    });
   });
 
   group("containsPath()", () {
@@ -143,10 +133,6 @@
       set.add("root/path/to/file");
       expect(set, containsPath(p.absolute("root/path/to/file")));
     });
-
-    test("with a path that's not beneath the root throws an error", () {
-      expect(() => set.contains("path/to/file"), throwsArgumentError);
-    });
   });
 
   group("containsDir()", () {
@@ -198,13 +184,13 @@
     });
   });
 
-  group("toSet", () {
+  group("paths", () {
     test("returns paths added to the set", () {
       set.add("root/path");
       set.add("root/path/to/one");
       set.add("root/path/to/two");
 
-      expect(set.toSet(), unorderedEquals([
+      expect(set.paths, unorderedEquals([
         "root/path",
         "root/path/to/one",
         "root/path/to/two",
@@ -216,7 +202,7 @@
       set.add("root/path/to/two");
       set.remove("root/path/to/two");
 
-      expect(set.toSet(), unorderedEquals([p.normalize("root/path/to/one")]));
+      expect(set.paths, unorderedEquals([p.normalize("root/path/to/one")]));
     });
   });
 
@@ -227,7 +213,7 @@
       set.add("root/path/to/two");
 
       set.clear();
-      expect(set.toSet(), isEmpty);
+      expect(set.paths, isEmpty);
     });
   });
 }
diff --git a/packages/watcher/test/utils.dart b/packages/watcher/test/utils.dart
index 7dd8332..e3c2a1b 100644
--- a/packages/watcher/test/utils.dart
+++ b/packages/watcher/test/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library watcher.test.utils;
-
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
@@ -13,9 +11,6 @@
 import 'package:watcher/src/stat.dart';
 import 'package:watcher/src/utils.dart';
 
-// TODO(nweiz): remove this when issue 15042 is fixed.
-import 'package:watcher/src/directory_watcher/mac_os.dart';
-
 /// The path to the temporary sandbox created for each test. All file
 /// operations are implicitly relative to this directory.
 String _sandboxDir;
@@ -292,7 +287,7 @@
       // Make sure we always use the same separator on Windows.
       path = p.normalize(path);
 
-      var milliseconds = _mockFileModificationTimes.putIfAbsent(path, () => 0);
+      _mockFileModificationTimes.putIfAbsent(path, () => 0);
       _mockFileModificationTimes[path]++;
     }
   }, "write file $path");
@@ -316,7 +311,7 @@
     to = p.normalize(to);
 
     // Manually update the mock modification time for the file.
-    var milliseconds = _mockFileModificationTimes.putIfAbsent(to, () => 0);
+    _mockFileModificationTimes.putIfAbsent(to, () => 0);
     _mockFileModificationTimes[to]++;
   }, "rename file $from to $to");
 }
@@ -349,9 +344,10 @@
 /// Returns a set of all values returns by [callback].
 ///
 /// [limit] defaults to 3.
-Set withPermutations(callback(int i, int j, int k), {int limit}) {
+Set/*<S>*/ withPermutations/*<S>*/(/*=S*/ callback(int i, int j, int k),
+    {int limit}) {
   if (limit == null) limit = 3;
-  var results = new Set();
+  var results = new Set/*<S>*/();
   for (var i = 0; i < limit; i++) {
     for (var j = 0; j < limit; j++) {
       for (var k = 0; k < limit; k++) {
diff --git a/packages/web_components/AUTHORS b/packages/web_components/AUTHORS
index 0617765..b132d3f 100644
--- a/packages/web_components/AUTHORS
+++ b/packages/web_components/AUTHORS
@@ -7,3 +7,4 @@
 #   Organization <fnmatch pattern>
 #
 Google Inc. <*@google.com>
+Matias Meno <m@tias.me>
diff --git a/packages/web_components/CHANGELOG.md b/packages/web_components/CHANGELOG.md
index 865b0b2..0a3cc5d 100644
--- a/packages/web_components/CHANGELOG.md
+++ b/packages/web_components/CHANGELOG.md
@@ -1,3 +1,12 @@
+#### 0.12.5
+  * Update to not use deprecated analyzer apis.
+  * Update analyzer minimum version to 0.27.1.
+
+#### 0.12.4
+  * Update to JS version
+    [0.7.23](https://github.com/webcomponents/webcomponentsjs/tree/v0.7.23).
+  * Update `analyzer`, `code_transformers`, and `html` version constraints.
+
 #### 0.12.3
   * Update to JS version
     [0.7.21](https://github.com/webcomponents/webcomponentsjs/tree/v0.7.21).
diff --git a/packages/web_components/lib/CustomElements.js b/packages/web_components/lib/CustomElements.js
old mode 100644
new mode 100755
index 85cc7e2..1897558
--- a/packages/web_components/lib/CustomElements.js
+++ b/packages/web_components/lib/CustomElements.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 if (typeof WeakMap === "undefined") {
   (function() {
     var defineProperty = Object.defineProperty;
@@ -351,7 +351,7 @@
 
 (function(scope) {
   "use strict";
-  if (!window.performance) {
+  if (!(window.performance && window.performance.now)) {
     var start = Date.now();
     window.performance = {
       now: function() {
@@ -778,6 +778,9 @@
       definition.prototype = Object.create(HTMLElement.prototype);
     }
     definition.__name = name.toLowerCase();
+    if (definition.extends) {
+      definition.extends = definition.extends.toLowerCase();
+    }
     definition.lifecycle = definition.lifecycle || {};
     definition.ancestry = ancestry(definition.extends);
     resolveTagName(definition);
@@ -950,21 +953,6 @@
   }
   wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
   wrapDomMethodToForceUpgrade(document, "importNode");
-  if (isIE) {
-    (function() {
-      var importNode = document.importNode;
-      document.importNode = function() {
-        var n = importNode.apply(document, arguments);
-        if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
-          var f = document.createDocumentFragment();
-          f.appendChild(n);
-          return f;
-        } else {
-          return n;
-        }
-      };
-    })();
-  }
   document.registerElement = register;
   document.createElement = createElement;
   document.createElementNS = createElementNS;
diff --git a/packages/web_components/lib/CustomElements.min.js b/packages/web_components/lib/CustomElements.min.js
old mode 100644
new mode 100755
index 192d493..707e097
--- a/packages/web_components/lib/CustomElements.min.js
+++ b/packages/web_components/lib/CustomElements.min.js
@@ -7,5 +7,5 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),b||(b=!0,w(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){b=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var d=t(a);d&&i.enqueue(d)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function d(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function s(e){var t=new d(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return y=new d(e,t)}function c(e){return N?N:(N=s(y),N.oldValue=e,N)}function l(){y=N=void 0}function f(e){return e===N||e===y}function m(e,t){return e===t?e:N&&f(e)?N:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var w,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))w=setTimeout;else if(window.setImmediate)w=window.setImmediate;else{var h=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=h;h=[],t.forEach(function(e){e()})}}),w=function(e){h.push(e),window.postMessage(g,"*")}}var b=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,N;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=m(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new u("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?c(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=u("characterData",o),a=e.prevValue;i(o,function(e){return e.characterData?e.characterDataOldValue?c(a):r:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var d,s,f=e.target;"DOMNodeInserted"===e.type?(d=[f],s=[]):(d=[],s=[f]);var m=f.previousSibling,p=f.nextSibling,r=u("childList",e.target.parentNode);r.addedNodes=d,r.removedNodes=s,r.previousSibling=m,r.nextSibling=p,i(e.relatedNode,function(e){return e.childList?r:void 0})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),d=0,s=r.length;s>d&&(o=r[d]);d++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function r(e){N.push(e),y||(y=!0,setTimeout(i))}function i(){y=!1;for(var e,t=N,n=0,o=t.length;o>n&&(e=t[n]);n++)e();N=[]}function a(e){_?r(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function s(e){u(e),b(e,function(e){u(e)})}function u(e){_?r(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)w(t),t=t.olderShadowRoot}}function m(e,n){if(g.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&s(e)}))}),g.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(m(e,t.takeRecords()),i())}function w(e){if(!e.__observer){var t=new MutationObserver(m.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),w(e),g.dom&&console.groupEnd()}function h(e){E(e,v)}var g=e.flags,b=e.forSubtree,E=e.forDocumentTree,_=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=_,e.hasThrottledAttached=_;var y=!1,N=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;O&&(Element.prototype.createShadowRoot=function(){var e=O.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=f,e.upgradeDocumentTree=h,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),d=0;i=a[d];d++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var s=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(u(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return s.prototype||(s.prototype=Object.create(HTMLElement.prototype)),s.__name=t.toLowerCase(),s.lifecycle=s.lifecycle||{},s.ancestry=i(s["extends"]),a(s),d(s),n(s.prototype),c(s.__name,s),s.ctor=l(s),s.ctor.prototype=s.prototype,s.prototype.constructor=s.ctor,e.ready&&h(document),s.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<y.length;t++)if(e===y[t])return!0}function i(e){var t=u(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function d(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function s(e){return b(O(e.tag),e)}function u(e){return e?N[e.toLowerCase()]:void 0}function c(e,t){N[e]=t}function l(e){return function(){return s(e)}}function f(e,t,n){return e===M?m(t,n):D(e,t)}function m(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=u(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=m(e),o.setAttribute("is",t),o):(o=O(e),e.indexOf("-")>=0&&E(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return g(e),e}}var w,v=e.isIE,h=e.upgradeDocumentTree,g=e.upgradeAll,b=e.upgradeWithDefinition,E=e.implementPrototype,_=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],N={},M="http://www.w3.org/1999/xhtml",O=document.createElement.bind(document),D=document.createElementNS.bind(document);w=Object.__proto__||_?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=m,document.createElementNS=f,e.registry=N,e["instanceof"]=w,e.reservedTagList=y,e.getRegisteredDefinition=u,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var d=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(d,t)}else t()}(window.CustomElements);
\ No newline at end of file
+// @version 0.7.23
+"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){E.push(e),b||(b=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){b=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var d=t(a);d&&i.enqueue(d)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function d(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function s(e){var t=new d(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return y=new d(e,t)}function c(e){return N?N:(N=s(y),N.oldValue=e,N)}function l(){y=N=void 0}function f(e){return e===N||e===y}function p(e,t){return e===t?e:N&&f(e)?N:null}function w(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var h=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=h;h=[],t.forEach(function(e){e()})}}),m=function(e){h.push(e),window.postMessage(g,"*")}}var b=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new w(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,N;w.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=p(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new u("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?c(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=u("characterData",o),a=e.prevValue;i(o,function(e){if(e.characterData)return e.characterDataOldValue?c(a):r});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var d,s,f=e.target;"DOMNodeInserted"===e.type?(d=[f],s=[]):(d=[],s=[f]);var p=f.previousSibling,w=f.nextSibling,r=u("childList",e.target.parentNode);r.addedNodes=d,r.removedNodes=s,r.previousSibling=p,r.nextSibling=w,i(e.relatedNode,function(e){if(e.childList)return r})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),d=0,s=r.length;d<s&&(o=r[d]);d++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function o(e,t){b(e,function(e){if(n(e,t))return!0})}function r(e){N.push(e),y||(y=!0,setTimeout(i))}function i(){y=!1;for(var e,t=N,n=0,o=t.length;n<o&&(e=t[n]);n++)e();N=[]}function a(e){_?r(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function s(e){u(e),b(e,function(e){u(e)})}function u(e){_?r(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function p(e,n){if(g.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&s(e)}))}),g.dom&&console.groupEnd()}function w(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(p.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function h(e){E(e,v)}var g=e.flags,b=e.forSubtree,E=e.forDocumentTree,_=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=_,e.hasThrottledAttached=_;var y=!1,N=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;O&&(Element.prototype.createShadowRoot=function(){var e=O.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=f,e.upgradeDocumentTree=h,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=w}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),d=0;i=a[d];d++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var s=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(u(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return s.prototype||(s.prototype=Object.create(HTMLElement.prototype)),s.__name=t.toLowerCase(),s["extends"]&&(s["extends"]=s["extends"].toLowerCase()),s.lifecycle=s.lifecycle||{},s.ancestry=i(s["extends"]),a(s),d(s),n(s.prototype),c(s.__name,s),s.ctor=l(s),s.ctor.prototype=s.prototype,s.prototype.constructor=s.ctor,e.ready&&v(document),s.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=u(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function d(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function s(e){return g(M(e.tag),e)}function u(e){if(e)return y[e.toLowerCase()]}function c(e,t){y[e]=t}function l(e){return function(){return s(e)}}function f(e,t,n){return e===N?p(t,n):O(e,t)}function p(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=u(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=p(e),o.setAttribute("is",t),o):(o=M(e),e.indexOf("-")>=0&&b(o,HTMLElement),o)}function w(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return h(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),h=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],y={},N="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},w(Node.prototype,"cloneNode"),w(document,"importNode"),document.registerElement=t,document.createElement=p,document.createElementNS=f,e.registry=y,e["instanceof"]=m,e.reservedTagList=_,e.getRegisteredDefinition=u,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var d=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(d,t)}else t()}(window.CustomElements);
\ No newline at end of file
diff --git a/packages/web_components/lib/HTMLImports.js b/packages/web_components/lib/HTMLImports.js
old mode 100644
new mode 100755
index 047e5ac..39c2d6a
--- a/packages/web_components/lib/HTMLImports.js
+++ b/packages/web_components/lib/HTMLImports.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 if (typeof WeakMap === "undefined") {
   (function() {
     var defineProperty = Object.defineProperty;
@@ -351,7 +351,7 @@
 
 (function(scope) {
   "use strict";
-  if (!window.performance) {
+  if (!(window.performance && window.performance.now)) {
     var start = Date.now();
     window.performance = {
       now: function() {
diff --git a/packages/web_components/lib/HTMLImports.min.js b/packages/web_components/lib/HTMLImports.min.js
old mode 100644
new mode 100755
index c7773e0..e11c830
--- a/packages/web_components/lib/HTMLImports.min.js
+++ b/packages/web_components/lib/HTMLImports.min.js
@@ -7,5 +7,5 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),g||(g=!0,f(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function c(e,t){return y=new s(e,t)}function u(e){return L?L:(L=d(y),L.oldValue=e,L)}function l(){y=L=void 0}function h(e){return e===L||e===y}function m(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var f,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))f=setTimeout;else if(window.setImmediate)f=window.setImmediate;else{var w=[],b=String(Math.random());window.addEventListener("message",function(e){if(e.data===b){var t=w;w=[],t.forEach(function(e){e()})}}),f=function(e){w.push(e),window.postMessage(b,"*")}}var g=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=v.get(e);r||v.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new p(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,L;p.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=m(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new c("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=c("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,d,h=e.target;"DOMNodeInserted"===e.type?(s=[h],d=[]):(s=[],d=[h]);var m=h.previousSibling,p=h.nextSibling,o=c("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=d,o.previousSibling=m,o.nextSibling=p,i(e.relatedNode,function(e){return e.childList?o:void 0})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===w)&&(t.removeEventListener(b,o),r(e,t))};t.addEventListener(b,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){d==c&&e&&e({allImports:s,loadedImports:u,errorImports:l})}function r(e){o(e),u.push(this),d++,n()}function i(e){l.push(this),d++,n()}var s=t.querySelectorAll("link[rel=import]"),d=0,c=s.length,u=[],l=[];if(c)for(var h,m=0;c>m&&(h=s[m]);m++)a(h)?(u.push(this),d++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),m=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=m(document),f={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return m(e)},configurable:!0};Object.defineProperty(document,"_currentScript",f),Object.defineProperty(p,"_currentScript",f);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)c(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,d=a.length;d>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),c&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;s>d&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,d=e.rootDocument,c=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===d?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(r,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n.__doc=d}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},m=new c(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(d,"baseURI",p)}e.importer=h,e.importLoader=m}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,d=e.length;d>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports);
\ No newline at end of file
+// @version 0.7.23
+"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){E.push(e),g||(g=!0,f(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function c(e,t){return y=new s(e,t)}function u(e){return L?L:(L=d(y),L.oldValue=e,L)}function l(){y=L=void 0}function h(e){return e===L||e===y}function m(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var f,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))f=setTimeout;else if(window.setImmediate)f=window.setImmediate;else{var w=[],b=String(Math.random());window.addEventListener("message",function(e){if(e.data===b){var t=w;w=[],t.forEach(function(e){e()})}}),f=function(e){w.push(e),window.postMessage(b,"*")}}var g=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=v.get(e);r||v.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new p(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,L;p.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=m(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new c("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=c("characterData",r),a=e.prevValue;i(r,function(e){if(e.characterData)return e.characterDataOldValue?u(a):o});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,d,h=e.target;"DOMNodeInserted"===e.type?(s=[h],d=[]):(s=[],d=[h]);var m=h.previousSibling,p=h.nextSibling,o=c("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=d,o.previousSibling=m,o.nextSibling=p,i(e.relatedNode,function(e){if(e.childList)return o})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(b,o),r(e,t))};t.addEventListener(b,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){d==c&&e&&e({allImports:s,loadedImports:u,errorImports:l})}function r(e){o(e),u.push(this),d++,n()}function i(e){l.push(this),d++,n()}var s=t.querySelectorAll("link[rel=import]"),d=0,c=s.length,u=[],l=[];if(c)for(var h,m=0;m<c&&(h=s[m]);m++)a(h)?(u.push(this),d++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),m=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=m(document),f={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return m(e)},configurable:!0};Object.defineProperty(document,"_currentScript",f),Object.defineProperty(p,"_currentScript",f);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;n<r&&(e=t[n]);n++)c(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,d=a.length;s<d&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),c&&"style"===e.localName){var o=!1;if(e.textContent.indexOf("@import")==-1)o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;d<s&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;i<a&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,d=e.rootDocument,c=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===d?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(r,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n.__doc=d}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},m=new c(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(d,"baseURI",p)}e.importer=h,e.importLoader=m}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,d=e.length;s<d&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports);
\ No newline at end of file
diff --git a/packages/web_components/lib/MutationObserver.js b/packages/web_components/lib/MutationObserver.js
old mode 100644
new mode 100755
index 84965e5..6968e38
--- a/packages/web_components/lib/MutationObserver.js
+++ b/packages/web_components/lib/MutationObserver.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 if (typeof WeakMap === "undefined") {
   (function() {
     var defineProperty = Object.defineProperty;
diff --git a/packages/web_components/lib/MutationObserver.min.js b/packages/web_components/lib/MutationObserver.min.js
old mode 100644
new mode 100755
index a50ec72..6451d1c
--- a/packages/web_components/lib/MutationObserver.min.js
+++ b/packages/web_components/lib/MutationObserver.min.js
@@ -7,5 +7,5 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,r=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};r.prototype={set:function(t,r){var i=t[this.name];return i&&i[0]===t?i[1]=r:e(t,this.name,{value:[t,r],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=r}(),function(e){function t(e){N.push(e),O||(O=!0,b(i))}function r(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function i(){O=!1;var e=N;N=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var r=e.takeRecords();n(e),r.length&&(e.callback_(r,e),t=!0)}),t&&i()}function n(e){e.nodes_.forEach(function(t){var r=p.get(t);r&&r.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function a(e,t){for(var r=e;r;r=r.parentNode){var i=p.get(r);if(i)for(var n=0;n<i.length;n++){var a=i[n],s=a.options;if(r===e||s.subtree){var o=t(s);o&&a.enqueue(o)}}}}function s(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++M}function o(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new o(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return D=new o(e,t)}function h(e){return w?w:(w=d(D),w.oldValue=e,w)}function c(){D=w=void 0}function v(e){return e===w||e===D}function l(e,t){return e===t?e:w&&v(e)?w:null}function f(e,t,r){this.observer=e,this.target=t,this.options=r,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var b,p=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))b=setTimeout;else if(window.setImmediate)b=window.setImmediate;else{var g=[],m=String(Math.random());window.addEventListener("message",function(e){if(e.data===m){var t=g;g=[],t.forEach(function(e){e()})}}),b=function(e){g.push(e),window.postMessage(m,"*")}}var O=!1,N=[],M=0;s.prototype={observe:function(e,t){if(e=r(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var i=p.get(e);i||p.set(e,i=[]);for(var n,a=0;a<i.length;a++)if(i[a].observer===this){n=i[a],n.removeListeners(),n.options=t;break}n||(n=new f(this,e,t),i.push(n),this.nodes_.push(e)),n.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=p.get(e),r=0;r<t.length;r++){var i=t[r];if(i.observer===this){i.removeListeners(),t.splice(r,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var D,w;f.prototype={enqueue:function(e){var r=this.observer.records_,i=r.length;if(r.length>0){var n=r[i-1],a=l(n,e);if(a)return void(r[i-1]=a)}else t(this.observer);r[i]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=p.get(e);t||p.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=p.get(e),r=0;r<t.length;r++)if(t[r]===this){t.splice(r,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,r=e.relatedNode.namespaceURI,i=e.target,n=new u("attributes",i);n.attributeName=t,n.attributeNamespace=r;var s=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;a(i,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(r)?void 0:e.attributeOldValue?h(s):n});break;case"DOMCharacterDataModified":var i=e.target,n=u("characterData",i),s=e.prevValue;a(i,function(e){return e.characterData?e.characterDataOldValue?h(s):n:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var o,d,v=e.target;"DOMNodeInserted"===e.type?(o=[v],d=[]):(o=[],d=[v]);var l=v.previousSibling,f=v.nextSibling,n=u("childList",e.target.parentNode);n.addedNodes=o,n.removedNodes=d,n.previousSibling=l,n.nextSibling=f,a(e.relatedNode,function(e){return e.childList?n:void 0})}c()}},e.JsMutationObserver=s,e.MutationObserver||(e.MutationObserver=s,s._isPolyfilled=!0)}}(self);
\ No newline at end of file
+// @version 0.7.23
+"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,r=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};r.prototype={set:function(t,r){var i=t[this.name];return i&&i[0]===t?i[1]=r:e(t,this.name,{value:[t,r],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=r}(),function(e){function t(e){N.push(e),O||(O=!0,b(i))}function r(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function i(){O=!1;var e=N;N=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var r=e.takeRecords();n(e),r.length&&(e.callback_(r,e),t=!0)}),t&&i()}function n(e){e.nodes_.forEach(function(t){var r=p.get(t);r&&r.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function a(e,t){for(var r=e;r;r=r.parentNode){var i=p.get(r);if(i)for(var n=0;n<i.length;n++){var a=i[n],s=a.options;if(r===e||s.subtree){var o=t(s);o&&a.enqueue(o)}}}}function s(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++M}function o(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new o(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return D=new o(e,t)}function h(e){return w?w:(w=d(D),w.oldValue=e,w)}function c(){D=w=void 0}function v(e){return e===w||e===D}function l(e,t){return e===t?e:w&&v(e)?w:null}function f(e,t,r){this.observer=e,this.target=t,this.options=r,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var b,p=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))b=setTimeout;else if(window.setImmediate)b=window.setImmediate;else{var g=[],m=String(Math.random());window.addEventListener("message",function(e){if(e.data===m){var t=g;g=[],t.forEach(function(e){e()})}}),b=function(e){g.push(e),window.postMessage(m,"*")}}var O=!1,N=[],M=0;s.prototype={observe:function(e,t){if(e=r(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var i=p.get(e);i||p.set(e,i=[]);for(var n,a=0;a<i.length;a++)if(i[a].observer===this){n=i[a],n.removeListeners(),n.options=t;break}n||(n=new f(this,e,t),i.push(n),this.nodes_.push(e)),n.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=p.get(e),r=0;r<t.length;r++){var i=t[r];if(i.observer===this){i.removeListeners(),t.splice(r,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var D,w;f.prototype={enqueue:function(e){var r=this.observer.records_,i=r.length;if(r.length>0){var n=r[i-1],a=l(n,e);if(a)return void(r[i-1]=a)}else t(this.observer);r[i]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=p.get(e);t||p.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=p.get(e),r=0;r<t.length;r++)if(t[r]===this){t.splice(r,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,r=e.relatedNode.namespaceURI,i=e.target,n=new u("attributes",i);n.attributeName=t,n.attributeNamespace=r;var s=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;a(i,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(r)!==-1))return e.attributeOldValue?h(s):n});break;case"DOMCharacterDataModified":var i=e.target,n=u("characterData",i),s=e.prevValue;a(i,function(e){if(e.characterData)return e.characterDataOldValue?h(s):n});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var o,d,v=e.target;"DOMNodeInserted"===e.type?(o=[v],d=[]):(o=[],d=[v]);var l=v.previousSibling,f=v.nextSibling,n=u("childList",e.target.parentNode);n.addedNodes=o,n.removedNodes=d,n.previousSibling=l,n.nextSibling=f,a(e.relatedNode,function(e){if(e.childList)return n})}c()}},e.JsMutationObserver=s,e.MutationObserver||(e.MutationObserver=s,s._isPolyfilled=!0)}}(self);
\ No newline at end of file
diff --git a/packages/web_components/lib/README.md b/packages/web_components/lib/README.md
old mode 100644
new mode 100755
index 01774b9..d92ed6f
--- a/packages/web_components/lib/README.md
+++ b/packages/web_components/lib/README.md
@@ -1,7 +1,7 @@
 webcomponents.js
 ================
 
-[![Join the chat at https://gitter.im/webcomponents/webcomponentsjs](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/webcomponents/webcomponentsjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Build Status](https://travis-ci.org/webcomponents/webcomponentsjs.svg?branch=master)](https://travis-ci.org/webcomponents/webcomponentsjs)
 
 A suite of polyfills supporting the [Web Components](http://webcomponents.org) specs:
 
diff --git a/packages/web_components/lib/ShadowDOM.js b/packages/web_components/lib/ShadowDOM.js
old mode 100644
new mode 100755
index 14565b2..cb20a25
--- a/packages/web_components/lib/ShadowDOM.js
+++ b/packages/web_components/lib/ShadowDOM.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 if (typeof WeakMap === "undefined") {
   (function() {
     var defineProperty = Object.defineProperty;
@@ -165,6 +165,9 @@
   }
   function getDescriptor(source, name) {
     try {
+      if (source === window && name === "showModalDialog") {
+        return dummyDescriptor;
+      }
       return Object.getOwnPropertyDescriptor(source, name);
     } catch (ex) {
       return dummyDescriptor;
diff --git a/packages/web_components/lib/ShadowDOM.min.js b/packages/web_components/lib/ShadowDOM.min.js
old mode 100644
new mode 100755
index 5b3ca6a..da1bbc0
--- a/packages/web_components/lib/ShadowDOM.min.js
+++ b/packages/web_components/lib/ShadowDOM.min.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){B.value=n,A(e,t,B)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(U)try{k(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return v(n,a,t),a}function c(e,t){m(e,t,!0)}function u(e,t){m(t,e,!1)}function l(e){return/^on[a-z]+$/.test(e)}function p(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function d(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function f(e){return I&&p(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function h(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function w(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return q}}function m(t,n,r,o){for(var i=k(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){U&&t.__lookupGetter__(s);var c,u,p=w(t,s);if("function"!=typeof p.value){var m=l(s);c=m?e.getEventHandlerGetter(s):d(s),(p.writable||p.set||V)&&(u=m?e.getEventHandlerSetter(s):f(s));var g=V||p.configurable;A(n,s,{get:c,set:u,configurable:g,enumerable:p.enumerable})}else r&&(n[s]=h(s))}}}function g(e,t,n){if(null!=e){var r=e.prototype;v(r,t,n),o(t,e)}}function v(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),P.set(o,e),c(e,o),r&&u(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return v(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function S(e){return e&&e.__impl4cf1e782hg__}function M(e){return!S(e)}function T(e){if(null===e)return null;n(M(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function O(e){return null===e?null:(n(S(e)),e.__impl4cf1e782hg__)}function N(e){return e.__impl4cf1e782hg__}function j(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function L(e){return e&&S(e)?O(e):e}function _(e){return e&&!S(e)?T(e):e}function D(e,t){null!==t&&(n(M(e)),n(void 0===t||S(t)),e.__wrapper8e3dd93a60__=t)}function C(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){C(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=_(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,P=new WeakMap,W=Object.create(null),I=t(),A=Object.defineProperty,k=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,B={value:void 0,configurable:!0,enumerable:!1,writable:!0};k(window);var U=/Firefox/.test(navigator.userAgent),q={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=C,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=p,e.isWrapper=S,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=P,e.oneOf=i,e.registerObject=y,e.registerWrapper=g,e.rewrap=D,e.setWrapper=j,e.unsafeUnwrap=N,e.unwrap=O,e.unwrapIfNeeded=L,e.wrap=T,e.wrapIfNeeded=_,e.wrappers=W}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),u=0;a>u;u++)c[u]=new Array(s),c[u][0]=u;for(var l=0;s>l;l++)c[0][l]=l;for(var u=1;a>u;u++)for(var l=1;s>l;l++)if(this.equals(e[t+l-1],r[o+u-1]))c[u][l]=c[u-1][l-1];else{var p=c[u-1][l]+1,d=c[u][l-1]+1;c[u][l]=d>p?p:d}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var u,l=e[t-1][n-1],p=e[t-1][n],d=e[t][n-1];u=d>p?l>p?p:l:l>d?d:l,u==l?(l==s?c.push(r):(c.push(o),s=l),t--,n--):u==p?(c.push(a),t--,s=p):(c.push(i),n--,s=d)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,u,l){var p=0,d=0,f=Math.min(s-n,l-u);if(0==n&&0==u&&(p=this.sharedPrefix(e,c,f)),s==e.length&&l==c.length&&(d=this.sharedSuffix(e,c,f-p)),n+=p,u+=p,s-=d,l-=d,s-n==0&&l-u==0)return[];if(n==s){for(var h=t(n,[],0);l>u;)h.removed.push(c[u++]);return[h]}if(u==l)return[t(n,[],s-n)];for(var w=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,u,l)),h=void 0,m=[],g=n,v=u,b=0;b<w.length;b++)switch(w[b]){case r:h&&(m.push(h),h=void 0),g++,v++;break;case o:h||(h=t(g,[],0)),h.addedCount++,g++,h.removed.push(c[v]),v++;break;case i:h||(h=t(g,[],0)),h.addedCount++,g++;break;case a:h||(h=t(g,[],0)),h.removed.push(c[v]),v++}return h&&m.push(h),m},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),u=document.createTextNode(s);c.observe(u,{characterData:!0}),r=function(){s=(s+1)%2,u.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,h.push(e),w||(l(n),w=!0))}function n(){for(w=!1;h.length;){var e=h;h=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new d.NodeList,this.removedNodes=new d.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=f.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=f.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=f.get(s);if(c)for(var u=0;u<c.length;u++){var l=c[u],p=l.options;if((s===e||p.subtree)&&("attributes"!==n||p.attributes)&&("attributes"!==n||!p.attributeFilter||null===o.namespace&&-1!==p.attributeFilter.indexOf(o.name))&&("characterData"!==n||p.characterData)&&("childList"!==n||p.childList)){var d=l.observer;i[d.uid_]=d,("attributes"===n&&p.attributeOldValue||"characterData"===n&&p.characterDataOldValue)&&(a[d.uid_]=o.oldValue)}}}for(var h in i){var d=i[h],w=new r(n,e);"name"in o&&"namespace"in o&&(w.attributeName=o.name,w.attributeNamespace=o.namespace),o.addedNodes&&(w.addedNodes=o.addedNodes),o.removedNodes&&(w.removedNodes=o.removedNodes),o.previousSibling&&(w.previousSibling=o.previousSibling),o.nextSibling&&(w.nextSibling=o.nextSibling),void 0!==a[h]&&(w.oldValue=a[h]),t(d),d.records_.push(w)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=m.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++g,this.scheduled_=!1}function u(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var l=e.setEndOfMicrotask,p=e.wrapIfNeeded,d=e.wrappers,f=new WeakMap,h=[],w=!1,m=Array.prototype.slice,g=0;c.prototype={constructor:c,observe:function(e,t){e=p(e);var n,r=new s(t),o=f.get(e);o||f.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new u(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=f.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},u.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=f.get(e);n||f.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=f.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var u=a(c);if(u&&u.length>0){for(var l=0;l<u.length;l++){var d=u[l];if(i(d)){var f=n(d),h=f.olderShadowRoot;h&&s.push(h)}s.push(d)}c=u[u.length-1]}else if(t(c)){if(p(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=u(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function u(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function l(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=u(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var l=0;l<s.length;l++){var p=s[l];if(A(p)===c)return p}return null}function p(e,t){return A(e)===A(t)}function d(e){if(!X.get(e)&&(X.set(e,!0),h(V(e),V(e.target)),W)){var t=W;throw W=null,t}}function f(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function h(t,n){if(K.get(t))throw new Error("InvalidStateError");K.set(t,!0),e.renderAllPending();var o,i,a;if(f(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!f(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),w(t,o,a,i)&&m(t,o,a,i)&&g(t,o,a,i),J.set(t,re),$["delete"](t,null),K["delete"](t),t.defaultPrevented}function w(e,t,n,r){var o=oe;if(n&&!v(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!v(t[i],e,o,t,r))return!1;return!0}function m(e,t,n,r){var o=ie,i=t[0]||n;return v(i,e,o,t,r)}function g(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!v(t[i],e,o,t,r))return;n&&t.length>0&&v(n,e,o,t,r)}function v(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),u=c.relatedTarget;if(u){if(u instanceof Object&&u.addEventListener){var p=V(u),d=l(t,e,p);if(d===a)return!0}else d=null;Z.set(t,d)}}J.set(t,n);var f=t.type,h=!1;Y.set(t,a),$.set(t,e),i.depth++;for(var w=0,m=i.length;m>w;w++){var g=i[w];if(g.removed)h=!0;else if(!(g.type!==f||!g.capture&&n===oe||g.capture&&n===ae))try{if("function"==typeof g.handler?g.handler.call(e,t):g.handler.handleEvent(t),ee.get(t))return!1}catch(v){W||(W=v)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var w=0;w<b.length;w++)b[w].removed||i.push(b[w])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof O?void B(n,this):new O(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:q(e.relatedTarget)}}):e}function S(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void B(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&k(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function M(e,t){return function(){arguments[t]=q(arguments[t]);var n=q(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ge)return new e(n,E(r));var o=q(document.createEvent(t)),i=me[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=q(t)),a.push(t)}),o["init"+t].apply(o,a),o}function O(e){y.call(this,e)}function N(e){return"function"==typeof e?!0:e&&e.handleEvent}function j(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function L(e){B(e,this)}function _(e){return e instanceof G.ShadowRoot&&(e=e.host),q(e)}function D(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function C(e,t){for(var n=q(e);n;n=n.parentNode)if(D(V(n),t))return!0;return!1}function H(e){I(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(Se.call(U(n),o,i));if(!a)return null;var c=r(a,null),u=c.lastIndexOf(t);return-1==u?null:(c=c.slice(0,u),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function P(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var W,I=e.forwardMethodsToWrapper,A=e.getTreeScope,k=e.mixin,F=e.registerWrapper,B=e.setWrapper,U=e.unsafeUnwrap,q=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),X=new WeakMap,K=new WeakMap,Y=new WeakMap,$=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return Y.get(this)},get currentTarget(){return $.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(U(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var ue=S("UIEvent",y),le=S("CustomEvent",y),pe={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(q(this).relatedTarget)}},de=k({initMouseEvent:M("initMouseEvent",14)},pe),fe=k({initFocusEvent:M("initFocusEvent",5)},pe),he=S("MouseEvent",ue,de),we=S("FocusEvent",ue,fe),me=Object.create(null),ge=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ge){var ve=function(e,t,n){if(n){var r=me[n];t=k(k({},r),t)}me[e]=t};ve("Event",{bubbles:!1,cancelable:!1}),ve("CustomEvent",{detail:null},"Event"),ve("UIEvent",{view:null,detail:0},"Event"),ve("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ve("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;O.prototype=Object.create(y.prototype),k(O.prototype,{get returnValue(){return U(this).returnValue},set returnValue(e){U(this).returnValue=e}}),be&&F(be,O);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)&&!j(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=_(this);a.addEventListener_(e,d,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=_(this);s.removeEventListener_(e,d,!0)}}},dispatchEvent:function(t){var n=q(t),r=n.type;X.set(n,!1),e.renderAllPending();var o;C(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return q(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,L);var Se=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=P,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=O,e.wrappers.CustomEvent=le,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=we,e.wrappers.MouseEvent=he,e.wrappers.UIEvent=ue}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,w)}function n(e){u(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,u=e.setWrapper,l=e.unsafeUnwrap,p=e.wrap,d=window.TouchEvent;if(d){var f;try{f=document.createEvent("TouchEvent")}catch(h){return}var w={enumerable:!1};n.prototype={get target(){return p(l(this).target)}};var m={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){m.get=function(){return l(this)[e]},Object.defineProperty(n.prototype,e,m)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(l(this).touches)},get targetTouches(){return o(l(this).targetTouches)},get changedTouches(){return o(l(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(d,i,f),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){N(e instanceof S)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){L(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){L(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);B=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;B=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function u(e,t){R(e,t),e.nodeIsInserted_()}function l(e,t){for(var n=_(t),r=0;r<e.length;r++)u(e[r],n)}function p(e){R(e,new O(e,null))}function d(e){for(var t=0;t<e.length;t++)p(e[t])}function f(e,t){var n=e.nodeType===S.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function h(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function w(e,t){h(e,t);var n=t.length;if(1===n)return W(t[0]);for(var r=W(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(W(t[o]));return r}function m(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function g(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){N(t.parentNode===e);var n=t.nextSibling,r=W(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=W(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function v(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?U.call(n,P(e),!1):q.call(P(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||_(e)!==_(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function S(e){N(e instanceof V),M.call(this,e),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 M=e.wrappers.EventTarget,T=e.wrappers.NodeList,O=e.TreeScope,N=e.assert,j=e.defineWrapGetter,L=e.enqueueMutation,_=e.getTreeScope,D=e.isWrapper,C=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,P=e.unsafeUnwrap,W=e.unwrap,I=e.unwrapIfNeeded,A=e.wrap,k=e.wrapIfNeeded,F=e.wrappers,B=!1,U=document.importNode,q=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),X=V.prototype.isEqualNode,K=V.prototype.insertBefore,Y=V.prototype.removeChild,$=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{Y.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){Y.call(e,t)};S.prototype=Object.create(M.prototype),C(S.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?D(n)?r=W(n):(r=n,n=A(r)):(n=null,r=null),n&&N(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!v(e);if(o=c?a(e):i(e,this,s,n),c)f(this,e),m(this),K.call(P(this),W(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var u=r?r.parentNode:P(this);u?K.call(u,w(this,o),r):h(this,o)}return L(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),l(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=W(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,u=this.lastChild,l=i.parentNode;l&&J(l,i),c===e&&(this.firstChild_=a),u===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else m(this),J(P(this),i);return B||L(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(D(r)?o=W(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,u=r.previousSibling,d=!this.invalidateShadowRenderer()&&!v(e);return d?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,u,c)),d?(f(this,e),m(this),$.call(P(this),W(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&$.call(o.parentNode,w(this,s),o)),L(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:u}),p(r),l(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(P(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(P(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(P(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(P(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(P(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==S.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=S.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(g(this),""!==e){var n=P(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else m(this),P(this).textContent=e;var r=c(this.childNodes);L(this,"childList",{addedNodes:r,removedNodes:t}),d(t),l(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,k(e))},compareDocumentPosition:function(e){return z.call(P(this),I(e))},isEqualNode:function(e){return X.call(P(this),I(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===S.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),j(S,"ownerDocument"),x(V,S,document.createDocumentFragment()),delete S.prototype.querySelector,delete S.prototype.querySelectorAll,S.prototype=C(Object.create(M.prototype),S.prototype),e.cloneNode=y,e.nodeWasAdded=u,e.nodeWasRemoved=p,e.nodesWereAdded=l,e.nodesWereRemoved=d,e.originalInsertBefore=K,e.originalRemoveChild=Y,e.snapshotNodeList=c,e.wrappers.Node=S}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=g(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===D}function s(){return!0}function c(e,t,n){return e.localName===n}function u(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function p(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=p(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=v(this),u=g(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,null);if(c instanceof L)s=M.call(c,i);else{if(!(c instanceof _))return p(this,r,o,n,i,null);s=S.call(c,i)}return t(s,r,o,a)}function f(n,r,o,i,a){var s,c=v(this),u=g(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function h(n,r,o,i,a){var s,c=v(this),u=g(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=j.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=N.call(c,i,a)}return t(s,r,o,!1)}var w=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,g=e.getTreeScope,v=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,S=document.querySelectorAll,M=document.documentElement.querySelectorAll,T=document.getElementsByTagName,O=document.documentElement.getElementsByTagName,N=document.getElementsByTagNameNS,j=document.documentElement.getElementsByTagNameNS,L=window.Element,_=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",C={querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=v(this),c=g(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof L)a=b(E.call(s,t));else{if(!(s instanceof _))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=g(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new m;return o.length=d.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(v(this),t)}},x={getElementsByTagName:function(e){var t=new w,n="*"===e?s:a;return t.length=f.call(this,n,0,t,e,e.toLowerCase()),
-t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new w,r=null;return r="*"===e?"*"===t?s:c:"*"===t?u:l,n.length=h.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=C,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var u=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,u,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){l(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,u=e.MatchesInterface,l=(e.addWrapNodeListMethod,e.enqueueMutation),p=e.mixin,d=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,w=window.Element,m=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return w.prototype[e]}),g=m[0],v=w.prototype[g],b=new WeakMap;r.prototype=Object.create(a.prototype),p(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=f(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),m.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),w.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),p(r.prototype,o),p(r.prototype,i),p(r.prototype,s),p(r.prototype,c),p(r.prototype,u),d(w,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=m,e.originalMatches=v,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(j,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==C)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,u=e.attributes,l=0;o=u[l];l++)c+=" "+o.name+'="'+n(o.value)+'"';return _[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var p=e.data;return t&&D[t.localName]?p:r(p);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof N.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(O(i))}function u(e){w.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return O(o)}function p(t){return function(){return e.renderAllPending(),M(this)[t]}}function d(e){m(u,e,p(e))}function f(t){Object.defineProperty(u.prototype,t,{get:p(t),set:function(n){e.renderAllPending(),M(this)[t]=n},configurable:!0,enumerable:!0})}function h(t){Object.defineProperty(u.prototype,t,{value:function(){return e.renderAllPending(),M(this)[t].apply(M(this),arguments)},configurable:!0,enumerable:!0})}var w=e.wrappers.Element,m=e.defineGetter,g=e.enqueueMutation,v=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,S=e.snapshotNodeList,M=e.unsafeUnwrap,T=e.unwrap,O=e.wrap,N=e.wrappers,j=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,_=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),C="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;u.prototype=Object.create(w.prototype),v(u.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&D[this.localName])return void(this.textContent=e);var t=S(this.childNodes);this.invalidateShadowRenderer()?this instanceof N.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof N.HTMLTemplateElement?c(this.content,e):M(this).innerHTML=e;var n=S(this.childNodes);g(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(f),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(h),E(x,u,document.createElement("b")),e.wrappers.HTMLElement=u,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=p.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);p.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!d){var t=n(e);l.set(this,u(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.wrap,l=new WeakMap,p=new WeakMap,d=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return d?u(s(this).content):l.get(this)}}),d&&a(d,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,u=e.wrap,l=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return u(c(this).form)}}),a(l,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",u=window.SVGElement,l=document.createElementNS(c,"title");if(!("classList"in l)){var p=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",p),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(u,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){d.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),u=document.createElementNS(s,"use"),l=c.constructor,p=Object.getPrototypeOf(l.prototype),d=p.constructor;t.prototype=Object.create(p),"instanceRoot"in u&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,u),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(u,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.WebGLRenderingContext;if(u){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var l=Object.getPrototypeOf(u.prototype);l!==Object.prototype&&n(l,t.prototype);var p=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(u,t,p),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,u=e.registerWrapper,l=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),u(l,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var p=c(document.createComment(""));e.wrappers.Comment=p}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(l(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;h.set(this,o),this.treeScope_=new r(this,a(o||e)),f.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,u=e.setInnerHTML,l=e.unsafeUnwrap,p=e.unwrap,d=e.wrap,f=new WeakMap,h=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){u(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return h.get(this)||null},get host(){return f.get(this)||null},invalidateShadowRenderer:function(){return f.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=p(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=d(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(e).root;return t instanceof f?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=l(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.unwrapIfNeeded,l=e.wrap,p=e.getTreeScope,d=window.Range,f=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(u(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(u(e),t)},setStartBefore:function(e){s(this).setStartBefore(u(e))},setStartAfter:function(e){s(this).setStartAfter(u(e))},setEndBefore:function(e){s(this).setEndBefore(u(e))},setEndAfter:function(e){s(this).setEndAfter(u(e))},selectNode:function(e){s(this).selectNode(u(e))},selectNodeContents:function(e){s(this).selectNodeContents(u(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return l(s(this).extractContents())},cloneContents:function(){return l(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(u(e))},surroundContents:function(e){s(this).surroundContents(u(e))},cloneRange:function(){return l(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(u(e),t)},comparePoint:function(e,t){return s(this).comparePoint(u(e),t)},intersectsNode:function(e){return s(this).intersectsNode(u(e))},toString:function(){return s(this).toString()}},d.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return l(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var u=R(a.lastChild);u&&(u.nextSibling_=u.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){W.set(e,[])}function i(e){var t=W.get(e);return t||W.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function u(e){var t=A.get(e);return t||(t=new f(e),A.set(e,t)),t}function l(e){var t=D(e).root;return t instanceof _?t:null}function p(e){return u(e.host)}function d(e){this.skip=!1,this.node=e,this.childNodes=[]}function f(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function h(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function w(e){if(e instanceof j)return e;if(e instanceof N)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=w(t);if(n)return n}return null}function m(e,t){i(t).push(e);var n=I.get(e);n?n.push(t):I.set(e,[t])}function g(e){return I.get(e)}function v(e){I.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof O))return!1;if(!U.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=g(t);return n&&n[n.length-1]===e}function E(e){return e instanceof N||e instanceof j}function S(e){return e.shadowRoot}function M(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,O=e.wrappers.Element,N=e.wrappers.HTMLContentElement,j=e.wrappers.HTMLShadowElement,L=e.wrappers.Node,_=e.wrappers.ShadowRoot,D=(e.assert,e.getTreeScope),C=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,P=e.ArraySplice,W=new WeakMap,I=new WeakMap,A=new WeakMap,k=C(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],B=new P;B.equals=function(e,t){return x(e.node)===t},d.prototype={append:function(e){var t=new d(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=B.calculateSplices(o,i),u=0,l=0,p=0,d=0;d<c.length;d++){for(var f=c[d];p<f.index;p++)l++,o[u++].sync(s);for(var h=f.removed.length,w=0;h>w;w++){var m=R(i[l++]);s.get(m)||r(m)}for(var g=f.addedCount,v=i[l]&&R(i[l]),w=0;g>w;w++){var b=o[u++],y=b.node;n(t,y,v),s.set(y,!0),b.sync(s)}p+=g}for(var d=p;d<o.length;d++)o[d].sync(s)}}},f.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new d(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return D(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[k](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):v(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(S(e)){for(var t=e,n=h(t),r=M(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=w(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c<n.length;c++)m(n[c],a)}this.distributionResolution(i)}}for(var u=e.firstChild;u;u=u.nextSibling)this.distributionResolution(u)},poolDistribution:function(e,t){if(!(e instanceof j))if(e instanceof N){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(m(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)m(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(S(t)){var a=u(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var U=/^(:not\()?[*.#[a-zA-Z_|]/;L.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},N.prototype.getDistributedNodes=j.prototype.getDistributedNodes=function(){return s(),i(this)},O.prototype.getDestinationInsertionPoints=function(){return s(),g(this)||[]},N.prototype.nodeIsInserted_=j.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=l(this);t&&(e=p(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=u,e.getShadowTrees=M,e.renderAllPending=s,e.getDestinationInsertionPoints=g,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e),this.treeScope_=new m(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return D(n.apply(L(this),arguments))}}function r(e,t){x.call(L(t),_(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof w&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){j(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){return D(n.apply(L(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(L(this),arguments)}}var u=e.GetElementsByInterface,l=e.wrappers.Node,p=e.ParentNodeInterface,d=e.NonElementParentNodeInterface,f=e.wrappers.Selection,h=e.SelectorsInterface,w=e.wrappers.ShadowRoot,m=e.TreeScope,g=e.cloneNode,v=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,S=e.matchesNames,M=e.mixin,T=e.registerWrapper,O=e.renderAllPending,N=e.rewrap,j=e.setWrapper,L=e.unsafeUnwrap,_=e.unwrap,D=e.wrap,C=e.wrapEventTargetMethods,H=(e.wrapNodeList,
-new WeakMap);t.prototype=Object.create(l.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),v(t,"activeElement",function(){var e=_(this).activeElement;if(!e||!e.nodeType)return null;for(var t=D(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;M(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return g(e,t,L(this))},getSelection:function(){return O(),new f(R.call(_(this)))},getElementsByName:function(e){return h.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var P=document.createTreeWalker,W=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(D(e))}}:"function"==typeof n&&(o=function(e){return n(D(e))})),new W(P.call(_(this),_(e),t,o,r))},document.registerElement){var I=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void j(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var u=Object.create(a),l=c.length-1;l>=0;l--)u=Object.create(u);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(u[e]=function(){D(this)instanceof r||N(this),t.apply(D(this),arguments)})});var p={prototype:u};i&&(p["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(u,r),e.nativePrototypeTable.set(o,u);I.call(_(this),t,p);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],S),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),M(t.prototype,u),M(t.prototype,p),M(t.prototype,h),M(t.prototype,d),M(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(_(this).implementation),H.set(this,e),e)},get defaultView(){return D(_(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=_(arguments[2]),D(A.apply(L(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,u=e.wrap,l=window.Window,p=window.getComputedStyle,d=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),l.prototype.getComputedStyle=function(e,t){return u(this||window).getComputedStyle(c(e),t)},d&&(l.prototype.getDefaultComputedStyle=function(e,t){return u(this||window).getDefaultComputedStyle(c(e),t)}),l.prototype.getSelection=function(){return u(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){l.prototype[e]=function(){var t=u(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),p.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return u(s(this).document)}}),d&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),d.call(s(this),c(e),t)}),i(l,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill);
\ No newline at end of file
+// @version 0.7.23
+"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){B.value=n,A(e,t,B)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(U)try{k(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){m(e,t,!0)}function u(e,t){m(t,e,!1)}function l(e){return/^on[a-z]+$/.test(e)}function p(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function d(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function f(e){return I&&p(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function h(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function w(e,t){try{return e===window&&"showModalDialog"===t?q:Object.getOwnPropertyDescriptor(e,t)}catch(n){return q}}function m(t,n,r,o){for(var i=k(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){U&&t.__lookupGetter__(s);var c,u,p=w(t,s);if("function"!=typeof p.value){var m=l(s);c=m?e.getEventHandlerGetter(s):d(s),(p.writable||p.set||V)&&(u=m?e.getEventHandlerSetter(s):f(s));var v=V||p.configurable;A(n,s,{get:c,set:u,configurable:v,enumerable:p.enumerable})}else r&&(n[s]=h(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),P.set(o,e),c(e,o),r&&u(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function S(e){return e&&e.__impl4cf1e782hg__}function M(e){return!S(e)}function T(e){if(null===e)return null;n(M(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function O(e){return null===e?null:(n(S(e)),e.__impl4cf1e782hg__)}function N(e){return e.__impl4cf1e782hg__}function j(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function L(e){return e&&S(e)?O(e):e}function _(e){return e&&!S(e)?T(e):e}function D(e,t){null!==t&&(n(M(e)),n(void 0===t||S(t)),e.__wrapper8e3dd93a60__=t)}function C(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){C(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=_(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,P=new WeakMap,W=Object.create(null),I=t(),A=Object.defineProperty,k=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,B={value:void 0,configurable:!0,enumerable:!1,writable:!0};k(window);var U=/Firefox/.test(navigator.userAgent),q={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=C,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=p,e.isWrapper=S,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=P,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=D,e.setWrapper=j,e.unsafeUnwrap=N,e.unwrap=O,e.unwrapIfNeeded=L,e.wrap=T,e.wrapIfNeeded=_,e.wrappers=W}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),u=0;u<a;u++)c[u]=new Array(s),c[u][0]=u;for(var l=0;l<s;l++)c[0][l]=l;for(var u=1;u<a;u++)for(var l=1;l<s;l++)if(this.equals(e[t+l-1],r[o+u-1]))c[u][l]=c[u-1][l-1];else{var p=c[u-1][l]+1,d=c[u][l-1]+1;c[u][l]=p<d?p:d}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var u,l=e[t-1][n-1],p=e[t-1][n],d=e[t][n-1];u=p<d?p<l?p:l:d<l?d:l,u==l?(l==s?c.push(r):(c.push(o),s=l),t--,n--):u==p?(c.push(a),t--,s=p):(c.push(i),n--,s=d)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,u,l){var p=0,d=0,f=Math.min(s-n,l-u);if(0==n&&0==u&&(p=this.sharedPrefix(e,c,f)),s==e.length&&l==c.length&&(d=this.sharedSuffix(e,c,f-p)),n+=p,u+=p,s-=d,l-=d,s-n==0&&l-u==0)return[];if(n==s){for(var h=t(n,[],0);u<l;)h.removed.push(c[u++]);return[h]}if(u==l)return[t(n,[],s-n)];for(var w=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,u,l)),h=void 0,m=[],v=n,g=u,b=0;b<w.length;b++)switch(w[b]){case r:h&&(m.push(h),h=void 0),v++,g++;break;case o:h||(h=t(v,[],0)),h.addedCount++,v++,h.removed.push(c[g]),g++;break;case i:h||(h=t(v,[],0)),h.addedCount++,v++;break;case a:h||(h=t(v,[],0)),h.removed.push(c[g]),g++}return h&&m.push(h),m},sharedPrefix:function(e,t,n){for(var r=0;r<n;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;i<n&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),u=document.createTextNode(s);c.observe(u,{characterData:!0}),r=function(){s=(s+1)%2,u.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,h.push(e),w||(l(n),w=!0))}function n(){for(w=!1;h.length;){var e=h;h=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new d.NodeList,this.removedNodes=new d.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=f.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=f.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=f.get(s);if(c)for(var u=0;u<c.length;u++){var l=c[u],p=l.options;if((s===e||p.subtree)&&("attributes"!==n||p.attributes)&&("attributes"!==n||!p.attributeFilter||null===o.namespace&&p.attributeFilter.indexOf(o.name)!==-1)&&("characterData"!==n||p.characterData)&&("childList"!==n||p.childList)){var d=l.observer;i[d.uid_]=d,("attributes"===n&&p.attributeOldValue||"characterData"===n&&p.characterDataOldValue)&&(a[d.uid_]=o.oldValue)}}}for(var h in i){var d=i[h],w=new r(n,e);"name"in o&&"namespace"in o&&(w.attributeName=o.name,w.attributeNamespace=o.namespace),o.addedNodes&&(w.addedNodes=o.addedNodes),o.removedNodes&&(w.removedNodes=o.removedNodes),o.previousSibling&&(w.previousSibling=o.previousSibling),o.nextSibling&&(w.nextSibling=o.nextSibling),void 0!==a[h]&&(w.oldValue=a[h]),t(d),d.records_.push(w)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=m.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function u(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var l=e.setEndOfMicrotask,p=e.wrapIfNeeded,d=e.wrappers,f=new WeakMap,h=[],w=!1,m=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=p(e);var n,r=new s(t),o=f.get(e);o||f.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new u(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=f.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},u.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=f.get(e);n||f.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=f.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var u=a(c);if(u&&u.length>0){for(var l=0;l<u.length;l++){var d=u[l];if(i(d)){var f=n(d),h=f.olderShadowRoot;h&&s.push(h)}s.push(d)}c=u[u.length-1]}else if(t(c)){if(p(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=u(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function u(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function l(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=u(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var l=0;l<s.length;l++){var p=s[l];if(A(p)===c)return p}return null}function p(e,t){return A(e)===A(t)}function d(e){if(!X.get(e)&&(X.set(e,!0),h(V(e),V(e.target)),W)){var t=W;throw W=null,t}}function f(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function h(t,n){if(K.get(t))throw new Error("InvalidStateError");K.set(t,!0),e.renderAllPending();var o,i,a;if(f(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!f(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),w(t,o,a,i)&&m(t,o,a,i)&&v(t,o,a,i),J.set(t,re),$["delete"](t,null),K["delete"](t),t.defaultPrevented}function w(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function m(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),u=c.relatedTarget;if(u){if(u instanceof Object&&u.addEventListener){var p=V(u),d=l(t,e,p);if(d===a)return!0}else d=null;Z.set(t,d)}}J.set(t,n);var f=t.type,h=!1;Y.set(t,a),$.set(t,e),i.depth++;for(var w=0,m=i.length;w<m;w++){var v=i[w];if(v.removed)h=!0;else if(!(v.type!==f||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){W||(W=g)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var w=0;w<b.length;w++)b[w].removed||i.push(b[w])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof O?void B(n,this):new O(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:q(e.relatedTarget)}}):e}function S(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void B(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&k(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function M(e,t){return function(){arguments[t]=q(arguments[t]);var n=q(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=q(document.createEvent(t)),i=me[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=q(t)),a.push(t)}),o["init"+t].apply(o,a),o}function O(e){y.call(this,e)}function N(e){return"function"==typeof e||e&&e.handleEvent}function j(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function L(e){B(e,this)}function _(e){return e instanceof G.ShadowRoot&&(e=e.host),q(e)}function D(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function C(e,t){for(var n=q(e);n;n=n.parentNode)if(D(V(n),t))return!0;return!1}function H(e){I(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(Se.call(U(n),o,i));if(!a)return null;var c=r(a,null),u=c.lastIndexOf(t);return u==-1?null:(c=c.slice(0,u),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function P(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var W,I=e.forwardMethodsToWrapper,A=e.getTreeScope,k=e.mixin,F=e.registerWrapper,B=e.setWrapper,U=e.unsafeUnwrap,q=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),X=new WeakMap,K=new WeakMap,Y=new WeakMap,$=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return Y.get(this)},get currentTarget(){return $.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(U(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var ue=S("UIEvent",y),le=S("CustomEvent",y),pe={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(q(this).relatedTarget)}},de=k({initMouseEvent:M("initMouseEvent",14)},pe),fe=k({initFocusEvent:M("initFocusEvent",5)},pe),he=S("MouseEvent",ue,de),we=S("FocusEvent",ue,fe),me=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=me[n];t=k(k({},r),t)}me[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;O.prototype=Object.create(y.prototype),k(O.prototype,{get returnValue(){return U(this).returnValue},set returnValue(e){U(this).returnValue=e}}),be&&F(be,O);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)&&!j(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=_(this);a.addEventListener_(e,d,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=_(this);s.removeEventListener_(e,d,!0)}}},dispatchEvent:function(t){var n=q(t),r=n.type;X.set(n,!1),e.renderAllPending();var o;C(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return q(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,L);var Se=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=P,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=O,e.wrappers.CustomEvent=le,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=we,e.wrappers.MouseEvent=he,e.wrappers.UIEvent=ue}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,w)}function n(e){u(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,u=e.setWrapper,l=e.unsafeUnwrap,p=e.wrap,d=window.TouchEvent;if(d){var f;try{f=document.createEvent("TouchEvent")}catch(h){return}var w={enumerable:!1};n.prototype={get target(){return p(l(this).target)}};var m={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){m.get=function(){return l(this)[e]},Object.defineProperty(n.prototype,e,m)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(l(this).touches)},get targetTouches(){return o(l(this).targetTouches)},get changedTouches(){return o(l(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(d,i,f),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;r<o;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){N(e instanceof S)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){L(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){L(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);B=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;B=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function u(e,t){R(e,t),e.nodeIsInserted_()}function l(e,t){for(var n=_(t),r=0;r<e.length;r++)u(e[r],n)}function p(e){R(e,new O(e,null))}function d(e){for(var t=0;t<e.length;t++)p(e[t])}function f(e,t){var n=e.nodeType===S.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function h(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function w(e,t){h(e,t);var n=t.length;if(1===n)return W(t[0]);for(var r=W(e.ownerDocument.createDocumentFragment()),o=0;o<n;o++)r.appendChild(W(t[o]));return r}function m(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){N(t.parentNode===e);var n=t.nextSibling,r=W(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=W(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?U.call(n,P(e),!1):q.call(P(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||_(e)!==_(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function S(e){N(e instanceof V),M.call(this,e),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 M=e.wrappers.EventTarget,T=e.wrappers.NodeList,O=e.TreeScope,N=e.assert,j=e.defineWrapGetter,L=e.enqueueMutation,_=e.getTreeScope,D=e.isWrapper,C=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,P=e.unsafeUnwrap,W=e.unwrap,I=e.unwrapIfNeeded,A=e.wrap,k=e.wrapIfNeeded,F=e.wrappers,B=!1,U=document.importNode,q=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),X=V.prototype.isEqualNode,K=V.prototype.insertBefore,Y=V.prototype.removeChild,$=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{Y.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){Y.call(e,t)};S.prototype=Object.create(M.prototype),C(S.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?D(n)?r=W(n):(r=n,n=A(r)):(n=null,r=null),n&&N(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)f(this,e),m(this),K.call(P(this),W(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var u=r?r.parentNode:P(this);u?K.call(u,w(this,o),r):h(this,o)}return L(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),l(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=W(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,u=this.lastChild,l=i.parentNode;l&&J(l,i),c===e&&(this.firstChild_=a),u===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else m(this),J(P(this),i);return B||L(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(D(r)?o=W(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,u=r.previousSibling,d=!this.invalidateShadowRenderer()&&!g(e);return d?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,u,c)),d?(f(this,e),m(this),$.call(P(this),W(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&$.call(o.parentNode,w(this,s),o)),L(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:u}),p(r),l(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(P(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(P(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(P(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(P(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(P(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==S.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=S.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=P(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else m(this),P(this).textContent=e;var r=c(this.childNodes);L(this,"childList",{addedNodes:r,removedNodes:t}),d(t),l(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,k(e))},compareDocumentPosition:function(e){return z.call(P(this),I(e))},isEqualNode:function(e){return X.call(P(this),I(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===S.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),j(S,"ownerDocument"),x(V,S,document.createDocumentFragment()),delete S.prototype.querySelector,delete S.prototype.querySelectorAll,S.prototype=C(Object.create(M.prototype),S.prototype),e.cloneNode=y,e.nodeWasAdded=u,e.nodeWasRemoved=p,e.nodesWereAdded=l,e.nodesWereRemoved=d,e.originalInsertBefore=K,e.originalRemoveChild=Y,e.snapshotNodeList=c,e.wrappers.Node=S}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;s<c;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===D}function s(){return!0}function c(e,t,n){return e.localName===n}function u(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function p(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=p(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,null);if(c instanceof L)s=M.call(c,i);else{if(!(c instanceof _))return p(this,r,o,n,i,null);s=S.call(c,i)}return t(s,r,o,a)}function f(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function h(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=j.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=N.call(c,i,a)}return t(s,r,o,!1)}var w=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,S=document.querySelectorAll,M=document.documentElement.querySelectorAll,T=document.getElementsByTagName,O=document.documentElement.getElementsByTagName,N=document.getElementsByTagNameNS,j=document.documentElement.getElementsByTagNameNS,L=window.Element,_=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",C={querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof L)a=b(E.call(s,t));else{if(!(s instanceof _))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new m;return o.length=d.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new w,n="*"===e?s:a;return t.length=f.call(this,n,0,t,e,e.toLowerCase()),
+t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new w,r=null;return r="*"===e?"*"===t?s:c:"*"===t?u:l,n.length=h.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=C,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var u=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,u,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){l(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,u=e.MatchesInterface,l=(e.addWrapNodeListMethod,e.enqueueMutation),p=e.mixin,d=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,w=window.Element,m=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return w.prototype[e]}),v=m[0],g=w.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),p(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=f(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),m.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),w.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),p(r.prototype,o),p(r.prototype,i),p(r.prototype,s),p(r.prototype,c),p(r.prototype,u),d(w,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=m,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(j,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==C)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,u=e.attributes,l=0;o=u[l];l++)c+=" "+o.name+'="'+n(o.value)+'"';return _[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var p=e.data;return t&&D[t.localName]?p:r(p);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof N.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(O(i))}function u(e){w.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return O(o)}function p(t){return function(){return e.renderAllPending(),M(this)[t]}}function d(e){m(u,e,p(e))}function f(t){Object.defineProperty(u.prototype,t,{get:p(t),set:function(n){e.renderAllPending(),M(this)[t]=n},configurable:!0,enumerable:!0})}function h(t){Object.defineProperty(u.prototype,t,{value:function(){return e.renderAllPending(),M(this)[t].apply(M(this),arguments)},configurable:!0,enumerable:!0})}var w=e.wrappers.Element,m=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,S=e.snapshotNodeList,M=e.unsafeUnwrap,T=e.unwrap,O=e.wrap,N=e.wrappers,j=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,_=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),C="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;u.prototype=Object.create(w.prototype),g(u.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&D[this.localName])return void(this.textContent=e);var t=S(this.childNodes);this.invalidateShadowRenderer()?this instanceof N.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof N.HTMLTemplateElement?c(this.content,e):M(this).innerHTML=e;var n=S(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(f),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(h),E(x,u,document.createElement("b")),e.wrappers.HTMLElement=u,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=p.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);p.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!d){var t=n(e);l.set(this,u(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.wrap,l=new WeakMap,p=new WeakMap,d=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return d?u(s(this).content):l.get(this)}}),d&&a(d,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,u=e.wrap,l=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return u(c(this).form)}}),a(l,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",u=window.SVGElement,l=document.createElementNS(c,"title");if(!("classList"in l)){var p=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",p),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(u,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){d.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),u=document.createElementNS(s,"use"),l=c.constructor,p=Object.getPrototypeOf(l.prototype),d=p.constructor;t.prototype=Object.create(p),"instanceRoot"in u&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,u),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(u,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.WebGLRenderingContext;if(u){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var l=Object.getPrototypeOf(u.prototype);l!==Object.prototype&&n(l,t.prototype);var p=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(u,t,p),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,u=e.registerWrapper,l=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),u(l,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var p=c(document.createComment(""));e.wrappers.Comment=p}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(l(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;h.set(this,o),this.treeScope_=new r(this,a(o||e)),f.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,u=e.setInnerHTML,l=e.unsafeUnwrap,p=e.unwrap,d=e.wrap,f=new WeakMap,h=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){u(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return h.get(this)||null},get host(){return f.get(this)||null},invalidateShadowRenderer:function(){return f.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=p(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=d(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(e).root;return t instanceof f?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=l(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.unwrapIfNeeded,l=e.wrap,p=e.getTreeScope,d=window.Range,f=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(u(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(u(e),t)},setStartBefore:function(e){s(this).setStartBefore(u(e))},setStartAfter:function(e){s(this).setStartAfter(u(e))},setEndBefore:function(e){s(this).setEndBefore(u(e))},setEndAfter:function(e){s(this).setEndAfter(u(e))},selectNode:function(e){s(this).selectNode(u(e))},selectNodeContents:function(e){s(this).selectNodeContents(u(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return l(s(this).extractContents())},cloneContents:function(){return l(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(u(e))},surroundContents:function(e){s(this).surroundContents(u(e))},cloneRange:function(){return l(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(u(e),t)},comparePoint:function(e,t){return s(this).comparePoint(u(e),t)},intersectsNode:function(e){return s(this).intersectsNode(u(e))},toString:function(){return s(this).toString()}},d.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return l(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var u=R(a.lastChild);u&&(u.nextSibling_=u.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){W.set(e,[])}function i(e){var t=W.get(e);return t||W.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function u(e){var t=A.get(e);return t||(t=new f(e),A.set(e,t)),t}function l(e){var t=D(e).root;return t instanceof _?t:null}function p(e){return u(e.host)}function d(e){this.skip=!1,this.node=e,this.childNodes=[]}function f(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function h(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function w(e){if(e instanceof j)return e;if(e instanceof N)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=w(t);if(n)return n}return null}function m(e,t){i(t).push(e);var n=I.get(e);n?n.push(t):I.set(e,[t])}function v(e){return I.get(e)}function g(e){I.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof O))return!1;if(!U.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof N||e instanceof j}function S(e){return e.shadowRoot}function M(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,O=e.wrappers.Element,N=e.wrappers.HTMLContentElement,j=e.wrappers.HTMLShadowElement,L=e.wrappers.Node,_=e.wrappers.ShadowRoot,D=(e.assert,e.getTreeScope),C=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,P=e.ArraySplice,W=new WeakMap,I=new WeakMap,A=new WeakMap,k=C(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],B=new P;B.equals=function(e,t){return x(e.node)===t},d.prototype={append:function(e){var t=new d(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=B.calculateSplices(o,i),u=0,l=0,p=0,d=0;d<c.length;d++){for(var f=c[d];p<f.index;p++)l++,o[u++].sync(s);for(var h=f.removed.length,w=0;w<h;w++){var m=R(i[l++]);s.get(m)||r(m)}for(var v=f.addedCount,g=i[l]&&R(i[l]),w=0;w<v;w++){var b=o[u++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}p+=v}for(var d=p;d<o.length;d++)o[d].sync(s)}}},f.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new d(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return D(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[k](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(S(e)){for(var t=e,n=h(t),r=M(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=w(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c<n.length;c++)m(n[c],a)}this.distributionResolution(i)}}for(var u=e.firstChild;u;u=u.nextSibling)this.distributionResolution(u)},poolDistribution:function(e,t){if(!(e instanceof j))if(e instanceof N){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(m(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)m(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(S(t)){var a=u(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var U=/^(:not\()?[*.#[a-zA-Z_|]/;L.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return!!t&&(t.invalidate(),!0)},N.prototype.getDistributedNodes=j.prototype.getDistributedNodes=function(){return s(),i(this)},O.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},N.prototype.nodeIsInserted_=j.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=l(this);t&&(e=p(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=u,e.getShadowTrees=M,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e),this.treeScope_=new m(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return D(n.apply(L(this),arguments))}}function r(e,t){x.call(L(t),_(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof w&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){j(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){return D(n.apply(L(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(L(this),arguments)}}var u=e.GetElementsByInterface,l=e.wrappers.Node,p=e.ParentNodeInterface,d=e.NonElementParentNodeInterface,f=e.wrappers.Selection,h=e.SelectorsInterface,w=e.wrappers.ShadowRoot,m=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,S=e.matchesNames,M=e.mixin,T=e.registerWrapper,O=e.renderAllPending,N=e.rewrap,j=e.setWrapper,L=e.unsafeUnwrap,_=e.unwrap,D=e.wrap,C=e.wrapEventTargetMethods,H=(e.wrapNodeList,
+new WeakMap);t.prototype=Object.create(l.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=_(this).activeElement;if(!e||!e.nodeType)return null;for(var t=D(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;M(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,L(this))},getSelection:function(){return O(),new f(R.call(_(this)))},getElementsByName:function(e){return h.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var P=document.createTreeWalker,W=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(D(e))}}:"function"==typeof n&&(o=function(e){return n(D(e))})),new W(P.call(_(this),_(e),t,o,r))},document.registerElement){var I=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void j(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var u=Object.create(a),l=c.length-1;l>=0;l--)u=Object.create(u);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(u[e]=function(){D(this)instanceof r||N(this),t.apply(D(this),arguments)})});var p={prototype:u};i&&(p["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(u,r),e.nativePrototypeTable.set(o,u);I.call(_(this),t,p);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],S),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),M(t.prototype,u),M(t.prototype,p),M(t.prototype,h),M(t.prototype,d),M(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(_(this).implementation),H.set(this,e),e)},get defaultView(){return D(_(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=_(arguments[2]),D(A.apply(L(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,u=e.wrap,l=window.Window,p=window.getComputedStyle,d=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),l.prototype.getComputedStyle=function(e,t){return u(this||window).getComputedStyle(c(e),t)},d&&(l.prototype.getDefaultComputedStyle=function(e,t){return u(this||window).getDefaultComputedStyle(c(e),t)}),l.prototype.getSelection=function(){return u(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){l.prototype[e]=function(){var t=u(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),p.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return u(s(this).document)}}),d&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),d.call(s(this),c(e),t)}),i(l,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill);
\ No newline at end of file
diff --git a/packages/web_components/lib/bower.json b/packages/web_components/lib/bower.json
old mode 100644
new mode 100755
index 7603c35..ad3daa4
--- a/packages/web_components/lib/bower.json
+++ b/packages/web_components/lib/bower.json
@@ -1,7 +1,7 @@
 {
   "name": "webcomponentsjs",
   "main": "webcomponents.js",
-  "version": "0.7.21",
+  "version": "0.7.23",
   "homepage": "http://webcomponents.org",
   "authors": [
     "The Polymer Authors"
diff --git a/packages/web_components/lib/build.log b/packages/web_components/lib/build.log
old mode 100644
new mode 100755
index 5929e73..8b95f7d
--- a/packages/web_components/lib/build.log
+++ b/packages/web_components/lib/build.log
@@ -1,448 +1,527 @@
 BUILD LOG
 ---------
-Build Time: 2016-02-18T16:57:00-0800
+Build Time: 2016-11-02T14:35:04-0700
 
 NODEJS INFORMATION
 ==================
-nodejs: v5.6.0
-accepts: 1.2.13
-accessibility-developer-tools: 2.10.0
-after: 0.8.1
+nodejs: v6.9.1
+accepts: 1.3.3
+accessibility-developer-tools: 2.11.0
 adm-zip: 0.4.7
-ansi-regex: 2.0.0
+after: 0.8.1
+agent-base: 2.0.1
 align-text: 0.1.4
-ansi-styles: 2.1.0
+ansi-regex: 2.0.0
 append-field: 0.1.0
+ansi-styles: 2.2.1
 archiver: 0.14.4
 archy: 1.0.0
+arr-flatten: 1.0.1
+arr-diff: 2.0.0
 array-differ: 1.0.0
-array-find-index: 1.0.1
+array-find-index: 1.0.2
 array-flatten: 1.1.1
-array-uniq: 1.0.2
+array-uniq: 1.0.3
+array-unique: 0.2.1
 arraybuffer.slice: 0.0.6
-asap: 2.0.3
+asap: 2.0.5
 asn1: 0.1.11
 assert-plus: 0.1.5
+assertion-error: 1.0.2
 async: 0.9.2
-assertion-error: 1.0.1
+asynckit: 0.4.0
 aws-sign2: 0.5.0
-aws4: 1.2.1
+aws4: 1.5.0
 backo2: 1.0.2
-backoff: 2.4.1
-balanced-match: 0.3.0
-base64-arraybuffer: 0.1.2
-base64-js: 0.0.8
+backoff: 2.5.0
+balanced-match: 0.4.2
+base64-arraybuffer: 0.1.5
+base64-js: 1.1.2
 base64id: 0.1.0
+bcrypt-pbkdf: 1.0.0
 beeper: 1.1.0
 benchmark: 1.0.0
 better-assert: 1.0.2
-binary: 0.3.0
-blob: 0.0.4
 bl: 0.9.5
-bluebird: 2.10.2
-body-parser: 1.15.0
+body-parser: 1.15.2
+blob: 0.0.4
+bluebird: 2.11.0
 boom: 0.4.2
-brace-expansion: 1.1.3
+boxen: 0.3.1
+brace-expansion: 1.1.6
+braces: 1.8.5
+browserstack: 1.5.0
+buffer-shims: 1.0.0
 buffer-crc32: 0.2.5
-browserstack: 1.3.1
 builtin-modules: 1.1.1
-buffers: 0.1.1
-bunyan: 1.6.0
-busboy: 0.2.12
-bytes: 2.2.0
-camelcase: 2.1.0
+bunyan: 1.8.4
+busboy: 0.2.13
+bytes: 2.4.0
 callsite: 1.0.0
-camelcase-keys: 2.0.0
-center-align: 0.1.3
+camelcase: 2.1.1
+camelcase-keys: 2.1.0
 capture-stack-trace: 1.0.0
 caseless: 0.8.0
+center-align: 0.1.3
 chai: 3.5.0
-chainsaw: 0.1.0
-chalk: 1.1.1
-cleankill: 1.0.2
+chalk: 1.1.3
+cleankill: 1.0.3
 cliui: 2.1.0
 clone: 1.0.2
 clone-stats: 0.0.1
-commander: 2.3.0
+code-point-at: 1.0.1
 combined-stream: 0.0.7
+commander: 2.3.0
 component-bind: 1.0.0
-component-inherit: 0.0.3
 component-emitter: 1.1.2
-concat-map: 0.0.1
+component-inherit: 0.0.3
 compress-commons: 0.2.9
-concat-stream: 1.5.1
+concat-map: 0.0.1
+concat-stream: 1.5.2
 concat-with-sourcemaps: 1.0.4
+configstore: 2.1.0
 content-disposition: 0.5.1
-configstore: 1.4.0
-content-type: 1.0.1
-cookie: 0.1.5
-core-util-is: 1.0.2
+content-type: 1.0.2
+cookie: 0.3.1
 cookie-signature: 1.0.6
+core-util-is: 1.0.2
 crc: 3.2.1
 crc32-stream: 0.3.4
-create-error-class: 2.0.1
+create-error-class: 3.0.2
 cryptiles: 0.2.2
 csv: 0.4.6
-csv-parse: 1.0.1
+csv-parse: 1.1.7
 csv-generate: 0.0.6
 csv-stringify: 0.0.8
-dashdash: 1.13.0
 ctype: 0.5.3
+currently-unhandled: 0.4.1
+dashdash: 1.14.0
 dateformat: 1.0.12
-debug: 2.2.0
 deap: 1.0.0
+debug: 2.2.0
+decamelize: 1.2.0
 debuglog: 1.0.1
-decamelize: 1.1.2
-deep-extend: 0.4.1
 deep-eql: 0.1.3
+deep-extend: 0.4.1
 defaults: 1.0.3
-deprecated: 0.0.1
-depd: 1.1.0
 delayed-stream: 0.0.5
+depd: 1.1.0
+deprecated: 0.0.1
 destroy: 1.0.4
-dezalgo: 1.0.3
+detect-file: 0.1.0
 dicer: 0.2.5
+dezalgo: 1.0.3
 diff: 1.4.0
+dot-prop: 3.0.0
 dtrace-provider: 0.6.0
-duplexer2: 0.0.2
 ecc-jsbn: 0.1.1
+duplexer2: 0.0.2
 ee-first: 1.1.1
+encodeurl: 1.0.1
 end-of-stream: 0.1.5
-engine.io: 1.6.8
-engine.io-client: 1.6.8
-engine.io-parser: 1.2.4
+engine.io: 1.7.2
+engine.io-client: 1.7.2
+engine.io-parser: 1.3.1
 error-ex: 1.3.0
 escape-html: 1.0.3
 escape-regexp-component: 1.0.2
-escape-string-regexp: 1.0.4
-express: 4.13.4
+escape-string-regexp: 1.0.5
 etag: 1.7.0
-extend: 2.0.1
+expand-brackets: 0.1.5
+expand-range: 1.8.2
+expand-tilde: 1.2.2
+express: 4.14.0
+extend: 3.0.0
+extglob: 0.3.2
 extsprintf: 1.2.0
 fancy-log: 1.2.0
-finalhandler: 0.4.1
-find-up: 1.1.0
-findup-sync: 0.3.0
+fd-slicer: 1.0.1
+filename-regex: 2.0.0
+fill-range: 2.2.3
+filled-array: 1.1.0
+finalhandler: 0.5.0
 find-index: 0.1.1
-flagged-respawn: 0.3.1
+find-up: 1.1.2
+findup-sync: 0.4.3
+fined: 1.0.2
 first-chunk-stream: 1.0.0
-formatio: 1.1.1
-form-data: 0.2.0
+flagged-respawn: 0.3.2
+for-in: 0.1.6
+for-own: 0.1.4
 forever-agent: 0.5.2
+form-data: 0.2.0
+formatio: 1.1.1
 formidable: 1.0.17
 freeport: 1.0.5
-fresh: 0.3.0
 forwarded: 0.1.0
-fstream: 0.1.31
+fresh: 0.3.0
+fs-exists-sync: 0.1.0
 gaze: 0.5.2
 generate-function: 2.0.0
 generate-object-property: 1.2.0
 get-stdin: 4.0.1
-github-url-from-username-repo: 1.0.2
-glob: 5.0.15
+getpass: 0.1.6
 github-url-from-git: 1.4.0
-glob-watcher: 0.0.6
+github-url-from-username-repo: 1.0.2
+glob: 4.5.3
+glob-base: 0.3.0
+glob-parent: 2.0.0
 glob-stream: 3.1.18
+glob-watcher: 0.0.6
 glob2base: 0.0.12
+global-modules: 0.2.3
+global-prefix: 0.1.4
 globule: 0.1.0
 glogg: 1.0.0
-got: 5.4.1
-graceful-fs: 4.1.3
+got: 5.7.1
+graceful-fs: 4.1.9
 graceful-readlink: 1.0.1
+growl: 1.9.2
 gulp: 3.9.1
-growl: 1.8.1
 gulp-audit: 1.0.0
-gulp-uglify: 1.5.2
 gulp-concat: 2.6.0
+gulp-header: 1.8.8
+gulp-uglify: 1.5.4
 gulp-util: 3.0.7
-gulp-header: 1.7.1
 gulplog: 1.0.0
-has-ansi: 2.0.0
-has-color: 0.1.7
+handle-thing: 1.2.5
 har-validator: 2.0.6
+has-ansi: 2.0.0
 has-binary: 0.1.7
-has-gulplog: 0.1.0
+has-color: 0.1.7
 has-cors: 1.1.0
-hoek: 0.9.1
+has-gulplog: 0.1.0
 hawk: 1.1.1
-hosted-git-info: 2.1.4
-http-errors: 1.4.0
-iconv-lite: 0.4.13
+hoek: 0.9.1
+hosted-git-info: 2.1.5
+hpack.js: 2.1.6
+http-deceiver: 1.2.7
+http-errors: 1.5.0
+https-proxy-agent: 1.0.0
 http-signature: 0.11.0
-indent-string: 2.1.0
+iconv-lite: 0.4.13
 imurmurhash: 0.1.4
-inflight: 1.0.4
+indent-string: 2.1.0
 indexof: 0.0.1
-inherits: 2.0.1
+inflight: 1.0.6
+inherits: 2.0.3
 ini: 1.3.4
-interpret: 1.0.0
-ipaddr.js: 1.0.5
-is-absolute: 0.1.7
-is-buffer: 1.1.2
+interpret: 1.0.1
+ipaddr.js: 1.1.1
+is-absolute: 0.2.6
 is-arrayish: 0.2.1
+is-buffer: 1.1.4
 is-builtin-module: 1.0.0
-is-my-json-valid: 2.13.0
-is-finite: 1.0.1
+is-dotfile: 1.0.2
+is-equal-shallow: 0.1.3
+is-extendable: 0.1.1
+is-extglob: 1.0.0
+is-finite: 1.0.2
+is-fullwidth-code-point: 1.0.0
+is-glob: 2.0.1
+is-my-json-valid: 2.15.0
 is-npm: 1.0.0
-is-plain-obj: 1.1.0
+is-number: 2.1.0
+is-obj: 1.0.1
+is-posix-bracket: 0.1.1
+is-primitive: 2.0.0
 is-property: 1.0.2
-is-relative: 0.1.3
 is-redirect: 1.0.0
-is-retry-allowed: 1.0.0
-is-stream: 1.0.1
+is-relative: 0.2.1
+is-retry-allowed: 1.1.0
+is-stream: 1.1.0
 is-typedarray: 1.0.0
-isexe: 1.1.2
+is-unc-path: 0.1.1
 is-utf8: 0.2.1
+is-windows: 0.2.0
 isarray: 0.0.1
-isobject: 2.0.0
+isexe: 1.1.2
+isobject: 2.1.0
 isstream: 0.1.2
 jade: 0.26.3
-jju: 1.2.1
+jju: 1.3.0
 jodid25519: 1.0.2
 jsbn: 0.1.0
-json-schema: 0.2.2
-json-stringify-safe: 5.0.1
 json-parse-helpfulerror: 1.0.3
+json-schema: 0.2.3
+json-stringify-safe: 5.0.1
 json3: 3.2.6
-jsonpointer: 2.0.0
-jsprim: 1.2.2
-kind-of: 3.0.2
+jsprim: 1.3.1
+jsonpointer: 4.0.0
 keep-alive-agent: 0.0.1
-launchpad: 0.5.1
+kind-of: 3.0.4
 latest-version: 2.0.0
-lazy-cache: 1.0.3
-liftoff: 2.2.0
+lazy-cache: 1.0.4
+launchpad: 0.5.4
 lazystream: 0.1.0
+liftoff: 2.3.0
 load-json-file: 1.1.0
-lodash._basecopy: 3.0.1
 lodash: 1.0.2
+lodash._basecopy: 3.0.1
 lodash._basetostring: 3.0.1
 lodash._basevalues: 3.0.0
 lodash._getnative: 3.9.1
 lodash._isiterateecall: 3.0.9
 lodash._reescape: 3.0.0
+lodash._reevaluate: 3.0.0
 lodash._reinterpolate: 3.0.0
 lodash._root: 3.0.1
-lodash._reevaluate: 3.0.0
-lodash.isarguments: 3.0.7
+lodash.assignwith: 4.2.0
 lodash.escape: 3.2.0
-lodash.keys: 3.1.2
+lodash.isarguments: 3.1.0
 lodash.isarray: 3.0.4
+lodash.isempty: 4.4.0
+lodash.isplainobject: 4.0.6
+lodash.isstring: 4.0.1
+lodash.keys: 3.1.2
+lodash.mapvalues: 4.6.0
+lodash.pick: 4.4.0
 lodash.restparam: 3.6.1
-lodash.template: 3.6.2
 lodash.templatesettings: 3.1.1
-longest: 1.0.1
+lodash.template: 3.6.2
 lolex: 1.3.2
+longest: 1.0.1
+loud-rejection: 1.6.0
 lowercase-keys: 1.0.0
-loud-rejection: 1.3.0
 lru-cache: 2.7.3
+map-cache: 0.2.2
 map-obj: 1.0.1
 media-typer: 0.3.0
-match-stream: 0.0.2
 meow: 3.7.0
-methods: 1.1.2
 merge-descriptors: 1.0.1
+methods: 1.1.2
 mime: 1.3.4
-mime-types: 2.1.10
-mime-db: 1.22.0
-minimatch: 3.0.0
+mime-db: 1.24.0
+mime-types: 2.1.12
+minimalistic-assert: 1.0.0
+minimatch: 2.0.10
 minimist: 1.2.0
 mkdirp: 0.5.1
-mocha: 2.4.5
-moment: 2.11.2
+micromatch: 2.3.11
+mocha: 2.5.3
+moment: 2.15.2
 ms: 0.7.1
-multer: 1.1.0
+multer: 1.2.0
 multipipe: 0.1.2
 mv: 2.1.1
-nan: 2.2.0
+nan: 2.4.0
+natives: 1.1.0
 ncp: 2.0.0
-negotiator: 0.5.3
+negotiator: 0.6.1
 node-int64: 0.3.3
-node-uuid: 1.4.7
 node-status-codes: 1.0.0
+node-uuid: 1.4.7
+nodegit-promise: 4.0.0
 nomnom: 1.8.1
 normalize-package-data: 2.3.5
-number-is-nan: 1.0.0
+normalize-path: 2.0.1
+number-is-nan: 1.0.1
 oauth-sign: 0.5.0
 object-assign: 3.0.0
-on-finished: 2.3.0
 object-component: 0.0.3
+object.omit: 2.0.1
+obuf: 1.1.1
+on-finished: 2.3.0
 once: 1.3.3
 options: 0.0.6
 orchestrator: 0.3.7
-os-homedir: 1.0.1
 ordered-read-streams: 0.1.0
+os-homedir: 1.0.2
+os-tmpdir: 1.0.2
 osenv: 0.1.3
-over: 0.0.5
-os-tmpdir: 1.0.1
-package-json: 2.3.1
+package-json: 2.4.0
+parse-filepath: 1.0.1
+parse-glob: 3.0.4
 parse-json: 2.2.0
-parseqs: 0.0.2
 parsejson: 0.0.1
+parseqs: 0.0.2
 parseuri: 0.0.4
-path-exists: 2.1.0
 parseurl: 1.3.1
+path-exists: 2.1.0
+path-is-absolute: 1.0.1
+path-root: 0.1.1
+path-root-regex: 0.1.2
 path-to-regexp: 0.1.7
-path-is-absolute: 1.0.0
 path-type: 1.1.0
+pend: 1.2.0
 pify: 2.3.0
 pinkie: 2.0.4
-plist: 1.2.0
-pinkie-promise: 2.0.0
+pinkie-promise: 2.0.1
+plist: 2.0.1
 precond: 0.2.3
-prepend-http: 1.0.3
+prepend-http: 1.0.4
+preserve: 0.2.0
 pretty-hrtime: 1.0.2
+process-nextick-args: 1.0.7
 progress: 1.1.8
-process-nextick-args: 1.0.6
-proxy-addr: 1.0.10
-pullstream: 0.4.1
-qs: 6.1.0
-range-parser: 1.0.3
+promisify-node: 0.4.0
+proxy-addr: 1.1.2
+pseudomap: 1.0.2
+punycode: 1.4.1
 q: 1.4.1
-raw-body: 2.1.5
-read-all-stream: 3.1.0
+qs: 6.2.0
+randomatic: 1.1.5
+range-parser: 1.2.0
+raw-body: 2.1.7
 rc: 1.1.6
-read-package-json: 1.3.3
+read-all-stream: 3.1.0
 read-installed: 3.1.5
+read-package-json: 1.3.3
 read-pkg: 1.1.0
 read-pkg-up: 1.0.1
-readable-stream: 1.1.13
+readable-stream: 1.1.14
 rechoir: 0.6.2
-readdir-scoped-modules: 1.0.2
 redent: 1.0.0
-registry-url: 3.0.3
-repeat-string: 1.5.2
-request: 2.51.0
-repeating: 2.0.0
+readdir-scoped-modules: 1.0.2
+regex-cache: 0.4.3
+registry-auth-token: 3.1.0
+registry-url: 3.1.0
+repeat-element: 1.1.2
+repeat-string: 1.6.1
+repeating: 2.0.1
 replace-ext: 0.0.1
+request: 2.51.0
 resolve: 1.1.7
-restify: 4.0.4
-rimraf: 2.4.5
+resolve-dir: 0.1.1
+restify: 4.2.0
 right-align: 0.1.3
+rimraf: 2.4.5
+run-sequence: 1.2.2
 safe-json-stringify: 1.0.3
-run-sequence: 1.1.5
-sauce-connect-launcher: 0.14.0
-send: 0.11.1
 samsam: 1.1.2
-selenium-standalone: 4.9.0
+sauce-connect-launcher: 0.16.0
+select-hose: 2.0.0
+selenium-standalone: 5.8.0
 semver: 4.3.6
 semver-diff: 2.1.0
-serve-static: 1.10.2
-server-destroy: 1.0.1
+send: 0.11.1
 sequencify: 0.0.7
+serve-static: 1.11.1
 serve-waterfall: 1.1.1
-setimmediate: 1.0.4
+server-destroy: 1.0.1
+setprototypeof: 1.0.1
 sigmund: 1.0.1
-signal-exit: 2.1.2
-sinon: 1.17.3
+signal-exit: 3.0.1
+sinon: 1.17.6
 sinon-chai: 2.8.0
-slice-stream: 1.0.0
 slide: 1.1.6
 sntp: 0.2.4
-socket.io: 1.4.5
+socket.io: 1.5.1
 socket.io-adapter: 0.4.0
-socket.io-client: 1.4.5
-socket.io-parser: 2.2.6
-source-map: 0.5.3
+socket.io-client: 1.5.1
+socket.io-parser: 2.3.1
+source-map: 0.5.6
 sparkles: 1.0.0
 spdx-correct: 1.0.2
-spdx-expression-parse: 1.0.2
-spdx-exceptions: 1.0.4
-spdx-license-ids: 1.2.0
-spdy: 1.32.5
-sshpk: 1.7.4
+spdx-expression-parse: 1.0.4
+spdx-license-ids: 1.2.2
+spdy: 3.4.4
+spdy-transport: 2.0.17
+sshpk: 1.10.1
 stacky: 1.3.1
-statuses: 1.2.1
+statuses: 1.3.0
 stream-consume: 0.1.0
 stream-transform: 0.1.1
 streamsearch: 0.1.2
-string-length: 1.0.1
+string-width: 1.0.2
 string_decoder: 0.10.31
 stringstream: 0.0.5
-strip-ansi: 3.0.0
+strip-ansi: 3.0.1
 strip-bom: 2.0.0
 strip-indent: 1.0.1
 strip-json-comments: 1.0.4
 supports-color: 2.0.0
-tar-stream: 1.1.5
 temp: 0.8.3
+tar-stream: 1.5.2
+test-fixture: 1.1.1
 through2: 2.0.1
-test-fixture: 1.1.0
-tildify: 1.1.2
-time-stamp: 1.0.0
+tildify: 1.2.0
+time-stamp: 1.0.1
+timed-out: 3.0.0
 to-array: 0.1.4
-timed-out: 2.0.0
-tough-cookie: 2.2.1
-traverse: 0.3.9
+to-iso-string: 0.0.2
+tough-cookie: 2.3.2
 trim-newlines: 1.0.0
-tunnel-agent: 0.4.2
-tweetnacl: 0.13.3
+tunnel-agent: 0.4.3
+tweetnacl: 0.14.3
 type-detect: 1.0.0
-type-is: 1.6.11
+type-is: 1.6.13
 typedarray: 0.0.6
+uglify-js: 2.6.4
 uglify-save-license: 0.4.1
-uglify-js: 2.6.1
 uglify-to-browserify: 1.0.2
 ultron: 1.0.2
+unc-path-regex: 0.1.2
 underscore: 1.6.0
 underscore.string: 3.0.3
 unique-stream: 1.0.0
 unpipe: 1.0.0
-unzip: 0.1.11
-unzip-response: 1.0.0
-update-notifier: 0.6.0
+unzip-response: 1.0.2
+update-notifier: 0.6.3
 urijs: 1.16.1
 url-parse-lax: 1.0.0
 user-home: 1.1.1
-utf8: 2.1.0
-util-deprecate: 1.0.2
 util: 0.10.3
+util-deprecate: 1.0.2
 util-extend: 1.0.3
 utils-merge: 1.0.0
-validate-npm-package-license: 3.0.1
-uuid: 2.0.1
+uuid: 2.0.3
 v8flags: 2.0.11
-vary: 1.0.1
-verror: 1.6.1
+validate-npm-package-license: 3.0.1
 vargs: 0.1.0
+vary: 1.1.0
 vasync: 1.6.3
+verror: 1.8.1
+vinyl: 0.5.3
 vinyl-fs: 0.3.14
 vinyl-sourcemaps-apply: 0.2.1
-vinyl: 0.5.3
-wct-local: 2.0.1
-wct-sauce: 1.8.3
-web-component-tester: 4.2.0
-window-size: 0.1.0
+wbuf: 1.7.2
+wct-local: 2.0.13
+wct-sauce: 1.8.5
 wd: 0.3.12
-which: 1.2.4
+web-component-tester: 4.3.6
+which: 1.2.11
+widest-line: 1.0.0
+window-size: 0.1.0
 wordwrap: 0.0.2
-wrappy: 1.0.1
-write-file-atomic: 1.1.4
-ws: 1.0.1
-xmlbuilder: 4.0.0
-xmldom: 0.1.22
+wrappy: 1.0.2
+write-file-atomic: 1.2.0
+ws: 1.1.1
+wtf-8: 1.0.0
 xdg-basedir: 2.0.0
+xmlbuilder: 8.2.2
+xmldom: 0.1.22
 xmlhttprequest-ssl: 1.5.1
 xtend: 4.0.1
+yallist: 2.0.0
 yargs: 3.10.0
+yauzl: 2.7.0
 yeast: 0.1.2
 zip-stream: 0.5.2
+@types/chalk: 0.4.31
+@types/express: 4.0.33
+@types/freeport: 1.0.20
+@types/express-serve-static-core: 4.0.38
+@types/mime: 0.0.29
+@types/node: 6.0.46
+@types/serve-static: 1.7.31
+@types/which: 1.0.28
 
 REPO REVISIONS
 ==============
-webcomponentsjs: b76bfaa6b1b2d691745b8d38b3f242e8f17490d5
+webcomponentsjs: 9d43da6447f0e1a7aac81abf8b1e904a3888c199
 
 BUILD HASHES
 ============
-CustomElements.js: 031b018d6bbebd32ae1b3edaa04927ce5cd40dd2
-CustomElements.min.js: 14f6fd8f3a3219470eec480e8918cd8749bf792d
-HTMLImports.js: 64f26245ac687f3d1a931bb99120238716219db4
-HTMLImports.min.js: 2ec6d3c8160ae77e52e2fc48db59e6ae5f3e3f19
-MutationObserver.js: aa0881cf576808bff95dfe5195727e839d8339f8
-MutationObserver.min.js: 1eebd7ec07b9e25b345ee553395c12c040bf9535
-ShadowDOM.js: 2095e8e2c18ab30417ea6bf42bcd7550a9870e7c
-ShadowDOM.min.js: ceba42773f616863115e13a884f1b7eee344ad74
-webcomponents-lite.js: b57a7c1b0d5d01cbefef3f1938c07138045bd82e
-webcomponents-lite.min.js: 2a31c424558c9f74f708ea32098f89baf2a4dd86
-webcomponents.js: 50f3c0c3fbdb74c44d5457f9d0c82d38038d379f
-webcomponents.min.js: 7127c614ab7e4e320bfc250549af7057f804a97c
\ No newline at end of file
+CustomElements.js: e3d11d1e93af611a85b4fc1a5954c5e6dcd5473c
+CustomElements.min.js: 4a54df840953ab5d9da800f93942c9a8d826efd6
+HTMLImports.js: aa6b3ae9b73b1abaadafd956e1010af3b5bc8099
+HTMLImports.min.js: 0a844190de129f97698c1ba6002a0a442dc8a7da
+MutationObserver.js: 2ba8c87a929e0914bd3dac0ee5fd29b92cec7ed9
+MutationObserver.min.js: 2cdb59f6d04abdbde231b7aabc71981b68b2457d
+ShadowDOM.js: 54b96e4b7d48bd11b197de9b679cf55e7eb69af1
+ShadowDOM.min.js: d45366b344e6ed73fd7c78ca93a6b3637e22f2ff
+webcomponents-lite.js: 8297b0f275edc1ec0e96622960f464a9ce829e8f
+webcomponents-lite.min.js: 4db667de7007003f0560c2ac0efbd3260223dbef
+webcomponents.js: fce9575094da6369726fd6fbd6b4eb11e26a69c1
+webcomponents.min.js: bef3b25b006ca5f96b2e37efcf10ccd6c98b3e29
\ No newline at end of file
diff --git a/packages/web_components/lib/build/html_import_annotation_recorder.dart b/packages/web_components/lib/build/html_import_annotation_recorder.dart
index 5f2a320..8a3580c 100644
--- a/packages/web_components/lib/build/html_import_annotation_recorder.dart
+++ b/packages/web_components/lib/build/html_import_annotation_recorder.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 library web_components.build.html_import_recorder_inliner;
 
-import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:initialize/transformer.dart';
 import 'package:path/path.dart' as path;
 import '../src/normalize_path.dart';
diff --git a/packages/web_components/lib/package.json b/packages/web_components/lib/package.json
old mode 100644
new mode 100755
index a670976..e0a13e7
--- a/packages/web_components/lib/package.json
+++ b/packages/web_components/lib/package.json
@@ -1,6 +1,6 @@
 {
   "name": "webcomponents.js",
-  "version": "0.7.21",
+  "version": "0.7.23",
   "description": "webcomponents.js",
   "main": "webcomponents.js",
   "directories": {
diff --git a/packages/web_components/lib/webcomponents-lite.js b/packages/web_components/lib/webcomponents-lite.js
old mode 100644
new mode 100755
index 1fdb2d3..10b5157
--- a/packages/web_components/lib/webcomponents-lite.js
+++ b/packages/web_components/lib/webcomponents-lite.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 (function() {
   window.WebComponents = window.WebComponents || {
     flags: {}
@@ -165,7 +165,7 @@
           this._fragment = "#";
           state = "fragment";
         } else {
-          if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+          if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
             this._schemeData += percentEscape(c);
           }
         }
@@ -296,7 +296,7 @@
           seenAt = true;
           for (var i = 0; i < buffer.length; i++) {
             var cp = buffer[i];
-            if ("	" == cp || "\n" == cp || "\r" == cp) {
+            if ("\t" == cp || "\n" == cp || "\r" == cp) {
               err("Invalid whitespace in authority.");
               continue;
             }
@@ -330,7 +330,7 @@
             state = "relative path start";
           }
           continue;
-        } else if ("	" == c || "\n" == c || "\r" == c) {
+        } else if ("\t" == c || "\n" == c || "\r" == c) {
           err("Invalid whitespace in file host.");
         } else {
           buffer += c;
@@ -354,7 +354,7 @@
             break loop;
           }
           continue;
-        } else if ("	" != c && "\n" != c && "\r" != c) {
+        } else if ("\t" != c && "\n" != c && "\r" != c) {
           if ("[" == c) {
             seenBracket = true;
           } else if ("]" == c) {
@@ -382,7 +382,7 @@
           }
           state = "relative path start";
           continue;
-        } else if ("	" == c || "\n" == c || "\r" == c) {
+        } else if ("\t" == c || "\n" == c || "\r" == c) {
           err("Invalid code point in port: " + c);
         } else {
           invalid.call(this);
@@ -427,7 +427,7 @@
             this._fragment = "#";
             state = "fragment";
           }
-        } else if ("	" != c && "\n" != c && "\r" != c) {
+        } else if ("\t" != c && "\n" != c && "\r" != c) {
           buffer += percentEscape(c);
         }
         break;
@@ -436,13 +436,13 @@
         if (!stateOverride && "#" == c) {
           this._fragment = "#";
           state = "fragment";
-        } else if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+        } else if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
           this._query += percentEscapeQuery(c);
         }
         break;
 
        case "fragment":
-        if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+        if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
           this._fragment += c;
         }
         break;
@@ -914,14 +914,29 @@
 
 (function() {
   var needsTemplate = typeof HTMLTemplateElement === "undefined";
+  if (/Trident/.test(navigator.userAgent)) {
+    (function() {
+      var importNode = document.importNode;
+      document.importNode = function() {
+        var n = importNode.apply(document, arguments);
+        if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
+          var f = document.createDocumentFragment();
+          f.appendChild(n);
+          return f;
+        } else {
+          return n;
+        }
+      };
+    })();
+  }
   var needsCloning = function() {
     if (!needsTemplate) {
-      var frag = document.createDocumentFragment();
       var t = document.createElement("template");
-      frag.appendChild(t);
-      t.content.appendChild(document.createElement("div"));
-      var clone = frag.cloneNode(true);
-      return clone.firstChild.content.childNodes.length === 0;
+      var t2 = document.createElement("template");
+      t2.content.appendChild(document.createElement("div"));
+      t.content.appendChild(t2);
+      var clone = t.cloneNode(true);
+      return clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0;
     }
   }();
   var TEMPLATE_TAG = "template";
@@ -943,6 +958,9 @@
       while (child = template.firstChild) {
         template.content.appendChild(child);
       }
+      template.cloneNode = function(deep) {
+        return TemplateImpl.cloneNode(this, deep);
+      };
       if (canDecorate) {
         try {
           Object.defineProperty(template, "innerHTML", {
@@ -965,9 +983,6 @@
             },
             configurable: true
           });
-          template.cloneNode = function(deep) {
-            return TemplateImpl.cloneNode(this, deep);
-          };
         } catch (err) {
           canDecorate = false;
         }
@@ -987,7 +1002,7 @@
     document.createElement = function() {
       "use strict";
       var el = createElement.apply(document, arguments);
-      if (el.localName == "template") {
+      if (el.localName === "template") {
         TemplateImpl.decorate(el);
       }
       return el;
@@ -1015,7 +1030,7 @@
   if (needsTemplate || needsCloning) {
     var nativeCloneNode = Node.prototype.cloneNode;
     TemplateImpl.cloneNode = function(template, deep) {
-      var clone = nativeCloneNode.call(template);
+      var clone = nativeCloneNode.call(template, false);
       if (this.decorate) {
         this.decorate(clone);
       }
@@ -1026,6 +1041,7 @@
       return clone;
     };
     TemplateImpl.fixClonedDom = function(clone, source) {
+      if (!source.querySelectorAll) return;
       var s$ = source.querySelectorAll(TEMPLATE_TAG);
       var t$ = clone.querySelectorAll(TEMPLATE_TAG);
       for (var i = 0, l = t$.length, t, s; i < l; i++) {
@@ -1063,13 +1079,13 @@
     }
   }
   if (needsTemplate) {
-    HTMLTemplateElement = TemplateImpl;
+    window.HTMLTemplateElement = TemplateImpl;
   }
 })();
 
 (function(scope) {
   "use strict";
-  if (!window.performance) {
+  if (!(window.performance && window.performance.now)) {
     var start = Date.now();
     window.performance = {
       now: function() {
@@ -2231,6 +2247,9 @@
       definition.prototype = Object.create(HTMLElement.prototype);
     }
     definition.__name = name.toLowerCase();
+    if (definition.extends) {
+      definition.extends = definition.extends.toLowerCase();
+    }
     definition.lifecycle = definition.lifecycle || {};
     definition.ancestry = ancestry(definition.extends);
     resolveTagName(definition);
@@ -2403,21 +2422,6 @@
   }
   wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
   wrapDomMethodToForceUpgrade(document, "importNode");
-  if (isIE) {
-    (function() {
-      var importNode = document.importNode;
-      document.importNode = function() {
-        var n = importNode.apply(document, arguments);
-        if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
-          var f = document.createDocumentFragment();
-          f.appendChild(n);
-          return f;
-        } else {
-          return n;
-        }
-      };
-    })();
-  }
   document.registerElement = register;
   document.createElement = createElement;
   document.createElementNS = createElementNS;
diff --git a/packages/web_components/lib/webcomponents-lite.min.js b/packages/web_components/lib/webcomponents-lite.min.js
old mode 100644
new mode 100755
index 0741ca5..2e98cb0
--- a/packages/web_components/lib/webcomponents-lite.min.js
+++ b/packages/web_components/lib/webcomponents-lite.min.js
@@ -7,6 +7,6 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents-lite.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,o=e.split("=");o[0]&&(t=o[0].match(/wc-(.+)/))&&(n[t[1]]=o[1]||!0)}),t)for(var o,r=0;o=t.attributes[r];r++)"src"!==o.name&&(n[o.name]=o.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function o(e){return""==e&&n.call(this),e.toLowerCase()}function r(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",u=0,l="",w=!1,_=!1,g=[];e:for(;(e[u-1]!=p||0==u)&&!this._isInvalid;){var b=e[u];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}l="",d="no scheme";continue}l+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))l+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}l="",u=0,d="no scheme";continue}if(this._scheme=l,l="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&"	"!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[u+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[u+1],E=e[u+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),l+="%40"),w=!0;for(var L=0;L<l.length;L++){var N=l[L];if("	"!=N&&"\n"!=N&&"\r"!=N)if(":"!=N||null!==this._password){var M=r(N);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}l=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){u-=l.length,l="",d="host";continue}l+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=l.length||!m.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?d="relative path start":(this._host=o.call(this,l),l="",d="relative path start"):d="relative path";continue}"	"==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):l+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=o.call(this,l),l="",d="relative path start",a)break e;continue}"	"!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),l+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=o.call(this,l),l="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))l+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=l){var T=parseInt(l,10);T!=h[this._scheme]&&(this._port=T+""),l=""}if(a)break e;d="relative path start";continue}"	"==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))"	"!=b&&"\n"!=b&&"\r"!=b&&(l+=r(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[l.toLowerCase()])&&(l=O),".."==l?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==l&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&m.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&"	"!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&"	"!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}u++}}function s(){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 c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",d="http://a/c%20d"===u.href}catch(l){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return(""!=this._username||null!=this._password)&&(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function u(e){return L?L:(L=c(E),L.oldValue=e,L)}function l(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new d("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=d("characterData",o),a=e.prevValue;i(o,function(e){return e.characterData?e.characterDataOldValue?u(a):r:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,r=d("childList",e.target.parentNode);r.addedNodes=s,r.removedNodes=c,r.previousSibling=f,r.nextSibling=p,i(e.relatedNode,function(e){return e.childList?r:void 0})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(l,e)}var n="undefined"==typeof HTMLTemplateElement,o=function(){if(!n){var e=document.createDocumentFragment(),t=document.createElement("template");e.appendChild(t),t.content.appendChild(document.createElement("div"));var o=e.cloneNode(!0);return 0===o.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0}),e.cloneNode=function(e){return i.cloneNode(this,e)}}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;a>o&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var u=document.createElement;document.createElement=function(){"use strict";var e=u.apply(document,arguments);return"template"==e.localName&&i.decorate(e),e};var l=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;c>s;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){("complete"===t.readyState||t.readyState===w)&&(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:u,errorImports:l})}function o(e){r(e),u.push(this),c++,n()}function i(e){l.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,u=[],l=[];if(d)for(var h,f=0;d>f&&(h=s[f]);f++)a(h)?(u.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;o>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(-1==e.textContent.indexOf("@import"))r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;a>i&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;c>s&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;o>n&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;
-t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=l(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(M(e.tag),e)}function d(e){return e?L[e.toLowerCase()]:void 0}function u(e,t){L[e]=t}function l(e){return function(){return c(e)}}function h(e,t,n){return e===N?f(t,n):T(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=M(e),e.indexOf("-")>=0&&b(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return _(e),e}}var m,v=e.isIE,w=e.upgradeDocumentTree,_=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],L={},N="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),T=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=L,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents);
\ No newline at end of file
+// @version 0.7.23
+!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents-lite.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,o=e.split("=");o[0]&&(t=o[0].match(/wc-(.+)/))&&(n[t[1]]=o[1]||!0)}),t)for(var o,r=0;o=t.attributes[r];r++)"src"!==o.name&&(n[o.name]=o.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function o(e){return""==e&&n.call(this),e.toLowerCase()}function r(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,63,96].indexOf(t)==-1?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,96].indexOf(t)==-1?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",l=0,u="",w=!1,_=!1,g=[];e:for(;(e[l-1]!=p||0==l)&&!this._isInvalid;){var b=e[l];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}u="",d="no scheme";continue}u+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))u+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}u="",l=0,d="no scheme";continue}if(this._scheme=u,u="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[l+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[l+1],E=e[l+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),u+="%40"),w=!0;for(var L=0;L<u.length;L++){var N=u[L];if("\t"!=N&&"\n"!=N&&"\r"!=N)if(":"!=N||null!==this._password){var M=r(N);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}u=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){l-=u.length,u="",d="host";continue}u+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=u.length||!m.test(u[0])||":"!=u[1]&&"|"!=u[1]?0==u.length?d="relative path start":(this._host=o.call(this,u),u="",d="relative path start"):d="relative path";continue}"\t"==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):u+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=o.call(this,u),u="",d="relative path start",a)break e;continue}"\t"!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),u+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=o.call(this,u),u="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))u+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=u){var T=parseInt(u,10);T!=h[this._scheme]&&(this._port=T+""),u=""}if(a)break e;d="relative path start";continue}"\t"==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))"\t"!=b&&"\n"!=b&&"\r"!=b&&(u+=r(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[u.toLowerCase()])&&(u=O),".."==u?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==u&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=u&&("file"==this._scheme&&0==this._path.length&&2==u.length&&m.test(u[0])&&"|"==u[1]&&(u=u[0]+":"),this._path.push(u)),u="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}l++}}function s(){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 c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var l=new URL("b","http://a");l.pathname="c%20d",d="http://a/c%20d"===l.href}catch(u){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function l(e){return L?L:(L=c(E),L.oldValue=e,L)}function u(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new d("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?l(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=d("characterData",o),a=e.prevValue;i(o,function(e){if(e.characterData)return e.characterDataOldValue?l(a):r});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,r=d("childList",e.target.parentNode);r.addedNodes=s,r.removedNodes=c,r.previousSibling=f,r.nextSibling=p,i(e.relatedNode,function(e){if(e.childList)return r})}u()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(u,e)}var n="undefined"==typeof HTMLTemplateElement;/Trident/.test(navigator.userAgent)&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}();var o=function(){if(!n){var e=document.createElement("template"),t=document.createElement("template");t.content.appendChild(document.createElement("div")),e.content.appendChild(t);var o=e.cloneNode(!0);return 0===o.content.childNodes.length||0===o.content.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(e.cloneNode=function(e){return i.cloneNode(this,e)},s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0})}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;o<a&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var l=document.createElement;document.createElement=function(){"use strict";var e=l.apply(document,arguments);return"template"===e.localName&&i.decorate(e),e};var u=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e,!1);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){if(t.querySelectorAll)for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;s<c;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(window.HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:l,errorImports:u})}function o(e){r(e),l.push(this),c++,n()}function i(e){u.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,l=[],u=[];if(d)for(var h,f=0;f<d&&(h=s[f]);f++)a(h)?(l.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return u?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var l="import",u=Boolean(l in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";u&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;n<o&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=l,e.useNative=u,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;s<c&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===l}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,l=e.IMPORT_LINK_TYPE,u="link[rel="+l+"]",h={documentSelectors:u,importsSelectors:[u,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(e.textContent.indexOf("@import")==-1)r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;c<s&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;i<a&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=u}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,l=e.Observer,u=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new l,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;s<c&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;s<c&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function o(e,t){g(e,function(e){if(n(e,t))return!0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;n<o&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e);
+}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function u(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=u(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),l(c.__name,c),c.ctor=u(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<y.length;t++)if(e===y[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return _(N(e.tag),e)}function d(e){if(e)return E[e.toLowerCase()]}function l(e,t){E[e]=t}function u(e){return function(){return c(e)}}function h(e,t,n){return e===L?f(t,n):M(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=N(e),e.indexOf("-")>=0&&g(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),w=e.upgradeAll,_=e.upgradeWithDefinition,g=e.implementPrototype,b=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],E={},L="http://www.w3.org/1999/xhtml",N=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||b?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=E,e["instanceof"]=m,e.reservedTagList=y,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents);
\ No newline at end of file
diff --git a/packages/web_components/lib/webcomponents.js b/packages/web_components/lib/webcomponents.js
old mode 100644
new mode 100755
index 8e9feb2..d30e911
--- a/packages/web_components/lib/webcomponents.js
+++ b/packages/web_components/lib/webcomponents.js
@@ -7,7 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
+// @version 0.7.23
 (function() {
   window.WebComponents = window.WebComponents || {
     flags: {}
@@ -211,6 +211,9 @@
     }
     function getDescriptor(source, name) {
       try {
+        if (source === window && name === "showModalDialog") {
+          return dummyDescriptor;
+        }
         return Object.getOwnPropertyDescriptor(source, name);
       } catch (ex) {
         return dummyDescriptor;
@@ -4656,7 +4659,7 @@
         if (cssRules) {
           Array.prototype.forEach.call(cssRules, function(rule) {
             if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
-              cssText += this.scopeSelector(rule.selectorText, scopeSelector, this.strictStyling) + " {\n	";
+              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";
@@ -4775,7 +4778,7 @@
       }
     };
     var selectorRe = /([^{]*)({[\s\S]*?})/gim, cssCommentRe = /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim, cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\s{,(]*)/gim, cssPartRe = /::part\(([^)]*)\)/gim, polyfillHost = "-shadowcsshost", polyfillHostContext = "-shadowcsscontext", parenSuffix = ")(?:\\((" + "(?:\\([^)(]*\\)|[^)(]*)+?" + ")\\))?([^,{]*)";
-    var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ />>>/g, /::shadow/g, /::content/g, /\/deep\//g, /\/shadow\//g, /\/shadow-deep\//g, /\^\^/g, /\^/g ];
+    var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ />>>/g, /::shadow/g, /::content/g, /\/deep\//g, /\/shadow\//g, /\/shadow-deep\//g, /\^\^/g, /\^(?!=)/g ];
     function stylesToCssText(styles, preserveComments) {
       var cssText = "";
       Array.prototype.forEach.call(styles, function(s) {
@@ -5055,7 +5058,7 @@
           this._fragment = "#";
           state = "fragment";
         } else {
-          if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+          if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
             this._schemeData += percentEscape(c);
           }
         }
@@ -5186,7 +5189,7 @@
           seenAt = true;
           for (var i = 0; i < buffer.length; i++) {
             var cp = buffer[i];
-            if ("	" == cp || "\n" == cp || "\r" == cp) {
+            if ("\t" == cp || "\n" == cp || "\r" == cp) {
               err("Invalid whitespace in authority.");
               continue;
             }
@@ -5220,7 +5223,7 @@
             state = "relative path start";
           }
           continue;
-        } else if ("	" == c || "\n" == c || "\r" == c) {
+        } else if ("\t" == c || "\n" == c || "\r" == c) {
           err("Invalid whitespace in file host.");
         } else {
           buffer += c;
@@ -5244,7 +5247,7 @@
             break loop;
           }
           continue;
-        } else if ("	" != c && "\n" != c && "\r" != c) {
+        } else if ("\t" != c && "\n" != c && "\r" != c) {
           if ("[" == c) {
             seenBracket = true;
           } else if ("]" == c) {
@@ -5272,7 +5275,7 @@
           }
           state = "relative path start";
           continue;
-        } else if ("	" == c || "\n" == c || "\r" == c) {
+        } else if ("\t" == c || "\n" == c || "\r" == c) {
           err("Invalid code point in port: " + c);
         } else {
           invalid.call(this);
@@ -5317,7 +5320,7 @@
             this._fragment = "#";
             state = "fragment";
           }
-        } else if ("	" != c && "\n" != c && "\r" != c) {
+        } else if ("\t" != c && "\n" != c && "\r" != c) {
           buffer += percentEscape(c);
         }
         break;
@@ -5326,13 +5329,13 @@
         if (!stateOverride && "#" == c) {
           this._fragment = "#";
           state = "fragment";
-        } else if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+        } else if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
           this._query += percentEscapeQuery(c);
         }
         break;
 
        case "fragment":
-        if (EOF != c && "	" != c && "\n" != c && "\r" != c) {
+        if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
           this._fragment += c;
         }
         break;
@@ -5768,7 +5771,7 @@
 
 (function(scope) {
   "use strict";
-  if (!window.performance) {
+  if (!(window.performance && window.performance.now)) {
     var start = Date.now();
     window.performance = {
       now: function() {
@@ -6930,6 +6933,9 @@
       definition.prototype = Object.create(HTMLElement.prototype);
     }
     definition.__name = name.toLowerCase();
+    if (definition.extends) {
+      definition.extends = definition.extends.toLowerCase();
+    }
     definition.lifecycle = definition.lifecycle || {};
     definition.ancestry = ancestry(definition.extends);
     resolveTagName(definition);
@@ -7102,21 +7108,6 @@
   }
   wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
   wrapDomMethodToForceUpgrade(document, "importNode");
-  if (isIE) {
-    (function() {
-      var importNode = document.importNode;
-      document.importNode = function() {
-        var n = importNode.apply(document, arguments);
-        if (n.nodeType == n.DOCUMENT_FRAGMENT_NODE) {
-          var f = document.createDocumentFragment();
-          f.appendChild(n);
-          return f;
-        } else {
-          return n;
-        }
-      };
-    })();
-  }
   document.registerElement = register;
   document.createElement = createElement;
   document.createElementNS = createElementNS;
diff --git a/packages/web_components/lib/webcomponents.min.js b/packages/web_components/lib/webcomponents.min.js
old mode 100644
new mode 100755
index 155ba28..3927736
--- a/packages/web_components/lib/webcomponents.min.js
+++ b/packages/web_components/lib/webcomponents.min.js
@@ -7,8 +7,8 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version 0.7.21
-!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&-1!==d.attributeFilter.indexOf(o.name))&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),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 S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
-querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;f>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){
-return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n	",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&"	"!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if("	"!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}"	"==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}"	"!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}"	"==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))"	"!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&"	"!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&"	"!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){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 c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return(""!=this._username||null!=this._password)&&(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===v)&&(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),c++,n()}function i(e){d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];
-if(l)for(var p,h=0;l>h&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return b(M(e.tag),e)}function l(e){return e?S[e.toLowerCase()]:void 0}function u(e,t){S[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===T?h(t,n):O(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=M(e),e.indexOf("-")>=0&&y(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return g(e),e}}var m,w=e.isIE,v=e.upgradeDocumentTree,g=e.upgradeAll,b=e.upgradeWithDefinition,y=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],S={},T="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),w&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=S,e["instanceof"]=m,e.reservedTagList=_,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
\ No newline at end of file
+// @version 0.7.23
+!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return e===window&&"showModalDialog"===t?B:Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;l<a;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;u<s;u++)c[0][u]=u;for(var l=1;l<a;l++)for(var u=1;u<s;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=d<p?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=d<p?d<u?d:u:p<u?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);l<u;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;r<n;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;i<n&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&d.attributeFilter.indexOf(o.name)!==-1)&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;m<w;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e||e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return l==-1?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;r<o;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;o<n;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),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 S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;s<c;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
+querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;m<f;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;m<v;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return!!t&&(t.invalidate(),!0)},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){
+return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;r<o&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;c<l&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n\t",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^(?!=)/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,63,96].indexOf(t)==-1?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,96].indexOf(t)==-1?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if("\t"!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}"\t"==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}"\t"!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}"\t"==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))"\t"!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){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 c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){if(e.characterData)return e.characterDataOldValue?u(a):o});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){if(e.childList)return o})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==v||(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),c++,n()}function i(e){
+d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];if(l)for(var p,h=0;h<l&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;n<r&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;s<c&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(e.textContent.indexOf("@import")==-1)o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;c<s&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;i<a&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;s<c&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;s<c&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function r(e,t){b(e,function(e){if(n(e,t))return!0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;n<r&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(T(e.tag),e)}function l(e){if(e)return _[e.toLowerCase()]}function u(e,t){_[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===S?h(t,n):M(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=T(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
\ No newline at end of file
diff --git a/packages/web_components/pubspec.yaml b/packages/web_components/pubspec.yaml
index c333213..b65a692 100644
--- a/packages/web_components/pubspec.yaml
+++ b/packages/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.12.3
+version: 0.12.5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://github.com/dart-lang/web-components/
 description: >
@@ -10,10 +10,10 @@
   elements, by hiding DOM subtrees under shadow roots. HTML Imports let authors
   bundle code and HTML as if they were libraries.
 dependencies:
-  analyzer: '^0.27.0'
+  analyzer: '>=0.27.1 <0.30.0'
   barback: '>=0.14.2 <0.16.0'
-  code_transformers: '>=0.3.0 <0.5.0'
-  html: '^0.12.0'
+  code_transformers: '>=0.3.0 <0.6.0'
+  html: '>=0.12.0 <0.14.0'
   initialize: '^0.6.0'
   path: '^1.3.0'
 dev_dependencies:
@@ -32,6 +32,5 @@
       - test/init_web_components_test.html
 - test/pub_serve:
     $include: test/**_test{.*,}.dart
-
 environment:
   sdk: ">=1.9.0-dev.7.1 <2.0.0"
diff --git a/packages/when/.gitignore b/packages/when/.gitignore
deleted file mode 100755
index 420b510..0000000
--- a/packages/when/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-# Don’t commit the following directories created by pub.

-build/

-packages/

-.buildlog

-

-# Or the files created by dart2js.

-*.dart.js

-*.dart.precompiled.js

-*.js_

-*.js.deps

-*.js.map

-

-# Include when developing application packages.

-pubspec.lock

diff --git a/packages/when/CHANGELOG.md b/packages/when/CHANGELOG.md
deleted file mode 100755
index 191dcec..0000000
--- a/packages/when/CHANGELOG.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# 0.2.0

-

-* Make `onSuccess` optional.

-

-# 0.1.0

-

-* Initial version.
\ No newline at end of file
diff --git a/packages/when/README.md b/packages/when/README.md
deleted file mode 100755
index e3897a7..0000000
--- a/packages/when/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-when [![pub package](http://img.shields.io/pub/v/when.svg)](https://pub.dartlang.org/packages/when) [![Build Status](https://drone.io/github.com/seaneagan/when.dart/status.png)](https://drone.io/github.com/seaneagan/when.dart/latest) [![Coverage Status](https://img.shields.io/coveralls/seaneagan/when.dart.svg)](https://coveralls.io/r/seaneagan/when.dart?branch=master)

-====

-

-It's often useful to provide sync (convenient) and async (concurrent) versions 

-of the same API.  `dart:io` does this with many APIs including [Process.run][] 

-and [Process.runSync][].  Since the sync and async versions do the same thing, 

-much of the logic is the same, with just a few small bits differing in their 

-sync vs. async implementation.

-

-The `when` function allows for registering `onSuccess`, `onError`, and 

-`onComplete` callbacks on another callback which represents that sync/async 

-dependent part of the API.  If the callback is sync (returns a non-`Future` or 

-throws), then the other callbacks are invoked synchronously, otherwise the 

-other callbacks are registered on the returned `Future`.

-

-For example, here's how it can be used to implement sync and async APIs for

-reading a JSON data structure from the file system with file absence handling:

-

-```dart

-import 'dart:async';

-import 'dart:convert';

-import 'dart:io';

-

-import 'package:when/when.dart';

-

-/// Reads and decodes JSON from [path] asynchronously.

-///

-/// If [path] does not exist, returns the result of calling [onAbsent].

-Future readJsonFile(String path, {onAbsent()}) => _readJsonFile(

-    path, onAbsent, (file) => file.exists(), (file) => file.readAsString());

-

-/// Reads and decodes JSON from [path] synchronously.

-///

-/// If [path] does not exist, returns the result of calling [onAbsent].

-readJsonFileSync(String path, {onAbsent()}) => _readJsonFile(

-    path, onAbsent, (file) => file.existsSync(),

-    (file) => file.readAsStringSync());

-

-_readJsonFile(String path, onAbsent(), exists(File file), read(File file)) {

-  var file = new File(path);

-  return when(

-      () => exists(file),

-      onSuccess: (doesExist) => doesExist ?

-          when(() => read(file), onSuccess: JSON.decode) :

-          onAbsent());

-}

-

-main() {

-  var syncJson = readJsonFileSync('foo.json', onAbsent: () => {'foo': 'bar'});

-  print('Sync json: $syncJson');

-  readJsonFile('foo.json', onAbsent: () => {'foo': 'bar'}).then((asyncJson) {

-    print('Async json: $asyncJson');

-  });

-}

-```

-

-[Process.run]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io.Process#id_run

-[Process.runSync]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io.Process#id_runSync

diff --git a/packages/when/drone.sh b/packages/when/drone.sh
deleted file mode 100755
index 6ed29b2..0000000
--- a/packages/when/drone.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash

-set -o xtrace

-

-pub get

-dart test/test_when.dart

-

-# TODO: dartanalyzer on all libraries

-

-# Install dart_coveralls; gather and send coverage data.

-if [ "$REPO_TOKEN" ]; then

-  export PATH="$PATH":"~/.pub-cache/bin"

-

-  echo

-  echo "Installing dart_coveralls"

-  pub global activate dart_coveralls

-

-  echo

-  echo "Running code coverage report"

-  # --debug for verbose logging

-  pub global run dart_coveralls report --token $REPO_TOKEN --retry 3 test/test_when.dart

-fi
\ No newline at end of file
diff --git a/packages/when/example/foo.json b/packages/when/example/foo.json
deleted file mode 100755
index 36533a5..0000000
--- a/packages/when/example/foo.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{

-  "some json": "from foo.json"

-}
\ No newline at end of file
diff --git a/packages/when/example/read_json_file.dart b/packages/when/example/read_json_file.dart
deleted file mode 100755
index 3092ac8..0000000
--- a/packages/when/example/read_json_file.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-

-library when.example.read_json_file;

-

-import 'dart:async';

-import 'dart:convert';

-import 'dart:io';

-

-import 'package:when/when.dart';

-

-/// Reads and decodes JSON from [path] asynchronously.

-///

-/// If [path] does not exist, returns the result of calling [onAbsent].

-Future readJsonFile(String path, {onAbsent()}) => _readJsonFile(

-    path, onAbsent, (file) => file.exists(), (file) => file.readAsString());

-

-/// Reads and decodes JSON from [path] synchronously.

-///

-/// If [path] does not exist, returns the result of calling [onAbsent].

-readJsonFileSync(String path, {onAbsent()}) => _readJsonFile(

-    path, onAbsent, (file) => file.existsSync(),

-    (file) => file.readAsStringSync());

-

-_readJsonFile(String path, onAbsent(), exists(File file), read(File file)) {

-  var file = new File(path);

-  return when(

-      () => exists(file),

-      onSuccess: (doesExist) => doesExist ?

-          when(() => read(file), onSuccess: JSON.decode) :

-          onAbsent());

-}

-

-main() {

-  var syncJson = readJsonFileSync('foo.json', onAbsent: () => {'foo': 'bar'});

-  print('Sync json: $syncJson');

-  readJsonFile('foo.json', onAbsent: () => {'foo': 'bar'}).then((asyncJson) {

-    print('Async json: $asyncJson');

-  });

-}

diff --git a/packages/when/lib/when.dart b/packages/when/lib/when.dart
deleted file mode 100755
index 703ecc2..0000000
--- a/packages/when/lib/when.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-

-library when;

-

-import 'dart:async';

-

-/// Registers callbacks on the result of a [callback], which may or may not be

-/// a [Future].

-///

-/// If [callback] returns a future, any of [onSuccess], [onError], or

-/// [onComplete] that are provided are registered on the future,

-/// and the resulting future is returned.

-///

-/// Otherwise, if [callback] did not throw, if [onSuccess] is provided, it is

-/// called with the with the result of [callback], and the return value of

-/// [onSuccess] is captured.

-///

-/// Otherwise, if [onError] was provided, it is called.  It can take either

-/// just an error, or a stack trace as well.  If [onError] was not provided,

-/// the error is not caught.

-///

-/// [onComplete] is then called synchronously.

-///

-/// The captured value is then returned.

-when(callback, {onSuccess(result), onError, onComplete}) {

-  var result, hasResult = false;

-

-  try {

-    result = callback();

-    hasResult = true;

-  } catch (e, s) {

-    if (onError != null) {

-      if (onError is _Unary) {

-        onError(e);

-      } else if (onError is _Binary) {

-        onError(e, s);

-      } else {

-        throw new ArgumentError(

-            '"onError" must accept 1 or 2 arguments: $onError');

-      }

-    } else {

-      rethrow;

-    }

-  } finally {

-    if (result is Future) {

-      if (onSuccess != null) {

-        result = result.then(onSuccess);

-      }

-      if (onError != null) {

-        result = result.catchError(onError);

-      }

-      if (onComplete != null) {

-        result = result.whenComplete(onComplete);

-      }

-    } else {

-      if (hasResult) {

-        if (onSuccess != null) {

-          result = onSuccess(result);

-        }

-      }

-      if (onComplete != null) onComplete();

-    }

-  }

-

-  return result;

-}

-

-typedef _Unary(x);

-typedef _Binary(x, y);

diff --git a/packages/when/pubspec.yaml b/packages/when/pubspec.yaml
deleted file mode 100755
index ac206a0..0000000
--- a/packages/when/pubspec.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: when
-version: 0.2.0
-author: Sean Eagan <seaneagan1@gmail.com>
-description: Register callbacks on code which is conditionally sync or async.
-homepage: https://github.com/seaneagan/when.dart
-dev_dependencies:
-  unittest: '>=0.11.4 <0.12.0'
diff --git a/packages/when/test/test_when.dart b/packages/when/test/test_when.dart
deleted file mode 100755
index 25c5086..0000000
--- a/packages/when/test/test_when.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-

-library when.test;

-

-import 'dart:async';

-

-import 'package:unittest/unittest.dart';

-import 'package:when/when.dart';

-

-main() {

-  group('when', () {

-

-    test('on non-Future callback result should call onSuccess with result, then onComplete, and return onSuccess result', () {

-      var onSuccessCalled = false;

-      var onErrorCalled = false;

-      var onCompleteCalled = false;

-      var ret = when(

-          () => 5,

-          onSuccess: (x) {

-            expect(x, 5);

-            onSuccessCalled = true;

-            return 10;

-          },

-          onError: (e) => onErrorCalled = true,

-          onComplete: () {

-            expect(onSuccessCalled, isTrue);

-            onCompleteCalled = true;

-          });

-      expect(onErrorCalled, isFalse);

-      expect(onCompleteCalled, isTrue);

-      expect(ret, 10);

-    });

-

-    test('on callback failure should call onError with error, then onComplete', () {

-      var onSuccessCalled = false;

-      var onErrorCalled = false;

-      var onCompleteCalled = false;

-      var ret = when(

-          () => throw 'e',

-          onSuccess: (_) => onSuccessCalled = true,

-          onError: (e) {

-            expect(e, 'e');

-            onErrorCalled = true;

-          },

-          onComplete: () {

-            expect(onErrorCalled, isTrue);

-            onCompleteCalled = true;

-          });

-      expect(onSuccessCalled, isFalse);

-      expect(onCompleteCalled, isTrue);

-      expect(ret, isNull);

-    });

-

-    test('should pass stack trace to onError if binary', () {

-      var onErrorCalled = false;

-      when(

-          () => throw 'e',

-          onError: (e, s) {

-            onErrorCalled = true;

-            expect(s, isNotNull);

-          });

-      expect(onErrorCalled, isTrue);

-    });

-

-    test('should throw callback error if no onError provided', () {

-      try {

-        when(

-            () => throw 'e');

-        fail('callback error was swallowed');

-      } catch (e) {

-        expect(e, 'e');

-      }

-    });

-

-    test('should just return callback result if onSuccess not provided', () {

-        expect(when(() => 5), 5);

-    });

-

-    test('should not swallow onComplete error', () {

-      try {

-        when(

-            () {},

-            onComplete: () => throw 'e');

-        fail('onComplete error was swallowed');

-      } catch (e) {

-        expect(e, 'e');

-      }

-    });

-

-    group('on Future callback result', () {

-

-      test('which succeeds should call onSuccess with result, then onComplete, and complete with onSuccess result', () {

-        var onSuccessCalled = false;

-        var onErrorCalled = false;

-        var onCompleteCalled = false;

-        var result = when(

-            () => new Future.value(5),

-            onSuccess: (x) {

-              expect(x, 5);

-              onSuccessCalled = true;

-              return 10;

-            },

-            onError: (e) => onErrorCalled = true,

-            onComplete: () {

-              expect(onSuccessCalled, isTrue);

-              onCompleteCalled = true;

-            });

-        expect(onSuccessCalled, isFalse);

-        expect(onCompleteCalled, isFalse);

-        expect(result, new isInstanceOf<Future>());

-        return result.then((ret) {

-          expect(onErrorCalled, isFalse);

-          expect(onCompleteCalled, isTrue);

-          expect(ret, 10);

-        });

-      });

-

-      test('which fails should call onError with error, then onComplete', () {

-        var onSuccessCalled = false;

-        var onErrorCalled = false;

-        var onCompleteCalled = false;

-        var result = when(

-            () => new Future.error('e'),

-            onSuccess: (_) => onSuccessCalled = true,

-            onError: (e) {

-              expect(e, 'e');

-              onErrorCalled = true;

-            },

-            onComplete: () {

-              onErrorCalled = true;

-              onCompleteCalled = true;

-            });

-        expect(onErrorCalled, isFalse);

-        expect(onCompleteCalled, isFalse);

-        expect(result, new isInstanceOf<Future>());

-        return result.then((ret) {

-          expect(ret, isNull);

-          expect(onSuccessCalled, isFalse);

-          expect(onCompleteCalled, isTrue);

-        });

-      });

-

-      test('should pass stack trace to onError if binary', () {

-        var onErrorCalled = false;

-        return when(

-            () => new Future.error('e'),

-            onError: (e, s) {

-              onErrorCalled = true;

-              // TODO: Why is the stack trace null?

-              // expect(s, isNotNull);

-        }).then((_) {

-          expect(onErrorCalled, isTrue);

-        });

-      });

-

-      test('should throw callback error if no onError provided', () {

-        return when(

-            () => new Future.error('e')

-        ).then((_) {

-          fail('callback error was swallowed');

-        }, onError: (e) {

-          expect(e, 'e');

-        });

-      });

-

-      test('should just return callback result if onSuccess not provided', () {

-        return when(() => new Future.value(5)).then((result) {

-          expect(result, 5);

-        });

-      });

-

-      test('should not swallow onComplete error', () {

-        return when(

-            () => new Future.value(),

-            onComplete: () => throw 'e')

-            .then((ret) {

-              fail('onComplete error was swallowed');

-            }, onError: (e) {

-              expect(e, 'e');

-            });

-      });

-

-    });

-  });

-}
\ No newline at end of file
diff --git a/packages/which/.gitignore b/packages/which/.gitignore
deleted file mode 100755
index 420b510..0000000
--- a/packages/which/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-# Don’t commit the following directories created by pub.

-build/

-packages/

-.buildlog

-

-# Or the files created by dart2js.

-*.dart.js

-*.dart.precompiled.js

-*.js_

-*.js.deps

-*.js.map

-

-# Include when developing application packages.

-pubspec.lock

diff --git a/packages/which/CHANGELOG.md b/packages/which/CHANGELOG.md
deleted file mode 100755
index 62ec2b4..0000000
--- a/packages/which/CHANGELOG.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## 0.1.3

-

-* Assume owner/group matches that of executable until it's possible to check. (#5)
\ No newline at end of file
diff --git a/packages/which/LICENSE b/packages/which/LICENSE
deleted file mode 100755
index 8e442ed..0000000
--- a/packages/which/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-Copyright 2015, the which.dart project authors. All rights reserved.

-Redistribution and use in source and binary forms, with or without

-modification, are permitted provided that the following conditions are

-met:

-    * Redistributions of source code must retain the above copyright

-      notice, this list of conditions and the following disclaimer.

-    * Redistributions in binary form must reproduce the above

-      copyright notice, this list of conditions and the following

-      disclaimer in the documentation and/or other materials provided

-      with the distribution.

-    * Neither the name of Google Inc. nor the names of its

-      contributors may be used to endorse or promote products derived

-      from this software without specific prior written permission.

-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/packages/which/README.md b/packages/which/README.md
deleted file mode 100755
index b4d1d87..0000000
--- a/packages/which/README.md
+++ /dev/null
@@ -1,41 +0,0 @@
-which [![pub package](http://img.shields.io/pub/v/which.svg)](https://pub.dartlang.org/packages/which) [![Build Status](https://drone.io/github.com/seaneagan/which.dart/status.png)](https://drone.io/github.com/seaneagan/which.dart/latest) [![Coverage Status](https://img.shields.io/coveralls/seaneagan/which.dart.svg)](https://coveralls.io/r/seaneagan/which.dart?branch=master)

-=====

-

-Check for and locate installed executables.  Just like unix [which(1)][unix_which], except:

-

-* Doesn't shell out (fast).

-* Cross-platform (works on windows).  

-

-## Install

-

-```shell

-pub global activate den

-den install which

-```

-

-## Usage

-

-```dart

-import 'dart:io';

-

-import 'package:which/which.dart';

-

-main(arguments) async {

-

-  // Asynchronously

-  var git = await which('git', orElse: () => null);

-

-  // Or synchronously

-  var git = whichSync('git', orElse: () => null);

-

-  if (git == null) {

-    print('Please install git and try again');

-    exit(1);

-  }

-

-  await Process.run(git, ['add', '-A']);

-  await Process.run(git, ['commit', '-m', arguments.first]);

-}

-```

-

-[unix_which]: http://en.wikipedia.org/wiki/Which_%28Unix%29
\ No newline at end of file
diff --git a/packages/which/drone.sh b/packages/which/drone.sh
deleted file mode 100755
index ac92240..0000000
--- a/packages/which/drone.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash

-set -o xtrace

-

-pub get

-

-# TODO: Remove once https://github.com/drone/drone/issues/821 is fixed.

-export PATH="$PATH":"~/.pub-cache/bin"

-

-# Run tests.

-pub global activate test_runner

-test_runner -v

-

-# TODO: dartanalyzer on all libraries

-

-# Install dart_coveralls; gather and send coverage data.

-if [ "$REPO_TOKEN" ]; then

-  pub global activate dart_coveralls

-  dart_coveralls report --token $REPO_TOKEN --retry 3 test/test.dart

-fi

diff --git a/packages/which/lib/src/candidate_paths.dart b/packages/which/lib/src/candidate_paths.dart
deleted file mode 100755
index 3c98767..0000000
--- a/packages/which/lib/src/candidate_paths.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-

-library which.src.candidate_paths;

-

-import 'dart:io';

-

-import 'package:path/path.dart';

-

-Iterable<String> getCandidatePaths(String command, Map<String, String> environment, bool isWindows, Context context) {

-  if (context.isAbsolute(command)) return [command];

-

-  String getEnvVar(String envVar, String defaultValue) {

-    var v = environment[envVar];

-    return v == null ? defaultValue : v;

-  }

-

-  var pathVarSeparator = isWindows ? ";" : ":";

-

-  List<String> splitEnvVar(String envVar, String defaultValue) =>

-      getEnvVar(envVar, defaultValue).split(pathVarSeparator);

-

-  var pathEnv = splitEnvVar('PATH', '');

-

-  var noExtPaths =

-      pathEnv.map((pathEntry) => context.join(pathEntry, command));

-

-  if (!isWindows) return noExtPaths;

-

-  pathEnv.insert(0, context.current);

-  var pathExt = splitEnvVar('PATHEXT', ".EXE");

-  if (command.contains('.')) pathExt.insert(0, '');

-  return noExtPaths.expand((commandPath) =>

-      pathExt.map((pathExtEntry) => commandPath + pathExtEntry));

-}

-

-Iterable<String> getRealCandidatePaths(String command) =>

-    getCandidatePaths(command, Platform.environment, Platform.isWindows, context);

diff --git a/packages/which/lib/src/has_permission.dart b/packages/which/lib/src/has_permission.dart
deleted file mode 100755
index 415c498..0000000
--- a/packages/which/lib/src/has_permission.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-

-/// See http://dartbug.com/22036

-library which.src.has_permission;

-

-class FilePermission {

-

-  final int index;

-  final String _name;

-

-  const FilePermission._(this.index, this._name);

-

-  static const EXECUTE = const FilePermission._(0, 'EXECUTE');

-  static const WRITE = const FilePermission._(1, 'WRITE');

-  static const READ = const FilePermission._(2, 'READ');

-  static const SET_UID = const FilePermission._(3, 'SET_UID');

-  static const SET_GID = const FilePermission._(4, 'SET_GID');

-  static const STICKY = const FilePermission._(5, 'STICKY');

-

-  static const List<FilePermission> values = const [EXECUTE, WRITE, READ, SET_UID, SET_GID, STICKY];

-

-  String toString() => 'FilePermission.$_name';

-}

-

-class FilePermissionRole {

-

-  final int index;

-  final String _name;

-

-  const FilePermissionRole._(this.index, this._name);

-

-  static const WORLD = const FilePermissionRole._(0, 'WORLD');

-  static const GROUP = const FilePermissionRole._(1, 'GROUP');

-  static const OWNER = const FilePermissionRole._(2, 'OWNER');

-

-  static const List<FilePermissionRole> values = const [WORLD, GROUP, OWNER];

-

-  String toString() => 'FilePermissionRole.$_name';

-}

-

-bool hasPermission(int fileStatMode, FilePermission permission, {FilePermissionRole role: FilePermissionRole.WORLD}) {

-  var bitIndex = _getPermissionBitIndex(permission, role);

-  return (fileStatMode & (1 << bitIndex)) != 0;

-}

-

-int _getPermissionBitIndex(FilePermission permission, FilePermissionRole role) {

-  switch (permission) {

-    case FilePermission.SET_UID: return 11;

-    case FilePermission.SET_GID: return 10;

-    case FilePermission.STICKY: return 9;

-    default: return (role.index * 3) + permission.index;

-  }

-}

diff --git a/packages/which/lib/src/is_executable.dart b/packages/which/lib/src/is_executable.dart
deleted file mode 100755
index 02fb834..0000000
--- a/packages/which/lib/src/is_executable.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-

-library which.src.is_executable;

-

-import 'dart:async';

-import 'dart:io';

-

-import 'package:when/when.dart';

-

-import 'has_permission.dart';

-

-Future<bool> isExecutable(String path, bool isWindows, Future<FileStat> getStat(path)) =>

-    _isExecutable(path, isWindows, getStat);

-

-bool isExecutableSync(String path, bool isWindows, FileStat getStat(path)) =>

-    _isExecutable(path, isWindows, getStat);

-

-_isExecutable(String path, bool isWindows, getStat(path)) =>

-    when(() => getStat(path), onSuccess: (stat) => isExecutableStat(stat, isWindows));

-

-/// Tests whether the file exists and is executable.

-bool isExecutableStat(FileStat stat, bool isWindows) {

-  if (FileSystemEntityType.FILE != stat.type) return false;

-

-  // There is no concept of executable on windows.

-  if (isWindows) return true;

-

-  // TODO: This currently produces false positives (returns true when it

-  //       shouldn't) when the uid/gid of current user and executable don't

-  //       match.  Fix if/when uid/gid support is added:

-  //       http://dartbug.com/22037.

-  return FilePermissionRole.values.any((role) =>

-      hasPermission(stat.mode, FilePermission.EXECUTE, role: role));

-}

diff --git a/packages/which/lib/src/util.dart b/packages/which/lib/src/util.dart
deleted file mode 100755
index 41af139..0000000
--- a/packages/which/lib/src/util.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-

-library which.src.util;

-

-import 'dart:async';

-

-/// Transparently call `firstWhere` on a [Stream] or [Iterable].

-// TODO: Remove once https://dartbug.com/ is fixed.

-firstWhere(sequence, test, { orElse() }) => sequence is Iterable ?

-  sequence.firstWhere(test, orElse: orElse) :

-    _streamFirstWhere(sequence, test, orElse: orElse);

-

-Future _streamFirstWhere(Stream stream, test(item), { orElse() }) {

-  var pairs = stream.asyncMap((item) => test(item).then((result) => [item, result]));

-  return pairs.firstWhere((pair) => pair.last, defaultValue: () => [orElse(), null]).then((pair) => pair.first);

-}

-

-/// The identity function simply returns its argument ([x]).

-identity(x) => x;

diff --git a/packages/which/lib/src/which_impl.dart b/packages/which/lib/src/which_impl.dart
deleted file mode 100755
index 2f49295..0000000
--- a/packages/which/lib/src/which_impl.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-

-library which.src.which_impl;

-

-import 'dart:async';

-

-import 'package:when/when.dart';

-

-import 'util.dart';

-

-Future<String> which(

-    String command,

-    Iterable<String> candidatePaths,

-    bool isWindows,

-    Future<bool> isExecutable(String path, bool isWindows),

-    orElse()) => new Future(() => _which(

-    command,

-    candidatePaths,

-    isWindows,

-    isExecutable,

-    orElse,

-    toSequence: (items) => new Stream.fromIterable(items)));

-

-String whichSync(

-    String command,

-    Iterable<String> candidatePaths,

-    bool isWindows,

-    bool isExecutable(String path, bool isWindows),

-    orElse()) => _which(

-    command,

-    candidatePaths,

-    isWindows,

-    isExecutable,

-    orElse);

-

-_which(

-    String command,

-    Iterable<String> candidatePaths,

-    bool isWindows,

-    isExecutable(String path, bool isWindows),

-    orElse(),

-    {toSequence(Iterable items): identity}) => when(

-    () => firstWhere(

-        toSequence(candidatePaths),

-        (path) => isExecutable(path, isWindows),

-        orElse: orElse != null ? orElse : () => _commandNotFound(command, null)),

-    onError: (e) => _commandNotFound(command, e));

-

-_commandNotFound(String command, e) {

-  var message = 'Command not found: $command';

-  if (e != null) message += '\n$e';

-  throw new StateError(message);

-}

diff --git a/packages/which/lib/which.dart b/packages/which/lib/which.dart
deleted file mode 100755
index c9047a3..0000000
--- a/packages/which/lib/which.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-

-library which;

-

-import 'dart:async';

-import 'dart:io';

-

-import 'src/candidate_paths.dart';

-import 'src/is_executable.dart';

-import 'src/which_impl.dart' as impl;

-

-/// Returns a future for the first [command] executable in the `PATH`.

-///

-/// If [command] is not found, [orElse] is called, which defaults to throwing.

-Future<String> which(String command, { orElse() }) => new Future(() => impl.which(

-    command,

-    getRealCandidatePaths(command),

-    Platform.isWindows,

-    (path, isWindows) => isExecutable(path, isWindows, FileStat.stat),

-    orElse));

-

-/// Returns the first [command] executable in the `PATH`.

-///

-/// If [command] is not found, [orElse] is called, which defaults to throwing.

-String whichSync(String command, { orElse() }) => impl.whichSync(

-    command,

-    getRealCandidatePaths(command),

-    Platform.isWindows,

-    (path, isWindows) => isExecutableSync(path, isWindows, FileStat.statSync),

-    orElse);

diff --git a/packages/which/pubspec.yaml b/packages/which/pubspec.yaml
deleted file mode 100755
index a6b2bc6..0000000
--- a/packages/which/pubspec.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: which
-version: 0.1.3
-author: Sean Eagan <seaneagan1@gmail.com>
-description: Like unix which(1).  Check for and locate installed executables.
-homepage: https://github.com/seaneagan/which.dart
-dependencies:
-  path: '>=1.3.1 <2.0.0'
-  when: '>=0.2.0 <0.3.0'
-dev_dependencies:
-  mockito: '>=0.8.1 <0.9.0'
-  unittest: '>=0.11.4 <0.12.0'
diff --git a/packages/which/test/candidate_paths_test.dart b/packages/which/test/candidate_paths_test.dart
deleted file mode 100755
index d1a4d89..0000000
--- a/packages/which/test/candidate_paths_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-

-library which.test.candidate_paths;

-

-import 'package:unittest/unittest.dart';

-

-import 'util.dart';

-

-main() {

-  group('getCandidatePaths', () {

-    test('posix', () {

-      var candidatePaths = getPosixCandidatePaths('z', '/x/y:/a/b/c', '/foo/bar');

-      expect(candidatePaths, ['/x/y/z', '/a/b/c/z']);

-    });

-

-    test('windows', () {

-      var candidatePaths = getWindowsCandidatePaths('z', r'C:\x\y;C:\a\b\c', '.EXE;.BAT', r'C:\foo\bar');

-      expect(candidatePaths, [

-        r'C:\foo\bar\z.EXE',

-        r'C:\foo\bar\z.BAT',

-        r'C:\x\y\z.EXE',

-        r'C:\x\y\z.BAT',

-        r'C:\a\b\c\z.EXE',

-        r'C:\a\b\c\z.BAT']);

-    });

-  });

-}

diff --git a/packages/which/test/has_permission_test.dart b/packages/which/test/has_permission_test.dart
deleted file mode 100755
index cc3181f..0000000
--- a/packages/which/test/has_permission_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-

-library which.test.has_permission;

-

-import 'package:unittest/unittest.dart';

-import 'package:which/src/has_permission.dart';

-

-import 'util.dart';

-

-main() {

-  test('hasPermission', () {

-    var mode = parseBinary('010101010101');

-

-    expect(hasPermission(mode, FilePermission.SET_UID), isFalse);

-    expect(hasPermission(mode, FilePermission.SET_GID), isTrue);

-    expect(hasPermission(mode, FilePermission.STICKY), isFalse);

-    expect(hasPermission(mode, FilePermission.READ, role: FilePermissionRole.OWNER), isTrue);

-    expect(hasPermission(mode, FilePermission.WRITE, role: FilePermissionRole.OWNER), isFalse);

-    expect(hasPermission(mode, FilePermission.EXECUTE, role: FilePermissionRole.OWNER), isTrue);

-    expect(hasPermission(mode, FilePermission.READ, role: FilePermissionRole.GROUP), isFalse);

-    expect(hasPermission(mode, FilePermission.WRITE, role: FilePermissionRole.GROUP), isTrue);

-    expect(hasPermission(mode, FilePermission.EXECUTE, role: FilePermissionRole.GROUP), isFalse);

-    expect(hasPermission(mode, FilePermission.READ, role: FilePermissionRole.WORLD), isTrue);

-    expect(hasPermission(mode, FilePermission.WRITE, role: FilePermissionRole.WORLD), isFalse);

-    expect(hasPermission(mode, FilePermission.EXECUTE, role: FilePermissionRole.WORLD), isTrue);

-  });

-}

diff --git a/packages/which/test/is_executable_test.dart b/packages/which/test/is_executable_test.dart
deleted file mode 100755
index 788c414..0000000
--- a/packages/which/test/is_executable_test.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-

-library which.test.is_executable;

-

-import 'dart:io';

-

-import 'package:mockito/mockito.dart';

-import 'package:unittest/unittest.dart';

-import 'package:which/src/is_executable.dart';

-

-import 'util.dart';

-

-main() {

-  group('isExecutableStat', () {

-    test('false if not a file', () {

-

-      var stat = new MockFileStat();

-

-      // A directory.

-      when(stat.type).thenReturn(FileSystemEntityType.DIRECTORY);

-

-      var result = isExecutableStat(stat, false);

-

-      expect(result, isFalse);

-

-      verifyNever(stat.mode);

-    });

-

-    test('true for all files on windows', () {

-

-      var stat = new MockFileStat();

-

-      // A file.

-      when(stat.type).thenReturn(FileSystemEntityType.FILE);

-

-      var result = isExecutableStat(stat, true);

-

-      expect(result, isTrue);

-

-      verifyNever(stat.mode);

-    });

-

-    test('true if has world execute permission', () {

-      var result = isExecutableStat(_getMockFileStat('000000000001'), false);

-      expect(result, isTrue);

-    });

-

-    test('true if has group execute permission', () {

-      var result = isExecutableStat(_getMockFileStat('000000001000'), false);

-      expect(result, isTrue);

-    });

-

-    test('true if has owner execute permission', () {

-      var result = isExecutableStat(_getMockFileStat('000001000000'), false);

-      expect(result, isTrue);

-    });

-

-    test('false if has no execute permissions', () {

-      var result = isExecutableStat(_getMockFileStat('111110110110'), false);

-      expect(result, isFalse);

-    });

-  });

-}

-

-MockFileStat _getMockFileStat(String mode) {

-  var stat = new MockFileStat();

-

-  // A file.

-  when(stat.type).thenReturn(FileSystemEntityType.FILE);

-

-  // Last bit is world execute.

-  when(stat.mode).thenReturn(int.parse(mode, radix: 2));

-

-  return stat;

-}

diff --git a/packages/which/test/test.dart b/packages/which/test/test.dart
deleted file mode 100755
index c7bdd92..0000000
--- a/packages/which/test/test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-

-library which.test;

-

-import 'candidate_paths_test.dart' as candidate_paths;

-import 'has_permission_test.dart' as has_permission;

-import 'is_executable_test.dart' as is_exe;

-import 'which_test.dart' as which;

-import 'which_impl_test.dart' as which_impl;

-

-main() {

-  candidate_paths.main();

-  has_permission.main();

-  is_exe.main();

-  which.main();

-  which_impl.main();

-}

diff --git a/packages/which/test/util.dart b/packages/which/test/util.dart
deleted file mode 100755
index b02e549..0000000
--- a/packages/which/test/util.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-

-library which.test.util;

-

-import 'dart:io';

-

-import 'package:mockito/mockito.dart';

-import 'package:path/path.dart' as path;

-import 'package:which/src/candidate_paths.dart';

-

-getPosixCandidatePaths(String command, String pathVar, String current) {

-  var env = {

-    'PATH': pathVar

-  };

-  var isWindows = false;

-  var context = new path.Context(style: path.Style.posix, current: current);

-

-  return getCandidatePaths(command, env, isWindows, context);

-}

-

-getWindowsCandidatePaths(String command, String pathVar, String pathExtVar, String current) {

-  var env = {

-    'PATH': pathVar,

-    'PATHEXT': pathExtVar

-  };

-  var isWindows = true;

-  var context = new path.Context(style: path.Style.windows, current: current);

-

-  return getCandidatePaths(command, env, isWindows, context);

-}

-

-class MockFileStat extends Mock implements FileStat {

-

-  MockFileStat();

-

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

-}

-

-int parseBinary(String b) => int.parse(b, radix: 2);

diff --git a/packages/which/test/which_impl_test.dart b/packages/which/test/which_impl_test.dart
deleted file mode 100755
index a505780..0000000
--- a/packages/which/test/which_impl_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-

-library which.test.which_impl;

-

-import 'dart:async';

-

-import 'package:unittest/unittest.dart';

-import 'package:which/src/which_impl.dart';

-

-import 'util.dart';

-

-main() {

-  group('which', () {

-    test('should complete to the first matching executable in candidate paths', () {

-      var candidatePaths = getPosixCandidatePaths('z', '/x/y:/a/b/c', '/foo/bar');

-

-      return which('z', candidatePaths, false, (path, isWindows) => new Future.value(path == '/x/y/z' || path == '/a/b/c/z'), null)

-          .then((path) => expect(path, '/x/y/z'));

-    });

-

-    test('should call orElse if command not found', () {

-      var candidatePaths = getPosixCandidatePaths('z', '/x/y:/a/b/c', '/foo/bar');

-

-      return which('z', candidatePaths, false, (path, isWindows) => new Future.value(false), () => '/or/else')

-          .then((path) => expect(path, '/or/else'));

-    });

-

-    test('should throw state error if command not found and orElse not provided', () {

-      var future = new Future(() =>

-          which('z', [], false, (path, isWindows) => new Future.value(false), null));

-

-      expect(future, throwsStateError);

-    });

-});

-

-  group('whichSync', () {

-    test('should return the first matching executable in candidate paths', () {

-      var candidatePaths = getWindowsCandidatePaths('z', r'C:\x\y;C:\a\b\c', '.EXE;.BAT', r'C:\foo\bar');

-

-      var result = whichSync('find', candidatePaths, true, (path, isWindows) => path == r'C:\x\y\z.BAT' || path == r'C:\a\b\c\z.BAT', null);

-

-      expect(result, r'C:\x\y\z.BAT');

-    });

-

-    test('should call orElse if command not found', () {

-      var candidatePaths = getWindowsCandidatePaths('z', r'C:\x\y;C:\a\b\c', '.EXE;.BAT', r'C:\foo\bar');

-

-      var result = whichSync('find', candidatePaths, true, (path, isWindows) => false, () => r'C:\or\else');

-

-      expect(result, r'C:\or\else');

-    });

-    test('should throw state error if command not found and orElse not provided', () {

-      expect(() => whichSync('z', [], true, (path, isWindows) => false, null), throwsStateError);

-    });

-  });

-}

diff --git a/packages/which/test/which_test.dart b/packages/which/test/which_test.dart
deleted file mode 100755
index 7511421..0000000
--- a/packages/which/test/which_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-

-library which.test.which;

-

-import 'package:path/path.dart';

-import 'package:unittest/unittest.dart';

-import 'package:which/which.dart';

-

-main() {

-  group('which', () {

-    // Any dart:io supported platform (*nix, osx, windows) should have `find`.

-    test('should find `find`', () => which('find').then(_testResult));

-  });

-

-  group('whichSync', () {

-    // Any dart:io supported platform (*nix, osx, windows) should have `find`.

-    test('should find `find`', () {

-      _testResult(whichSync('find'));

-    });

-  });

-}

-

-_testResult(String path) {

-  expect(path, isNotNull);

-  var base = basenameWithoutExtension(path);

-  expect(base, 'find');

-}

diff --git a/packages/yaml/.analysis_options b/packages/yaml/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/packages/yaml/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/packages/yaml/CHANGELOG.md b/packages/yaml/CHANGELOG.md
index 21fbf36..eece5fe 100644
--- a/packages/yaml/CHANGELOG.md
+++ b/packages/yaml/CHANGELOG.md
@@ -1,3 +1,23 @@
+## 2.1.12
+
+* Properly refuse mappings with duplicate keys.
+
+## 2.1.11
+
+* Fix an infinite loop when parsing some invalid documents.
+
+## 2.1.10
+
+* Support `string_scanner` 1.0.0.
+
+## 2.1.9
+
+* Fix all strong-mode warnings.
+
+## 2.1.8
+
+* Remove the dependency on `path`, since we don't actually import it.
+
 ## 2.1.7
 
 * Fix more strong mode warnings.
diff --git a/packages/yaml/lib/src/equality.dart b/packages/yaml/lib/src/equality.dart
index 5408135..846f716 100644
--- a/packages/yaml/lib/src/equality.dart
+++ b/packages/yaml/lib/src/equality.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.equality;
-
 import 'dart:collection';
 
 import 'package:collection/collection.dart';
@@ -11,7 +9,8 @@
 import 'yaml_node.dart';
 
 /// Returns a [Map] that compares its keys based on [deepEquals].
-Map deepEqualsMap() => new HashMap(equals: deepEquals, hashCode: deepHashCode);
+Map/*<K, V>*/ deepEqualsMap/*<K, V>*/() =>
+    new HashMap(equals: deepEquals, hashCode: deepHashCode);
 
 /// Returns whether two objects are structurally equivalent.
 ///
diff --git a/packages/yaml/lib/src/event.dart b/packages/yaml/lib/src/event.dart
index 96e2f16..a78c6ea 100644
--- a/packages/yaml/lib/src/event.dart
+++ b/packages/yaml/lib/src/event.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.event;
-
 import 'package:source_span/source_span.dart';
 
 import 'style.dart';
diff --git a/packages/yaml/lib/src/loader.dart b/packages/yaml/lib/src/loader.dart
index 07ae430..a2d681b 100644
--- a/packages/yaml/lib/src/loader.dart
+++ b/packages/yaml/lib/src/loader.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.loader;
-
 import 'package:charcode/ascii.dart';
 import 'package:source_span/source_span.dart';
 
@@ -149,7 +147,7 @@
       throw new YamlException("Invalid tag for mapping.", firstEvent.span);
     }
 
-    var children = deepEqualsMap();
+    var children = deepEqualsMap/*<dynamic, YamlNode>*/();
     var node = new YamlMap.internal(
         children, firstEvent.span, firstEvent.style);
     _registerAnchor(firstEvent.anchor, node);
@@ -158,6 +156,10 @@
     while (event.type != EventType.MAPPING_END) {
       var key = _loadNode(event);
       var value = _loadNode(_parser.parse());
+      if (children.containsKey(key)) {
+        throw new YamlException("Duplicate mapping key.", key.span);
+      }
+
       children[key] = value;
       event = _parser.parse();
     }
diff --git a/packages/yaml/lib/src/null_span.dart b/packages/yaml/lib/src/null_span.dart
index 06b42f0..43ac685 100644
--- a/packages/yaml/lib/src/null_span.dart
+++ b/packages/yaml/lib/src/null_span.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.null_span;
-
 import 'package:source_span/source_span.dart';
 
 /// A [SourceSpan] with no location information.
diff --git a/packages/yaml/lib/src/parser.dart b/packages/yaml/lib/src/parser.dart
index b44043a..df6ed75 100644
--- a/packages/yaml/lib/src/parser.dart
+++ b/packages/yaml/lib/src/parser.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.parser;
-
 import 'package:source_span/source_span.dart';
 import 'package:string_scanner/string_scanner.dart';
 
@@ -669,7 +667,7 @@
   Pair<VersionDirective, List<TagDirective>> _processDirectives() {
     var token = _scanner.peek();
 
-    var versionDirective;
+    VersionDirective versionDirective;
     var tagDirectives = <TagDirective>[];
     while (token.type == TokenType.VERSION_DIRECTIVE ||
            token.type == TokenType.TAG_DIRECTIVE) {
diff --git a/packages/yaml/lib/src/scanner.dart b/packages/yaml/lib/src/scanner.dart
index 0ac86dc..9bf8114 100644
--- a/packages/yaml/lib/src/scanner.dart
+++ b/packages/yaml/lib/src/scanner.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.scanner;
-
 import 'package:collection/collection.dart';
 import 'package:string_scanner/string_scanner.dart';
 import 'package:source_span/source_span.dart';
@@ -326,6 +324,9 @@
       if (_tokens.isNotEmpty) {
         _staleSimpleKeys();
 
+        // If there are no more tokens to fetch, break.
+        if (_tokens.last.type == TokenType.STREAM_END) break;
+
         // If the current token could be a simple key, we need to scan more
         // tokens until we determine whether it is or not. Otherwise we might
         // not emit the `KEY` token before we emit the value of the key.
@@ -462,8 +463,6 @@
         _fetchPlainScalar();
         return;
     }
-
-    throw 'Inaccessible';
   }
 
   /// Throws an error about a disallowed character.
diff --git a/packages/yaml/lib/src/style.dart b/packages/yaml/lib/src/style.dart
index 6305fce..d235404 100644
--- a/packages/yaml/lib/src/style.dart
+++ b/packages/yaml/lib/src/style.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.style;
-
 /// An enum of source scalar styles.
 class ScalarStyle {
   /// No source style was specified.
diff --git a/packages/yaml/lib/src/token.dart b/packages/yaml/lib/src/token.dart
index 20ae547..5f91ce9 100644
--- a/packages/yaml/lib/src/token.dart
+++ b/packages/yaml/lib/src/token.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.token;
-
 import 'package:source_span/source_span.dart';
 
 import 'style.dart';
diff --git a/packages/yaml/lib/src/utils.dart b/packages/yaml/lib/src/utils.dart
index 445221f..c1a58e4 100644
--- a/packages/yaml/lib/src/utils.dart
+++ b/packages/yaml/lib/src/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.utils;
-
 import 'package:source_span/source_span.dart';
 
 /// A pair of values.
diff --git a/packages/yaml/lib/src/yaml_document.dart b/packages/yaml/lib/src/yaml_document.dart
index 4c249a0..61a82e7 100644
--- a/packages/yaml/lib/src/yaml_document.dart
+++ b/packages/yaml/lib/src/yaml_document.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.yaml_document;
-
 import 'dart:collection';
 
 import 'package:source_span/source_span.dart';
diff --git a/packages/yaml/lib/src/yaml_exception.dart b/packages/yaml/lib/src/yaml_exception.dart
index 8689953..04067ee 100644
--- a/packages/yaml/lib/src/yaml_exception.dart
+++ b/packages/yaml/lib/src/yaml_exception.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.exception;
-
 import 'package:source_span/source_span.dart';
 
 /// An error thrown by the YAML processor.
diff --git a/packages/yaml/lib/src/yaml_node.dart b/packages/yaml/lib/src/yaml_node.dart
index 99f7515..2b615d3 100644
--- a/packages/yaml/lib/src/yaml_node.dart
+++ b/packages/yaml/lib/src/yaml_node.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.yaml_node;
-
 import 'dart:collection' as collection;
 
 import 'package:collection/collection.dart';
diff --git a/packages/yaml/lib/src/yaml_node_wrapper.dart b/packages/yaml/lib/src/yaml_node_wrapper.dart
index d7146c4..a0922ed 100644
--- a/packages/yaml/lib/src/yaml_node_wrapper.dart
+++ b/packages/yaml/lib/src/yaml_node_wrapper.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.yaml_node_wrapper;
-
 import 'dart:collection';
 
 import 'package:collection/collection.dart' as pkg_collection;
diff --git a/packages/yaml/lib/yaml.dart b/packages/yaml/lib/yaml.dart
index 0d48dea..9772464 100644
--- a/packages/yaml/lib/yaml.dart
+++ b/packages/yaml/lib/yaml.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml;
-
 import 'src/loader.dart';
 import 'src/style.dart';
 import 'src/yaml_document.dart';
diff --git a/packages/yaml/output.txt b/packages/yaml/output.txt
deleted file mode 100644
index 87e0149..0000000
--- a/packages/yaml/output.txt
+++ /dev/null
@@ -1,412 +0,0 @@
-00:00 +0: test/yaml_node_wrapper_test.dart: YamlMap() with no sourceUrl
-00:00 +1: loading test/yaml_test.dart
-00:00 +1: test/yaml_node_wrapper_test.dart: YamlMap() with a sourceUrl
-00:00 +2: loading test/yaml_test.dart
-00:00 +2: test/yaml_node_wrapper_test.dart: YamlList() with no sourceUrl
-00:00 +3: loading test/yaml_test.dart
-00:00 +3: test/yaml_node_wrapper_test.dart: YamlList() with a sourceUrl
-00:00 +4: loading test/yaml_test.dart
-00:00 +4: test/yaml_node_wrapper_test.dart: YamlMap.wrap() with no sourceUrl
-00:00 +5: loading test/yaml_test.dart
-00:00 +5: test/yaml_node_wrapper_test.dart: YamlMap.wrap() with a sourceUrl
-00:00 +6: loading test/yaml_test.dart
-00:00 +6: test/yaml_node_wrapper_test.dart: YamlList.wrap() with no sourceUrl
-00:00 +7: loading test/yaml_test.dart
-00:00 +7: test/yaml_node_wrapper_test.dart: YamlList.wrap() with a sourceUrl
-00:00 +8: loading test/yaml_test.dart
-00:00 +8: test/yaml_node_wrapper_test.dart: re-wrapped objects equal one another
-00:00 +9: loading test/yaml_test.dart
-00:00 +9: test/yaml_test.dart: has a friendly error message for using a tab as indentation
-00:00 +10: test/yaml_test.dart: has a friendly error message for using a tab not as indentation
-00:00 +11: test/yaml_test.dart: refuses documents that declare version 1.0
-00:00 +12: test/yaml_test.dart: refuses documents that declare version 1.3
-00:00 +13: test/yaml_test.dart: refuses documents that declare version 2.0
-00:00 +14: test/yaml_test.dart: 2.1: Collections [Example 2.1]
-00:00 +15: test/yaml_test.dart: 2.1: Collections [Example 2.2]
-00:00 +15 -1: test/yaml_test.dart: 2.1: Collections [Example 2.2]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 80:7             main.<fn>.<fn>
-  
-00:00 +15 -1: test/yaml_test.dart: 2.1: Collections [Example 2.3]
-00:00 +16 -1: test/yaml_test.dart: 2.1: Collections [Example 2.4]
-00:00 +16 -2: test/yaml_test.dart: 2.1: Collections [Example 2.4]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 104:7            main.<fn>.<fn>
-  
-00:00 +16 -2: test/yaml_test.dart: 2.1: Collections [Example 2.5]
-00:00 +16 -3: test/yaml_test.dart: 2.1: Collections [Example 2.5]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 120:7            main.<fn>.<fn>
-  
-00:00 +16 -3: test/yaml_test.dart: 2.1: Collections [Example 2.6]
-00:00 +16 -4: test/yaml_test.dart: 2.1: Collections [Example 2.6]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 132:7            main.<fn>.<fn>
-  
-00:00 +16 -4: test/yaml_test.dart: 2.2: Structures [Example 2.7]
-00:00 +17 -4: test/yaml_test.dart: 2.2: Structures [Example 2.8]
-00:00 +17 -5: test/yaml_test.dart: 2.2: Structures [Example 2.8]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 85:25         loadYamlStream
-  test/utils.dart 37:16                expectYamlStreamLoads
-  test/yaml_test.dart 165:7            main.<fn>.<fn>
-  
-00:00 +17 -5: test/yaml_test.dart: 2.2: Structures [Example 2.9]
-00:00 +18 -5: test/yaml_test.dart: 2.2: Structures [Example 2.10]
-00:00 +19 -5: test/yaml_test.dart: 2.2: Structures [Example 2.11]
-00:00 +19 -6: test/yaml_test.dart: 2.2: Structures [Example 2.11]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 219:7            main.<fn>.<fn>
-  
-00:00 +19 -6: test/yaml_test.dart: 2.2: Structures [Example 2.12]
-00:00 +20 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.13]
-00:00 +21 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.14]
-00:00 +22 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.15]
-00:00 +23 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.16]
-00:00 +24 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.17]
-00:00 +25 -6: test/yaml_test.dart: 2.3: Scalars [Example 2.18]
-00:00 +26 -6: test/yaml_test.dart: 2.4: Tags [Example 2.19]
-00:00 +27 -6: test/yaml_test.dart: 2.4: Tags [Example 2.20]
-00:00 +27 -7: test/yaml_test.dart: 2.4: Tags [Example 2.20]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 360:7            main.<fn>.<fn>
-  
-00:00 +27 -7: test/yaml_test.dart: 2.4: Tags [Example 2.21]
-00:00 +28 -7: test/yaml_test.dart: 2.5 Full Length Example [Example 2.28]
-00:00 +28 -8: test/yaml_test.dart: 2.5 Full Length Example [Example 2.28]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 85:25         loadYamlStream
-  test/utils.dart 37:16                expectYamlStreamLoads
-  test/yaml_test.dart 397:7            main.<fn>.<fn>
-  
-00:00 +28 -8: test/yaml_test.dart: 5.1: Character Set doesn't include C0 control characters
-00:00 +29 -8: test/yaml_test.dart: 5.1: Character Set includes TAB
-00:00 +30 -8: test/yaml_test.dart: 5.1: Character Set doesn't include DEL
-00:00 +31 -8: test/yaml_test.dart: 5.1: Character Set doesn't include C1 control characters
-00:00 +32 -8: test/yaml_test.dart: 5.1: Character Set includes NEL
-00:00 +33 -8: test/yaml_test.dart: 5.1: Character Set within quoted strings includes DEL
-00:00 +34 -8: test/yaml_test.dart: 5.1: Character Set within quoted strings includes C1 control characters
-00:00 +35 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.3]
-00:00 +36 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.4]
-00:00 +37 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.5]
-00:00 +38 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.7]
-00:00 +39 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.8]
-00:00 +40 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.9]
-00:00 +41 -8: test/yaml_test.dart: 5.3: Indicator Characters [Example 5.10]
-00:00 +42 -8: test/yaml_test.dart: 5.4: Line Break Characters include \n
-00:00 +43 -8: test/yaml_test.dart: 5.4: Line Break Characters include \r
-00:00 +44 -8: test/yaml_test.dart: 5.4: Line Break Characters do not include form feed
-00:00 +45 -8: test/yaml_test.dart: 5.4: Line Break Characters do not include NEL
-00:00 +45 -9: test/yaml_test.dart: 5.4: Line Break Characters do not include NEL
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 582:25           main.<fn>.<fn>.<fn>
-  
-00:00 +45 -9: test/yaml_test.dart: 5.4: Line Break Characters do not include 0x2028
-00:00 +45 -10: test/yaml_test.dart: 5.4: Line Break Characters do not include 0x2028
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 583:28           main.<fn>.<fn>.<fn>
-  
-00:00 +45 -10: test/yaml_test.dart: 5.4: Line Break Characters do not include 0x2029
-00:00 +45 -11: test/yaml_test.dart: 5.4: Line Break Characters do not include 0x2029
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 584:28           main.<fn>.<fn>.<fn>
-  
-00:00 +45 -11: test/yaml_test.dart: 5.4: Line Break Characters in a scalar context must be normalized from \r to \n
-00:00 +46 -11: test/yaml_test.dart: 5.4: Line Break Characters in a scalar context must be normalized from \r\n to \n
-00:00 +47 -11: test/yaml_test.dart: 5.4: Line Break Characters [Example 5.11]
-00:00 +48 -11: test/yaml_test.dart: 5.5: White Space Characters [Example 5.12]
-00:00 +49 -11: test/yaml_test.dart: 5.7: Escaped Characters [Example 5.13]
-00:00 +50 -11: test/yaml_test.dart: 5.7: Escaped Characters [Example 5.14]
-00:00 +51 -11: test/yaml_test.dart: 6.1: Indentation Spaces may not include TAB characters
-00:00 +52 -11: test/yaml_test.dart: 6.1: Indentation Spaces must be the same for all sibling nodes
-00:00 +53 -11: test/yaml_test.dart: 6.1: Indentation Spaces may be different for the children of sibling nodes
-00:00 +54 -11: test/yaml_test.dart: 6.1: Indentation Spaces [Example 6.1]
-00:00 +55 -11: test/yaml_test.dart: 6.1: Indentation Spaces [Example 6.2]
-00:00 +56 -11: test/yaml_test.dart: 6.2: Separation Spaces [Example 6.3]
-00:00 +57 -11: test/yaml_test.dart: 6.3: Line Prefixes [Example 6.4]
-00:00 +58 -11: test/yaml_test.dart: 6.4: Empty Lines [Example 6.5]
-00:00 +59 -11: test/yaml_test.dart: 6.5: Line Folding [Example 6.6]
-00:00 +60 -11: test/yaml_test.dart: 6.5: Line Folding [Example 6.7]
-00:00 +61 -11: test/yaml_test.dart: 6.5: Line Folding [Example 6.8]
-00:00 +62 -11: test/yaml_test.dart: 6.6: Comments must be separated from other tokens by white space characters
-00:00 +63 -11: test/yaml_test.dart: 6.6: Comments [Example 6.9]
-00:00 +64 -11: test/yaml_test.dart: 6.6: Comments outside of scalar content may appear on a line of their own
-00:00 +65 -11: test/yaml_test.dart: 6.6: Comments outside of scalar content are independent of indentation level
-00:00 +66 -11: test/yaml_test.dart: 6.6: Comments outside of scalar content include lines containing only white space characters
-00:00 +67 -11: test/yaml_test.dart: 6.6: Comments within scalar content may not appear on a line of their own
-00:00 +68 -11: test/yaml_test.dart: 6.6: Comments within scalar content don't include lines containing only white space characters
-00:00 +69 -11: test/yaml_test.dart: 6.6: Comments [Example 6.10]
-00:00 +70 -11: test/yaml_test.dart: 6.6: Comments [Example 6.11]
-00:00 +71 -11: test/yaml_test.dart: 6.6: Comments ending a block scalar header may not be followed by additional comment lines
-00:00 +72 -11: test/yaml_test.dart: 6.7: Separation Lines may not be used within implicit keys
-00:00 +73 -11: test/yaml_test.dart: 6.7: Separation Lines [Example 6.12]
-00:00 +73 -12: test/yaml_test.dart: 6.7: Separation Lines [Example 6.12]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 899:7            main.<fn>.<fn>
-  
-00:00 +73 -12: test/yaml_test.dart: 6.8: Directives [Example 6.13]
-line 1, column 1: Warning: unknown directive.
-%FOO  bar baz # Should be ignored
-^^^^
-00:00 +74 -12: test/yaml_test.dart: 6.8: Directives [Example 6.14]
-line 1, column 1: Warning: this parser only supports YAML 1.1 and 1.2.
-%YAML 1.3 # Attempt parsing
-^^^^^^^^^
-00:00 +75 -12: test/yaml_test.dart: 6.8: Directives [Example 6.15]
-00:00 +76 -12: test/yaml_test.dart: 6.8: Directives [Example 6.16]
-00:00 +77 -12: test/yaml_test.dart: 6.8: Directives [Example 6.17]
-00:00 +78 -12: test/yaml_test.dart: 6.9: Node Properties may be specified in any order
-00:00 +79 -12: test/yaml_test.dart: 6.9: Node Properties [Example 6.23]
-00:00 +80 -12: test/yaml_test.dart: 6.9: Node Properties [Example 6.25]
-00:00 +81 -12: test/yaml_test.dart: 6.9: Node Properties [Example 6.28]
-00:00 +82 -12: test/yaml_test.dart: 6.9: Node Properties [Example 6.29]
-00:00 +83 -12: test/yaml_test.dart: 7.1: Alias Nodes must not use an anchor that doesn't previously occur
-00:00 +84 -12: test/yaml_test.dart: 7.1: Alias Nodes don't have to exist for a given anchor node
-00:00 +85 -12: test/yaml_test.dart: 7.1: Alias Nodes must not specify tag properties
-00:00 +86 -12: test/yaml_test.dart: 7.1: Alias Nodes must not specify anchor properties
-00:00 +87 -12: test/yaml_test.dart: 7.1: Alias Nodes must not specify content
-00:00 +88 -12: test/yaml_test.dart: 7.1: Alias Nodes must preserve structural equality
-00:00 +89 -12: test/yaml_test.dart: 7.1: Alias Nodes [Example 7.1]
-00:00 +90 -12: test/yaml_test.dart: 7.2: Empty Nodes [Example 7.2]
-00:00 +91 -12: test/yaml_test.dart: 7.2: Empty Nodes [Example 7.3]
-00:00 +92 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.4]
-00:00 +93 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.5]
-00:00 +94 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.6]
-00:00 +95 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.7]
-00:00 +96 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.8]
-00:00 +97 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.9]
-00:00 +98 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.10]
-00:00 +99 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.11]
-00:00 +100 -12: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.12]
-00:00 +100 -13: test/yaml_test.dart: 7.3: Flow Scalar Styles [Example 7.12]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 1186:7           main.<fn>.<fn>
-  
-00:00 +100 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.13]
-00:00 +101 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.14]
-00:00 +102 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.15]
-00:00 +103 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.16]
-00:00 +104 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.17]
-00:00 +105 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.18]
-00:00 +106 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.19]
-00:00 +107 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.20]
-00:00 +108 -13: test/yaml_test.dart: 7.4: Flow Collection Styles [Example 7.21]
-00:00 +109 -13: test/yaml_test.dart: 7.5: Flow Nodes [Example 7.23]
-00:00 +110 -13: test/yaml_test.dart: 7.5: Flow Nodes [Example 7.24]
-00:00 +111 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.1]
-00:00 +112 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.2]
-00:00 +113 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.3]
-00:00 +114 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.4]
-00:00 +115 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.5]
-00:00 +116 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.6]
-00:00 +117 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.7]
-00:00 +118 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.8]
-00:00 +119 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.9]
-00:00 +120 -13: test/yaml_test.dart: 8.1: Block Scalar Styles [Example 8.10]
-00:00 +121 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.14]
-00:00 +122 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.15]
-00:00 +123 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.16]
-00:00 +124 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.17]
-00:00 +125 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.18]
-00:00 +126 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.19]
-00:00 +127 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.20]
-00:00 +128 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.21]
-00:00 +129 -13: test/yaml_test.dart: 8.2: Block Collection Styles [Example 8.22]
-00:00 +130 -13: test/yaml_test.dart: 9.1: Documents [Example 9.2]
-00:00 +131 -13: test/yaml_test.dart: 9.1: Documents [Example 9.3]
-00:00 +132 -13: test/yaml_test.dart: 9.1: Documents [Example 9.4]
-00:00 +133 -13: test/yaml_test.dart: 9.1: Documents [Example 9.5]
-00:00 +134 -13: test/yaml_test.dart: 9.1: Documents [Example 9.6]
-00:00 +135 -13: test/yaml_test.dart: 10.1: Failsafe Schema [Example 10.1]
-00:00 +136 -13: test/yaml_test.dart: 10.1: Failsafe Schema [Example 10.2]
-00:00 +137 -13: test/yaml_test.dart: 10.1: Failsafe Schema [Example 10.3]
-00:00 +138 -13: test/yaml_test.dart: 10.3: Core Schema [Example 10.9]
-00:00 +138 -14: test/yaml_test.dart: 10.3: Core Schema [Example 10.9]
-  type '_NoValue' is not a subtype of type 'int' of 'function result'.
-  dart:core                            int.parse
-  package:yaml/src/loader.dart 323:21  Loader._scanNumber
-  package:yaml/src/loader.dart 243:17  Loader._scanScalar
-  package:yaml/src/loader.dart 120:14  Loader._loadScalar
-  package:yaml/src/loader.dart 86:37   Loader._loadNode
-  package:yaml/src/loader.dart 141:20  Loader._loadSequence
-  package:yaml/src/loader.dart 87:45   Loader._loadNode
-  package:yaml/src/loader.dart 164:19  Loader._loadMapping
-  package:yaml/src/loader.dart 88:44   Loader._loadNode
-  package:yaml/src/loader.dart 68:20   Loader._loadDocument
-  package:yaml/src/loader.dart 60:20   Loader.load
-  package:yaml/yaml.dart 53:25         loadYamlDocument
-  package:yaml/yaml.dart 44:5          loadYamlNode
-  package:yaml/yaml.dart 36:5          loadYaml
-  test/utils.dart 30:16                expectYamlLoads
-  test/yaml_test.dart 1829:7           main.<fn>.<fn>
-  
-00:00 +138 -14: Some tests failed.
diff --git a/packages/yaml/pubspec.yaml b/packages/yaml/pubspec.yaml
index 46b7475..d4445d9 100644
--- a/packages/yaml/pubspec.yaml
+++ b/packages/yaml/pubspec.yaml
@@ -1,15 +1,15 @@
 name: yaml
-version: 2.1.7
+version: 2.1.12
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/yaml
 description: A parser for YAML.
 dependencies:
   charcode: "^1.1.0"
   collection: ">=1.1.0 <2.0.0"
-  path: ">=1.2.0 <2.0.0"
-  string_scanner: "^0.1.4"
+  string_scanner: ">=0.1.4 <2.0.0"
   source_span: ">=1.0.0 <2.0.0"
 dev_dependencies:
+  path: ">=1.2.0 <2.0.0"
   test: ">=0.12.0 <0.13.0"
 environment:
   sdk: '>=1.12.0 <2.0.0'
diff --git a/packages/yaml/test.dart b/packages/yaml/test.dart
deleted file mode 100644
index 84f842e..0000000
--- a/packages/yaml/test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'package:yaml/yaml.dart';
-
-main() {
-  const src = """
-name: linter
-version: 0.0.1
-author: Dart Team <misc@dartlang.org>
-authors:
-  - Bill
-  - Ted
-description: Style linter for Dart.
-documentation:
-homepage: https://github.com/dart-lang/linter
-dependencies:
-  transmogrify:
-    hosted:
-      name: transmogrify
-      url: http://your-package-server.com
-    version: '>=0.4.0 <1.0.0'
-  analyzer: '0.24.0-dev.1'
-  cli_util: '>=0.0.1 <0.1.0'
-  semver: '>=0.2.0 <0.3.0'
-  yaml: '>=2.1.2 <3.0.0'
-  kittens:
-    git:
-      url: git://github.com/munificent/kittens.git
-      ref: some-branch
-  foo: any
-dev_dependencies:
-  markdown: '>=0.7.1+2 <0.8.0'
-  unittest: '>=0.11.0 <0.12.0'
-""";
-
-  YamlMap node = loadYamlNode(src, sourceUrl: null);
-  node.nodes.forEach((k, v) {
-    if (k is YamlScalar) print(k.span);
-  });
-}
diff --git a/packages/yaml/test/utils.dart b/packages/yaml/test/utils.dart
index a2d2019..e1d4b64 100644
--- a/packages/yaml/test/utils.dart
+++ b/packages/yaml/test/utils.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.test.utils;
-
 import 'package:test/test.dart';
 import 'package:yaml/src/equality.dart' as equality;
 import 'package:yaml/yaml.dart';
diff --git a/packages/yaml/test/yaml_node_wrapper_test.dart b/packages/yaml/test/yaml_node_wrapper_test.dart
index b76a73b..8cb8cfa 100644
--- a/packages/yaml/test/yaml_node_wrapper_test.dart
+++ b/packages/yaml/test/yaml_node_wrapper_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.node_wrapper_test;
-
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
diff --git a/packages/yaml/test/yaml_test.dart b/packages/yaml/test/yaml_test.dart
index c4601d5..8dee6c6 100644
--- a/packages/yaml/test/yaml_test.dart
+++ b/packages/yaml/test/yaml_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.test;
-
 import 'package:test/test.dart';
 import 'package:yaml/yaml.dart';
 
@@ -31,26 +29,37 @@
     });
   });
 
-  group("refuses documents that declare version", () {
-    test("1.0", () {
-      expectYamlFails("""
+  group("refuses", () {
+    // Regression test for #19.
+    test("invalid contents", () {
+      expectYamlFails("{");
+    });
+
+    test("duplicate mapping keys", () {
+      expectYamlFails("{a: 1, a: 2}");
+    });
+
+    group("documents that declare version", () {
+      test("1.0", () {
+        expectYamlFails("""
          %YAML 1.0
          --- text
          """);
-    });
+      });
 
-    test("1.3", () {
-      expectYamlFails("""
-         %YAML 1.3
-         --- text
-         """);
-    });
+      test("1.3", () {
+        expectYamlFails("""
+           %YAML 1.3
+           --- text
+           """);
+      });
 
-    test("2.0", () {
-      expectYamlFails("""
-         %YAML 2.0
-         --- text
-         """);
+      test("2.0", () {
+        expectYamlFails("""
+           %YAML 2.0
+           --- text
+           """);
+      });
     });
   });
 
@@ -59,14 +68,14 @@
 - foo:
     bar
 - 123
-""");
+""") as YamlList;
 
     expect(yaml.span.start.line, equals(0));
     expect(yaml.span.start.column, equals(0));
     expect(yaml.span.end.line, equals(3));
     expect(yaml.span.end.column, equals(0));
 
-    var map = yaml.nodes.first;
+    var map = yaml.nodes.first as YamlMap;
     expect(map.span.start.line, equals(0));
     expect(map.span.start.column, equals(2));
     expect(map.span.end.line, equals(2));
diff --git a/pubspec.yaml b/pubspec.yaml
index d33b211..005d257 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -7,7 +7,7 @@
     commandLineOptions: [--show-package-warnings]
 dependencies:
   args: any
-  charted: ^0.4.0
+  charted: ^0.4.8
   unittest: < 0.12.0
   usage: any
   web_components: any