[roll] Update of 3p packages for Flutter roll

Change-Id: Ia16bcb3f127c6a31433e6e29dbcb84b82b00268b
diff --git a/build_daemon/BUILD.gn b/build_daemon/BUILD.gn
index 43ca206..4401942 100644
--- a/build_daemon/BUILD.gn
+++ b/build_daemon/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_daemon-0.4.0
+# This file is generated by importer.py for build_daemon-0.4.1
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_daemon/CHANGELOG.md b/build_daemon/CHANGELOG.md
index f42bfd7..c461359 100644
--- a/build_daemon/CHANGELOG.md
+++ b/build_daemon/CHANGELOG.md
@@ -1,11 +1,16 @@
+## 0.4.1
+
+- Support closing a daemon client.
+- Fix a null set bug in the build target manager.
+
 ## 0.4.0
 
 - Replace the client log stream with an optional logHandler. This simplifies the
-  logging logic and prevents the need for the client to print to stdio. 
+  logging logic and prevents the need for the client to print to stdio.
 
 ## 0.3.0
 
-- Forward daemon output while starting up / connecting. 
+- Forward daemon output while starting up / connecting.
 
 ## 0.2.3
 
diff --git a/build_daemon/lib/client.dart b/build_daemon/lib/client.dart
index 43640cd..05ee987 100644
--- a/build_daemon/lib/client.dart
+++ b/build_daemon/lib/client.dart
@@ -102,6 +102,8 @@
     _channel.sink.add(jsonEncode(_serializers.serialize(request)));
   }
 
+  Future<void> close() => _channel.sink.close();
+
   static Future<BuildDaemonClient> connect(
       String workingDirectory, List<String> daemonCommand,
       {Serializers serializersOverride,
diff --git a/build_daemon/lib/src/managers/build_target_manager.dart b/build_daemon/lib/src/managers/build_target_manager.dart
index f411372..cca2214 100644
--- a/build_daemon/lib/src/managers/build_target_manager.dart
+++ b/build_daemon/lib/src/managers/build_target_manager.dart
@@ -22,22 +22,23 @@
 
   bool Function(BuildTarget, Iterable<WatchEvent>) shouldBuild;
 
-  bool get isEmpty => _buildTargets.isEmpty;
-
-  Set<BuildTarget> get targets => _buildTargets.keys.toSet();
-
-  Set<WebSocketChannel> channels(BuildTarget target) => _buildTargets[target];
-
   BuildTargetManager(
       {bool Function(BuildTarget, Iterable<WatchEvent>) shouldBuildOverride})
       : shouldBuild = shouldBuildOverride ?? _shouldBuild;
 
+  bool get isEmpty => _buildTargets.isEmpty;
+
+  Set<BuildTarget> get targets => _buildTargets.keys.toSet();
+
   void addBuildTarget(BuildTarget target, WebSocketChannel channel) {
     _buildTargets
         .putIfAbsent(target, () => Set<WebSocketChannel>())
         .add(channel);
   }
 
+  Set<WebSocketChannel> channels(BuildTarget target) =>
+      _buildTargets[target] ?? Set();
+
   void removeChannel(WebSocketChannel channel) =>
       _buildTargets = Map.fromEntries(_buildTargets.entries
           .map((e) => MapEntry(e.key, e.value..remove(channel)))
diff --git a/build_daemon/lib/src/server.dart b/build_daemon/lib/src/server.dart
index 797a678..fa563f5 100644
--- a/build_daemon/lib/src/server.dart
+++ b/build_daemon/lib/src/server.dart
@@ -30,7 +30,6 @@
 
   HttpServer _server;
   DaemonBuilder _builder;
-  final _channels = Set<WebSocketChannel>();
   // Channels that are interested in the current build.
   var _interestedChannels = Set<WebSocketChannel>();
 
@@ -57,8 +56,6 @@
 
   Future<int> listen() async {
     var handler = webSocketHandler((WebSocketChannel channel) async {
-      _channels.add(channel);
-
       channel.stream.listen((message) async {
         dynamic request;
         try {
@@ -73,7 +70,6 @@
           await _build(_buildTargetManager.targets, <WatchEvent>[]);
         }
       }, onDone: () {
-        _channels.remove(channel);
         _removeChannel(channel);
       });
     });
diff --git a/build_daemon/pubspec.yaml b/build_daemon/pubspec.yaml
index bdcfa0c..43f1976 100644
--- a/build_daemon/pubspec.yaml
+++ b/build_daemon/pubspec.yaml
@@ -1,5 +1,5 @@
 name: build_daemon
-version: 0.4.0
+version: 0.4.1
 description: A daemon for running Dart builds.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_daemon
@@ -26,4 +26,4 @@
   mockito: ^4.0.0
   test: ^1.3.3
   test_descriptor: ^1.1.1
-  uuid: ^1.0.3
+  uuid: ^2.0.0
diff --git a/build_modules/BUILD.gn b/build_modules/BUILD.gn
index 01b4a87..acbf941 100644
--- a/build_modules/BUILD.gn
+++ b/build_modules/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_modules-1.0.7+2
+# This file is generated by importer.py for build_modules-1.0.8
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_modules/CHANGELOG.md b/build_modules/CHANGELOG.md
index c9846d8..477171a 100644
--- a/build_modules/CHANGELOG.md
+++ b/build_modules/CHANGELOG.md
@@ -1,16 +1,21 @@
+## 1.0.8
+
+- Don't follow `dart.library.isolate` conditional imports for the DDC
+  platform.
+
 ## 1.0.7+2
 
-- Update `dart2js` snapshot arguments for upcoming SDK. 
+- Update `dart2js` snapshot arguments for upcoming SDK.
 
 ## 1.0.7+1
 
-- Fix broken release by updating `dart2js` worker and restricting sdk version. 
+- Fix broken release by updating `dart2js` worker and restricting sdk version.
 
 ## 1.0.7
 
 - Explicitly skip dart-ext uris during module creation.
   - Filed Issue #2047 to track real support for native extensions.
-- Run workers with mode `detachedWithStdio` if no terminal is connected. 
+- Run workers with mode `detachedWithStdio` if no terminal is connected.
 
 ## 1.0.6
 
diff --git a/build_modules/lib/src/platform.dart b/build_modules/lib/src/platform.dart
index 8857ac0..7f64f32 100644
--- a/build_modules/lib/src/platform.dart
+++ b/build_modules/lib/src/platform.dart
@@ -18,7 +18,6 @@
     'html',
     'html_common',
     'indexed_db',
-    'isolate',
     'js',
     'js_util',
     'math',
diff --git a/build_modules/pubspec.yaml b/build_modules/pubspec.yaml
index 830aaf2..a9fe227 100644
--- a/build_modules/pubspec.yaml
+++ b/build_modules/pubspec.yaml
@@ -1,5 +1,5 @@
 name: build_modules
-version: 1.0.7+2
+version: 1.0.8
 description: Builders for Dart modules
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_modules
diff --git a/build_runner/BUILD.gn b/build_runner/BUILD.gn
new file mode 100644
index 0000000..ee05fee
--- /dev/null
+++ b/build_runner/BUILD.gn
@@ -0,0 +1,48 @@
+# This file is generated by importer.py for build_runner-1.2.8
+
+import("//build/dart/dart_library.gni")
+
+dart_library("build_runner") {
+  package_name = "build_runner"
+
+  # This parameter is left empty as we don't care about analysis or exporting
+  # these sources outside of the tree.
+  sources = []
+
+  disable_analysis = true
+
+  deps = [
+    "//third_party/dart-pkg/pub/shelf_web_socket",
+    "//third_party/dart-pkg/pub/code_builder",
+    "//third_party/dart-pkg/pub/watcher",
+    "//third_party/dart-pkg/pub/pubspec_parse",
+    "//third_party/dart-pkg/pub/meta",
+    "//third_party/dart-pkg/pub/io",
+    "//third_party/dart-pkg/pub/build_config",
+    "//third_party/dart-pkg/pub/pub_semver",
+    "//third_party/dart-pkg/pub/graphs",
+    "//third_party/dart-pkg/pub/web_socket_channel",
+    "//third_party/dart-pkg/pub/yaml",
+    "//third_party/dart-pkg/pub/build",
+    "//third_party/dart-pkg/pub/dart_style",
+    "//third_party/dart-pkg/pub/build_runner_core",
+    "//third_party/dart-pkg/pub/stack_trace",
+    "//third_party/dart-pkg/pub/pedantic",
+    "//third_party/dart-pkg/pub/build_daemon",
+    "//third_party/dart-pkg/pub/shelf",
+    "//third_party/dart-pkg/pub/glob",
+    "//third_party/dart-pkg/pub/args",
+    "//third_party/dart-pkg/pub/http_multi_server",
+    "//third_party/dart-pkg/pub/collection",
+    "//third_party/dart-pkg/pub/js",
+    "//third_party/dart-pkg/pub/mime",
+    "//third_party/dart-pkg/pub/timing",
+    "//third_party/dart-pkg/pub/path",
+    "//third_party/dart-pkg/pub/pool",
+    "//third_party/dart-pkg/pub/logging",
+    "//third_party/dart-pkg/pub/crypto",
+    "//third_party/dart-pkg/pub/stream_transform",
+    "//third_party/dart-pkg/pub/build_resolvers",
+    "//third_party/dart-pkg/pub/async",
+  ]
+}
diff --git a/build_runner/CHANGELOG.md b/build_runner/CHANGELOG.md
new file mode 100644
index 0000000..4fdfe47
--- /dev/null
+++ b/build_runner/CHANGELOG.md
@@ -0,0 +1,760 @@
+## 1.2.8
+
+- Fix issue where daemon command wouldn't properly shutdown.
+- Allow running when the root package, or a path dependency, is named `test`.
+
+## 1.2.7
+
+- Fix issue where daemon command would occasionally color a log.
+
+## 1.2.6
+
+- Prevent terminals being launched when running the daemon command on Windows.
+- No longer assumeTty when logging through the daemon command.
+- Update `build_daemon` to version `0.4.0`.
+- Update `build_runner_core` to version `2.0.3`.
+- Ensure the daemon command always exits.
+
+## 1.2.5
+
+- Fix a bug with the build daemon where the output options were ignored.
+
+## 1.2.4
+
+- Update `build_resolvers` to version `1.0.0`.
+
+## 1.2.3
+
+- Fix a bug where changing between `--live-reload` and `--hot-reload` might not
+  work due to the etags for the injected JS not changing when they should.
+
+## 1.2.2
+
+- Change the format of Build Daemon messages.
+- Build Daemon asset server now properly waits for build results.
+- Build Daemon now properly signals the start of a build.
+- Fix path issues with Daemon command under Windows.
+
+## 1.2.1
+
+- Update `package:build_runner_core` to version `2.0.1`.
+
+## 1.2.0
+
+- Support building through `package:build_daemon`.
+- Update `package:build_runner_core` to version `2.0.0`.
+
+## 1.1.3
+
+- Update to `package:graphs` version `0.2.0`.
+- Fix an issue where when running from source in watch mode the script would
+  delete itself when it shouldn't.
+- Add digest string to the asset graph visualization.
+- Added a filter box to the asset graph visualization.
+- Allow `build` version `1.1.x`.
+
+## 1.1.2
+
+- Improve error message when the generated build script cannot be parsed or
+  compiled and exit with code `78` to indicate that there is a problem with
+  configuration in the project or a dependency's `build.yaml`.
+
+## 1.1.1
+
+### Bug Fixes
+
+- Handle re-snapshotting the build script on SDK updates.
+- Suppress header for the `Bootstrap` logger.
+
+## 1.1.0
+
+### New Features
+
+- The build script will now be ran from snapshot, which improves startup times.
+- The build script will automatically re-run itself when the build script is
+  changed, instead of requiring the user to re-run it manually.
+
+## 1.0.0
+
+### Breaking Changes
+
+- Massive cleanup of the public api. The only thing exported from this package
+  is now the `run` method. The goal is to reduce the surface area in order to
+  stabilize this package, since it is directly depended on by all users.
+  - Removed all exports from build_runner_core, if you are creating a custom
+    build script you will need to import build_runner_core directly and add a
+    dependency on it.
+  - Stopped exporting the `build` and `watch` functions directly, as well as the
+    `ServeHandler`.
+  - If this has broken your use case please file an issue on the package and
+    request that we export the api you were using previously. These will be
+    considered on an individual basis but the bar for additional exports will be
+    high.
+- Removed support for the --[no-]assume-tty command line argument as it is no
+  longer needed.
+
+## 0.10.3
+
+- Improve performance tracking and visualization using the `timing` package.
+- Handle bad asset graph in the `clean` command.
+
+## 0.10.2
+
+- Added `--hot-reload` cli option and appropriate functionality.
+  See [hot-module-reloading](../docs/hot_module_reloading.md) for more info.
+- Removed dependency on cli_util.
+
+## 0.10.1+1
+
+- Added better error handling when a socket is already in use in `serve` mode.
+
+## 0.10.1
+
+- Added `--live-reload` cli option and appropriate functionality
+- Migrated glob tracking to a specialized node type to fix dart-lang/build#1702.
+
+## 0.10.0
+
+### Breaking Changes
+
+- Implementations of `BuildEnvironment` must now implement the `finalizeBuild`
+  method. There is a default implementation if you extend `BuildEnvironment`
+  that is a no-op.
+  - This method is invoked at the end of the build that allows you to do
+    arbitrary additional work, such as creating merged output directories.
+- The `assumeTty` argument on `IOEnvironment` has moved to a named argument
+  since `null` is an accepted value.
+- The `outputMap` field on `BuildOptions` has moved to the `IOEnvironment`
+  class.
+
+### New Features/Updates
+
+- Added a `outputSymlinksOnly` option to `IOEnvironment` constructor, that
+  causes the merged output directories to contain only symlinks, which is much
+  faster than copying files.
+- Added the `FinalizedAssetView` class which provides a list of all available
+  assets to the `BuildEnvironment` during the build finalization phase.
+  - `outputMap` has moved from `BuildOptions` to this constructor, as a named
+    argument.
+- The `OverridableEnvironment` now supports overriding the new `finalizeBuild`
+  api.
+- The number of concurrent actions per phase is now limited (currently to 16),
+  which should help with memory and cpu usage for large builds.
+
+## 0.9.2
+
+- Changed the default file caching logic to use an LRU cache.
+
+## 0.9.1+1
+
+- Increased the upper bound for the sdk to `<3.0.0`.
+
+## 0.9.1
+
+- The hash dir for the asset graph under `.dart_tool/build` is now based on a
+  relative path to the build script instead of the absolute path.
+  - This enables `.dart_tool/build` directories to be reused across different
+    computers and directories for the same project.
+
+## 0.9.0
+
+### New Features
+
+- Added the `--log-performance <dir>` option which will dump performance
+  information to `<dir>` after each build.
+- The `BuildPerformance` class is now serializable, it has a `fromJson`
+  constructor and a `toJson` instance method.
+- Added support for `global_options` in `build.yaml` of the root package.
+- Allow overriding the default `Resolvers` implementation.
+- Allows building with symlinked files. Note that changes to the linked files
+  will not trigger rebuilds in watch or serve mode.
+
+### Breaking changes
+
+- `BuildPhasePerformance.action` has been replaced with
+  `BuildPhasePerformance.builderKeys`.
+- `BuilderActionPerformance.builder` has been replaced with
+  `BuilderActionPerformance.builderKey`.
+- `BuildResult` no longer has an `exception` or `stackTrace` field.
+- The 'test' command through `run` will no longer set an exit code. All manual
+  build scripts which call `run` should use the `Future<int>` return to set the
+  exit code for the process.
+- Dropped `failOnSevere` arguments and `--fail-on-severe` flag. Severe logs are
+  always considered failing.
+- Severe level logs now go to `stdout` along with other logs rather than
+  `stderr`. Uncaught exceptions from the `build_runner` system itself still go
+  to `stderr`.
+
+## Other
+
+- Updated to the latest camel case constants from the sdk.
+- Minimum sdk version is now `>=2.0.0-dev.61`.
+
+## 0.8.10
+
+- All builders with `build_to: source` will now be ran regardless of which
+  directory is currently being built, see
+  https://github.com/dart-lang/build/issues/1454 for context.
+- `build` will now throw instead of returning a failed build result if nothing
+  was built.
+- Improve error message when a dependency has a bad `build.yaml` with a missing
+  dependency.
+- Sources that are not a part of a `target` will no longer appear in the asset
+  graph, so they will not be readable or globbable.
+- Updated the generated build script to not rely on json encode/decode for the
+  builder options object. Instead it now directly inlines a map literal.
+
+## 0.8.9
+
+- Added support for building only specified top level directories.
+  - The `build`, `watch` commands support positional arguments which are the
+    directories to build. For example, `pub run build_runner build web` will
+    only build the `web` directory.
+  - The `serve` command treats positional args as it did before, except it will
+    only build the directories you ask it to serve.
+  - The `test` command will automatically only build the `test` directory.
+  - If using the `-o` option, with the `<dir-to-build>:<output-dir>` syntax,
+    then the `<dir-to-build>` will be added to the list of directories to build.
+    - If additional directories are supplied with positional arguments, then
+      those will also be built.
+- Update to latest analyzer and build packages.
+- Updated the `serve` logic to only serve files which were part of the actual
+  build, and not stale assets. This brings the semantics exactly in line with
+  what would be copied to the `-o` output directory.
+
+## 0.8.8
+
+- Improve search behavior on the `/$graph` page. Users can now query for
+  paths and `AssetID` values – `pkg_name|lib/pkg_name.dart`.
+- Commands that don't support trailing args will now appropriately fail with a
+  usage exception.
+- Fix a bug where some rebuilds would not happen after adding a new file that
+  has outputs which were missing during the previous build.
+- Fix a bug where failing actions which are no longer required can still cause
+  the overall build to fail.
+
+## 0.8.7
+
+- Improve error handling on the `/$graph` page.
+- Support the latest `package:builde`
+
+## 0.8.6
+
+- Forward default options for `PostProcessBuilder`s in the generated build
+  script.
+- If a build appears to be not making progress (no actions completed for 15
+  seconds), then a warning will now be logged with the pending actions.
+- Now fail when a build is requested which does not build anything.
+- Clean up some error messages.
+
+## 0.8.5
+
+- Add log message for merged output errors.
+
+## 0.8.4
+
+- Log the number of completed actions on successful builds.
+- Support the new `isRoot` field for `BuilderOptions` so that builders can
+  do different things for the root package.
+- Deprecated `PostProcessBuilder` and `PostProcessBuildStep`. These should be
+  imported from `package:build` instead.
+
+## 0.8.3
+
+- Clean and summarize stack traces printed with `--verbose`.
+- Added a `clean` command which deletes generated to source files and the entire
+  build cache directory.
+- Bug Fix: Use the same order to compute the digest of input files to a build
+  step when writing it as when comparing it. Previously builds would not be
+  pruned as efficiently as they can be because the inputs erroneously looked
+  different.
+
+## 0.8.2+2
+
+- The `.packages` file is now always created in the root of the output directory
+  instead of under each top level directory.
+
+## 0.8.2+1
+
+- Bug Fix: Correctly parse Window's paths with new `--output` semantics.
+
+## 0.8.2
+
+- Allow passing multiple `--output` options. Each option will be split on
+  `:`. The first value will be the root input directory, the second value will
+  be the output directory. If no delimeter is provided, all resources
+  will be copied to the output directory.
+- Allow deleting files in the post process build step.
+- Bug Fix: Correctly include the default whitelist when multiple targets
+  without include are provided.
+- Allow logging from within a build factory.
+- Allow serving assets from successful build steps if the overall build fails.
+- Add a `--release` flag to choose the options from `release_options` in
+  `build.yaml`. This should replace the need to use `--config` pointing to a
+  release version of `build.yaml`.
+
+## 0.8.1
+
+- Improved the layout of `/$perf`, especially after browser window resize.
+- `pub run build_runner` exits with a error when invoked with an unsupported
+  command.
+- Bug Fix: Update outputs in merged directory for sources which are not used
+  during the build. For example if `web/index.html` is not read to produce any
+  generated outputs changes to this file will now get picked up during `pub run
+  build_runner watch --output build`.
+- Don't allow a thrown exception from a Builder to take down the entire build
+  process - instead record it as a failed action. The overall build will still
+  be marked as a failure, but it won't crash the process.
+
+## 0.8.0
+
+### New Features
+
+- Added the new `PostProcessBuilder` class. These are not supported in bazel,
+  and are different than a normal `Builder` in some fundamental ways:
+  - They don't have to declare output extensions, and can output any file as
+    long as it doesn't conflict with an existing one. This is only checked at
+    build time.
+  - They can only read their primary input.
+  - They will not cause optional actions to run - they will only run on assets
+    that were built as a part of the normal build.
+  - They can not be optional themselves, and can only output to cache.
+  - Because they all run in a single phase, after other builders, none of their
+    outputs can be used as inputs to any actions.
+- Added `applyPostProccess` method which takes `PostProcessBuilderFactory`s
+  instead of `BuilderFactory`s.
+
+### Breaking Changes
+
+- `BuilderApplication` now has a `builderActionFactories` getter instead of a
+  `builderFactories` getter.
+- The default constructor for `BuilderApplication` has been replaced with
+  `BuilderApplication.forBuilder` and
+  `BuilderApplication.forPostProcessBuilder`.
+
+## 0.7.14
+
+- Warn when using `--define` or `build.yaml` configuration for invalid builders.
+
+## 0.7.13+1
+
+- Fix a concurrent modification error when using `listAssets` when an asset
+  could be written.
+
+## 0.7.13
+
+- Fix a bug where a chain of `Builder`s would fail to run on some outputs from
+  previous steps when the generated asset did not match the target's `sources`.
+- Added support for serving on IPv4 loopback when the server hostname is
+  'localhost' (the default).
+- Added support for serving on any connection (both IPv4 and IPv6) when the
+  hostname is 'any'.
+- Improved stdout output.
+
+## 0.7.12
+
+- Added the `--log-requests` flag to the `serve` command, which will log all
+  requests to the server.
+- Build actions using `findAssets` will be more smartly invalidated.
+- Added a warning if using `serve` mode but no directories were found to serve.
+- The `--output` option now only outputs files that were required for the latest
+  build. Previously when switching js compilers you could end up with ddc
+  modules in your dart2js output, even though they weren't required. See
+  https://github.com/dart-lang/build/issues/1033.
+- The experimental `create_merged_dir` binary is now removed, it can't be easily
+  supported any more and has been replaced by the `--output` option.
+- Builders which write to `source` are no longer guaranteed to run before
+  builders which write to `cache`.
+- Honors `runs_before` configuration from Builder definitions.
+- Honors `applies_builders` configuration from Builder definitions.
+
+## 0.7.11+1
+
+- Switch to use a `PollingDirectoryWatcher` on windows, which should fix file
+  watching with the `--output` option. Follow along at
+  https://github.com/dart-lang/watcher/issues/52 for more details.
+
+## 0.7.11
+
+- Performance tracking is now disabled by default, and you must pass the
+  `--track-performance` flag to enable it.
+- The heartbeat logger will now log the current number of completed versus
+  scheduled actions, and it will log once a second instead of every 5 seconds.
+- Builds will now be invalidated when the dart SDK is updated.
+- Fixed the error message when missing a build_test dependency but trying to run
+  the `test` command.
+- The build script will now exit on changes to `build.yaml` files.
+
+## 0.7.10+1
+
+- Fix bug where relative imports in a dependencies build.yaml would break
+  all downstream users, https://github.com/dart-lang/build/issues/995.
+
+## 0.7.10
+
+### New Features
+
+- Added a basic performance visualization. When running with `serve` you can
+  now navigate to `/$perf` and get a timeline of all actions. If you are
+  experiencing slow builds (especially incremental ones), you can save the
+  html of that page and attach it to bug reports!
+
+### Bug Fixes
+
+- When using `--output` we will only clean up files we know we previously output
+  to the specified directory. This should allow running long lived processes
+  such as servers in that directory (as long as they don't hold open file
+  handles).
+
+## 0.7.9+2
+
+- Fixed a bug with build to source and watch mode that would result in an
+  infinite build loop, [#962](https://github.com/dart-lang/build/issues/962).
+
+## 0.7.9+1
+
+- Support the latest `analyzer` package.
+
+## 0.7.9
+
+### New Features
+
+- Added command line args to override config for builders globally. The format
+  is `--define "<builder_key>=<option>=<value>"`. As an example, enabling the
+  dart2js compiler for the `build_web_compilers|entrypoint` builder would look
+  like this: `--define "build_web_compilers|entrypoint=compiler=dart2js"`.
+
+### Bug Fixes
+
+- Fixed an issue with mixed mode builds, see
+  https://github.com/dart-lang/build/issues/924.
+- Fixed some issues with exit codes and --fail-on-severe, although there are
+  still some outstanding problems. See
+  https://github.com/dart-lang/build/issues/910 for status updates.
+- Fixed an issue where the process would hang on exceptions, see
+  https://github.com/dart-lang/build/issues/883.
+- Fixed an issue with etags not getting updated for source files that weren't
+  inputs to any build actions, https://github.com/dart-lang/build/issues/894.
+- Fixed an issue with hidden .DS_Store files on mac in the generated directory,
+  https://github.com/dart-lang/build/issues/902.
+- Fixed test output so it will use the compact reporter,
+  https://github.com/dart-lang/build/issues/821.
+
+## 0.7.8
+
+- Add `--config` option to use a different `build.yaml` at build time.
+
+## 0.7.7+1
+
+- Avoid watching hosted dependencies for file changes.
+
+## 0.7.7
+
+- The top level `run` method now returns an `int` which represents an `exitCode`
+  for the command that was executed.
+  - For now we still set the exitCode manually as well but this will likely
+    change in the next breaking release. In manual scripts you should `await`
+    the call to `run` and assign that to `exitCode` to be future-proofed.
+
+## 0.7.6
+
+- Update to package:build version `0.12.0`.
+- Removed the `DigestAssetReader` interface, the `digest` method has now moved
+  to the core `AssetReader` interface. We are treating this as a non-breaking
+  change because there are no known users of this interface.
+
+## 0.7.5+1
+
+- Bug fix for using the `--output` flag when you have no `test` directory.
+
+## 0.7.5
+
+- Add more human friendly duration printing.
+- Added the `--output <dir>` (or `-o`) argument which will create a merged
+  output directory after each build.
+- Added the `--verbose` (or `-v`) flag which enables verbose logging.
+  - Disables stack trace folding and terse stack traces.
+  - Disables the overwriting of previous info logs.
+  - Sets the default log level to `Level.ALL`.
+- Added `pubspec.yaml` and `pubspec.lock` to the whitelist for the root package
+  sources.
+
+## 0.7.4
+
+- Allows using files in any build targets in the root package as sources if they
+  fall outside the hardcoded whitelist.
+- Changes to the root `.packages` file during watch mode will now cause the
+  build script to exit and prompt the user to restart the build.
+
+## 0.7.3
+
+- Added the flag `--low-resources-mode`, which defaults to `false`.
+
+## 0.7.2
+
+- Added the flag `--fail-on-severe`, which defaults to `false`. In a future
+  version this will default to `true`, which means that logging a message via
+  `log.severe` will fail the build instead of just printing to the terminal.
+  This would match the current behavior in `bazel_codegen`.
+- Added the `test` command to the `build_runner` binary.
+
+## 0.7.1+1
+
+- **BUG FIX**: Running the `build_runner` binary without arguments no longer
+  causes a crash saying `Could not find an option named "assume-tty".`.
+
+## 0.7.1
+
+- Run Builders which write to the source tree before those which write to the
+  build cache.
+
+## 0.7.0
+
+### New Features
+
+- Added `toRoot` Package filter.
+- Actions are now invalidated at a fine grained level when `BuilderOptions`
+  change.
+- Added magic placeholder files in all packages, which can be used when your
+  builder doesn't have a clear primary input file.
+  - For non-root packages the placeholder exists at `lib/$lib$`, you should
+    declare your `buildExtensions` like this `{r'$lib$': 'my_output_file.txt'}`,
+    which would result in an output file at `lib/my_output_file.txt` in the
+    package.
+  - For the root package there are also placeholders at `web/$web$` and
+    `test/$test$` which should cover most use cases. Please file an issue if you
+    need additional placeholders.
+  - Note that these placeholders are not real assets and attempting to read them
+    will result in an `AssetNotFoundException`.
+
+### Breaking Changes
+
+- Removed `BuildAction`. Changed `build` and `watch` to take a
+  `List<BuilderApplication>`. See `apply` and `applyToRoot` to set these up.
+- Changed `apply` to take a single String argument - a Builder key from
+  `package:build_config` rather than a separate package and builder name.
+- Changed the default value of `hideOutput` from `false` to `true` for `apply`.
+  With `applyToRoot` the value remains `false`.
+- There is now a whitelist of top level directories that will be used as a part
+  of the build, and other files will be ignored. For now those directories
+  include 'benchmark', 'bin', 'example', 'lib', 'test', 'tool', and 'web'.
+  - If this breaks your workflow please file an issue and we can look at either
+    adding additional directories or making the list configurable per project.
+- Remove `PackageGraph.orderedPackages` and `PackageGraph.dependentsOf`.
+- Remove `writeToCache` argument of `build` and `watch`. Each `apply` call
+  should specify `hideOutput` to keep this behavior.
+- Removed `PackageBuilder` and `PackageBuildActions` classes. Use the new
+  magic placeholder files instead (see new features section for this release).
+
+The following changes are technically breaking but should not impact most
+clients:
+
+- Upgrade to `build_barback` v0.5.0 which uses strong mode analysis and no
+  longer analyzes method bodies.
+- Removed `dependencyType`, `version`, `includes`, and `excludes` from
+  `PackageNode`.
+- Removed `PackageNode.noPubspec` constructor.
+- Removed `InputSet`.
+- PackageGraph instances enforce that the `root` node is the only node with
+  `isRoot == true`.
+
+## 0.6.1
+
+### New Features
+
+- Add an `enableLowResourcesMode` option to `build` and `watch`, which will
+  consume less memory at the cost of slower builds. This is intended for use in
+  resource constrained environments such as Travis.
+- Add `createBuildActions`. After finding a list of Builders to run, and defining
+  which packages need them applied, use this tool to apply them in the correct
+  order across the package graph.
+
+### Deprecations
+
+- Deprecate `PackageGraph.orderedPackages` and `PackageGraph.dependentsOf`.
+
+### Internal Improvements
+
+- Outputs will no longer be rebuilt unless their inputs actually changed,
+  previously if any transtive dependency changed they would be invalidated.
+- Switched to using semantic analyzer summaries, this combined with the better
+  input validation means that, ddc/summary builds are much faster on non-api
+  affecting edits (dependent modules will no longer be rebuilt).
+- Build script invalidation is now much faster, which speeds up all builds.
+
+### Bug Fixes
+
+- The build actions are now checked against the previous builds actions, and if
+  they do not match then a full build is performed. Previously the behavior in
+  this case was undefined.
+- Fixed an issue where once an edge between an output and an input was created
+  it was never removed, causing extra builds to happen that weren't necessary.
+- Build actions are now checked for overlapping outputs in non-checked mode,
+  previously this was only an assert.
+- Fixed an issue where nodes could get in an inconsistent state for short
+  periods of time, leading to various errors.
+- Fixed an issue on windows where incremental builds didn't work.
+
+## 0.6.0+1
+
+### Internal Improvements
+
+- Now using `package:pool` to limit the number of open file handles.
+
+### Bug fixes
+
+- Fixed an issue where the asset graph could get in an invalid state if you
+  aren't setting `writeToCache: true`.
+
+## 0.6.0
+
+### New features
+
+- Added `orderedPackages` and `dependentsOf` utilities to `PackageGraph`.
+- Added the `noPubspec` constructor to `PackageNode`.
+- Added the `PackageBuilder` and `PackageBuildAction` classes. These builders
+  only run once per package, and have no primary input. Outputs must be well
+  known ahead of time and are declared with the `Iterable<String> get outputs`
+  field, which returns relative paths under the current package.
+- Added the `isOptional` field to `BuildAction`. Setting this to `true` means
+  that the action will not run unless some other non-optional action tries to
+  read one of the outputs of the action.
+- **Breaking**: `PackageNode.location` has become `PackageNode.path`, and is
+  now a `String` (absolute path) instead of a `Uri`; this prevents needing
+  conversions to/from `Uri` across the package.
+- **Breaking**: `RunnerAssetReader` interface requires you to implement
+  `MultiPackageAssetReader` and `DigestAssetReader`. This means the
+  `packageName` named argument has changed to `package`, and you have to add the
+  `Future<Digest> digest(AssetId id)` method. While technically breaking most
+  users do not rely on this interface explicitly.
+  - You also no longer have to implement the
+    `Future<DateTime> lastModified(AssetId id)` method, as it has been replaced
+    with the `DigestAssetReader` interface.
+- **Breaking**: `ServeHandler.handle` has been replaced with
+  `Handler ServeHandler.handleFor(String rootDir)`. This allows you to create
+  separate handlers per directory you want to serve, which maintains pub serve
+  conventions and allows interoperation with `pub run test --pub-serve=$PORT`.
+
+### Bug fixes
+
+- **Breaking**: All `AssetReader#findAssets` implementations now return a
+  `Stream<AssetId>` to match the latest `build` package. This should not affect
+  most users unless you are extending the built in `AssetReader`s or using them
+  in a custom way.
+- Fixed an issue where `findAssets` could return declared outputs from previous
+  phases that did not actually output the asset.
+- Fixed two issues with `writeToCache`:
+  - Over-declared outputs will no longer attempt to build on each startup.
+  - Unrecognized files in the cache dir will no longer be treated as inputs.
+- Asset invalidation has changed from using last modified timestamps to content
+  hashes. This is generally much more reliable, and unblocks other desired
+  features.
+
+### Internal changes
+
+- Added `PackageGraphWatcher` and `PackageNodeWatcher` as a wrapper API,
+  including an `AssetChange` class that is now consistently used across the
+  package.
+
+## 0.5.0
+
+- **Breaking**: Removed `buildType` field from `BuildResult`.
+- **Breaking**: `watch` now returns a `ServeHandler` instead of a
+  `Stream<BuildResult>`. Use `ServeHandler.buildResults` to get back to the
+  original stream.
+- **Breaking**: `serve` has been removed. Instead use `watch` and use the
+  resulting `ServeHandler.handle` method along with a server created in the
+  client script to start a server.
+- Prevent reads into `.dart_tool` for more hermetic builds.
+- Bug Fix: Rebuild entire asset graph if the build script changes.
+- Add `writeToCache` argument to `build` and `watch` which separates generated
+  files from the source directory and allows running builders against other
+  packages.
+- Allow the latest version of `package:shelf`.
+
+## 0.4.0+3
+
+- Bug fix: Don't try to delete files generated for other packages.
+
+## 0.4.0+2
+
+- Bug fix: Don't crash after a Builder reads a file from another package.
+
+## 0.4.0+1
+
+- Depend on `build` 0.10.x and `build_barback` 0.4.x
+
+## 0.4.0
+
+- **Breaking**: The `PhaseGroup` class has been replaced with a
+  `List<BuildAction>` in `build`, `watch`, and `serve`. The `PhaseGroup` and
+  `Phase` classes are removed.
+  If your current build has multiple actions in a single phase which are
+  depending on *not* seeing the outputs from other actions in the phase you will
+  need to instead set up the `InputSet`s so that the outputs are filtered out.
+- **Breaking**: The `resolvers` argument has been removed from `build`, `watch`,
+  and `serve`.
+- Allow `package:build` v0.10.x
+
+## 0.3.4+1
+
+- Support the latest release of `build_barback`.
+
+## 0.3.4
+
+- Support the latest release of `analyzer`.
+
+## 0.3.2
+
+- Support for build 0.9.0
+
+## 0.3.1+1
+
+- Bug Fix: Update AssetGraph version so builds can be run without manually
+  deleting old build directory.
+- Bug Fix: Check for unreadable assets in an async method rather than throw
+  synchronously
+
+## 0.3.1
+
+- Internal refactoring of RunnerAssetReader.
+- Support for build 0.8.0
+- Add findAssets on AssetReader implementations
+- Limit Asset reads to those which were available at the start of the phase.
+  This might cause some reads which uses to succeed to fail.
+
+## 0.3.0
+
+### Bug Fixes
+
+- Fixed a race condition bug [175](https://github.com/dart-lang/build/issues/175)
+  that could cause invalid output errors.
+
+### Breaking Changes
+
+- `RunnerAssetWriter` now requires an additional field, `onDelete` which is a
+  callback that must be called synchronously within `delete`.
+
+## 0.2.0
+
+Add support for the new bytes apis in `build`.
+
+### New Features
+
+- `FileBasedAssetReader` and `FileBasedAssetWriter` now support reading/writing
+  as bytes.
+
+### Breaking Changes
+
+- Removed the `AssetCache`, `CachedAssetReader`, and `CachedAssetWriter`. These
+  may come back at a later time if deemed necessary, but for now they just
+  complicate things unnecessarily without proven benefits.
+- `BuildResult#outputs` now has a type of `List<AssetId>` instead of
+  `List<Asset>`, since the `Asset` class no longer exists. Additionally this was
+  wasting memory by keeping all output contents around when it's not generally
+  a very useful thing outside of tests (which retain this information in other
+  ways).
+
+## 0.0.1
+
+- Initial separate release - split off from `build` package.
diff --git a/build_runner/LICENSE b/build_runner/LICENSE
new file mode 100644
index 0000000..82e9b52
--- /dev/null
+++ b/build_runner/LICENSE
@@ -0,0 +1,26 @@
+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/build_runner/README.md b/build_runner/README.md
new file mode 100644
index 0000000..7910a5a
--- /dev/null
+++ b/build_runner/README.md
@@ -0,0 +1,258 @@
+# build_runner
+
+<p align="center">
+  Standalone generator and watcher for Dart using <a href="https://pub.dartlang.org/packages/build"><code>package:build</code></a>.
+  <br>
+  <a href="https://travis-ci.org/dart-lang/build">
+    <img src="https://travis-ci.org/dart-lang/build.svg?branch=master" alt="Build Status" />
+  </a>
+  <a href="https://github.com/dart-lang/build/labels/package%3A%20build_runner">
+    <img src="https://img.shields.io/github/issues-raw/dart-lang/build/package%3A%20build_runner.svg" alt="Issues related to build_runner" />
+  </a>
+  <a href="https://pub.dartlang.org/packages/build_runner">
+    <img src="https://img.shields.io/pub/v/build_runner.svg" alt="Pub Package Version" />
+  </a>
+  <a href="https://pub.dartlang.org/documentation/build_runner/latest">
+    <img src="https://img.shields.io/badge/dartdocs-latest-blue.svg" alt="Latest Dartdocs" />
+  </a>
+  <a href="https://gitter.im/dart-lang/build">
+    <img src="https://badges.gitter.im/dart-lang/build.svg" alt="Join the chat on Gitter" />
+  </a>
+</p>
+
+The `build_runner` package provides a concrete way of generating files using
+Dart code, outside of tools like `pub`. Unlike `pub serve/build`, files are
+always generated directly on disk, and rebuilds are _incremental_ - inspired by
+tools such as [Bazel][].
+
+> **NOTE**: Are you a user of this package? You may be interested in
+> simplified user-facing documentation, such as our
+> [getting started guide][getting-started-link].
+
+[getting-started-link]: https://goo.gl/b9o2j6
+
+* [Installation](#installation)
+* [Usage](#usage)
+  * [Built-in commands](#built-in-commands)
+  * [Inputs](#inputs)
+  * [Outputs](#outputs)
+  * [Source control](#source-control)
+  * [Publishing packages](#publishing-packages)
+* [Contributing](#contributing)
+  * [Testing](#testing)
+
+## Installation
+
+This package is intended to support development of Dart projects with
+[`package:build`][]. In general, put it under [dev_dependencies][], in your
+[`pubspec.yaml`][pubspec].
+
+```yaml
+dev_dependencies:
+  build_runner:
+```
+
+## Usage
+
+When the packages providing `Builder`s are configured with a `build.yaml` file
+they are designed to be consumed using an generated build script. Most builders
+should need little or no configuration, see the documentation provided with the
+Builder to decide whether the build needs to be customized. If it does you may
+also provide a `build.yaml` with the configuration. See the
+`package:build_config` README for more information on this file.
+
+To have web code compiled to js add a `dev_dependency` on `build_web_compilers`.
+
+### Built-in Commands
+
+The `build_runner` package exposes a binary by the same name, which can be
+invoked using `pub run build_runner <command>`.
+
+The available commands are `build`, `watch`, `serve`, and `test`.
+
+- `build`: Runs a single build and exits.
+- `watch`: Runs a persistent build server that watches the files system for
+  edits and does rebuilds as necessary.
+- `serve`: Same as `watch`, but runs a development server as well.
+  - By default this serves the `web` and `test` directories, on port `8080` and
+    `8081` respectively. See below for how to configure this.
+- `test`: Runs a single build, creates a merged output directory, and then runs
+  `pub run test --precompiled <merged-output-dir>`. See below for instructions
+  on passing custom args to the test command.
+
+#### Command Line Options
+
+All the above commands support the following arguments:
+
+- `--help`: Print usage information for the command.
+- `--assume-tty`: Enables colors and interactive input when the script does not
+  appear to be running directly in a terminal, for instance when it is a
+  subprocess.
+- `--delete-conflicting-outputs`: Assume conflicting outputs in the users
+  package are from previous builds, and skip the user prompt that would usually
+  be provided.
+- `--[no-]fail-on-severe`: Whether to consider the build a failure on an error
+  logged. By default this is false.
+
+Some commands also have additional options:
+
+##### serve
+
+- `--hostname`: The host to run the server on.
+- `--live-reload`: Enables automatic page reloading on rebuilds.
+  Can't be used together with `--hot-reload`.
+- `--hot-reload`: Enables automatic reloading of changed modules on rebuilds.
+  See [hot-module-reloading](../docs/hot_module_reloading.md) for more info.
+  Can't be used together with `--live-reload`.
+
+Trailing args of the form `<directory>:<port>` are supported to customize what
+directories are served, and on what ports.
+
+For example to serve the `example` and `web` directories on ports 8000 and 8001
+you would do `pub run build_runner serve example:8000 web:8001`.
+
+##### test
+
+The test command will forward any arguments after an empty `--` arg to the
+`pub run test` command.
+
+For example if you wanted to pass `-p chrome` you would do
+`pub run build_runner test -- -p chrome`.
+
+### Inputs
+
+Valid inputs follow the general dart package rules. You can read any files under
+the top level `lib` folder any package dependency, and you can read all files
+from the current package.
+
+In general it is best to be as specific as possible with your `InputSet`s,
+because all matching files will be checked against a `Builder`'s
+[`buildExtensions`][build_extensions] - see [outputs](#outputs) for more
+information.
+
+### Outputs
+
+* You may output files anywhere in the current package.
+
+> **NOTE**: When a `BuilderApplication` specifies `hideOutput: true` it may
+> output under the `lib` folder of _any_ package you depend on.
+
+* Builders are not allowed to overwrite existing files, only create new ones.
+* Outputs from previous builds will not be treated as inputs to later ones.
+* You may use a previous `BuilderApplications`'s outputs as an input to a later
+  action.
+
+### Source control
+
+This package creates a top level `.dart_tool` folder in your package, which
+should not be submitted to your source control repository. You can see [our own
+`.gitignore`](https://github.com/dart-lang/build/blob/master/.gitignore) as an
+example.
+
+```git
+# Files generated by dart tools
+.dart_tool
+```
+
+When it comes to _generated_ files it is generally best to not submit them to
+source control, but a specific `Builder` may provide a recommendation otherwise.
+
+It should be noted that if you do submit generated files to your repo then when
+you change branches or merge in changes you may get a warning on your next build
+about declared outputs that already exist. This will be followed up with a
+prompt to delete those files. You can type `l` to list the files, and then type
+`y` to delete them if everything looks correct. If you think something is wrong
+you can type `n` to abandon the build without taking any action.
+
+### Publishing packages
+
+In general generated files **should** be published with your package, but this
+may not always be the case. Some `Builder`s may provide a recommendation for
+this as well.
+
+
+## Legacy Usage
+
+If the generated script does not do everything you need it's possible to
+manually write one. With this approach every package which *uses* a
+[`Builder`][builder] must have it's own script, they cannot be reused
+from other packages. A package which defines a [`Builder`][builder] may have an
+example you can reference, but a unique script must be written for the consuming
+packages as well. You can reference the generated script at
+`.dart_tool/build/entrypoint/build.dart` for an example.
+
+Your script should use one of the following functions defined by this library:
+
+- [**`run`**][run_fn]: Use the same argument parsing as the generated approach.
+- [**`build`**][build_fn]: Run a single build and exit.
+- [**`watch`**][watch_fn]: Continuously run builds as you edit files.
+
+### Configuring
+
+[`run`][run_fn], [`build`][build_fn], and [`watch`][watch_fn] have a required
+argument which is a `List<BuilderApplication>`. These correspond to the
+`BuilderDefinition` class from `package:build_config`. See `apply` and
+`applyToRoot` to create instances of this class. These will be translated into
+actions by crawling through dependencies. The order of this list is important.
+Each Builder may read the generated outputs of any Builder that ran on a package
+earlier in the dependency graph, but for the package it is running on it may
+only read the generated outputs from Builders earlier in the list of
+`BuilderApplication`s.
+
+**NOTE**: Any time you change your build script (or any of its dependencies),
+the next build will be a full rebuild. This is because the system has no way
+of knowing how that change may have affected the outputs.
+
+## Contributing
+
+We welcome a diverse set of contributions, including, but not limited to:
+
+* [Filing bugs and feature requests][file_an_issue]
+* [Send a pull request][pull_request]
+* Or, create something awesome using this API and share with us and others!
+
+For the stability of the API and existing users, consider opening an issue
+first before implementing a large new feature or breaking an API. For smaller
+changes (like documentation, minor bug fixes), just send a pull request.
+
+### Testing
+
+All pull requests are validated against [travis][travis], and must pass. The
+`build_runner` package lives in a mono repository with other `build` packages,
+and _all_ of the following checks must pass for _each_ package.
+
+Ensure code passes all our [analyzer checks][analysis_options]:
+
+```sh
+$ dartanalyzer .
+```
+
+Ensure all code is formatted with the latest [dev-channel SDK][dev_sdk].
+
+```sh
+$ dartfmt -w .
+```
+
+Run all of our unit tests:
+
+```sh
+$ pub run test
+```
+
+[Bazel]: https://bazel.build/
+[`package:build`]: https://pub.dartlang.org/packages/build
+[analysis_options]: https://github.com/dart-lang/build/blob/master/analysis_options.yaml
+
+[builder]: https://www.dartdocs.org/documentation/build/latest/build/Builder-class.html
+[run_fn]: https://www.dartdocs.org/documentation/build_runner/latest/build_runner/run.html
+[build_fn]: https://www.dartdocs.org/documentation/build_runner/latest/build_runner/build.html
+[watch_fn]: https://www.dartdocs.org/documentation/build_runner/latest/build_runner/watch.html
+[builder_application]: https://www.dartdocs.org/documentation/build_runner/latest/build_runner/BuilderApplication-class.html
+[build_extensions]: https://www.dartdocs.org/documentation/build/latest/build/Builder/buildExtensions.html
+
+[travis]: https://travis-ci.org/
+[dev_sdk]: https://www.dartlang.org/install
+[dev_dependencies]: https://www.dartlang.org/tools/pub/dependencies#dev-dependencies
+[pubspec]: https://www.dartlang.org/tools/pub/pubspec
+[file_an_issue]: https://github.com/dart-lang/build/issues/new
+[pull_request]: https://github.com/dart-lang/build/pulls
diff --git a/build_runner/bin/build_runner.dart b/build_runner/bin/build_runner.dart
new file mode 100644
index 0000000..eb1e0af
--- /dev/null
+++ b/build_runner/bin/build_runner.dart
@@ -0,0 +1,87 @@
+// 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:io';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:io/ansi.dart';
+import 'package:io/io.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:build_runner/src/build_script_generate/build_script_generate.dart';
+import 'package:build_runner/src/build_script_generate/bootstrap.dart';
+import 'package:build_runner/src/entrypoint/runner.dart';
+import 'package:build_runner/src/logging/std_io_logging.dart';
+
+Future<Null> main(List<String> args) async {
+  // Use the actual command runner to parse the args and immediately print the
+  // usage information if there is no command provided or the help command was
+  // explicitly invoked.
+  var commandRunner = BuildCommandRunner([])
+    ..addCommand(_GenerateBuildScript());
+
+  ArgResults parsedArgs;
+  try {
+    parsedArgs = commandRunner.parse(args);
+  } on UsageException catch (e) {
+    print(red.wrap(e.message));
+    print('');
+    print(e.usage);
+    exitCode = ExitCode.usage.code;
+    return;
+  }
+
+  var commandName = parsedArgs.command?.name;
+
+  if (parsedArgs.rest.isNotEmpty) {
+    print(
+        yellow.wrap('Could not find a command named "${parsedArgs.rest[0]}".'));
+    print('');
+    print(commandRunner.usageWithoutDescription);
+    exitCode = ExitCode.usage.code;
+    return;
+  }
+
+  if (commandName == null || commandName == 'help') {
+    commandRunner.printUsage();
+    return;
+  }
+
+  StreamSubscription logListener;
+  if (commandName == _generateCommand) {
+    exitCode = await commandRunner.runCommand(parsedArgs);
+    return;
+  }
+  logListener = Logger.root.onRecord.listen(stdIOLogListener());
+
+  while ((exitCode = await generateAndRun(args)) == ExitCode.tempFail.code) {}
+  await logListener?.cancel();
+}
+
+const _generateCommand = 'generate-build-script';
+
+class _GenerateBuildScript extends Command<int> {
+  @override
+  final description = 'Generate a script to run builds and print the file path '
+      'with no other logging. Useful for wrapping builds with other tools.';
+
+  @override
+  final name = _generateCommand;
+
+  @override
+  bool get hidden => true;
+
+  @override
+  Future<int> run() async {
+    var buildScript = await generateBuildScript();
+    File(scriptLocation)
+      ..createSync(recursive: true)
+      ..writeAsStringSync(buildScript);
+    print(p.absolute(scriptLocation));
+    return 0;
+  }
+}
diff --git a/build_runner/bin/graph_inspector.dart b/build_runner/bin/graph_inspector.dart
new file mode 100644
index 0000000..b32ad5a
--- /dev/null
+++ b/build_runner/bin/graph_inspector.dart
@@ -0,0 +1,214 @@
+// 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:io';
+
+import 'package:args/command_runner.dart';
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/asset_graph/graph.dart';
+import 'package:build_runner_core/src/asset_graph/node.dart';
+
+AssetGraph assetGraph;
+PackageGraph packageGraph;
+
+Future main(List<String> args) async {
+  stdout.writeln(
+      'Warning: this tool is unsupported and usage may change at any time, '
+      'use at your own risk.');
+
+  if (args.length != 1) {
+    throw ArgumentError(
+        'Expected exactly one argument, the path to a build script to '
+        'analyze.');
+  }
+  var scriptPath = args.first;
+  var scriptFile = File(scriptPath);
+  if (!scriptFile.existsSync()) {
+    throw ArgumentError(
+        'Expected a build script at $scriptPath but didn\'t find one.');
+  }
+
+  var assetGraphFile =
+      File(assetGraphPathFor(p.url.joinAll(p.split(scriptPath))));
+  if (!assetGraphFile.existsSync()) {
+    throw ArgumentError(
+        'Unable to find AssetGraph for $scriptPath at ${assetGraphFile.path}');
+  }
+  stdout.writeln('Loading asset graph at ${assetGraphFile.path}...');
+
+  assetGraph = AssetGraph.deserialize(assetGraphFile.readAsBytesSync());
+  packageGraph = PackageGraph.forThisPackage();
+
+  var commandRunner =
+      CommandRunner('', 'A tool for inspecting the AssetGraph for your build')
+        ..addCommand(InspectNodeCommand())
+        ..addCommand(GraphCommand());
+
+  stdout.writeln('Ready, please type in a command:');
+
+  while (true) {
+    stdout
+      ..writeln('')
+      ..write('> ');
+    var nextCommand = stdin.readLineSync();
+    stdout.writeln('');
+    try {
+      await commandRunner.run(nextCommand.split(' '));
+    } on UsageException {
+      stdout.writeln('Unrecognized option');
+      await commandRunner.run(['help']);
+    }
+  }
+}
+
+class InspectNodeCommand extends Command {
+  @override
+  String get name => 'inspect';
+
+  @override
+  String get description =>
+      'Lists all the information about an asset using a relative or package: uri';
+
+  @override
+  String get invocation => '${super.invocation} <dart-uri>';
+
+  InspectNodeCommand() {
+    argParser.addFlag('verbose', abbr: 'v');
+  }
+
+  @override
+  run() {
+    var stringUris = argResults.rest;
+    if (stringUris.isEmpty) {
+      stderr.writeln('Expected at least one uri for a node to inspect.');
+    }
+    for (var stringUri in stringUris) {
+      var id = _idFromString(stringUri);
+      if (id == null) {
+        continue;
+      }
+      var node = assetGraph.get(id);
+      if (node == null) {
+        stderr.writeln('Unable to find an asset node for $stringUri.');
+        continue;
+      }
+
+      var description = StringBuffer()
+        ..writeln('Asset: $stringUri')
+        ..writeln('  type: ${node.runtimeType}');
+
+      if (node is GeneratedAssetNode) {
+        description
+          ..writeln('  state: ${node.state}')
+          ..writeln('  wasOutput: ${node.wasOutput}')
+          ..writeln('  phase: ${node.phaseNumber}')
+          ..writeln('  isFailure: ${node.isFailure}');
+      }
+
+      _printAsset(AssetId asset) =>
+          _listAsset(asset, description, indentation: '    ');
+
+      if (argResults['verbose'] == true) {
+        description.writeln('  primary outputs:');
+        node.primaryOutputs.forEach(_printAsset);
+
+        description.writeln('  secondary outputs:');
+        node.outputs.difference(node.primaryOutputs).forEach(_printAsset);
+
+        if (node is GeneratedAssetNode) {
+          description.writeln('  inputs:');
+          assetGraph.allNodes
+              .where((n) => n.outputs.contains(node.id))
+              .map((n) => n.id)
+              .forEach(_printAsset);
+        }
+      }
+
+      stdout.write(description);
+    }
+    return null;
+  }
+}
+
+class GraphCommand extends Command {
+  @override
+  String get name => 'graph';
+
+  @override
+  String get description => 'Lists all the nodes in the graph.';
+
+  @override
+  String get invocation => '${super.invocation} <dart-uri>';
+
+  GraphCommand() {
+    argParser
+      ..addFlag('generated',
+          abbr: 'g', help: 'Show only generated assets.', defaultsTo: false)
+      ..addFlag('original',
+          abbr: 'o',
+          help: 'Show only original source assets.',
+          defaultsTo: false)
+      ..addOption('package',
+          abbr: 'p', help: 'Filters nodes to a certain package')
+      ..addOption('pattern', abbr: 'm', help: 'glob pattern for path matching');
+  }
+
+  @override
+  run() {
+    var showGenerated = argResults['generated'] as bool;
+    var showSources = argResults['original'] as bool;
+    Iterable<AssetId> assets;
+    if (showGenerated) {
+      assets = assetGraph.outputs;
+    } else if (showSources) {
+      assets = assetGraph.sources;
+    } else {
+      assets = assetGraph.allNodes.map((n) => n.id);
+    }
+
+    var package = argResults['package'] as String;
+    if (package != null) {
+      assets = assets.where((id) => id.package == package);
+    }
+
+    var pattern = argResults['pattern'] as String;
+    if (pattern != null) {
+      var glob = Glob(pattern);
+      assets = assets.where((id) => glob.matches(id.path));
+    }
+
+    for (var id in assets) {
+      _listAsset(id, stdout, indentation: '  ');
+    }
+    return null;
+  }
+}
+
+AssetId _idFromString(String stringUri) {
+  var uri = Uri.parse(stringUri);
+  if (uri.scheme == 'package') {
+    return AssetId(uri.pathSegments.first,
+        p.url.join('lib', p.url.joinAll(uri.pathSegments.skip(1))));
+  } else if (!uri.isAbsolute && (uri.scheme == '' || uri.scheme == 'file')) {
+    return AssetId(packageGraph.root.name, uri.path);
+  } else {
+    stderr.writeln('Unrecognized uri $uri, must be a package: uri or a '
+        'relative path.');
+    return null;
+  }
+}
+
+_listAsset(AssetId output, StringSink buffer, {String indentation = '  '}) {
+  var outputUri = output.uri;
+  if (outputUri.scheme == 'package') {
+    buffer.writeln('$indentation${output.uri}');
+  } else {
+    buffer.writeln('$indentation${output.path}');
+  }
+}
diff --git a/build_runner/dart_test.yaml b/build_runner/dart_test.yaml
new file mode 100644
index 0000000..112148b
--- /dev/null
+++ b/build_runner/dart_test.yaml
@@ -0,0 +1,3 @@
+tags:
+  integration:
+    timeout: 16x
diff --git a/build_runner/lib/build_runner.dart b/build_runner/lib/build_runner.dart
new file mode 100644
index 0000000..e0157e7
--- /dev/null
+++ b/build_runner/lib/build_runner.dart
@@ -0,0 +1,5 @@
+// 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.
+
+export 'src/entrypoint/run.dart' show run;
diff --git a/build_runner/lib/build_script_generate.dart b/build_runner/lib/build_script_generate.dart
new file mode 100644
index 0000000..ee76280
--- /dev/null
+++ b/build_runner/lib/build_script_generate.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/build_script_generate/build_script_generate.dart'
+    show generateBuildScript, scriptLocation;
diff --git a/build_runner/lib/src/build_script_generate/bootstrap.dart b/build_runner/lib/src/build_script_generate/bootstrap.dart
new file mode 100644
index 0000000..22f4e10
--- /dev/null
+++ b/build_runner/lib/src/build_script_generate/bootstrap.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+import 'package:stack_trace/stack_trace.dart';
+
+import 'package:build_runner/src/build_script_generate/build_script_generate.dart';
+
+final _logger = Logger('Bootstrap');
+
+/// Generates the build script, snapshots it if needed, and runs it.
+///
+/// Will retry once on [IsolateSpawnException]s to handle SDK updates.
+///
+/// Returns the exit code from running the build script.
+///
+/// If an exit code of 75 is returned, this function should be re-ran.
+Future<int> generateAndRun(List<String> args, {Logger logger}) async {
+  logger ??= _logger;
+  ReceivePort exitPort;
+  ReceivePort errorPort;
+  ReceivePort messagePort;
+  StreamSubscription errorListener;
+  int scriptExitCode;
+
+  var tryCount = 0;
+  var succeeded = false;
+  while (tryCount < 2 && !succeeded) {
+    tryCount++;
+    exitPort?.close();
+    errorPort?.close();
+    messagePort?.close();
+    await errorListener?.cancel();
+
+    try {
+      var buildScript = await generateBuildScript();
+      File(scriptLocation)
+        ..createSync(recursive: true)
+        ..writeAsStringSync(buildScript);
+    } on CannotBuildException {
+      return ExitCode.config.code;
+    }
+
+    scriptExitCode = await _createSnapshotIfMissing(logger);
+    if (scriptExitCode != 0) return scriptExitCode;
+
+    exitPort = ReceivePort();
+    errorPort = ReceivePort();
+    messagePort = ReceivePort();
+    errorListener = errorPort.listen((e) {
+      final error = e[0];
+      final trace = e[1] as String;
+      stderr
+        ..writeln('\n\nYou have hit a bug in build_runner')
+        ..writeln('Please file an issue with reproduction steps at '
+            'https://github.com/dart-lang/build/issues\n\n')
+        ..writeln(error)
+        ..writeln(Trace.parse(trace).terse);
+      if (scriptExitCode == 0) scriptExitCode = 1;
+    });
+    try {
+      await Isolate.spawnUri(Uri.file(p.absolute(scriptSnapshotLocation)), args,
+          messagePort.sendPort,
+          errorsAreFatal: true,
+          onExit: exitPort.sendPort,
+          onError: errorPort.sendPort);
+      succeeded = true;
+    } on IsolateSpawnException catch (e) {
+      if (tryCount > 1) {
+        logger.severe(
+            'Failed to spawn build script after retry. '
+            'This is likely due to a misconfigured builder definition. '
+            'See the generated script at $scriptLocation to find errors.',
+            e);
+        messagePort.sendPort.send(ExitCode.config.code);
+        exitPort.sendPort.send(null);
+      } else {
+        logger.warning(
+            'Error spawning build script isolate, this is likely due to a Dart '
+            'SDK update. Deleting snapshot and retrying...');
+      }
+      await File(scriptSnapshotLocation).delete();
+    }
+  }
+
+  StreamSubscription exitCodeListener;
+  exitCodeListener = messagePort.listen((isolateExitCode) {
+    if (isolateExitCode is int) {
+      scriptExitCode = isolateExitCode;
+    } else {
+      throw StateError(
+          'Bad response from isolate, expected an exit code but got '
+          '$isolateExitCode');
+    }
+    exitCodeListener.cancel();
+    exitCodeListener = null;
+  });
+  await exitPort.first;
+  await errorListener.cancel();
+  await exitCodeListener?.cancel();
+
+  return scriptExitCode;
+}
+
+/// Creates a script snapshot for the build script.
+///
+/// Returns zero for success or a number for failure which should be set to the
+/// exit code.
+Future<int> _createSnapshotIfMissing(Logger logger) async {
+  var snapshotFile = File(scriptSnapshotLocation);
+  String stderr;
+  if (!await snapshotFile.exists()) {
+    var mode = stdin.hasTerminal
+        ? ProcessStartMode.normal
+        : ProcessStartMode.detachedWithStdio;
+    await logTimedAsync(logger, 'Creating build script snapshot...', () async {
+      var snapshot = await Process.start(Platform.executable,
+          ['--snapshot=$scriptSnapshotLocation', scriptLocation],
+          mode: mode);
+      stderr = (await snapshot.stderr
+              .transform(utf8.decoder)
+              .transform(LineSplitter())
+              .toList())
+          .join('');
+    });
+    if (!await snapshotFile.exists()) {
+      logger.severe('Failed to snapshot build script $scriptLocation.\n'
+          'This is likely caused by a misconfigured builder definition.');
+      if (stderr.isNotEmpty) {
+        logger.severe(stderr);
+      }
+      return ExitCode.config.code;
+    }
+  }
+  return 0;
+}
diff --git a/build_runner/lib/src/build_script_generate/build_script_generate.dart b/build_runner/lib/src/build_script_generate/build_script_generate.dart
new file mode 100644
index 0000000..0157cad
--- /dev/null
+++ b/build_runner/lib/src/build_script_generate/build_script_generate.dart
@@ -0,0 +1,257 @@
+// 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:build/build.dart' show BuilderOptions;
+import 'package:build_config/build_config.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:code_builder/code_builder.dart';
+import 'package:dart_style/dart_style.dart';
+import 'package:graphs/graphs.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+import '../package_graph/build_config_overrides.dart';
+import 'builder_ordering.dart';
+
+const scriptLocation = '$entryPointDir/build.dart';
+const scriptSnapshotLocation = '$scriptLocation.snapshot';
+
+final _log = Logger('Entrypoint');
+
+Future<String> generateBuildScript() =>
+    logTimedAsync(_log, 'Generating build script', _generateBuildScript);
+
+Future<String> _generateBuildScript() async {
+  final builders = await _findBuilderApplications();
+  final library = Library((b) => b.body.addAll([
+        literalList(
+                builders,
+                refer('BuilderApplication',
+                    'package:build_runner_core/build_runner_core.dart'))
+            .assignFinal('_builders')
+            .statement,
+        _main()
+      ]));
+  final emitter = DartEmitter(Allocator.simplePrefixing());
+  try {
+    return DartFormatter().format('''
+      // ignore_for_file: directives_ordering
+
+      ${library.accept(emitter)}''');
+  } on FormatterException {
+    _log.severe('Generated build script could not be parsed.\n'
+        'This is likely caused by a misconfigured builder definition.');
+    throw CannotBuildException();
+  }
+}
+
+/// Finds expressions to create all the `BuilderApplication` instances that
+/// should be applied packages in the build.
+///
+/// Adds `apply` expressions based on the BuildefDefinitions from any package
+/// which has a `build.yaml`.
+Future<Iterable<Expression>> _findBuilderApplications() async {
+  final builderApplications = <Expression>[];
+  final packageGraph = PackageGraph.forThisPackage();
+  final orderedPackages = stronglyConnectedComponents<PackageNode>(
+    [packageGraph.root],
+    (node) => node.dependencies,
+    equals: (a, b) => a.name == b.name,
+    hashCode: (n) => n.name.hashCode,
+  ).expand((c) => c);
+  final buildConfigOverrides =
+      await findBuildConfigOverrides(packageGraph, null);
+  Future<BuildConfig> _packageBuildConfig(PackageNode package) async {
+    if (buildConfigOverrides.containsKey(package.name)) {
+      return buildConfigOverrides[package.name];
+    }
+    try {
+      return await BuildConfig.fromBuildConfigDir(
+          package.name, package.dependencies.map((n) => n.name), package.path);
+    } on ArgumentError catch (_) {
+      // During the build an error will be logged.
+      return BuildConfig.useDefault(
+          package.name, package.dependencies.map((n) => n.name));
+    }
+  }
+
+  bool _isValidDefinition(dynamic definition) {
+    // Filter out builderDefinitions with relative imports that aren't
+    // from the root package, because they will never work.
+    if (definition.import.startsWith('package:') as bool) return true;
+    return definition.package == packageGraph.root.name;
+  }
+
+  final orderedConfigs =
+      await Future.wait(orderedPackages.map(_packageBuildConfig));
+  final builderDefinitions = orderedConfigs
+      .expand((c) => c.builderDefinitions.values)
+      .where(_isValidDefinition);
+
+  final orderedBuilders = findBuilderOrder(builderDefinitions).toList();
+  builderApplications.addAll(orderedBuilders.map(_applyBuilder));
+
+  final postProcessBuilderDefinitions = orderedConfigs
+      .expand((c) => c.postProcessBuilderDefinitions.values)
+      .where(_isValidDefinition);
+  builderApplications
+      .addAll(postProcessBuilderDefinitions.map(_applyPostProcessBuilder));
+
+  return builderApplications;
+}
+
+/// A method forwarding to `run`.
+Method _main() => Method((b) => b
+  ..name = 'main'
+  ..modifier = MethodModifier.async
+  ..requiredParameters.add(Parameter((b) => b
+    ..name = 'args'
+    ..type = TypeReference((b) => b
+      ..symbol = 'List'
+      ..types.add(refer('String')))))
+  ..optionalParameters.add(Parameter((b) => b
+    ..name = 'sendPort'
+    ..type = refer('SendPort', 'dart:isolate')))
+  ..body = Block.of([
+    refer('run', 'package:build_runner/build_runner.dart')
+        .call([refer('args'), refer('_builders')])
+        .awaited
+        .assignVar('result')
+        .statement,
+    refer('sendPort')
+        .nullSafeProperty('send')
+        .call([refer('result')]).statement,
+  ]));
+
+/// An expression calling `apply` with appropriate setup for a Builder.
+Expression _applyBuilder(BuilderDefinition definition) {
+  final namedArgs = <String, Expression>{};
+  if (definition.isOptional) {
+    namedArgs['isOptional'] = literalTrue;
+  }
+  if (definition.buildTo == BuildTo.cache) {
+    namedArgs['hideOutput'] = literalTrue;
+  } else {
+    namedArgs['hideOutput'] = literalFalse;
+  }
+  if (!identical(definition.defaults?.generateFor, InputSet.anything)) {
+    final inputSetArgs = <String, Expression>{};
+    if (definition.defaults.generateFor.include != null) {
+      inputSetArgs['include'] =
+          literalConstList(definition.defaults.generateFor.include);
+    }
+    if (definition.defaults.generateFor.exclude != null) {
+      inputSetArgs['exclude'] =
+          literalConstList(definition.defaults.generateFor.exclude);
+    }
+    namedArgs['defaultGenerateFor'] =
+        refer('InputSet', 'package:build_config/build_config.dart')
+            .constInstance([], inputSetArgs);
+  }
+  if (!identical(definition.defaults?.options, BuilderOptions.empty)) {
+    namedArgs['defaultOptions'] =
+        _constructBuilderOptions(definition.defaults.options);
+  }
+  if (!identical(definition.defaults?.devOptions, BuilderOptions.empty)) {
+    namedArgs['defaultDevOptions'] =
+        _constructBuilderOptions(definition.defaults.devOptions);
+  }
+  if (!identical(definition.defaults?.releaseOptions, BuilderOptions.empty)) {
+    namedArgs['defaultReleaseOptions'] =
+        _constructBuilderOptions(definition.defaults.releaseOptions);
+  }
+  if (definition.appliesBuilders.isNotEmpty) {
+    namedArgs['appliesBuilders'] = literalList(definition.appliesBuilders);
+  }
+  var import = _buildScriptImport(definition.import);
+  return refer('apply', 'package:build_runner_core/build_runner_core.dart')
+      .call([
+    literalString(definition.key),
+    literalList(
+        definition.builderFactories.map((f) => refer(f, import)).toList()),
+    _findToExpression(definition),
+  ], namedArgs);
+}
+
+/// An expression calling `applyPostProcess` with appropriate setup for a
+/// PostProcessBuilder.
+Expression _applyPostProcessBuilder(PostProcessBuilderDefinition definition) {
+  final namedArgs = <String, Expression>{};
+  if (definition.defaults?.generateFor != null) {
+    final inputSetArgs = <String, Expression>{};
+    if (definition.defaults.generateFor.include != null) {
+      inputSetArgs['include'] =
+          literalConstList(definition.defaults.generateFor.include);
+    }
+    if (definition.defaults.generateFor.exclude != null) {
+      inputSetArgs['exclude'] =
+          literalConstList(definition.defaults.generateFor.exclude);
+    }
+    if (!identical(definition.defaults?.options, BuilderOptions.empty)) {
+      namedArgs['defaultOptions'] =
+          _constructBuilderOptions(definition.defaults.options);
+    }
+    if (!identical(definition.defaults?.devOptions, BuilderOptions.empty)) {
+      namedArgs['defaultDevOptions'] =
+          _constructBuilderOptions(definition.defaults.devOptions);
+    }
+    if (!identical(definition.defaults?.releaseOptions, BuilderOptions.empty)) {
+      namedArgs['defaultReleaseOptions'] =
+          _constructBuilderOptions(definition.defaults.releaseOptions);
+    }
+    namedArgs['defaultGenerateFor'] =
+        refer('InputSet', 'package:build_config/build_config.dart')
+            .constInstance([], inputSetArgs);
+  }
+  var import = _buildScriptImport(definition.import);
+  return refer('applyPostProcess',
+          'package:build_runner_core/build_runner_core.dart')
+      .call([
+    literalString(definition.key),
+    refer(definition.builderFactory, import),
+  ], namedArgs);
+}
+
+/// Returns the actual import to put in the generated script based on an import
+/// found in the build.yaml.
+String _buildScriptImport(String import) {
+  if (import.startsWith('package:')) {
+    return import;
+  } else if (import.startsWith('../') || import.startsWith('/')) {
+    _log.warning('The `../` import syntax in build.yaml is now deprecated, '
+        'instead do a normal relative import as if it was from the root of '
+        'the package. Found `$import` in your `build.yaml` file.');
+    return import;
+  } else {
+    return p.url.relative(import, from: p.url.dirname(scriptLocation));
+  }
+}
+
+Expression _findToExpression(BuilderDefinition definition) {
+  switch (definition.autoApply) {
+    case AutoApply.none:
+      return refer('toNoneByDefault',
+              'package:build_runner_core/build_runner_core.dart')
+          .call([]);
+    case AutoApply.dependents:
+      return refer('toDependentsOf',
+              'package:build_runner_core/build_runner_core.dart')
+          .call([literalString(definition.package)]);
+    case AutoApply.allPackages:
+      return refer('toAllPackages',
+              'package:build_runner_core/build_runner_core.dart')
+          .call([]);
+    case AutoApply.rootPackage:
+      return refer('toRoot', 'package:build_runner_core/build_runner_core.dart')
+          .call([]);
+  }
+  throw ArgumentError('Unhandled AutoApply type: ${definition.autoApply}');
+}
+
+/// An expression creating a [BuilderOptions] from a json string.
+Expression _constructBuilderOptions(BuilderOptions options) =>
+    refer('BuilderOptions', 'package:build/build.dart')
+        .newInstance([literalMap(options.config)]);
diff --git a/build_runner/lib/src/build_script_generate/builder_ordering.dart b/build_runner/lib/src/build_script_generate/builder_ordering.dart
new file mode 100644
index 0000000..052414b
--- /dev/null
+++ b/build_runner/lib/src/build_script_generate/builder_ordering.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:build_config/build_config.dart';
+import 'package:graphs/graphs.dart';
+
+/// Put [builders] into an order such that any builder which specifies
+/// [BuilderDefinition.requiredInputs] will come after any builder which
+/// produces a desired output.
+///
+/// Builders will be ordered such that their `required_inputs` and `runs_before`
+/// constraints are met, but the rest of the ordering is arbitrary.
+Iterable<BuilderDefinition> findBuilderOrder(
+    Iterable<BuilderDefinition> builders) {
+  Iterable<BuilderDefinition> dependencies(BuilderDefinition parent) =>
+      builders.where((child) =>
+          _hasInputDependency(parent, child) || _mustRunBefore(parent, child));
+  var components = stronglyConnectedComponents<BuilderDefinition>(
+    builders,
+    dependencies,
+    equals: (a, b) => a.key == b.key,
+    hashCode: (b) => b.key.hashCode,
+  );
+  return components.map((component) {
+    if (component.length > 1) {
+      throw ArgumentError('Required input cycle for ${component.toList()}');
+    }
+    return component.single;
+  }).toList();
+}
+
+/// Whether [parent] has a `required_input` that wants to read outputs produced
+/// by [child].
+bool _hasInputDependency(BuilderDefinition parent, BuilderDefinition child) {
+  final childOutputs = child.buildExtensions.values.expand((v) => v).toSet();
+  return parent.requiredInputs
+      .any((input) => childOutputs.any((output) => output.endsWith(input)));
+}
+
+/// Whether [child] specifies that it wants to run before [parent].
+bool _mustRunBefore(BuilderDefinition parent, BuilderDefinition child) =>
+    child.runsBefore.contains(parent.key);
diff --git a/build_runner/lib/src/daemon/asset_server.dart b/build_runner/lib/src/daemon/asset_server.dart
new file mode 100644
index 0000000..e434c5a
--- /dev/null
+++ b/build_runner/lib/src/daemon/asset_server.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+import '../server/server.dart';
+import 'daemon_builder.dart';
+
+class AssetServer {
+  HttpServer _server;
+
+  AssetServer._(this._server);
+
+  int get port => _server.port;
+
+  Future<void> stop() => _server.close(force: true);
+
+  static Future<AssetServer> run(
+    BuildRunnerDaemonBuilder builder,
+    String rootPackage,
+  ) async {
+    var server = await HttpServer.bind(InternetAddress.anyIPv6, 0);
+    var cascade = Cascade().add((_) async {
+      await builder.building;
+      return Response.notFound('');
+    }).add(AssetHandler(builder.reader, rootPackage).handle);
+    shelf_io.serveRequests(server, cascade.handler);
+    return AssetServer._(server);
+  }
+}
diff --git a/build_runner/lib/src/daemon/constants.dart b/build_runner/lib/src/daemon/constants.dart
new file mode 100644
index 0000000..dd8b244
--- /dev/null
+++ b/build_runner/lib/src/daemon/constants.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:build_daemon/constants.dart';
+import 'package:path/path.dart' as p;
+
+String assetServerPortFilePath(String workingDirectory) =>
+    p.join(daemonWorkspace(workingDirectory), '.asset_server_port');
diff --git a/build_runner/lib/src/daemon/daemon_builder.dart b/build_runner/lib/src/daemon/daemon_builder.dart
new file mode 100644
index 0000000..e192864
--- /dev/null
+++ b/build_runner/lib/src/daemon/daemon_builder.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:build/build.dart';
+import 'package:build_daemon/daemon_builder.dart';
+import 'package:build_daemon/data/build_status.dart' as daemon;
+import 'package:build_daemon/data/build_target.dart';
+import 'package:build_daemon/data/server_log.dart';
+import 'package:build_runner/src/entrypoint/options.dart';
+import 'package:build_runner/src/package_graph/build_config_overrides.dart';
+import 'package:build_runner/src/watcher/asset_change.dart';
+import 'package:build_runner/src/watcher/change_filter.dart';
+import 'package:build_runner/src/watcher/collect_changes.dart';
+import 'package:build_runner/src/watcher/delete_writer.dart';
+import 'package:build_runner/src/watcher/graph_watcher.dart';
+import 'package:build_runner/src/watcher/node_watcher.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/generate/build_impl.dart';
+import 'package:logging/logging.dart';
+import 'package:watcher/watcher.dart';
+
+/// A Daemon Builder that uses build_runner_core for building.
+class BuildRunnerDaemonBuilder implements DaemonBuilder {
+  final _buildResults = StreamController<daemon.BuildResults>();
+
+  final BuildImpl _builder;
+  final BuildOptions _buildOptions;
+  final StreamController<ServerLog> _outputStreamController;
+  final Stream<WatchEvent> _changes;
+
+  Completer<Null> _buildingCompleter;
+
+  @override
+  final Stream<ServerLog> logs;
+
+  BuildRunnerDaemonBuilder._(
+    this._builder,
+    this._buildOptions,
+    this._outputStreamController,
+    this._changes,
+  ) : logs = _outputStreamController.stream.asBroadcastStream();
+
+  /// Waits for a running build to complete before returning.
+  ///
+  /// If there is no running build, it will return immediately.
+  Future<void> get building => _buildingCompleter?.future;
+
+  @override
+  Stream<daemon.BuildResults> get builds => _buildResults.stream;
+
+  Stream<WatchEvent> get changes => _changes;
+
+  FinalizedReader get reader => _builder.finalizedReader;
+
+  @override
+  Future<void> build(
+      Set<BuildTarget> targets, Iterable<WatchEvent> fileChanges) async {
+    var changes = fileChanges
+        .map<AssetChange>(
+            (change) => AssetChange(AssetId.parse(change.path), change.type))
+        .toList();
+    var targetNames = targets.map((t) => t.target).toSet();
+    _logMessage(Level.INFO, 'About to build ${targetNames.toList()}...');
+    _signalStart(targetNames);
+    var results = <daemon.BuildResult>[];
+    try {
+      var mergedChanges = collectChanges([changes]);
+      var result =
+          await _builder.run(mergedChanges, buildDirs: targetNames.toList());
+      for (var target in targets) {
+        if (result.status == BuildStatus.success) {
+          // TODO(grouma) - Can we notify if a target was cached?
+          results.add(daemon.DefaultBuildResult((b) => b
+            ..status = daemon.BuildStatus.succeeded
+            ..target = target.target));
+        } else {
+          results.add(daemon.DefaultBuildResult((b) => b
+            ..status = daemon.BuildStatus.failed
+            // TODO(grouma) - We should forward the error messages instead.
+            // We can use the AssetGraph and FailureReporter to provide a better
+            // error message.
+            ..error = 'FailureType: ${result.failureType.exitCode}'
+            ..target = target.target));
+        }
+      }
+    } catch (e) {
+      for (var target in targets) {
+        results.add(daemon.DefaultBuildResult((b) => b
+          ..status = daemon.BuildStatus.failed
+          ..error = '$e'
+          ..target = target.target));
+      }
+      _logMessage(Level.SEVERE, 'Build Failed:\n${e.toString()}');
+    }
+    _signalEnd(results);
+  }
+
+  @override
+  Future<void> stop() async {
+    await _builder.beforeExit();
+    await _buildOptions.logListener.cancel();
+  }
+
+  void _logMessage(Level level, String message) =>
+      _outputStreamController.add(ServerLog(
+        (b) => b.log = '[$level] $message',
+      ));
+
+  void _signalEnd(Iterable<daemon.BuildResult> results) {
+    _buildingCompleter.complete();
+    _buildResults.add(daemon.BuildResults((b) => b..results.addAll(results)));
+  }
+
+  void _signalStart(Iterable<String> targets) {
+    _buildingCompleter = Completer();
+    var results = <daemon.BuildResult>[];
+    for (var target in targets) {
+      results.add(daemon.DefaultBuildResult((b) => b
+        ..status = daemon.BuildStatus.started
+        ..target = target));
+    }
+    _buildResults.add(daemon.BuildResults((b) => b..results.addAll(results)));
+  }
+
+  static Future<BuildRunnerDaemonBuilder> create(
+    PackageGraph packageGraph,
+    List<BuilderApplication> builders,
+    SharedOptions sharedOptions,
+  ) async {
+    var expectedDeletes = Set<AssetId>();
+    var outputStreamController = StreamController<ServerLog>();
+
+    var environment = OverrideableEnvironment(
+        IOEnvironment(packageGraph,
+            assumeTty: true,
+            // TODO(grouma) - This should likely moved to the build_impl command
+            // so that different daemon clients can output to different
+            // directories.
+            outputMap: sharedOptions.outputMap,
+            outputSymlinksOnly: sharedOptions.outputSymlinksOnly),
+        onLog: (record) {
+      outputStreamController.add(ServerLog((b) => b.log = record.toString()));
+    });
+
+    var daemonEnvironment = OverrideableEnvironment(environment,
+        writer: OnDeleteWriter(environment.writer, expectedDeletes.add));
+
+    var logSubscription =
+        LogSubscription(environment, verbose: sharedOptions.verbose);
+
+    var overrideBuildConfig =
+        await findBuildConfigOverrides(packageGraph, sharedOptions.configKey);
+
+    var buildOptions = await BuildOptions.create(
+      logSubscription,
+      packageGraph: packageGraph,
+      deleteFilesByDefault: sharedOptions.deleteFilesByDefault,
+      overrideBuildConfig: overrideBuildConfig,
+      skipBuildScriptCheck: sharedOptions.skipBuildScriptCheck,
+      enableLowResourcesMode: sharedOptions.enableLowResourcesMode,
+      trackPerformance: sharedOptions.trackPerformance,
+      logPerformanceDir: sharedOptions.logPerformanceDir,
+    );
+
+    var builder = await BuildImpl.create(buildOptions, daemonEnvironment,
+        builders, sharedOptions.builderConfigOverrides,
+        isReleaseBuild: sharedOptions.isReleaseBuild);
+
+    var graphEvents = PackageGraphWatcher(packageGraph,
+            watch: (node) => PackageNodeWatcher(node,
+                watch: (path) => Platform.isWindows
+                    ? PollingDirectoryWatcher(path)
+                    : DirectoryWatcher(path)))
+        .watch()
+        .where((change) => shouldProcess(
+              change,
+              builder.assetGraph,
+              buildOptions,
+              sharedOptions.outputMap?.isNotEmpty == true,
+              expectedDeletes,
+            ));
+
+    var changes =
+        graphEvents.map((data) => WatchEvent(data.type, '${data.id}'));
+
+    return BuildRunnerDaemonBuilder._(
+        builder, buildOptions, outputStreamController, changes);
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/base_command.dart b/build_runner/lib/src/entrypoint/base_command.dart
new file mode 100644
index 0000000..b48afaa
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/base_command.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:args/command_runner.dart';
+import 'package:logging/logging.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+
+import 'options.dart';
+import 'runner.dart';
+
+abstract class BuildRunnerCommand extends Command<int> {
+  Logger get logger => Logger(name);
+
+  List<BuilderApplication> get builderApplications =>
+      (runner as BuildCommandRunner).builderApplications;
+
+  PackageGraph get packageGraph => (runner as BuildCommandRunner).packageGraph;
+
+  BuildRunnerCommand({bool symlinksDefault}) {
+    _addBaseFlags(symlinksDefault ?? false);
+  }
+
+  void _addBaseFlags(bool symlinksDefault) {
+    argParser
+      ..addFlag(deleteFilesByDefaultOption,
+          help:
+              'By default, the user will be prompted to delete any files which '
+              'already exist but were not known to be generated by this '
+              'specific build script.\n\n'
+              'Enabling this option skips the prompt and deletes the files. '
+              'This should typically be used in continues integration servers '
+              'and tests, but not otherwise.',
+          negatable: false,
+          defaultsTo: false)
+      ..addFlag(lowResourcesModeOption,
+          help: 'Reduce the amount of memory consumed by the build process. '
+              'This will slow down builds but allow them to progress in '
+              'resource constrained environments.',
+          negatable: false,
+          defaultsTo: false)
+      ..addOption(configOption,
+          help: 'Read `build.<name>.yaml` instead of the default `build.yaml`',
+          abbr: 'c')
+      ..addFlag('fail-on-severe',
+          help: 'Deprecated argument - always enabled',
+          negatable: true,
+          defaultsTo: true,
+          hide: true)
+      ..addFlag(trackPerformanceOption,
+          help: r'Enables performance tracking and the /$perf page.',
+          negatable: true,
+          defaultsTo: false)
+      ..addOption(logPerformanceOption,
+          help: 'A directory to write performance logs to, must be in the '
+              'current package. Implies `--track-performance`.')
+      ..addFlag(skipBuildScriptCheckOption,
+          help: r'Skip validation for the digests of files imported by the '
+              'build script.',
+          hide: true,
+          defaultsTo: false)
+      ..addMultiOption(outputOption,
+          help: 'A directory to copy the fully built package to. Or a mapping '
+              'from a top-level directory in the package to the directory to '
+              'write a filtered build output to. For example "web:deploy".',
+          abbr: 'o')
+      ..addFlag(verboseOption,
+          abbr: 'v',
+          defaultsTo: false,
+          negatable: false,
+          help: 'Enables verbose logging.')
+      ..addFlag(releaseOption,
+          abbr: 'r',
+          defaultsTo: false,
+          negatable: true,
+          help: 'Build with release mode defaults for builders.')
+      ..addMultiOption(defineOption,
+          splitCommas: false,
+          help: 'Sets the global `options` config for a builder by key.')
+      ..addFlag(symlinkOption,
+          defaultsTo: symlinksDefault,
+          negatable: true,
+          help: 'Symlink files in the output directories, instead of copying.');
+  }
+
+  /// Must be called inside [run] so that [argResults] is non-null.
+  ///
+  /// You may override this to return more specific options if desired, but they
+  /// must extend [SharedOptions].
+  SharedOptions readOptions() {
+    return SharedOptions.fromParsedArgs(
+        argResults, argResults.rest, packageGraph.root.name, this);
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/build.dart b/build_runner/lib/src/entrypoint/build.dart
new file mode 100644
index 0000000..405104d
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/build.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+
+import '../generate/build.dart';
+import 'base_command.dart';
+
+/// A command that does a single build and then exits.
+class BuildCommand extends BuildRunnerCommand {
+  @override
+  String get invocation => '${super.invocation} [directories]';
+
+  @override
+  String get name => 'build';
+
+  @override
+  String get description =>
+      'Performs a single build on the specified targets and then exits.';
+
+  @override
+  Future<int> run() async {
+    var options = readOptions();
+    var result = await build(
+      builderApplications,
+      deleteFilesByDefault: options.deleteFilesByDefault,
+      enableLowResourcesMode: options.enableLowResourcesMode,
+      configKey: options.configKey,
+      outputMap: options.outputMap,
+      outputSymlinksOnly: options.outputSymlinksOnly,
+      packageGraph: packageGraph,
+      verbose: options.verbose,
+      builderConfigOverrides: options.builderConfigOverrides,
+      isReleaseBuild: options.isReleaseBuild,
+      trackPerformance: options.trackPerformance,
+      skipBuildScriptCheck: options.skipBuildScriptCheck,
+      buildDirs: options.buildDirs,
+      logPerformanceDir: options.logPerformanceDir,
+    );
+    if (result.status == BuildStatus.success) {
+      return ExitCode.success.code;
+    } else {
+      return result.failureType.exitCode;
+    }
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/clean.dart b/build_runner/lib/src/entrypoint/clean.dart
new file mode 100644
index 0000000..f9c3f8c
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/clean.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:args/command_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/asset_graph/graph.dart';
+import 'package:build_runner_core/src/asset_graph/node.dart';
+import 'package:logging/logging.dart';
+
+import '../logging/std_io_logging.dart';
+
+class CleanCommand extends Command<int> {
+  @override
+  String get name => 'clean';
+
+  @override
+  String get description =>
+      'Cleans up output from previous builds. Does not clean up --output '
+      'directories.';
+
+  Logger get logger => Logger(name);
+
+  @override
+  Future<int> run() async {
+    var logSubscription = Logger.root.onRecord.listen(stdIOLogListener());
+
+    logger.warning('Deleting cache and generated source files.\n'
+        'This shouldn\'t be necessary for most applications, unless you have '
+        'made intentional edits to generated files (i.e. for testing). '
+        'Consider filing a bug at '
+        'https://github.com/dart-lang/build/issues/new if you are using this '
+        'to work around an apparent (and reproducible) bug.');
+
+    await logTimedAsync(logger, 'Cleaning up source outputs', () async {
+      var assetGraphFile = File(assetGraphPath);
+      if (!assetGraphFile.existsSync()) {
+        logger.warning('No asset graph found. '
+            'Skipping cleanup of generated files in source directories.');
+        return;
+      }
+      AssetGraph assetGraph;
+      try {
+        assetGraph = AssetGraph.deserialize(await assetGraphFile.readAsBytes());
+      } catch (_) {
+        logger.warning('Failed to deserialize AssetGraph. '
+            'Skipping cleanup of generated files in source directories.');
+        return;
+      }
+      var packageGraph = PackageGraph.forThisPackage();
+      await cleanUpSourceOutputs(assetGraph, packageGraph);
+    });
+
+    await logTimedAsync(
+        logger, 'Cleaning up cache directory', cleanUpGeneratedDirectory);
+
+    await logSubscription.cancel();
+
+    return 0;
+  }
+}
+
+Future<void> cleanUpSourceOutputs(
+    AssetGraph assetGraph, PackageGraph packageGraph) async {
+  var writer = FileBasedAssetWriter(packageGraph);
+  for (var id in assetGraph.outputs) {
+    if (id.package != packageGraph.root.name) continue;
+    var node = assetGraph.get(id) as GeneratedAssetNode;
+    if (node.wasOutput) {
+      // Note that this does a file.exists check in the root package and
+      // only tries to delete the file if it exists. This way we only
+      // actually delete to_source outputs, without reading in the build
+      // actions.
+      await writer.delete(id);
+    }
+  }
+}
+
+Future<void> cleanUpGeneratedDirectory() async {
+  var generatedDir = Directory(cacheDir);
+  if (await generatedDir.exists()) {
+    await generatedDir.delete(recursive: true);
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/daemon.dart b/build_runner/lib/src/entrypoint/daemon.dart
new file mode 100644
index 0000000..8feca56
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/daemon.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:build_daemon/constants.dart';
+import 'package:build_daemon/src/daemon.dart';
+import 'package:build_runner/src/daemon/constants.dart';
+
+import '../daemon/asset_server.dart';
+import '../daemon/daemon_builder.dart';
+import 'base_command.dart';
+
+/// A command that starts the Build Daemon.
+class DaemonCommand extends BuildRunnerCommand {
+  @override
+  String get description => 'Starts the build daemon.';
+
+  @override
+  bool get hidden => true;
+
+  @override
+  String get name => 'daemon';
+
+  @override
+  Future<int> run() async {
+    var workingDirectory = Directory.current.path;
+    var options = readOptions();
+    var daemon = Daemon(workingDirectory);
+    var requestedOptions = argResults.arguments.toSet();
+    if (!daemon.tryGetLock()) {
+      var runningOptions = currentOptions(workingDirectory);
+      var version = runningVersion(workingDirectory);
+      if (version != currentVersion) {
+        stdout
+          ..writeln('Running Version: $version')
+          ..writeln('Current Version: $currentVersion')
+          ..writeln(versionSkew);
+        return 1;
+      } else if (!(runningOptions.length == requestedOptions.length &&
+          runningOptions.containsAll(requestedOptions))) {
+        stdout
+          ..writeln('Running Options: $runningOptions')
+          ..writeln('Requested Options: $requestedOptions')
+          ..writeln(optionsSkew);
+        return 1;
+      } else {
+        stdout.writeln('Daemon is already running.');
+        print(readyToConnectLog);
+        return 0;
+      }
+    } else {
+      stdout.writeln('Starting daemon...');
+      var builder = await BuildRunnerDaemonBuilder.create(
+        packageGraph,
+        builderApplications,
+        options,
+      );
+      // Forward server logs to daemon command STDIO.
+      var logSub =
+          builder.logs.listen((serverLog) => stdout.writeln(serverLog.log));
+      var server = await AssetServer.run(builder, packageGraph.root.name);
+      File(assetServerPortFilePath(workingDirectory))
+          .writeAsStringSync('${server.port}');
+      await daemon.start(requestedOptions, builder, builder.changes);
+      stdout.writeln(readyToConnectLog);
+      await logSub.cancel();
+      await daemon.onDone.whenComplete(() async {
+        await server.stop();
+      });
+      // Clients can disconnect from the daemon mid build.
+      // As a result we try to relinquish resources which can
+      // cause the build to hang. To ensure there are no ghost processes
+      // fast exit.
+      exit(0);
+    }
+    return 0;
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/options.dart b/build_runner/lib/src/entrypoint/options.dart
new file mode 100644
index 0000000..ae2cb4f
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/options.dart
@@ -0,0 +1,322 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:build_config/build_config.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as p;
+
+const defineOption = 'define';
+const deleteFilesByDefaultOption = 'delete-conflicting-outputs';
+const liveReloadOption = 'live-reload';
+const hotReloadOption = 'hot-reload';
+const logPerformanceOption = 'log-performance';
+const logRequestsOption = 'log-requests';
+const lowResourcesModeOption = 'low-resources-mode';
+const failOnSevereOption = 'fail-on-severe';
+const hostnameOption = 'hostname';
+const outputOption = 'output';
+const configOption = 'config';
+const verboseOption = 'verbose';
+const releaseOption = 'release';
+const trackPerformanceOption = 'track-performance';
+const skipBuildScriptCheckOption = 'skip-build-script-check';
+const symlinkOption = 'symlink';
+
+enum BuildUpdatesOption { none, liveReload, hotReload }
+
+final _defaultWebDirs = const ['web', 'test', 'example', 'benchmark'];
+
+/// Base options that are shared among all commands.
+class SharedOptions {
+  /// By default, the user will be prompted to delete any files which already
+  /// exist but were not generated by this specific build script.
+  ///
+  /// This option can be set to `true` to skip this prompt.
+  final bool deleteFilesByDefault;
+
+  final bool enableLowResourcesMode;
+
+  /// Read `build.$configKey.yaml` instead of `build.yaml`.
+  final String configKey;
+
+  /// A mapping of output paths to root input directory.
+  ///
+  /// If null, no directory will be created.
+  final Map<String, String> outputMap;
+
+  /// Whether or not the output directories should contain only symlinks,
+  /// or full copies of all files.
+  final bool outputSymlinksOnly;
+
+  /// Enables performance tracking and the `/$perf` page.
+  final bool trackPerformance;
+
+  /// A directory to log performance information to.
+  String logPerformanceDir;
+
+  /// Check digest of imports to the build script to invalidate the build.
+  final bool skipBuildScriptCheck;
+
+  final bool verbose;
+
+  // Global config overrides by builder.
+  //
+  // Keys are the builder keys, such as my_package|my_builder, and values
+  // represent config objects. All keys in the config will override the parsed
+  // config for that key.
+  final Map<String, Map<String, dynamic>> builderConfigOverrides;
+
+  final bool isReleaseBuild;
+
+  /// The directories that should be built.
+  final List<String> buildDirs;
+
+  SharedOptions._({
+    @required this.deleteFilesByDefault,
+    @required this.enableLowResourcesMode,
+    @required this.configKey,
+    @required this.outputMap,
+    @required this.outputSymlinksOnly,
+    @required this.trackPerformance,
+    @required this.skipBuildScriptCheck,
+    @required this.verbose,
+    @required this.builderConfigOverrides,
+    @required this.isReleaseBuild,
+    @required this.buildDirs,
+    @required this.logPerformanceDir,
+  });
+
+  factory SharedOptions.fromParsedArgs(ArgResults argResults,
+      Iterable<String> positionalArgs, String rootPackage, Command command) {
+    var outputMap = _parseOutputMap(argResults);
+    var buildDirs = _buildDirsFromOutputMap(outputMap);
+    for (var arg in positionalArgs) {
+      var parts = p.split(arg);
+      if (parts.length > 1) {
+        throw UsageException(
+            'Only top level directories are allowed as positional args',
+            command.usage);
+      }
+      buildDirs.add(arg);
+    }
+
+    return SharedOptions._(
+      deleteFilesByDefault: argResults[deleteFilesByDefaultOption] as bool,
+      enableLowResourcesMode: argResults[lowResourcesModeOption] as bool,
+      configKey: argResults[configOption] as String,
+      outputMap: outputMap,
+      outputSymlinksOnly: argResults[symlinkOption] as bool,
+      trackPerformance: argResults[trackPerformanceOption] as bool,
+      skipBuildScriptCheck: argResults[skipBuildScriptCheckOption] as bool,
+      verbose: argResults[verboseOption] as bool,
+      builderConfigOverrides:
+          _parseBuilderConfigOverrides(argResults[defineOption], rootPackage),
+      isReleaseBuild: argResults[releaseOption] as bool,
+      buildDirs: buildDirs.toList(),
+      logPerformanceDir: argResults[logPerformanceOption] as String,
+    );
+  }
+}
+
+/// Options specific to the `serve` command.
+class ServeOptions extends SharedOptions {
+  final String hostName;
+  final BuildUpdatesOption buildUpdates;
+  final bool logRequests;
+  final List<ServeTarget> serveTargets;
+
+  ServeOptions._({
+    @required this.hostName,
+    @required this.buildUpdates,
+    @required this.logRequests,
+    @required this.serveTargets,
+    @required bool deleteFilesByDefault,
+    @required bool enableLowResourcesMode,
+    @required String configKey,
+    @required Map<String, String> outputMap,
+    @required bool outputSymlinksOnly,
+    @required bool trackPerformance,
+    @required bool skipBuildScriptCheck,
+    @required bool verbose,
+    @required Map<String, Map<String, dynamic>> builderConfigOverrides,
+    @required bool isReleaseBuild,
+    @required List<String> buildDirs,
+    @required String logPerformanceDir,
+  }) : super._(
+          deleteFilesByDefault: deleteFilesByDefault,
+          enableLowResourcesMode: enableLowResourcesMode,
+          configKey: configKey,
+          outputMap: outputMap,
+          outputSymlinksOnly: outputSymlinksOnly,
+          trackPerformance: trackPerformance,
+          skipBuildScriptCheck: skipBuildScriptCheck,
+          verbose: verbose,
+          builderConfigOverrides: builderConfigOverrides,
+          isReleaseBuild: isReleaseBuild,
+          buildDirs: buildDirs,
+          logPerformanceDir: logPerformanceDir,
+        );
+
+  factory ServeOptions.fromParsedArgs(ArgResults argResults,
+      Iterable<String> positionalArgs, String rootPackage, Command command) {
+    var serveTargets = <ServeTarget>[];
+    var nextDefaultPort = 8080;
+    for (var arg in positionalArgs) {
+      var parts = arg.split(':');
+      var path = parts.first;
+      if (parts.length > 2) {
+        throw UsageException(
+            'Invalid format for positional argument to serve `$arg`'
+            ', expected <directory>:<port>.',
+            command.usage);
+      }
+      var port = parts.length == 2 ? int.tryParse(parts[1]) : nextDefaultPort++;
+      if (port == null) {
+        throw UsageException(
+            'Unable to parse port number in `$arg`', command.usage);
+      }
+      serveTargets.add(ServeTarget(path, port));
+    }
+    if (serveTargets.isEmpty) {
+      for (var dir in _defaultWebDirs) {
+        if (Directory(dir).existsSync()) {
+          serveTargets.add(ServeTarget(dir, nextDefaultPort++));
+        }
+      }
+    }
+
+    var outputMap = _parseOutputMap(argResults);
+    var buildDirs = _buildDirsFromOutputMap(outputMap)
+      ..addAll(serveTargets.map((t) => t.dir));
+
+    BuildUpdatesOption buildUpdates;
+    if (argResults[liveReloadOption] as bool &&
+        argResults[hotReloadOption] as bool) {
+      throw UsageException(
+          'Options --$liveReloadOption and --$hotReloadOption '
+          "can't both be used together",
+          command.usage);
+    } else if (argResults[liveReloadOption] as bool) {
+      buildUpdates = BuildUpdatesOption.liveReload;
+    } else if (argResults[hotReloadOption] as bool) {
+      buildUpdates = BuildUpdatesOption.hotReload;
+    }
+
+    return ServeOptions._(
+      hostName: argResults[hostnameOption] as String,
+      buildUpdates: buildUpdates,
+      logRequests: argResults[logRequestsOption] as bool,
+      serveTargets: serveTargets,
+      deleteFilesByDefault: argResults[deleteFilesByDefaultOption] as bool,
+      enableLowResourcesMode: argResults[lowResourcesModeOption] as bool,
+      configKey: argResults[configOption] as String,
+      outputMap: _parseOutputMap(argResults),
+      outputSymlinksOnly: argResults[symlinkOption] as bool,
+      trackPerformance: argResults[trackPerformanceOption] as bool,
+      skipBuildScriptCheck: argResults[skipBuildScriptCheckOption] as bool,
+      verbose: argResults[verboseOption] as bool,
+      builderConfigOverrides:
+          _parseBuilderConfigOverrides(argResults[defineOption], rootPackage),
+      isReleaseBuild: argResults[releaseOption] as bool,
+      buildDirs: buildDirs.toList(),
+      logPerformanceDir: argResults[logPerformanceOption] as String,
+    );
+  }
+}
+
+/// A target to serve, representing a directory and a port.
+class ServeTarget {
+  final String dir;
+  final int port;
+
+  ServeTarget(this.dir, this.port);
+}
+
+Set<String> _buildDirsFromOutputMap(Map<String, String> outputMap) =>
+    outputMap.values.where((v) => v != null).toSet();
+
+Map<String, Map<String, dynamic>> _parseBuilderConfigOverrides(
+    dynamic parsedArg, String rootPackage) {
+  final builderConfigOverrides = <String, Map<String, dynamic>>{};
+  if (parsedArg == null) return builderConfigOverrides;
+  var allArgs = parsedArg is List<String> ? parsedArg : [parsedArg as String];
+  for (final define in allArgs) {
+    final parts = define.split('=');
+    const expectedFormat = '--define "<builder_key>=<option>=<value>"';
+    if (parts.length < 3) {
+      throw ArgumentError.value(
+          define,
+          defineOption,
+          'Expected at least 2 `=` signs, should be of the format like '
+          '$expectedFormat');
+    } else if (parts.length > 3) {
+      var rest = parts.sublist(2);
+      parts
+        ..removeRange(2, parts.length)
+        ..add(rest.join('='));
+    }
+    final builderKey = normalizeBuilderKeyUsage(parts[0], rootPackage);
+    final option = parts[1];
+    dynamic value;
+    // Attempt to parse the value as JSON, and if that fails then treat it as
+    // a normal string.
+    try {
+      value = json.decode(parts[2]);
+    } on FormatException catch (_) {
+      value = parts[2];
+    }
+    final config = builderConfigOverrides.putIfAbsent(
+        builderKey, () => <String, dynamic>{});
+    if (config.containsKey(option)) {
+      throw ArgumentError(
+          'Got duplicate overrides for the same builder option: '
+          '$builderKey=$option. Only one is allowed.');
+    }
+    config[option] = value;
+  }
+  return builderConfigOverrides;
+}
+
+/// Returns a map of output directory to root input directory to be used
+/// for merging.
+///
+/// Each output option is split on `:` where the first value is the
+/// root input directory and the second value output directory.
+/// If no delimeter is provided the root input directory will be null.
+Map<String, String> _parseOutputMap(ArgResults argResults) {
+  var outputs = argResults[outputOption] as List<String>;
+  if (outputs == null) return null;
+  var result = <String, String>{};
+
+  void checkExisting(String outputDir) {
+    if (result.containsKey(outputDir)) {
+      throw ArgumentError.value(outputs.join(' '), '--output',
+          'Duplicate output directories are not allowed, got');
+    }
+  }
+
+  for (var option in argResults[outputOption] as List<String>) {
+    var split = option.split(':');
+    if (split.length == 1) {
+      var output = split.first;
+      checkExisting(output);
+      result[output] = null;
+    } else if (split.length >= 2) {
+      var output = split.sublist(1).join(':');
+      checkExisting(output);
+      var root = split.first;
+      if (root.contains('/')) {
+        throw ArgumentError.value(
+            option, '--output', 'Input root can not be nested');
+      }
+      result[output] = split.first;
+    }
+  }
+  return result;
+}
diff --git a/build_runner/lib/src/entrypoint/run.dart b/build_runner/lib/src/entrypoint/run.dart
new file mode 100644
index 0000000..3d76725
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/run.dart
@@ -0,0 +1,64 @@
+// 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:io';
+
+import 'package:args/command_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:io/ansi.dart' as ansi;
+import 'package:io/io.dart' show ExitCode;
+
+import 'runner.dart';
+
+/// A common entry point to parse command line arguments and build or serve with
+/// [builders].
+///
+/// Returns the exit code that should be set when the calling process exits. `0`
+/// implies success.
+Future<int> run(List<String> args, List<BuilderApplication> builders) async {
+  var runner = BuildCommandRunner(builders);
+  try {
+    var result = await runner.run(args);
+    return result ?? 0;
+  } on UsageException catch (e) {
+    print(ansi.red.wrap(e.message));
+    print('');
+    print(e.usage);
+    return ExitCode.usage.code;
+  } on ArgumentError catch (e) {
+    print(ansi.red.wrap(e.toString()));
+    return ExitCode.usage.code;
+  } on CannotBuildException {
+    // A message should have already been logged.
+    return ExitCode.config.code;
+  } on BuildScriptChangedException {
+    _deleteAssetGraph();
+    if (_runningFromSnapshot) _deleteSelf();
+    return ExitCode.tempFail.code;
+  } on BuildConfigChangedException {
+    return ExitCode.tempFail.code;
+  }
+}
+
+/// Deletes the asset graph for the current build script from disk.
+void _deleteAssetGraph() {
+  var graph = File(assetGraphPath);
+  if (graph.existsSync()) {
+    graph.deleteSync();
+  }
+}
+
+/// Deletes the current running script.
+///
+/// This should only happen if the current script is a snapshot, and it has
+/// been invalidated.
+void _deleteSelf() {
+  var self = File(Platform.script.toFilePath());
+  if (self.existsSync()) {
+    self.deleteSync();
+  }
+}
+
+bool get _runningFromSnapshot => !Platform.script.path.endsWith('.dart');
diff --git a/build_runner/lib/src/entrypoint/runner.dart b/build_runner/lib/src/entrypoint/runner.dart
new file mode 100644
index 0000000..0c0552d
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/runner.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:args/command_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+
+import 'build.dart';
+import 'clean.dart';
+import 'daemon.dart';
+import 'serve.dart';
+import 'test.dart';
+import 'watch.dart';
+
+/// Unified command runner for all build_runner commands.
+class BuildCommandRunner extends CommandRunner<int> {
+  final List<BuilderApplication> builderApplications;
+
+  final packageGraph = PackageGraph.forThisPackage();
+
+  BuildCommandRunner(List<BuilderApplication> builderApplications)
+      : builderApplications = List.unmodifiable(builderApplications),
+        super('build_runner', 'Unified interface for running Dart builds.') {
+    addCommand(DaemonCommand());
+    addCommand(BuildCommand());
+    addCommand(WatchCommand());
+    addCommand(ServeCommand());
+    addCommand(TestCommand(packageGraph));
+    addCommand(CleanCommand());
+  }
+
+  // CommandRunner._usageWithoutDescription is private – this is a reasonable
+  // facsimile.
+  /// Returns [usage] with [description] removed from the beginning.
+  String get usageWithoutDescription => LineSplitter.split(usage)
+      .skipWhile((line) => line == description || line.isEmpty)
+      .join('\n');
+}
diff --git a/build_runner/lib/src/entrypoint/serve.dart b/build_runner/lib/src/entrypoint/serve.dart
new file mode 100644
index 0000000..6d03f79
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/serve.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+import 'package:logging/logging.dart';
+import 'package:shelf/shelf_io.dart';
+
+import '../generate/build.dart';
+import '../logging/std_io_logging.dart';
+import '../server/server.dart';
+import 'options.dart';
+import 'watch.dart';
+
+/// Extends [WatchCommand] with dev server functionality.
+class ServeCommand extends WatchCommand {
+  ServeCommand() {
+    argParser
+      ..addOption(hostnameOption,
+          help: 'Specify the hostname to serve on', defaultsTo: 'localhost')
+      ..addFlag(logRequestsOption,
+          defaultsTo: false,
+          negatable: false,
+          help: 'Enables logging for each request to the server.')
+      ..addFlag(liveReloadOption,
+          defaultsTo: false,
+          negatable: false,
+          help: 'Enables automatic page reloading on rebuilds. '
+              "Can't be used together with --$hotReloadOption.")
+      ..addFlag(hotReloadOption,
+          defaultsTo: false,
+          negatable: false,
+          help: 'Enables automatic reloading of changed modules on rebuilds. '
+              "Can't be used together with --$liveReloadOption.");
+  }
+
+  @override
+  String get invocation => '${super.invocation} [<directory>[:<port>]]...';
+
+  @override
+  String get name => 'serve';
+
+  @override
+  String get description =>
+      'Runs a development server that serves the specified targets and runs '
+      'builds based on file system updates.';
+
+  @override
+  ServeOptions readOptions() => ServeOptions.fromParsedArgs(
+      argResults, argResults.rest, packageGraph.root.name, this);
+
+  @override
+  Future<int> run() async {
+    final servers = <ServeTarget, HttpServer>{};
+    return _runServe(servers).whenComplete(() async {
+      await Future.wait(
+          servers.values.map((server) => server.close(force: true)));
+    });
+  }
+
+  Future<int> _runServe(Map<ServeTarget, HttpServer> servers) async {
+    var options = readOptions();
+    try {
+      await Future.wait(options.serveTargets.map((target) async {
+        servers[target] = await _bindServer(options, target);
+      }));
+    } on SocketException catch (e) {
+      var listener = Logger.root.onRecord.listen(stdIOLogListener());
+      logger.severe(
+          'Error starting server at ${e.address.address}:${e.port}, address '
+          'is already in use. Please kill the server running on that port or '
+          'serve on a different port and restart this process.');
+      await listener.cancel();
+      return ExitCode.osError.code;
+    }
+
+    var handler = await watch(
+      builderApplications,
+      deleteFilesByDefault: options.deleteFilesByDefault,
+      enableLowResourcesMode: options.enableLowResourcesMode,
+      configKey: options.configKey,
+      outputMap: options.outputMap,
+      outputSymlinksOnly: options.outputSymlinksOnly,
+      packageGraph: packageGraph,
+      trackPerformance: options.trackPerformance,
+      skipBuildScriptCheck: options.skipBuildScriptCheck,
+      verbose: options.verbose,
+      builderConfigOverrides: options.builderConfigOverrides,
+      isReleaseBuild: options.isReleaseBuild,
+      buildDirs: options.buildDirs,
+      logPerformanceDir: options.logPerformanceDir,
+    );
+
+    if (handler == null) return ExitCode.config.code;
+
+    servers.forEach((target, server) {
+      serveRequests(
+          server,
+          handler.handlerFor(target.dir,
+              logRequests: options.logRequests,
+              buildUpdates: options.buildUpdates));
+    });
+
+    _ensureBuildWebCompilersDependency(packageGraph, logger);
+
+    final completer = Completer<int>();
+    handleBuildResultsStream(handler.buildResults, completer);
+    _logServerPorts(handler, options, logger);
+    return completer.future;
+  }
+
+  void _logServerPorts(
+      ServeHandler serveHandler, ServeOptions options, Logger logger) async {
+    await serveHandler.currentBuild;
+    // Warn if in serve mode with no servers.
+    if (options.serveTargets.isEmpty) {
+      logger.warning(
+          'Found no known web directories to serve, but running in `serve` '
+          'mode. You may expliclity provide a directory to serve with trailing '
+          'args in <dir>[:<port>] format.');
+    } else {
+      for (var target in options.serveTargets) {
+        stdout.writeln('Serving `${target.dir}` on '
+            'http://${options.hostName}:${target.port}');
+      }
+    }
+  }
+}
+
+Future<HttpServer> _bindServer(ServeOptions options, ServeTarget target) {
+  switch (options.hostName) {
+    case 'any':
+      // Listens on both IPv6 and IPv4
+      return HttpServer.bind(InternetAddress.anyIPv6, target.port);
+    case 'localhost':
+      return HttpMultiServer.loopback(target.port);
+    default:
+      return HttpServer.bind(options.hostName, target.port);
+  }
+}
+
+void _ensureBuildWebCompilersDependency(PackageGraph packageGraph, Logger log) {
+  if (!packageGraph.allPackages.containsKey('build_web_compilers')) {
+    log.warning('''
+    Missing dev dependency on package:build_web_compilers, which is required to serve Dart compiled to JavaScript.
+
+    Please update your dev_dependencies section of your pubspec.yaml:
+
+    dev_dependencies:
+      build_runner: any
+      build_test: any
+      build_web_compilers: any''');
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/test.dart b/build_runner/lib/src/entrypoint/test.dart
new file mode 100644
index 0000000..b669a1f
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:io';
+
+import 'package:args/command_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+import 'package:path/path.dart' as p;
+import 'package:pub_semver/pub_semver.dart';
+import 'package:pubspec_parse/pubspec_parse.dart';
+
+import '../generate/build.dart';
+import 'base_command.dart';
+import 'options.dart';
+
+/// A command that does a single build and then runs tests using the compiled
+/// assets.
+class TestCommand extends BuildRunnerCommand {
+  TestCommand(PackageGraph packageGraph)
+      : super(
+          // Use symlinks by default, if package:test supports it.
+          symlinksDefault:
+              _packageTestSupportsSymlinks(packageGraph) && !Platform.isWindows,
+        );
+
+  @override
+  String get invocation =>
+      '${super.invocation.replaceFirst('[arguments]', '[build-arguments]')} '
+      '[-- [test-arguments]]';
+
+  @override
+  String get name => 'test';
+
+  @override
+  String get description =>
+      'Performs a single build of the test directory only and then runs tests '
+      'using the compiled assets.';
+
+  @override
+  SharedOptions readOptions() {
+    // This command doesn't allow specifying directories to build, instead it
+    // always builds the `test` directory.
+    //
+    // Here we validate that [argResults.rest] is exactly equal to all the
+    // arguments after the `--`.
+    if (argResults.rest.isNotEmpty) {
+      void throwUsageException() {
+        throw UsageException(
+            'The `test` command does not support positional args before the, '
+            '`--` separator, which should separate build args from test args.',
+            usage);
+      }
+
+      var separatorPos = argResults.arguments.indexOf('--');
+      if (separatorPos < 0) {
+        throwUsageException();
+      }
+      var expectedRest = argResults.arguments.skip(separatorPos + 1).toList();
+      if (argResults.rest.length != expectedRest.length) {
+        throwUsageException();
+      }
+      for (var i = 0; i < argResults.rest.length; i++) {
+        if (expectedRest[i] != argResults.rest[i]) {
+          throwUsageException();
+        }
+      }
+    }
+
+    return SharedOptions.fromParsedArgs(
+        argResults, ['test'], packageGraph.root.name, this);
+  }
+
+  @override
+  Future<int> run() async {
+    SharedOptions options;
+    // We always run our tests in a temp dir.
+    var tempPath = Directory.systemTemp
+        .createTempSync('build_runner_test')
+        .absolute
+        .uri
+        .toFilePath();
+    try {
+      _ensureBuildTestDependency(packageGraph);
+      options = readOptions();
+      var outputMap = (options.outputMap ?? {})..addAll({tempPath: null});
+      var result = await build(
+        builderApplications,
+        deleteFilesByDefault: options.deleteFilesByDefault,
+        enableLowResourcesMode: options.enableLowResourcesMode,
+        configKey: options.configKey,
+        outputMap: outputMap,
+        outputSymlinksOnly: options.outputSymlinksOnly,
+        packageGraph: packageGraph,
+        trackPerformance: options.trackPerformance,
+        skipBuildScriptCheck: options.skipBuildScriptCheck,
+        verbose: options.verbose,
+        builderConfigOverrides: options.builderConfigOverrides,
+        isReleaseBuild: options.isReleaseBuild,
+        buildDirs: options.buildDirs,
+        logPerformanceDir: options.logPerformanceDir,
+      );
+
+      if (result.status == BuildStatus.failure) {
+        stdout.writeln('Skipping tests due to build failure');
+        return result.failureType.exitCode;
+      }
+
+      return await _runTests(tempPath);
+    } on _BuildTestDependencyError catch (e) {
+      stdout.writeln(e);
+      return ExitCode.config.code;
+    } finally {
+      // Clean up the output dir.
+      await Directory(tempPath).delete(recursive: true);
+    }
+  }
+
+  /// Runs tests using [precompiledPath] as the precompiled test directory.
+  Future<int> _runTests(String precompiledPath) async {
+    stdout.writeln('Running tests...\n');
+    var extraTestArgs = argResults.rest;
+    var testProcess = await Process.start(
+        pubBinary,
+        [
+          'run',
+          'test',
+          '--precompiled',
+          precompiledPath,
+        ]..addAll(extraTestArgs),
+        mode: ProcessStartMode.inheritStdio);
+    return testProcess.exitCode;
+  }
+}
+
+bool _packageTestSupportsSymlinks(PackageGraph packageGraph) {
+  var testPackage = packageGraph['test'];
+  if (testPackage == null) return false;
+  var pubspecPath = p.join(testPackage.path, 'pubspec.yaml');
+  var pubspec = Pubspec.parse(File(pubspecPath).readAsStringSync());
+  if (pubspec.version == null) return false;
+  return pubspec.version >= Version(1, 3, 0);
+}
+
+void _ensureBuildTestDependency(PackageGraph packageGraph) {
+  if (!packageGraph.allPackages.containsKey('build_test')) {
+    throw _BuildTestDependencyError();
+  }
+}
+
+class _BuildTestDependencyError extends StateError {
+  _BuildTestDependencyError() : super('''
+Missing dev dependency on package:build_test, which is required to run tests.
+
+Please update your dev_dependencies section of your pubspec.yaml:
+
+  dev_dependencies:
+    build_runner: any
+    build_test: any
+    # If you need to run web tests, you will also need this dependency.
+    build_web_compilers: any
+''');
+}
diff --git a/build_runner/lib/src/entrypoint/watch.dart b/build_runner/lib/src/entrypoint/watch.dart
new file mode 100644
index 0000000..8e6740a
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/watch.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+
+import '../generate/build.dart';
+import 'base_command.dart';
+
+/// A command that watches the file system for updates and rebuilds as
+/// appropriate.
+class WatchCommand extends BuildRunnerCommand {
+  @override
+  String get invocation => '${super.invocation} [directories]';
+
+  @override
+  String get name => 'watch';
+
+  @override
+  String get description =>
+      'Builds the specified targets, watching the file system for updates and '
+      'rebuilding as appropriate.';
+
+  @override
+  Future<int> run() async {
+    var options = readOptions();
+    var handler = await watch(
+      builderApplications,
+      deleteFilesByDefault: options.deleteFilesByDefault,
+      enableLowResourcesMode: options.enableLowResourcesMode,
+      configKey: options.configKey,
+      outputMap: options.outputMap,
+      outputSymlinksOnly: options.outputSymlinksOnly,
+      packageGraph: packageGraph,
+      trackPerformance: options.trackPerformance,
+      skipBuildScriptCheck: options.skipBuildScriptCheck,
+      verbose: options.verbose,
+      builderConfigOverrides: options.builderConfigOverrides,
+      isReleaseBuild: options.isReleaseBuild,
+      buildDirs: options.buildDirs,
+      logPerformanceDir: options.logPerformanceDir,
+    );
+    if (handler == null) return ExitCode.config.code;
+
+    final completer = Completer<int>();
+    handleBuildResultsStream(handler.buildResults, completer);
+    return completer.future;
+  }
+
+  /// Listens to [buildResults], handling certain types of errors and completing
+  /// [completer] appropriately.
+  void handleBuildResultsStream(
+      Stream<BuildResult> buildResults, Completer<int> completer) async {
+    var subscription = buildResults.listen((result) {
+      if (completer.isCompleted) return;
+      if (result.status == BuildStatus.failure) {
+        if (result.failureType == FailureType.buildScriptChanged) {
+          completer.completeError(BuildScriptChangedException());
+        } else if (result.failureType == FailureType.buildConfigChanged) {
+          completer.completeError(BuildConfigChangedException());
+        }
+      }
+    });
+    await subscription.asFuture();
+    if (!completer.isCompleted) completer.complete(ExitCode.success.code);
+  }
+}
diff --git a/build_runner/lib/src/generate/build.dart b/build_runner/lib/src/generate/build.dart
new file mode 100644
index 0000000..824e4f3
--- /dev/null
+++ b/build_runner/lib/src/generate/build.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:build/build.dart';
+import 'package:build_runner/src/generate/terminator.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:logging/logging.dart';
+import 'package:shelf/shelf.dart';
+import 'package:watcher/watcher.dart';
+
+import '../logging/std_io_logging.dart';
+import '../package_graph/build_config_overrides.dart';
+import '../server/server.dart';
+import 'watch_impl.dart' as watch_impl;
+
+/// Runs all of the BuilderApplications in [builders] once.
+///
+/// By default, the user will be prompted to delete any files which already
+/// exist but were not generated by this specific build script. The
+/// [deleteFilesByDefault] option can be set to `true` to skip this prompt.
+///
+/// A [packageGraph] may be supplied, otherwise one will be constructed using
+/// [PackageGraph.forThisPackage]. The default functionality assumes you are
+/// running in the root directory of a package, with both a `pubspec.yaml` and
+/// `.packages` file present.
+///
+/// A [reader] and [writer] may also be supplied, which can read/write assets
+/// to arbitrary locations or file systems. By default they will write directly
+/// to the root package directory, and will use the [packageGraph] to know where
+/// to read files from.
+///
+/// Logging may be customized by passing a custom [logLevel] below which logs
+/// will be ignored, as well as an [onLog] handler which defaults to [print].
+///
+/// The [terminateEventStream] is a stream which can send termination events.
+/// By default the [ProcessSignal.sigint] stream is used. In this mode, it
+/// will simply consume the first event and allow the build to continue.
+/// Multiple termination events will cause a normal shutdown.
+///
+/// If [outputMap] is supplied then after each build a merged output directory
+/// will be created for each value in the map which contains all original
+/// sources and built sources contained in the provided path.
+///
+/// If [outputSymlinksOnly] is `true`, then the merged output directories will
+/// contain only symlinks, which is much faster but not generally suitable for
+/// deployment.
+///
+/// If [verbose] is `true` then verbose logging will be enabled. This changes
+/// the default [logLevel] to [Level.ALL] and removes stack frame folding, among
+/// other things.
+Future<BuildResult> build(List<BuilderApplication> builders,
+    {bool deleteFilesByDefault,
+    bool assumeTty,
+    String configKey,
+    PackageGraph packageGraph,
+    RunnerAssetReader reader,
+    RunnerAssetWriter writer,
+    Resolvers resolvers,
+    Level logLevel,
+    onLog(LogRecord record),
+    Stream terminateEventStream,
+    bool enableLowResourcesMode,
+    Map<String, String> outputMap,
+    bool outputSymlinksOnly,
+    bool trackPerformance,
+    bool skipBuildScriptCheck,
+    bool verbose,
+    bool isReleaseBuild,
+    Map<String, Map<String, dynamic>> builderConfigOverrides,
+    List<String> buildDirs,
+    String logPerformanceDir}) async {
+  builderConfigOverrides ??= const {};
+  packageGraph ??= PackageGraph.forThisPackage();
+  var environment = OverrideableEnvironment(
+      IOEnvironment(
+        packageGraph,
+        assumeTty: assumeTty,
+        outputMap: outputMap,
+        outputSymlinksOnly: outputSymlinksOnly,
+      ),
+      reader: reader,
+      writer: writer,
+      onLog: onLog ?? stdIOLogListener(assumeTty: assumeTty, verbose: verbose));
+  var logSubscription =
+      LogSubscription(environment, verbose: verbose, logLevel: logLevel);
+  var options = await BuildOptions.create(
+    logSubscription,
+    deleteFilesByDefault: deleteFilesByDefault,
+    packageGraph: packageGraph,
+    skipBuildScriptCheck: skipBuildScriptCheck,
+    overrideBuildConfig:
+        await findBuildConfigOverrides(packageGraph, configKey),
+    enableLowResourcesMode: enableLowResourcesMode,
+    trackPerformance: trackPerformance,
+    logPerformanceDir: logPerformanceDir,
+    resolvers: resolvers,
+  );
+  var terminator = Terminator(terminateEventStream);
+  try {
+    var build = await BuildRunner.create(
+      options,
+      environment,
+      builders,
+      builderConfigOverrides,
+      isReleaseBuild: isReleaseBuild ?? false,
+    );
+    var result = await build.run({}, buildDirs: buildDirs);
+    await build?.beforeExit();
+    return result;
+  } finally {
+    await terminator.cancel();
+    await options.logListener.cancel();
+  }
+}
+
+/// Same as [build], except it watches the file system and re-runs builds
+/// automatically.
+///
+/// Call [ServeHandler.handlerFor] to create a [Handler] for use with
+/// `package:shelf`. Requests for assets will be blocked while builds are
+/// running then served with the latest version of the asset. Only source and
+/// generated assets can be served through this handler.
+///
+/// The [debounceDelay] controls how often builds will run. As long as files
+/// keep changing with less than that amount of time apart, builds will be put
+/// off.
+///
+/// The [directoryWatcherFactory] allows you to inject a way of creating custom
+/// `DirectoryWatcher`s. By default a normal `DirectoryWatcher` will be used.
+///
+/// The [terminateEventStream] is a stream which can send termination events.
+/// By default the [ProcessSignal.sigint] stream is used. In this mode, the
+/// first event will allow any ongoing builds to finish, and then the program
+/// will complete normally. Subsequent events are not handled (and will
+/// typically cause a shutdown).
+///
+/// If [outputMap] is supplied then after each build a merged output directory
+/// will be created for each value in the map which contains all original
+/// sources and built sources contained in the provided path.
+Future<ServeHandler> watch(List<BuilderApplication> builders,
+        {bool deleteFilesByDefault,
+        bool assumeTty,
+        String configKey,
+        PackageGraph packageGraph,
+        RunnerAssetReader reader,
+        RunnerAssetWriter writer,
+        Resolvers resolvers,
+        Level logLevel,
+        onLog(LogRecord record),
+        Duration debounceDelay,
+        DirectoryWatcher Function(String) directoryWatcherFactory,
+        Stream terminateEventStream,
+        bool enableLowResourcesMode,
+        Map<String, String> outputMap,
+        bool outputSymlinksOnly,
+        bool trackPerformance,
+        bool skipBuildScriptCheck,
+        bool verbose,
+        bool isReleaseBuild,
+        Map<String, Map<String, dynamic>> builderConfigOverrides,
+        List<String> buildDirs,
+        String logPerformanceDir}) =>
+    watch_impl.watch(
+      builders,
+      assumeTty: assumeTty,
+      deleteFilesByDefault: deleteFilesByDefault,
+      configKey: configKey,
+      packageGraph: packageGraph,
+      reader: reader,
+      writer: writer,
+      resolvers: resolvers,
+      logLevel: logLevel,
+      onLog: onLog,
+      debounceDelay: debounceDelay,
+      directoryWatcherFactory: directoryWatcherFactory,
+      terminateEventStream: terminateEventStream,
+      enableLowResourcesMode: enableLowResourcesMode,
+      outputMap: outputMap,
+      outputSymlinksOnly: outputSymlinksOnly,
+      trackPerformance: trackPerformance,
+      skipBuildScriptCheck: skipBuildScriptCheck,
+      verbose: verbose,
+      builderConfigOverrides: builderConfigOverrides,
+      isReleaseBuild: isReleaseBuild,
+      buildDirs: buildDirs,
+      logPerformanceDir: logPerformanceDir,
+    );
diff --git a/build_runner/lib/src/generate/directory_watcher_factory.dart b/build_runner/lib/src/generate/directory_watcher_factory.dart
new file mode 100644
index 0000000..11e9c7b
--- /dev/null
+++ b/build_runner/lib/src/generate/directory_watcher_factory.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.
+
+import 'dart:io';
+
+import 'package:watcher/watcher.dart';
+
+DirectoryWatcher defaultDirectoryWatcherFactory(String path) =>
+    // TODO: Use `DirectoryWatcher` on windows. See the following issues:
+    // - https://github.com/dart-lang/build/issues/1031
+    // - https://github.com/dart-lang/watcher/issues/52
+    Platform.isWindows ? PollingDirectoryWatcher(path) : DirectoryWatcher(path);
diff --git a/build_runner/lib/src/generate/terminator.dart b/build_runner/lib/src/generate/terminator.dart
new file mode 100644
index 0000000..da6c07f
--- /dev/null
+++ b/build_runner/lib/src/generate/terminator.dart
@@ -0,0 +1,38 @@
+// 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:io';
+
+/// Fires [shouldTerminate] once a `SIGINT` is intercepted.
+///
+/// The `SIGINT` stream can optionally be replaced with another Stream in the
+/// constructor. [cancel] should be called after work is finished. If multiple
+/// events are receieved on the terminate event stream before work is finished
+/// the process will be terminated with [exit].
+class Terminator {
+  /// A Future that fires when a signal has been received indicating that builds
+  /// should stop.
+  final Future shouldTerminate;
+  final StreamSubscription _subscription;
+
+  factory Terminator([Stream terminateEventStream]) {
+    var shouldTerminate = Completer();
+    terminateEventStream ??= ProcessSignal.sigint.watch();
+    var numEventsSeen = 0;
+    var terminateListener = terminateEventStream.listen((_) {
+      numEventsSeen++;
+      if (numEventsSeen == 1) {
+        shouldTerminate.complete();
+      } else {
+        exit(2);
+      }
+    });
+    return Terminator._(shouldTerminate.future, terminateListener);
+  }
+
+  Terminator._(this.shouldTerminate, this._subscription);
+
+  Future cancel() => _subscription.cancel();
+}
diff --git a/build_runner/lib/src/generate/watch_impl.dart b/build_runner/lib/src/generate/watch_impl.dart
new file mode 100644
index 0000000..8a898cc
--- /dev/null
+++ b/build_runner/lib/src/generate/watch_impl.dart
@@ -0,0 +1,343 @@
+// 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:build/build.dart';
+import 'package:build_config/build_config.dart';
+import 'package:build_runner/src/package_graph/build_config_overrides.dart';
+import 'package:build_runner/src/watcher/asset_change.dart';
+import 'package:build_runner/src/watcher/change_filter.dart';
+import 'package:build_runner/src/watcher/collect_changes.dart';
+import 'package:build_runner/src/watcher/delete_writer.dart';
+import 'package:build_runner/src/watcher/graph_watcher.dart';
+import 'package:build_runner/src/watcher/node_watcher.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/asset_graph/graph.dart';
+import 'package:build_runner_core/src/generate/build_impl.dart';
+import 'package:crypto/crypto.dart';
+import 'package:logging/logging.dart';
+import 'package:pedantic/pedantic.dart';
+import 'package:stream_transform/stream_transform.dart';
+import 'package:watcher/watcher.dart';
+
+import '../logging/std_io_logging.dart';
+import '../server/server.dart';
+import 'terminator.dart';
+
+final _logger = Logger('Watch');
+
+Future<ServeHandler> watch(
+  List<BuilderApplication> builders, {
+  bool deleteFilesByDefault,
+  bool assumeTty,
+  String configKey,
+  PackageGraph packageGraph,
+  RunnerAssetReader reader,
+  RunnerAssetWriter writer,
+  Resolvers resolvers,
+  Level logLevel,
+  onLog(LogRecord record),
+  Duration debounceDelay,
+  DirectoryWatcher Function(String) directoryWatcherFactory,
+  Stream terminateEventStream,
+  bool skipBuildScriptCheck,
+  bool enableLowResourcesMode,
+  Map<String, BuildConfig> overrideBuildConfig,
+  Map<String, String> outputMap,
+  bool outputSymlinksOnly,
+  bool trackPerformance,
+  bool verbose,
+  Map<String, Map<String, dynamic>> builderConfigOverrides,
+  bool isReleaseBuild,
+  List<String> buildDirs,
+  String logPerformanceDir,
+}) async {
+  builderConfigOverrides ??= const {};
+  packageGraph ??= PackageGraph.forThisPackage();
+
+  var environment = OverrideableEnvironment(
+      IOEnvironment(packageGraph,
+          assumeTty: assumeTty,
+          outputMap: outputMap,
+          outputSymlinksOnly: outputSymlinksOnly),
+      reader: reader,
+      writer: writer,
+      onLog: onLog ?? stdIOLogListener(assumeTty: assumeTty, verbose: verbose));
+  var logSubscription =
+      LogSubscription(environment, verbose: verbose, logLevel: logLevel);
+  overrideBuildConfig ??=
+      await findBuildConfigOverrides(packageGraph, configKey);
+  var options = await BuildOptions.create(
+    logSubscription,
+    deleteFilesByDefault: deleteFilesByDefault,
+    packageGraph: packageGraph,
+    overrideBuildConfig: overrideBuildConfig,
+    debounceDelay: debounceDelay,
+    skipBuildScriptCheck: skipBuildScriptCheck,
+    enableLowResourcesMode: enableLowResourcesMode,
+    trackPerformance: trackPerformance,
+    logPerformanceDir: logPerformanceDir,
+    resolvers: resolvers,
+  );
+  var terminator = Terminator(terminateEventStream);
+
+  var watch = _runWatch(
+      options,
+      environment,
+      builders,
+      builderConfigOverrides,
+      terminator.shouldTerminate,
+      directoryWatcherFactory,
+      configKey,
+      outputMap?.isNotEmpty == true,
+      buildDirs,
+      isReleaseMode: isReleaseBuild ?? false);
+
+  unawaited(watch.buildResults.drain().then((_) async {
+    await terminator.cancel();
+    await options.logListener.cancel();
+  }));
+
+  return createServeHandler(watch);
+}
+
+/// Repeatedly run builds as files change on disk until [until] fires.
+///
+/// Sets up file watchers and collects changes then triggers new builds. When
+/// [until] fires the file watchers will be stopped and up to one additional
+/// build may run if there were pending changes.
+///
+/// The [BuildState.buildResults] stream will end after the final build has been
+/// run.
+WatchImpl _runWatch(
+        BuildOptions options,
+        BuildEnvironment environment,
+        List<BuilderApplication> builders,
+        Map<String, Map<String, dynamic>> builderConfigOverrides,
+        Future until,
+        DirectoryWatcher Function(String) directoryWatcherFactory,
+        String configKey,
+        bool willCreateOutputDirs,
+        List<String> buildDirs,
+        {bool isReleaseMode = false}) =>
+    WatchImpl(options, environment, builders, builderConfigOverrides, until,
+        directoryWatcherFactory, configKey, willCreateOutputDirs, buildDirs,
+        isReleaseMode: isReleaseMode);
+
+class WatchImpl implements BuildState {
+  BuildImpl _build;
+
+  AssetGraph get assetGraph => _build?.assetGraph;
+
+  final _readyCompleter = Completer<Null>();
+  Future<Null> get ready => _readyCompleter.future;
+
+  final String _configKey; // may be null
+
+  /// Delay to wait for more file watcher events.
+  final Duration _debounceDelay;
+
+  /// Injectable factory for creating directory watchers.
+  final DirectoryWatcher Function(String) _directoryWatcherFactory;
+
+  /// Whether or not we will be creating any output directories.
+  ///
+  /// If not, then we don't care about source edits that don't have outputs.
+  final bool _willCreateOutputDirs;
+
+  /// Should complete when we need to kill the build.
+  final _terminateCompleter = Completer<Null>();
+
+  /// The [PackageGraph] for the current program.
+  final PackageGraph packageGraph;
+
+  /// The directories to build upon file changes.
+  final List<String> _buildDirs;
+
+  @override
+  Future<BuildResult> currentBuild;
+
+  /// Pending expected delete events from the build.
+  final Set<AssetId> _expectedDeletes = Set<AssetId>();
+
+  FinalizedReader _reader;
+  FinalizedReader get reader => _reader;
+
+  WatchImpl(
+      BuildOptions options,
+      BuildEnvironment environment,
+      List<BuilderApplication> builders,
+      Map<String, Map<String, dynamic>> builderConfigOverrides,
+      Future until,
+      this._directoryWatcherFactory,
+      this._configKey,
+      this._willCreateOutputDirs,
+      this._buildDirs,
+      {bool isReleaseMode = false})
+      : _debounceDelay = options.debounceDelay,
+        packageGraph = options.packageGraph {
+    buildResults = _run(
+            options, environment, builders, builderConfigOverrides, until,
+            isReleaseMode: isReleaseMode)
+        .asBroadcastStream();
+  }
+
+  @override
+  Stream<BuildResult> buildResults;
+
+  /// Runs a build any time relevant files change.
+  ///
+  /// Only one build will run at a time, and changes are batched.
+  ///
+  /// File watchers are scheduled synchronously.
+  Stream<BuildResult> _run(
+      BuildOptions options,
+      BuildEnvironment environment,
+      List<BuilderApplication> builders,
+      Map<String, Map<String, dynamic>> builderConfigOverrides,
+      Future until,
+      {bool isReleaseMode = false}) {
+    var watcherEnvironment = OverrideableEnvironment(environment,
+        writer: OnDeleteWriter(environment.writer, _expectedDeletes.add));
+    var firstBuildCompleter = Completer<BuildResult>();
+    currentBuild = firstBuildCompleter.future;
+    var controller = StreamController<BuildResult>();
+
+    Future<BuildResult> doBuild(List<List<AssetChange>> changes) async {
+      assert(_build != null);
+      _logger..info('${'-' * 72}\n')..info('Starting Build\n');
+      var mergedChanges = collectChanges(changes);
+
+      _expectedDeletes.clear();
+      if (!options.skipBuildScriptCheck) {
+        if (_build.buildScriptUpdates
+            .hasBeenUpdated(mergedChanges.keys.toSet())) {
+          _terminateCompleter.complete();
+          _logger.severe('Terminating builds due to build script update');
+          return BuildResult(BuildStatus.failure, [],
+              failureType: FailureType.buildScriptChanged);
+        }
+      }
+      return _build.run(mergedChanges, buildDirs: _buildDirs);
+    }
+
+    var terminate = Future.any([until, _terminateCompleter.future]).then((_) {
+      _logger.info('Terminating. No further builds will be scheduled\n');
+    });
+
+    Digest originalRootPackagesDigest;
+    final rootPackagesId = AssetId(packageGraph.root.name, '.packages');
+
+    // Start watching files immediately, before the first build is even started.
+    var graphWatcher = PackageGraphWatcher(packageGraph,
+        logger: _logger,
+        watch: (node) =>
+            PackageNodeWatcher(node, watch: _directoryWatcherFactory));
+    graphWatcher
+        .watch()
+        .asyncMap<AssetChange>((change) {
+          // Delay any events until the first build is completed.
+          if (firstBuildCompleter.isCompleted) return change;
+          return firstBuildCompleter.future.then((_) => change);
+        })
+        .asyncMap<AssetChange>((change) {
+          var id = change.id;
+          assert(originalRootPackagesDigest != null);
+          if (id == rootPackagesId) {
+            // Kill future builds if the root packages file changes.
+            return watcherEnvironment.reader
+                .readAsBytes(rootPackagesId)
+                .then((bytes) {
+              if (md5.convert(bytes) != originalRootPackagesDigest) {
+                _terminateCompleter.complete();
+                _logger
+                    .severe('Terminating builds due to package graph update, '
+                        'please restart the build.');
+              }
+              return change;
+            });
+          } else if (_isBuildYaml(id) ||
+              _isConfiguredBuildYaml(id) ||
+              _isPackageBuildYamlOverride(id)) {
+            controller.add(BuildResult(BuildStatus.failure, [],
+                failureType: FailureType.buildConfigChanged));
+
+            // Kill future builds if the build.yaml files change.
+            _terminateCompleter.complete();
+            _logger.severe(
+                'Terminating builds due to ${id.package}:${id.path} update.');
+          }
+          return change;
+        })
+        .where((change) {
+          assert(_readyCompleter.isCompleted);
+          return shouldProcess(
+            change,
+            assetGraph,
+            options,
+            _willCreateOutputDirs,
+            _expectedDeletes,
+          );
+        })
+        .transform(debounceBuffer(_debounceDelay))
+        .transform(takeUntil(terminate))
+        .transform(asyncMapBuffer((changes) => currentBuild = doBuild(changes)
+          ..whenComplete(() => currentBuild = null)))
+        .listen((BuildResult result) {
+          if (controller.isClosed) return;
+          controller.add(result);
+        })
+        .onDone(() async {
+          await currentBuild;
+          await _build?.beforeExit();
+          if (!controller.isClosed) await controller.close();
+          _logger.info('Builds finished. Safe to exit\n');
+        });
+
+    // Schedule the actual first build for the future so we can return the
+    // stream synchronously.
+    () async {
+      await logTimedAsync(_logger, 'Waiting for all file watchers to be ready',
+          () => graphWatcher.ready);
+      originalRootPackagesDigest = md5
+          .convert(await watcherEnvironment.reader.readAsBytes(rootPackagesId));
+
+      BuildResult firstBuild;
+      try {
+        _build = await BuildImpl.create(
+            options, watcherEnvironment, builders, builderConfigOverrides,
+            isReleaseBuild: isReleaseMode);
+
+        firstBuild = await _build.run({}, buildDirs: _buildDirs);
+      } on CannotBuildException {
+        _terminateCompleter.complete();
+
+        firstBuild = BuildResult(BuildStatus.failure, []);
+      } on BuildScriptChangedException {
+        _terminateCompleter.complete();
+
+        firstBuild = BuildResult(BuildStatus.failure, [],
+            failureType: FailureType.buildScriptChanged);
+      }
+
+      _reader = _build?.finalizedReader;
+      _readyCompleter.complete(null);
+      // It is possible this is already closed if the user kills the process
+      // early, which results in an exception without this check.
+      if (!controller.isClosed) controller.add(firstBuild);
+      firstBuildCompleter.complete(firstBuild);
+    }();
+
+    return controller.stream;
+  }
+
+  bool _isBuildYaml(AssetId id) => id.path == 'build.yaml';
+  bool _isConfiguredBuildYaml(AssetId id) =>
+      id.package == packageGraph.root.name &&
+      id.path == 'build.$_configKey.yaml';
+  bool _isPackageBuildYamlOverride(AssetId id) =>
+      id.package == packageGraph.root.name &&
+      id.path.contains(_packageBuildYamlRegexp);
+  final _packageBuildYamlRegexp = RegExp(r'^[a-z0-9_]+\.build\.yaml$');
+}
diff --git a/build_runner/lib/src/logging/std_io_logging.dart b/build_runner/lib/src/logging/std_io_logging.dart
new file mode 100644
index 0000000..be5b8b2
--- /dev/null
+++ b/build_runner/lib/src/logging/std_io_logging.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:io/ansi.dart';
+import 'package:logging/logging.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+Function(LogRecord) stdIOLogListener({bool assumeTty, bool verbose}) =>
+    (record) => overrideAnsiOutput(assumeTty == true || ansiOutputEnabled, () {
+          _stdIOLogListener(record, verbose: verbose ?? false);
+        });
+
+StringBuffer colorLog(LogRecord record, {bool verbose}) {
+  AnsiCode color;
+  if (record.level < Level.WARNING) {
+    color = cyan;
+  } else if (record.level < Level.SEVERE) {
+    color = yellow;
+  } else {
+    color = red;
+  }
+  final level = color.wrap('[${record.level}]');
+  final eraseLine = ansiOutputEnabled && !verbose ? '\x1b[2K\r' : '';
+  var lines = <Object>[
+    '$eraseLine$level ${_loggerName(record, verbose)}${record.message}'
+  ];
+
+  if (record.error != null) {
+    lines.add(record.error);
+  }
+
+  if (record.stackTrace != null && verbose) {
+    var trace = Trace.from(record.stackTrace).foldFrames((f) {
+      return f.package == 'build_runner' || f.package == 'build';
+    }, terse: true);
+
+    lines.add(trace);
+  }
+
+  var message = StringBuffer(lines.join('\n'));
+
+  // We always add an extra newline at the end of each message, so it
+  // isn't multiline unless we see > 2 lines.
+  var multiLine = LineSplitter.split(message.toString()).length > 2;
+
+  if (record.level > Level.INFO || !ansiOutputEnabled || multiLine || verbose) {
+    // Add an extra line to the output so the last line isn't written over.
+    message.writeln('');
+  }
+  return message;
+}
+
+void _stdIOLogListener(LogRecord record, {bool verbose}) =>
+    stdout.write(colorLog(record, verbose: verbose));
+
+/// Filter out the Logger names known to come from `build_runner` and splits the
+/// header for levels >= WARNING.
+String _loggerName(LogRecord record, bool verbose) {
+  var knownNames = const [
+    'ApplyBuilders',
+    'Bootstrap',
+    'Build',
+    'BuildConfigOverrides',
+    'BuildDefinition',
+    'BuildOptions',
+    'BuildScriptUpdates',
+    'CreateOutputDir',
+    'Entrypoint',
+    'Heartbeat',
+    'IOEnvironment',
+    'Serve',
+    'Watch',
+    'build_runner',
+    // commands
+    'build',
+    'clean',
+    'serve',
+    'test',
+    'watch',
+  ];
+  var maybeSplit = record.level >= Level.WARNING ? '\n' : '';
+  return verbose || !knownNames.contains(record.loggerName)
+      ? '${record.loggerName}:$maybeSplit'
+      : '';
+}
diff --git a/build_runner/lib/src/package_graph/build_config_overrides.dart b/build_runner/lib/src/package_graph/build_config_overrides.dart
new file mode 100644
index 0000000..64f6130
--- /dev/null
+++ b/build_runner/lib/src/package_graph/build_config_overrides.dart
@@ -0,0 +1,42 @@
+// 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:io';
+
+import 'package:build_config/build_config.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:glob/glob.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+final _log = Logger('BuildConfigOverrides');
+
+Future<Map<String, BuildConfig>> findBuildConfigOverrides(
+    PackageGraph packageGraph, String configKey) async {
+  final configs = <String, BuildConfig>{};
+  final configFiles = Glob('*.build.yaml').list();
+  await for (final file in configFiles) {
+    if (file is File) {
+      final packageName = p.basename(file.path).split('.').first;
+      final packageNode = packageGraph.allPackages[packageName];
+      final yaml = file.readAsStringSync();
+      final config = BuildConfig.parse(
+          packageName, packageNode.dependencies.map((n) => n.name), yaml);
+      configs[packageName] = config;
+    }
+  }
+  if (configKey != null) {
+    final file = File('build.$configKey.yaml');
+    if (!file.existsSync()) {
+      _log.warning('Cannot find build.$configKey.yaml for specified config.');
+      throw CannotBuildException();
+    }
+    final yaml = file.readAsStringSync();
+    final config = BuildConfig.parse(packageGraph.root.name,
+        packageGraph.root.dependencies.map((n) => n.name), yaml);
+    configs[packageGraph.root.name] = config;
+  }
+  return configs;
+}
diff --git a/build_runner/lib/src/server/README.md b/build_runner/lib/src/server/README.md
new file mode 100644
index 0000000..e40bb70
--- /dev/null
+++ b/build_runner/lib/src/server/README.md
@@ -0,0 +1,4 @@
+## Regenerating the graph_vis_main.dart.js{.map} files
+
+To regenerate these files, you should use the custom build script at
+`tool/build.dart`. This supports all the normal build_runner commands.
diff --git a/build_runner/lib/src/server/asset_graph_handler.dart b/build_runner/lib/src/server/asset_graph_handler.dart
new file mode 100644
index 0000000..78921e2
--- /dev/null
+++ b/build_runner/lib/src/server/asset_graph_handler.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+import 'dart:io';
+
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+import 'package:shelf/shelf.dart' as shelf;
+
+import 'package:build_runner_core/src/asset_graph/graph.dart';
+import 'package:build_runner_core/src/asset_graph/node.dart';
+import 'path_to_asset_id.dart';
+
+/// A handler for `/$graph` requests under a specific `rootDir`.
+class AssetGraphHandler {
+  final AssetReader _reader;
+  final String _rootPackage;
+  final AssetGraph _assetGraph;
+
+  AssetGraphHandler(this._reader, this._rootPackage, this._assetGraph);
+
+  /// Returns a response with the information about a specific node in the
+  /// graph.
+  ///
+  /// For an empty path, returns the HTML page to render the graph.
+  ///
+  /// For queries with `q=QUERY` will look for the assetNode referenced.
+  /// QUERY can be an [AssetId] or a path.
+  ///
+  /// [AssetId] as `package|path`
+  ///
+  /// path as:
+  /// - `packages/<package>/<path_under_lib>`
+  /// - `<path_under_root_package>`
+  /// - `<path_under_rootDir>`
+  ///
+  /// There may be some ambiguity between paths which are under the top-level of
+  /// the root package, and those which are under the rootDir. Preference is
+  /// given to the asset (if it exists) which is not under the implicit
+  /// `rootDir`. For instance if the request is `$graph/web/main.dart` this will
+  /// prefer to serve `<package>|web/main.dart`, but if it does not exist will
+  /// fall back to `<package>|web/web/main.dart`.
+  FutureOr<shelf.Response> handle(shelf.Request request, String rootDir) async {
+    switch (request.url.path) {
+      case '':
+        if (!request.url.hasQuery) {
+          return shelf.Response.ok(
+              await _reader.readAsString(
+                  AssetId('build_runner', 'lib/src/server/graph_viz.html')),
+              headers: {HttpHeaders.contentTypeHeader: 'text/html'});
+        }
+
+        var query = request.url.queryParameters['q']?.trim();
+        if (query != null && query.isNotEmpty) {
+          var filter = request.url.queryParameters['f']?.trim();
+          return _handleQuery(query, rootDir, filter: filter);
+        }
+        break;
+      case 'assets.json':
+        return _jsonResponse(_assetGraph.serialize());
+    }
+
+    return shelf.Response.notFound('Bad request: "${request.url}".');
+  }
+
+  Future<shelf.Response> _handleQuery(String query, String rootDir,
+      {String filter}) async {
+    var filterGlob = filter != null ? Glob(filter) : null;
+    var pipeIndex = query.indexOf('|');
+
+    AssetId assetId;
+    if (pipeIndex < 0) {
+      var querySplit = query.split('/');
+
+      assetId = pathToAssetId(
+          _rootPackage, querySplit.first, querySplit.skip(1).toList());
+
+      if (!_assetGraph.contains(assetId)) {
+        var secondTry = pathToAssetId(_rootPackage, rootDir, querySplit);
+
+        if (!_assetGraph.contains(secondTry)) {
+          return shelf.Response.notFound(
+              'Could not find asset for path "$query". Tried:\n'
+              '- $assetId\n'
+              '- $secondTry');
+        }
+        assetId = secondTry;
+      }
+    } else {
+      assetId = AssetId.parse(query);
+      if (!_assetGraph.contains(assetId)) {
+        return shelf.Response.notFound(
+            'Could not find asset in build graph: $assetId');
+      }
+    }
+    var node = _assetGraph.get(assetId);
+    var currentEdge = 0;
+    var nodes = [
+      {'id': '${node.id}', 'label': '${node.id}'}
+    ];
+    var edges = <Map<String, String>>[];
+    for (final output in node.outputs) {
+      if (filterGlob != null && !filterGlob.matches(output.toString())) {
+        continue;
+      }
+      edges.add(
+          {'from': '${node.id}', 'to': '$output', 'id': 'e${currentEdge++}'});
+      nodes.add({'id': '$output', 'label': '$output'});
+    }
+    if (node is NodeWithInputs) {
+      for (final input in node.inputs) {
+        if (filterGlob != null && !filterGlob.matches(input.toString())) {
+          continue;
+        }
+        edges.add(
+            {'from': '$input', 'to': '${node.id}', 'id': 'e${currentEdge++}'});
+        nodes.add({'id': '$input', 'label': '$input'});
+      }
+    }
+    var result = <String, dynamic>{
+      'primary': {
+        'id': '${node.id}',
+        'hidden': node is GeneratedAssetNode ? node.isHidden : null,
+        'state': node is NodeWithInputs ? '${node.state}' : null,
+        'wasOutput': node is GeneratedAssetNode ? node.wasOutput : null,
+        'isFailure': node is GeneratedAssetNode ? node.isFailure : null,
+        'phaseNumber': node is NodeWithInputs ? node.phaseNumber : null,
+        'type': node.runtimeType.toString(),
+        'glob': node is GlobAssetNode ? node.glob.pattern : null,
+        'lastKnownDigest': node.lastKnownDigest.toString(),
+      },
+      'edges': edges,
+      'nodes': nodes,
+    };
+    return _jsonResponse(_jsonUtf8Encoder.convert(result));
+  }
+}
+
+final _jsonUtf8Encoder = JsonUtf8Encoder();
+
+shelf.Response _jsonResponse(List<int> body) => shelf.Response.ok(body,
+    headers: {HttpHeaders.contentTypeHeader: 'application/json'});
diff --git a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart b/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart
new file mode 100644
index 0000000..a2b6e8b
--- /dev/null
+++ b/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@JS()
+library hot_reload_client;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart';
+
+import 'module.dart';
+import 'reload_handler.dart';
+import 'reloading_manager.dart';
+
+final _assetsDigestPath = r'$assetDigests';
+final _buildUpdatesProtocol = r'$buildUpdates';
+
+@anonymous
+@JS()
+abstract class HotReloadableLibrary {
+  /// Implement this function with any code to release resources before destroy.
+  ///
+  /// Any object returned from this function will be passed to update hooks. Use
+  /// it to save any state you need to be preserved between hot reloadings.
+  /// Try do not use any custom types here, as it might prevent their code from
+  /// reloading. Better serialise to JSON or plain types.
+  ///
+  /// This function will be called on old version of module before unloading.
+  @JS()
+  external Object hot$onDestroy();
+
+  /// Implement this function to handle update of the module itself.
+  ///
+  /// May return nullable bool. To indicate that reload completes successfully
+  /// return true. To indicate that hot-reload is undoable return false - this
+  /// will lead to full page reload. If null returned, reloading will be
+  /// propagated to parent.
+  ///
+  /// If any state was saved from previous version, it will be passed to [data].
+  ///
+  /// This function will be called on new version of module after reloading.
+  @JS()
+  external bool hot$onSelfUpdate([Object data]);
+
+  /// Implement this function to handle update of child modules.
+  ///
+  /// May return nullable bool. To indicate that reload of child completes
+  /// successfully return true. To indicate that hot-reload is undoable for this
+  /// child return false - this will lead to full page reload. If null returned,
+  /// reloading will be propagated to current module itself.
+  ///
+  /// The name of the child will be provided in [childId]. New version of child
+  /// module object will be provided in [child].
+  /// If any state was saved from previous version, it will be passed to [data].
+  ///
+  /// This function will be called on old version of module current after child
+  /// reloading.
+  @JS()
+  external bool hot$onChildUpdate(String childId, HotReloadableLibrary child,
+      [Object data]);
+}
+
+class LibraryWrapper implements Library {
+  final HotReloadableLibrary _internal;
+
+  LibraryWrapper(this._internal);
+
+  @override
+  Object onDestroy() {
+    if (_internal != null && hasProperty(_internal, r'hot$onDestroy')) {
+      return _internal.hot$onDestroy();
+    }
+    return null;
+  }
+
+  @override
+  bool onSelfUpdate([Object data]) {
+    if (_internal != null && hasProperty(_internal, r'hot$onSelfUpdate')) {
+      return _internal.hot$onSelfUpdate(data);
+    }
+    // ignore: avoid_returning_null
+    return null;
+  }
+
+  @override
+  bool onChildUpdate(String childId, Library child, [Object data]) {
+    if (_internal != null && hasProperty(_internal, r'hot$onChildUpdate')) {
+      return _internal.hot$onChildUpdate(
+          childId, (child as LibraryWrapper)._internal, data);
+    }
+    // ignore: avoid_returning_null
+    return null;
+  }
+}
+
+@JS('Map')
+abstract class JsMap<K, V> {
+  @JS()
+  external Object keys();
+
+  @JS()
+  external V get(K key);
+}
+
+@JS('Error')
+abstract class JsError {
+  @JS()
+  external String get message;
+
+  @JS()
+  external String get stack;
+}
+
+@anonymous
+@JS()
+class DartLoader {
+  @JS()
+  external JsMap<String, String> get urlToModuleId;
+
+  @JS()
+  external JsMap<String, List<String>> get moduleParentsGraph;
+
+  @JS()
+  external void forceLoadModule(String moduleId, void Function() callback,
+      void Function(JsError e) onError);
+
+  @JS()
+  external Object getModuleLibraries(String moduleId);
+}
+
+@JS(r'$dartLoader')
+external DartLoader get dartLoader;
+
+@JS('Array.from')
+external List _jsArrayFrom(Object any);
+
+@JS('Object.keys')
+external List _jsObjectKeys(Object any);
+
+@JS('Object.values')
+external List _jsObjectValues(Object any);
+
+List<K> keys<K, V>(JsMap<K, V> map) {
+  return List.from(_jsArrayFrom(map.keys()));
+}
+
+Module _moduleLibraries(String moduleId) {
+  var moduleObj = dartLoader.getModuleLibraries(moduleId);
+  if (moduleObj == null) {
+    throw HotReloadFailedException("Failed to get module '$moduleId'. "
+        "This error might appear if such module doesn't exist or isn't already loaded");
+  }
+  var moduleKeys = List<String>.from(_jsObjectKeys(moduleObj));
+  var moduleValues =
+      List<HotReloadableLibrary>.from(_jsObjectValues(moduleObj));
+  var moduleLibraries = moduleValues.map((x) => LibraryWrapper(x));
+  return Module(Map.fromIterables(moduleKeys, moduleLibraries));
+}
+
+Future<Module> _reloadModule(String moduleId) {
+  var completer = Completer<Module>();
+  var stackTrace = StackTrace.current;
+  dartLoader.forceLoadModule(moduleId, allowInterop(() {
+    completer.complete(_moduleLibraries(moduleId));
+  }),
+      allowInterop((e) => completer.completeError(
+          HotReloadFailedException(e.message), stackTrace)));
+  return completer.future;
+}
+
+void _reloadPage() {
+  window.location.reload();
+}
+
+main() async {
+  var currentOrigin = '${window.location.origin}/';
+  var modulePaths = keys(dartLoader.urlToModuleId)
+      .map((key) => key.replaceFirst(currentOrigin, ''))
+      .toList();
+  var modulePathsJson = json.encode(modulePaths);
+
+  var request = await HttpRequest.request('/$_assetsDigestPath',
+      responseType: 'json', sendData: modulePathsJson, method: 'POST');
+  var digests = (request.response as Map).cast<String, String>();
+
+  var manager = ReloadingManager(
+      _reloadModule,
+      _moduleLibraries,
+      _reloadPage,
+      (module) => dartLoader.moduleParentsGraph.get(module),
+      () => keys(dartLoader.moduleParentsGraph));
+
+  var handler = ReloadHandler(digests,
+      (path) => dartLoader.urlToModuleId.get(currentOrigin + path), manager);
+
+  var webSocket =
+      WebSocket('ws://${window.location.host}', [_buildUpdatesProtocol]);
+  webSocket.onMessage.listen((event) => handler.listener(event.data as String));
+}
diff --git a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map b/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map
new file mode 100644
index 0000000..6fc8649
--- /dev/null
+++ b/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map
@@ -0,0 +1,16 @@
+{
+  "version": 3,
+  "engine": "v2",
+  "file": "hot_reload_client.dart.js",
+  "sourceRoot": "",
+  "sources": ["org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_array.dart","org-dartlang-sdk:///sdk/lib/collection/list.dart","org-dartlang-sdk:///sdk/lib/core/comparable.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_string.dart","org-dartlang-sdk:///sdk/lib/internal/iterable.dart","org-dartlang-sdk:///sdk/lib/core/errors.dart","org-dartlang-sdk:///sdk/lib/internal/sort.dart","org-dartlang-sdk:///sdk/lib/internal/cast.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/internal_patch.dart","org-dartlang-sdk:///sdk/lib/internal/symbol.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_rti.dart","org-dartlang-sdk:///sdk/lib/core/exceptions.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_names.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_primitives.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_typed_data.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart","org-dartlang-sdk:///sdk/lib/async/future_impl.dart","org-dartlang-sdk:///sdk/lib/async/schedule_microtask.dart","org-dartlang-sdk:///sdk/lib/async/zone.dart","org-dartlang-sdk:///sdk/lib/async/stream.dart","org-dartlang-sdk:///sdk/lib/async/stream_impl.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart","org-dartlang-sdk:///sdk/lib/collection/hash_map.dart","org-dartlang-sdk:///sdk/lib/collection/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/maps.dart","org-dartlang-sdk:///sdk/lib/collection/splay_tree.dart","org-dartlang-sdk:///sdk/lib/collection/queue.dart","org-dartlang-sdk:///sdk/lib/collection/set.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart","org-dartlang-sdk:///sdk/lib/convert/json.dart","org-dartlang-sdk:///sdk/lib/core/map.dart","org-dartlang-sdk:///sdk/lib/core/print.dart","org-dartlang-sdk:///sdk/lib/core/date_time.dart","org-dartlang-sdk:///sdk/lib/core/iterable.dart","org-dartlang-sdk:///sdk/lib/core/null.dart","org-dartlang-sdk:///sdk/lib/core/string_buffer.dart","org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart","org-dartlang-sdk:///sdk/lib/html/html_common/conversions_dart2js.dart","org-dartlang-sdk:///sdk/lib/html/html_common/conversions.dart","org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart","hot_reload_client.dart","org-dartlang-sdk:///sdk/lib/collection/linked_hash_map.dart","module.dart","reloading_manager.dart","reload_handler.dart","../../../../graphs/src/strongly_connected_components.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/math_patch.dart","org-dartlang-sdk:///sdk/lib/async/future.dart"],
+  "names": ["makeDispatchRecord","getNativeInterceptor","Interceptor.==","Interceptor.hashCode","Interceptor.toString","Interceptor.noSuchMethod","JSBool.toString","JSBool.hashCode","JSNull.==","JSNull.toString","JSNull.hashCode","JSNull.noSuchMethod","JavaScriptObject.hashCode","JavaScriptObject.toString","JavaScriptFunction.toString","JSArray.add","JSArray.addAll","JSArray.elementAt","JSArray.setRange","JSArray.setRange[function-entry$3]","JSArray.sort","JSArray.isEmpty","JSArray.isNotEmpty","JSArray.toString","JSArray.iterator","JSArray.hashCode","JSArray.length","JSArray.[]","JSArray.[]=","JSArray.+","JSArray.markFixed","JSArray.markFixedList","JSArray._compareAny","ArrayIterator.current","ArrayIterator.moveNext","JSNumber.compareTo","JSNumber.isNegative","JSNumber.toString","JSNumber.hashCode","JSNumber.+","JSNumber._tdivFast","JSNumber._tdivSlow","JSNumber._shrOtherPositive","JSNumber._shrBothPositive","JSNumber.>","JSString._codeUnitAt","JSString.+","JSString.substring","JSString.substring[function-entry$1]","JSString.isEmpty","JSString.compareTo","JSString.toString","JSString.hashCode","JSString.length","IterableElementError.noElement","IterableElementError.tooFew","Sort.sort","Sort._doSort","Sort._insertionSort","Sort._dualPivotQuicksort","_CastIterableBase.iterator","_CastIterableBase.length","_CastIterableBase.isEmpty","_CastIterableBase.contains","_CastIterableBase.toString","CastIterator.moveNext","CastIterator.current","CastIterable","CastMap.cast","CastMap.containsKey","CastMap.[]","CastMap.[]=","CastMap.forEach","CastMap.keys","CastMap.length","CastMap.isEmpty","CastMap.forEach.<anonymous function>","CastMap_forEach_closure","ListIterable.iterator","ListIterable.isEmpty","ListIterable.contains","ListIterable.toList","ListIterable.toList[function-entry$0]","ListIterator.current","ListIterator.moveNext","MappedListIterable.length","MappedListIterable.elementAt","Symbol.hashCode","Symbol.toString","Symbol.==","ConstantMap._throwUnmodifiable","unminifyOrTag","getType","isJsIndexable","S","Primitives.objectHashCode","Primitives.objectTypeName","Primitives._objectClassName","Primitives.stringFromCharCode","Primitives.lazyAsJsDate","Primitives.getYear","Primitives.getMonth","Primitives.getDay","Primitives.getHours","Primitives.getMinutes","Primitives.getSeconds","Primitives.getMilliseconds","Primitives.functionNoSuchMethod","createUnmangledInvocationMirror","Primitives.applyFunctionWithPositionalArguments","Primitives._genericApplyFunctionWithPositionalArguments","ioore","diagnoseIndexError","argumentErrorValue","checkNum","wrapException","toStringWrapper","throwExpression","throwConcurrentModificationError","unwrapException","getTraceFromException","invokeClosure","Exception","convertDartClosureToJS","Closure.fromTearOff","Closure.cspForwardCall","Closure.forwardCallTo","Closure.cspForwardInterceptedCall","Closure.forwardInterceptedCallTo","closureFromTearOff","stringTypeCast","propertyTypeCastError","interceptedTypeCast","extractFunctionTypeObjectFromInternal","functionTypeTest","_typeDescription","throwCyclicInit","getIsolateAffinityTag","setRuntimeTypeInfo","getRuntimeTypeInfo","getRuntimeTypeArguments","getRuntimeTypeArgumentIntercepted","getRuntimeTypeArgument","getTypeArgumentByIndex","runtimeTypeToString","_runtimeTypeToString","_functionRtiToString","_joinArguments","StringBuffer.write","substitute","checkSubtype","subtypeCast","Primitives.formatType","areSubtypes","computeSignature","isSupertypeOfNullRecursive","checkSubtypeOfRuntimeType","subtypeOfRuntimeTypeCast","_isSubtype","_isFunctionSubtype","namedParametersSubtypeCheck","defineProperty","lookupAndCacheInterceptor","patchProto","patchInteriorProto","makeLeafDispatchRecord","makeDefaultDispatchRecord","initNativeDispatch","initNativeDispatchContinue","initHooks","applyHooksTransformer","stringReplaceFirstUnchecked","stringReplaceRangeUnchecked","ConstantMap.cast","ConstantMap.isEmpty","ConstantMap.toString","ConstantMap.[]=","ConstantStringMap.length","ConstantStringMap.containsKey","ConstantStringMap.[]","ConstantStringMap._fetch","ConstantStringMap.forEach","ConstantStringMap.keys","_ConstantMapKeyIterable.iterator","_ConstantMapKeyIterable.length","JSInvocationMirror.memberName","JSInvocationMirror.positionalArguments","JSInvocationMirror.namedArguments","JsLinkedHashMap.es6","ReflectionInfo.defaultValue","ReflectionInfo","Primitives.functionNoSuchMethod.<anonymous function>","TypeErrorDecoder.matchTypeError","TypeErrorDecoder.extractPattern","TypeErrorDecoder.provokeCallErrorOn","TypeErrorDecoder.provokePropertyErrorOn","NullError.toString","NullError","JsNoSuchMethodError.toString","JsNoSuchMethodError","UnknownJsTypeError.toString","unwrapException.saveStackTrace","_StackTrace.toString","Closure.toString","StaticClosure.toString","BoundClosure.==","BoundClosure.hashCode","BoundClosure.toString","BoundClosure.selfOf","BoundClosure.receiverOf","BoundClosure.computeFieldNamed","CastErrorImplementation.toString","CastErrorImplementation","RuntimeError.toString","RuntimeError","JsLinkedHashMap.length","JsLinkedHashMap.isEmpty","JsLinkedHashMap.keys","JsLinkedHashMap.containsKey","JsLinkedHashMap.internalContainsKey","JsLinkedHashMap.[]","JsLinkedHashMap.internalGet","JsLinkedHashMap.[]=","JsLinkedHashMap.internalSet","JsLinkedHashMap.clear","JsLinkedHashMap.forEach","JsLinkedHashMap._addHashTableEntry","JsLinkedHashMap._modified","JsLinkedHashMap._newLinkedCell","JsLinkedHashMap.internalComputeHashCode","JsLinkedHashMap.internalFindBucketIndex","JsLinkedHashMap.toString","JsLinkedHashMap._getTableCell","JsLinkedHashMap._getTableBucket","JsLinkedHashMap._setTableEntry","JsLinkedHashMap._deleteTableEntry","JsLinkedHashMap._containsTableEntry","JsLinkedHashMap._newHashTable","LinkedHashMapKeyIterable.length","LinkedHashMapKeyIterable.isEmpty","LinkedHashMapKeyIterable.iterator","LinkedHashMapKeyIterator","LinkedHashMapKeyIterable.contains","LinkedHashMapKeyIterator.current","LinkedHashMapKeyIterator.moveNext","initHooks.<anonymous function>","extractKeys","printString","_checkValidIndex","NativeTypedArray.length","NativeTypedArrayOfDouble.[]","NativeTypedArrayOfDouble.[]=","NativeTypedArrayOfInt.[]=","NativeInt16List.[]","NativeInt32List.[]","NativeInt8List.[]","NativeUint16List.[]","NativeUint32List.[]","NativeUint8ClampedList.length","NativeUint8ClampedList.[]","NativeUint8List.length","NativeUint8List.[]","_AsyncRun._initializeScheduleImmediate","_AsyncRun._scheduleImmediateJsOverride","_AsyncRun._scheduleImmediateWithSetImmediate","_AsyncRun._scheduleImmediateWithTimer","_makeAsyncAwaitCompleter","Completer.sync","_Completer.future","_asyncStartSync","_asyncAwait","_asyncReturn","_asyncRethrow","_awaitOnObject","_wrapJsFunctionForAsync","_registerErrorHandler","_microtaskLoop","_startMicrotaskLoop","_scheduleAsyncCallback","_schedulePriorityAsyncCallback","scheduleMicrotask","StreamIterator","_rootHandleUncaughtError","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_AsyncRun._initializeScheduleImmediate.internalCallback","_AsyncRun._initializeScheduleImmediate.<anonymous function>","_AsyncRun._scheduleImmediateJsOverride.internalCallback","_AsyncRun._scheduleImmediateWithSetImmediate.internalCallback","_TimerImpl","_TimerImpl.internalCallback","_AsyncAwaitCompleter.complete","_AsyncAwaitCompleter.completeError","_AsyncAwaitCompleter.complete.<anonymous function>","_AsyncAwaitCompleter.completeError.<anonymous function>","_awaitOnObject.<anonymous function>","_wrapJsFunctionForAsync.<anonymous function>","_Completer.completeError","_nonNullError","_Completer.completeError[function-entry$1]","_AsyncCompleter.complete","_AsyncCompleter.complete[function-entry$0]","_AsyncCompleter._completeError","_SyncCompleter.complete","_SyncCompleter.complete[function-entry$0]","_SyncCompleter._completeError","_FutureListener.matchesErrorTest","_FutureListener.handleError","_Future.then","_Future.then[function-entry$1]","_Future._thenNoZoneRegistration","_Future._addListener","_Future._prependListeners","_Future._removeListeners","_Future._reverseListeners","_Future._complete","_Future._completeError","_Future._setError","_Future._asyncComplete","_Future._chainFuture","_Future._asyncCompleteError","_Future._chainForeignFuture","_Future._chainCoreFuture","_Future._propagateToListeners","_Future._addListener.<anonymous function>","_Future._prependListeners.<anonymous function>","_Future._chainForeignFuture.<anonymous function>","_Future._chainForeignFuture[function-entry$1].<anonymous function>","_Future._asyncComplete.<anonymous function>","_Future._completeWithValue","_Future._chainFuture.<anonymous function>","_Future._asyncCompleteError.<anonymous function>","_Future._propagateToListeners.handleWhenCompleteCallback","_Future._propagateToListeners.handleWhenCompleteCallback.<anonymous function>","_Future._propagateToListeners.handleValueCallback","_Future._propagateToListeners.handleError","AsyncError.toString","_rootHandleUncaughtError.<anonymous function>","_RootZone.runGuarded","_RootZone.runUnaryGuarded","_RootZone.runUnaryGuarded[function-entry$2]","_RootZone.bindCallback","_RootZone.bindCallback[function-entry$1]","_RootZone.bindCallbackGuarded","_RootZone.bindUnaryCallbackGuarded","_RootZone.run","_RootZone.run[function-entry$1]","_RootZone.runUnary","_RootZone.runUnary[function-entry$2]","_RootZone.runBinary","_RootZone.runBinary[function-entry$3]","_RootZone.registerBinaryCallback","_RootZone.registerBinaryCallback[function-entry$1]","_RootZone.bindCallback.<anonymous function>","_RootZone.bindCallbackGuarded.<anonymous function>","_RootZone.bindUnaryCallbackGuarded.<anonymous function>","_RootZone_bindUnaryCallbackGuarded_closure","HashMap","LinkedHashMap","LinkedHashMap._empty","LinkedHashMap._makeEmpty","HashSet","_defaultHashCode","IterableBase.iterableToShortString","IterableBase.iterableToFullString","_isToStringVisiting","_iterablePartsToStrings","MapBase.mapToString","MapBase._fillMapWithIterables","_HashMap.length","_HashMap.isEmpty","_HashMap.keys","_HashMap.containsKey","_HashMap._containsKey","_HashMap.[]","_HashMap._get","_HashMap.[]=","_HashMap._set","_HashMap.forEach","_HashMap._computeKeys","_HashMap._addHashTableEntry","_HashMap._computeHashCode","_HashMap._getBucket","_HashMap._findBucketIndex","_HashMap._getTableEntry","_HashMap._setTableEntry","_HashMap._newHashTable","_CustomHashMap.[]","_CustomHashMap.[]=","_CustomHashMap.containsKey","_CustomHashMap._computeHashCode","_CustomHashMap._findBucketIndex","_CustomHashMap","_CustomHashMap.<anonymous function>","_HashMapKeyIterable.length","_HashMapKeyIterable.isEmpty","_HashMapKeyIterable.iterator","_HashMapKeyIterable.contains","_HashMapKeyIterator.current","_HashMapKeyIterator.moveNext","_HashSet.iterator","_HashSet.length","_HashSet.isEmpty","_HashSet.contains","_HashSet._contains","_HashSet.add","_HashSet._add","_HashSet.remove","_HashSet._remove","_HashSet._computeElements","_HashSet._addHashTableEntry","_HashSet._removeHashTableEntry","_HashSet._computeHashCode","_HashSet._getBucket","_HashSet._findBucketIndex","_HashSet._newHashTable","_CustomHashSet._findBucketIndex","_CustomHashSet._computeHashCode","_CustomHashSet.add","_CustomHashSet.contains","_CustomHashSet.remove","_CustomHashSet","_CustomHashSet.<anonymous function>","_HashSetIterator.current","_HashSetIterator.moveNext","IterableMixin.length","SplayTreeSet.iterator","_SplayTreeIterator","IterableMixin.isEmpty","IterableMixin.toString","ListMixin.iterator","ListMixin.elementAt","ListMixin.isEmpty","ListMixin.isNotEmpty","ListMixin.sort","ListMixin.+","ListMixin.toString","MapBase.mapToString.<anonymous function>","MapMixin.cast","MapMixin.forEach","MapMixin.containsKey","MapMixin.length","MapMixin.isEmpty","MapMixin.toString","_UnmodifiableMapMixin.[]=","MapView.cast","MapView.[]","MapView.containsKey","MapView.forEach","MapView.isEmpty","MapView.length","MapView.keys","MapView.toString","UnmodifiableMapView.cast","ListQueue.iterator","ListQueue.isEmpty","ListQueue.length","ListQueue.elementAt","ListQueue.toString","_ListQueueIterator.current","_ListQueueIterator.moveNext","SetMixin.isEmpty","SetMixin.toString","_SplayTree._splay","_SplayTree._splayMin","_SplayTree._splayMax","_SplayTree._remove","_SplayTree._addNewRoot","_SplayTree._first","_SplayTreeIterator.current","_SplayTreeIterator._findLeftMostDescendent","_SplayTreeIterator.moveNext","_SplayTreeIterator._rebuildWorkList","SplayTreeSet.length","SplayTreeSet.isEmpty","SplayTreeSet.add","SplayTreeSet.remove","SplayTreeSet.addAll","SplayTreeSet.toString","SplayTreeSet","SplayTreeSet._dummy","SplayTreeSet.<anonymous function>","_parseJson","_convertJsonToDartLazy","_defaultToEncodable","_JsonMap.[]","_JsonMap.length","_JsonMap.isEmpty","_JsonMap.keys","_JsonMap.[]=","_JsonMap.containsKey","_JsonMap.forEach","_JsonMap._computeKeys","_JsonMap._upgrade","_JsonMap._process","_JsonMapKeyIterable.length","_JsonMapKeyIterable.elementAt","_JsonMapKeyIterable.iterator","_JsonMapKeyIterable.contains","JsonUnsupportedObjectError.toString","JsonUnsupportedObjectError","JsonCyclicError.toString","JsonCodec.decode","JsonCodec.decode[function-entry$1]","JsonCodec.encode","JsonCodec.encode[function-entry$1]","JsonCodec.encoder","JsonCodec.decoder","_JsonStringifier.writeStringContent","StringBuffer.writeCharCode","_JsonStringStringifier.writeString","_JsonStringifier._checkCycle","_JsonStringifier.writeObject","_JsonStringifier.writeJsonValue","_JsonStringifier.writeList","_JsonStringifier.writeMap","_JsonStringifier.writeMap.<anonymous function>","_JsonStringStringifier._partialResult","_JsonStringStringifier.stringify","_JsonStringStringifier.printOn","_JsonStringStringifier","Error._objectToString","List.from","StackTrace.current","Error.safeToString","Map.castFrom","print","NoSuchMethodError.toString.<anonymous function>","DateTime.==","DateTime.compareTo","DateTime.hashCode","DateTime.toString","DateTime._fourDigits","DateTime._threeDigits","DateTime._twoDigits","NullThrownError.toString","ArgumentError._errorName","ArgumentError._errorExplanation","ArgumentError.toString","ArgumentError","ArgumentError.value","RangeError._errorName","RangeError._errorExplanation","RangeError.value","RangeError.range","RangeError.checkValidRange","IndexError._errorName","IndexError._errorExplanation","IndexError","NoSuchMethodError.toString","NoSuchMethodError","UnsupportedError.toString","UnsupportedError","UnimplementedError.toString","UnimplementedError","StateError.toString","StateError","ConcurrentModificationError.toString","ConcurrentModificationError","StackOverflowError.toString","CyclicInitializationError.toString","_Exception.toString","FormatException.toString","Iterable.contains","Iterable.length","Iterable.isEmpty","Iterable.elementAt","Iterable.toString","Null.hashCode","Null.toString","Object.==","Object.hashCode","Object.toString","Object.noSuchMethod","StringBuffer.length","StringBuffer.toString","StringBuffer.isEmpty","StringBuffer._writeAll","HttpRequest.request","Completer","WebSocket","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","convertNativeToDart_SerializedScriptValue","_wrapZone","DomException.toString","EventTarget._addEventListener","HttpRequest.open","HttpRequest.open[function-entry$2$async]","HttpRequest.request.<anonymous function>","Location.origin","Location.toString","Node.toString","_EventStreamSubscription._tryResume","_EventStreamSubscription","_EventStreamSubscription.<anonymous function>","convertNativePromiseToDartFuture","_AcceptStructuredClone.findSlot","_AcceptStructuredClone.walk","DateTime._withValue","convertNativeToDart_DateTime","_AcceptStructuredClone.convertNativeToDart_AcceptStructuredClone","_AcceptStructuredClone.walk.<anonymous function>","_AcceptStructuredCloneDart2Js.forEachJsField","convertNativePromiseToDartFuture.<anonymous function>","_convertDartFunctionFast","_callDartFunctionFast","Function._apply1","allowInterop","keys","_moduleLibraries","JSArray.map","_reloadModule","_reloadPage","main","ReloadingManager","LibraryWrapper.onDestroy","LibraryWrapper.onSelfUpdate","LibraryWrapper.onChildUpdate","_moduleLibraries.<anonymous function>","_reloadModule.<anonymous function>","main.<anonymous function>","Module.onDestroy","Module.onSelfUpdate","Module.onChildUpdate","ReloadHandler.listener","HotReloadFailedException.toString","HotReloadFailedException","ReloadingManager.moduleTopologicalCompare","ReloadingManager.updateGraph","ReloadingManager.reload","_Completer.isCompleted","stronglyConnectedComponents","ListQueue","_defaultEquals","stronglyConnectedComponents.strongConnect","ListQueue.addLast","ListQueue._add","stronglyConnectedComponents_strongConnect","DART_CLOSURE_PROPERTY_NAME","JS_INTEROP_INTERCEPTOR_TAG","TypeErrorDecoder.noSuchMethodPattern","TypeErrorDecoder.notClosurePattern","TypeErrorDecoder.nullCallPattern","TypeErrorDecoder.nullLiteralCallPattern","TypeErrorDecoder.undefinedCallPattern","TypeErrorDecoder.undefinedLiteralCallPattern","TypeErrorDecoder.nullPropertyPattern","TypeErrorDecoder.nullLiteralPropertyPattern","TypeErrorDecoder.undefinedPropertyPattern","TypeErrorDecoder.undefinedLiteralPropertyPattern","_AsyncRun._scheduleImmediateClosure","_toStringVisiting","_hasErrorStackProperty","String","MappedListIterable","main_closure","request","Map","_AsyncCompleter","_Future","_current","int","_empty","","ReloadHandler","stringify","StringBuffer","unwrapException_saveStackTrace","ExceptionAndStackTrace","UnknownJsTypeError","StackOverflowError","Error","extractPattern","TypeErrorDecoder","CyclicInitializationError","provokePropertyErrorOn","provokeCallErrorOn","_SplayTreeKeyIterator","_SplayTreeNode","range","RangeError","ListIterator","value","NullThrownError","safeToString","_objectToString","Closure","objectTypeName","_objectClassName","Object","markFixed","markFixedList","UnknownJavaScriptObject","iterableToShortString","_writeAll","ArrayIterator","iterableToFullString","JsonCyclicError","List","_JsonStringifier_writeMap_closure","Null","stringFromCharCode","_AcceptStructuredCloneDart2Js","BoundClosure","FormatException","_JsonMap","mapToString","MapBase_mapToString_closure","MapMixin","castFrom","CastMap","CastIterator","Function","Future","EfficientLengthIterable","_EfficientLengthCastIterable","_JsonMapKeyIterable","noElement","sort","_doSort","_insertionSort","_dualPivotQuicksort","checkValidRange","tooFew","ListMixin","_Future__asyncComplete_closure","_propagateToListeners","_Future__propagateToListeners_handleWhenCompleteCallback","_Future__propagateToListeners_handleValueCallback","_Future__propagateToListeners_handleError","_chainCoreFuture","AsyncError","_StackTrace","StackTrace","_Future__propagateToListeners_handleWhenCompleteCallback_closure","_FutureListener","_Future__addListener_closure","_Future__prependListeners_closure","_rootHandleUncaughtError_closure","_nextCallback","_lastPriorityCallback","_lastCallback","_AsyncCallbackEntry","_isInCallbackLoop","_initializeScheduleImmediate","_AsyncRun__initializeScheduleImmediate_internalCallback","_AsyncRun__initializeScheduleImmediate_closure","_TimerImpl_internalCallback","_AsyncRun__scheduleImmediateWithSetImmediate_internalCallback","_Exception","_AsyncRun__scheduleImmediateJsOverride_internalCallback","_RootZone_bindCallback_closure","_RootZone_bindCallbackGuarded_closure","_Future__chainFuture_closure","_chainForeignFuture","_Future__chainForeignFuture_closure","_ListQueueIterator","_HashSet","objectHashCode","_newHashTable","_HashSetIterator","_CustomHashSet_closure","bool","_HashMap","_setTableEntry","_getTableEntry","_HashMapKeyIterable","_HashMapKeyIterator","_CustomHashMap_closure","DateTime","_makeEmpty","_AcceptStructuredClone_walk_closure","getYear","_fourDigits","getMonth","_twoDigits","getDay","getHours","getMinutes","getSeconds","getMilliseconds","_threeDigits","lazyAsJsDate","JsLinkedHashMap","LinkedHashMapCell","LinkedHashMapKeyIterable","convertNativePromiseToDartFuture_closure","_Future__asyncCompleteError_closure","ListIterable","_wrapJsFunctionForAsync_closure","_StreamIterator","_awaitOnObject_closure","initNativeDispatchFlag","getTagFunction","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","alternateTagFunction","JavaScriptIndexingBehavior","prototypeForTagFunction","initHooks_closure","_AsyncAwaitCompleter","_SyncCompleter","_AsyncAwaitCompleter_completeError_closure","_AsyncAwaitCompleter_complete_closure","_EventStreamSubscription_closure","Event","SplayTreeSet_closure","from","HotReloadableLibrary","Library","_moduleLibraries_closure","LibraryWrapper","_fillMapWithIterables","Module","fromTearOff","receiverOf","selfOf","StaticClosure","functionCounter","forwardCallTo","forwardInterceptedCallTo","cspForwardCall","selfFieldNameCache","computeFieldNamed","receiverFieldNameCache","cspForwardInterceptedCall","current","_reloadModule_closure","applyFunctionWithPositionalArguments","_genericApplyFunctionWithPositionalArguments","functionNoSuchMethod","Primitives_functionNoSuchMethod_closure","JSInvocationMirror","Symbol","NoSuchMethodError_toString_closure","ConstantMapView","_throwUnmodifiable","_ConstantMapKeyIterable","UnmodifiableMapView","Document","HttpRequest","HttpRequest_request_closure","JS_CONST","Interceptor","JSBool","JSNull","JavaScriptObject","PlainJavaScriptObject","JavaScriptFunction","JSArray","JSUnmodifiableArray","num","JSNumber","JSInt","JSDouble","JSString","Iterable","_CastIterableBase","FixedLengthListMixin","ConstantMap","ConstantStringMap","noSuchMethodPattern","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","TearOffClosure","NativeTypedData","NativeTypedArray","double","NativeTypedArrayOfDouble","NativeTypedArrayOfInt","NativeInt16List","NativeInt32List","NativeInt8List","NativeUint16List","NativeUint32List","NativeUint8ClampedList","NativeUint8List","_Completer","StreamSubscription","StreamTransformerBase","_Zone","_RootZone","_HashSetBase","IterableMixin","MapBase","_UnmodifiableMapMixin","MapView","SetMixin","SetBase","_SplayTree","Codec","Converter","JsonCodec","JsonEncoder","JsonDecoder","_JsonStringifier","DomException","EventTarget","HttpRequestEventTarget","Location","MessageEvent","Node","ProgressEvent","_AcceptStructuredClone","JsMap","JsError","DartLoader","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin&FixedLengthListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin&FixedLengthListMixin","_SplayTreeSet&_SplayTree&IterableMixin","_SplayTreeSet&_SplayTree&IterableMixin&SetMixin","_UnmodifiableMapView&MapView&_UnmodifiableMapMixin","_compareAny","_scheduleImmediateJsOverride","_scheduleImmediateWithSetImmediate","_scheduleImmediateWithTimer","_scheduleImmediateClosure","$intercepted$get$urlToModuleId$x","getInterceptor$x","hot_reload_client___reloadModule$closure","hot_reload_client___moduleLibraries$closure","hot_reload_client___reloadPage$closure","convert___defaultToEncodable$closure","getInterceptor$","$intercepted$get$length$asx","getInterceptor$asx","$intercepted$elementAt1$ax","getInterceptor$ax","$intercepted$toString0$IJavaScriptFunctionJavaScriptObjectabnsux","$intercepted$get$iterator$ax","$intercepted$get$isNotEmpty$ax","getInterceptor$s","$intercepted$$eq$Iu","$intercepted$$add$ansx","getInterceptor$ansx","$intercepted$get$isEmpty$asx","$intercepted$sort1$ax","_interceptors_JSArray__compareAny$closure","$intercepted$$gt$n","getInterceptor$n","$intercepted$compareTo1$ns","getInterceptor$ns","async___startMicrotaskLoop$closure","async__AsyncRun__scheduleImmediateJsOverride$closure","async__AsyncRun__scheduleImmediateWithSetImmediate$closure","async__AsyncRun__scheduleImmediateWithTimer$closure","strongly_connected_components___defaultEquals$closure","collection___defaultHashCode$closure","$intercepted$get$hashCode$IJavaScriptObjectabnsu","$intercepted$[]=$ax","$intercepted$get1$x","$intercepted$get$moduleParentsGraph$x","$intercepted$_addEventListener3$x","$intercepted$getModuleLibraries1$x","$intercepted$hot$onChildUpdate3$x","$intercepted$hot$onSelfUpdate1$x","$intercepted$hot$onDestroy0$x","$intercepted$forceLoadModule3$x","$intercepted$get$message$x","$intercepted$noSuchMethod1$Iu","$intercepted$keys0$x","functionThatReturnsNull","makeConstantList","_containsKey","reload","_add","_set","toString","_contains","noSuchMethod","_get","_remove","listener","isEmpty","dart.collection#_addNewRoot","encode","runBinary","moduleTopologicalCompare","open","call","remove","getModuleLibraries","registerBinaryCallback","contains","dart.async#_asyncCompleteError","writeMap","dart.collection#_splayMax","onSelfUpdate","dart.async#_thenNoZoneRegistration","_js_helper#_modified","dart.collection#_get","moveNext","iterator","_js_helper#_deleteTableEntry","run","dart.async#_removeListeners","complete","handleError","internalFindBucketIndex","setRange","dart.async#_reverseListeners","walk","internalComputeHashCode","get","updateGraph","compareTo","dart.collection#_contains","namedArguments","dart.collection#_removeHashTableEntry","dart.collection#_getBucket","_js_helper#_getTableBucket","forceLoadModule","dart.collection#_first","isNegative","moduleParentsGraph","runUnary","toJson","_interceptors#_codeUnitAt","addAll","writeList","dart.collection#_containsKey","dart.collection#_addHashTableEntry","completeError","dart.async#_addListener","_js_helper#_newLinkedCell","_js_helper#_getTableCell","cast","dart.convert#_process","urlToModuleId","decoder","bindCallback","dart.convert#_upgrade","_interceptors#_tdivSlow","matchesErrorTest","positionalArguments","dart.convert#_partialResult","dart.core#_errorName","dart.async#_asyncComplete","forEach","bindUnaryCallbackGuarded","dart.convert#_computeKeys","internalGet","dart.async#_complete","dart.collection#_computeHashCode","then","dart.collection#_splayMin","_js_helper#_newHashTable","_interceptors#_shrBothPositive","dart.collection#_remove","encoder","dart.async#_state","dart.collection#_computeKeys","dart.collection#_findBucketIndex","runUnaryGuarded","internalSet","onChildUpdate","writeJsonValue","hashCode","clear","message","dart.dom.html#_addEventListener","decode","dart.collection#_findLeftMostDescendent","_js_helper#_fetch","matchTypeError","runGuarded","dart.dom.html#_tryResume","containsKey","dart.collection#_add","substring","memberName","bindCallbackGuarded","origin","dart.collection#_computeElements","isNotEmpty","hot$onDestroy","hot$onSelfUpdate","length=","dart.async#_chainFuture","writeObject","_interceptors#_tdivFast","_js_helper#_addHashTableEntry","toList","dart.async#_resultOrListeners","defaultValue","dart.collection#_splay","add","forEachJsField","writeStringContent","dart.core#_errorExplanation","dart.collection#_set","dart.async#_completeError","internalContainsKey","dart.async#_prependListeners","dart.core#_contents=","onDestroy","dart.convert#_checkCycle","findSlot","_interceptors#_shrOtherPositive","_js_helper#_containsTableEntry","hot$onChildUpdate","elementAt","_js_helper#_setTableEntry","$indexSet","$index","$eq","$ge","$gt","$lt","$add","lookupInterceptorByConstructor","cacheInterceptorOnConstructor","objectToHumanReadableString","checkGrowable","checkMutable","listToString","compare","_","joinArguments","selfFieldName","receiverFieldName","extractFunctionTypeObjectFrom","isFunctionSubtype","_getRuntimeTypeAsString","write","_writeString","checkArguments","computeTypeName","formatType","isSupertypeOfNull","isSubtype","isJsArray","setDispatchProperty","markUnmodifiableList","es6","unvalidated","internal","_getBucket","_createTimer","_completer","sync","_AsyncAwaitCompleter._completer","future","_setValue","_scheduleImmediate","inSameErrorZone","_zone","_mayAddListener","_chainSource","_isComplete","_cloneResult","_setError","_setErrorObject","_setPendingComplete","_setChained","_hasError","_error","handleUncaughtError","handlesValue","handlesComplete","_removeListeners","_clearPendingComplete","_completeWithValue","handleWhenComplete","handleValue","_rethrow","writeAll","_workList","checkValidIndex","_checkModification","_compare","_rebuildWorkList","_dummy","_isUpgraded","_setProperty","convert","writeStringSlice","writeCharCode","_JsonStringStringifier.writeCharCode","fromCharCode","writeString","_removeSeen","writeNumber","printOn","printToConsole","year","month","day","hour","minute","second","millisecond","checkNotNegative","_writeOne","listen","addEventListener","fromMillisecondsSinceEpoch","_withValue","isJavaScriptSimpleObject","readSlot","writeSlot","apply","_apply1","Function.apply","applyFunction","fromIterables","map","response","_running","_moduleOrdering","replaceFirst","data","MessageEvent.data","isCompleted","_mayComplete","first","addLast","_grow","min","removeLast","provokeCallErrorOnNull","provokeCallErrorOnUndefined","provokePropertyErrorOnNull","provokePropertyErrorOnUndefined"],
+  "mappings": "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",
+  "x_org_dartlang_dart2js": {
+    "minified_names": {
+      "global": "h,656,cA,611,bY,657,hi,658,i,143,dt,659,fB,583,J,660,he,132,at,661,r,662,f,663,eg,617,hj,658,hk,658,t,664,b3,665,en,666,d,94,l,138,ex,666,hl,658,ef,667,hm,658,bc,666,ay,616,bj,269,aK,270,bi,271,bh,272,bo,274,bn,266,fd,668,ar,669,fc,522,bV,666,b,115,c,111,z,119,hx,670,aX,671,b2,666,c_,666,ev,672,c5,673,O,541,n,674,M,139,Y,149,C,675,et,676,dk,677,c8,678,aI,679,e_,197,dE,199,af,112,bg,680,ab,681,x,666,D,666,p,117,ap,682,c1,683,ew,554,df,560,b4,684,b_,666,dv,550,E,248,b8,685,cG,116,b7,686,P,687,dn,688,e,689,a8,690,e2,691,bm,147,L,145,ai,91,fC,146,a,692,fZ,246,dy,693,b0,694,bE,685,as,695,cx,137,bR,696,bl,367,fE,368,c6,697,aB,698,aT,118,al,699,bU,502,dG,700,F,701,ff,702,j,703,v,704,ca,705,cF,130,hv,151,aV,706,fI,484,ae,113,dp,707,aL,485,fa,708,b5,709,dS,710,ao,711,bs,142,bX,712,bI,713,d7,666,d8,714,ah,157,av,156,cE,144,aE,666,d6,212,fP,135,cw,133,cz,155,aP,134,w,158,hB,715,q,716,cn,159,ct,153,ho,160,m,717,W,150,eQ,718,bH,67,d9,77,fb,719,bS,720,aS,247,a9,666,cC,528,aY,629,c4,721,aq,722,el,723,ek,724,ed,725,dw,726,b9,558,am,727,h3,141,eX,728,U,286,S,729,aM,282,f4,730,f3,731,f2,732,aJ,733,H,120,aC,734,cm,735,G,736,f5,737,fJ,275,fN,285,cp,284,co,283,eU,738,eV,739,f1,740,fM,741,fO,279,T,742,cq,278,ad,743,ac,744,cb,745,bk,746,fF,276,eD,747,eF,748,X,123,eE,749,fr,666,fq,291,fs,750,eH,751,hf,121,eT,752,eG,753,fj,754,fi,755,f0,756,cd,757,eY,758,eZ,758,f_,758,bw,280,hs,634,bP,666,dq,666,dP,635,ht,640,aN,114,fg,759,cg,760,eO,666,a7,761,bf,762,f9,763,eN,423,eP,764,au,765,ce,766,eL,666,bd,762,be,767,cf,768,f6,769,f7,770,eK,394,eM,771,bD,666,bL,772,bb,666,fV,598,dO,773,ez,774,eb,775,dl,776,e9,777,ak,778,e5,779,e6,780,e8,781,ea,782,e7,783,dm,784,R,785,aG,786,dK,787,dL,788,dM,241,fW,789,fX,789,eW,790,eu,556,a5,791,hq,171,hr,172,fQ,792,fo,793,fw,273,fx,794,fy,794,bt,795,hc,167,hh,162,cy,796,aO,797,aQ,798,cs,799,aR,165,cB,164,bu,0,b1,800,hd,168,h8,169,cD,801,hn,166,V,170,h9,802,ha,802,hb,802,eA,803,fp,804,eB,805,eC,806,eS,807,aF,808,fR,586,eR,596,fk,358,em,481,eo,809,dr,666,an,810,bQ,811,dJ,812,dN,666,fH,813,bW,814,dR,815,a6,816,dd,817,h4,92,bG,818,aW,819,c2,666,eq,820,B,821,bJ,822,dc,823,da,824,a_,825,aD,826,bF,827,db,828,ei,666,eh,214,ee,190,ep,829,fK,830,cr,610,fL,830,fG,612,fA,607,fz,608,e3,831,e1,832,c0,833,e4,834,dB,835,ba,836,bZ,666,dY,837,aa,836,dX,552,dh,838,di,839,eJ,840,c9,841,bM,842,aZ,843,du,844,hp,131,hE,845,u,846,dz,847,dC,848,Q,849,e0,850,a4,851,a1,852,hD,853,bv,854,a2,855,bT,856,dA,857,a3,858,a0,859,eI,860,bO,861,dg,862,dj,863,hP,864,hQ,865,hR,866,hS,867,hV,868,hW,869,hU,870,hT,871,hY,872,hX,873,c7,874,dW,875,b6,876,bq,877,dV,878,K,879,hH,880,hI,881,hJ,882,hK,883,hL,884,hM,885,hN,886,cc,887,er,888,es,889,fv,890,fh,891,f8,892,dx,893,aH,894,ft,895,dT,896,c3,897,ej,898,fl,899,cl,429,de,900,bK,901,dF,902,dI,903,dH,904,fe,905,hA,906,bN,907,ds,908,dQ,909,dU,910,dZ,911,ec,912,ey,913,hG,914,dD,915,hz,916,ch,917,ci,918,cj,919,ck,920,fm,921,fn,922,fu,923,ax,1,hC,924,hg,93,bp,129,hw,136,ic,140,ia,154,ib,161,i_,925,i0,926,i1,927,i8,277,hO,666,i3,364,i4,486,i6,614,i7,615,i2,636,hy,641,hF,642,hZ,928,i9,654,i5,655,cH,864,cI,865,cJ,866,cK,867,cN,868,cO,869,cM,870,cL,871,cQ,872,cP,873,bx,641,aj,654,bz,928,by,642,cR,655,bB,929,y,930,h6,931,h5,932,h7,933,fY,934,k,935,I,936,aw,937,cV,938,ag,939,aA,940,N,941,cY,942,h2,943,o,944,cS,945,h_,946,cX,947,d5,948,fD,949,A,950,h0,951,aU,952,h1,953,cu,954,fS,955,fT,956,fU,957,hu,958,cv,959,Z,960,cT,961,bC,962,bA,963,cU,964,d_,965,d0,966,d2,967,d1,968,cW,969,cZ,970,d4,971,d3,972,br,973,az,974",
+      "instance": "b1,975,bV,976,b4,977,b3,978,b_,979,b5,980,b7,666,aZ,981,b0,979,b2,982,b6,983,bO,984,p,985,h,979,aw,986,bB,987,bY,988,ca,989,bS,990,aV,991,a2,992,aX,993,ar,721,bU,994,D,995,ba,996,c8,997,bn,998,ao,999,af,1000,aB,1001,bi,1002,l,1003,q,1004,bg,1005,aS,1006,Y,1007,al,981,C,1008,bG,1009,aj,1010,U,1011,Z,1012,aq,1013,ai,1014,aW,1015,c5,1016,a0,1017,bW,1006,bd,1018,aP,1019,aE,1020,ah,1008,S,1021,a9,1022,bF,1023,bh,1024,ak,1025,bR,1026,ap,1027,cc,1028,T,976,ax,1029,ag,1030,c7,1031,be,1032,at,1033,aI,1034,av,1035,ab,1036,X,1037,K,1038,bj,1039,c6,1040,a5,1011,bz,1041,bt,1042,br,1043,bp,1044,bP,1045,cb,990,a1,984,aQ,1046,aC,1047,a8,1048,W,1049,w,1050,bu,1051,bN,611,R,1052,bL,1053,az,1054,J,1055,a3,1056,bo,1057,aa,1058,bC,987,c_,1027,bm,1059,ac,1060,bD,1061,aF,1062,ay,1063,n,829,G,1064,c0,1065,bM,1066,am,1067,aT,1068,A,1069,bv,1070,P,1034,bQ,1071,b9,1072,by,1073,aK,584,au,1033,N,1074,aA,1075,F,1076,aO,989,bZ,1077,bq,1078,u,1079,b8,1080,V,1081,aN,1082,aH,1083,bT,1084,bc,1085,bs,1042,aM,1086,bI,1087,bJ,1088,j,1089,bb,1090,a4,1091,aJ,1034,aG,1092,as,1093,c3,1094,c2,1056,bk,1095,bA,1096,a_,1097,O,1098,aY,1081,bw,1008,bE,1099,aU,1100,t,611,a7,1101,bl,1102,I,1103,bK,1104,aD,1105,B,1106,an,1107,a6,1108,aL,1109,bx,1073,c1,1065,ae,1110,bf,1111,bH,1112,E,1113,aR,994,ad,1114,c4,1094,bX,988,i,1115,k,1116,L,1117,c9,1118,M,1119,H,1120,v,1121"
+    },
+    "frames": "uhUAiKoBkmCyB;0NA+BhBCqE;8IA8I8BCW;iuCEnN9BC6C;0BA+GAAuC;wIAsLAC2C;+SAsGAAuC;2HAoE4BCe;yBAcE7csB;qFAO9B2c2C;wJAoBAC8C;mYAtGkBES;s/DK6WiB9csB;wBAIHA4B;qlGGn3BFAS;6YA4DjBAiB;QAEF+ciB;2GAyLqB/ciB;usBHjOFA8B;oxDN4nBXgdK;+uCAuaU9/BAAxzBpB8iBqC,A;2yBA8tCmBmB0B;2GAyCnBAuB;sGAqCcnBa;ovCAkjBfAmC;yFAKKAU;0EAWaA4E;yHASbAU;kFAmCmBAW;4DAGtBAW;0KA4DFAAcjtE8BAgE,A;8Wd81E1BAgD;AAEAA4I;qgDA0M+BidyC;6NAYXAyC;s5BAkGAAyC;AACIC6C;w/BAuhBbCe;2BAElBCmB;+CAqFoBDU;oFA2DjBndY;+MaltGN9gBiC;8CAYYAiC;gQA8CPm+BkC;4rCAyJiBrde;8CAExBsdAEqNACQ,A;iWFvGKC6B;+JAiBWCqBARACAboMCVyC,A,A;iPa1Gf99BI;YAAAAgB;iTA2EkBy+BO;iQAgCfCkB;+hBAwFOCuD;qUAgCAAuD;mKAoBPLoB;4pDGvkBE/8BAA2BTq9B+G,A;iIAZSr9BAAYTq9B+G,A;uwCAsKgB98B4D;g1BJ9QHgfe;0EA8B+BkVAX6aZlVsB,A;6ND/Of+dK;8PASDCAkBjUJheyB,A;uGlBmUAiekB;OAGCjeoB;yOA4DAkegD;ivBAq5CAlemR;i7DAq+BO0cY;4FAkCC1c8C;gfkBtxFRAe;4MAwBEme2B;8TAiCAAwB;21BA2HgBnegB;2sBA0JlBAkBA0BbAAAAAAQ,A,A;qoFIvUQoeS;0CA0IGpeSAnCYqeAAAACAgC4oBSteS/B9xB5BAAAjC0BweAAAAxe+B,A,A,A,A,A,A;oRDoTPAwB;AACrByeY;glBE7QYCU;2CAYqB1ekB;oCAIrB0eU;oGAsBkB1ec;mKAsD3BlYgB;iCEw6DGkYc;sbDn6BkB2egC;8lBHzhC1B3eU;2jBAyLUAc;kJCpSA9WA+B+4BuC8Wa,A;iqB/BvxBtC4eW;sRAmHe5eyB;QACPsY6B;kCA0EbuGS;4CAQiBCS;AACLCM;uBAIZCoB;oBAIFl3BgB;iFAQE+2BS;wFAeiBCS;AACLCM;uBAIZCoB;kCAIFl3BgB;6RA6FA22BkB;8CAkBFQAA/KACS,AAAoBlfqB,A;oFAoMpBmfS;oBACAr3BgB;oFASIq3BS;oBACAr3BgB;iFAeJq3BS;oBACAr3BgB;4DA3HAq3BU;kIAkCkBLM;iBAIhBEgB;oBAIAIY;sFA6FuBCU;kBAGYCM;6BACxBCsB;sFA6BcCM;mCACFZY;uBACGD6B;uDAGfYsB;OAMWpVM;0BAsEPsVM;uKAwBKCwB;AACZVgB;4CAaIUwB;mBAEVjBiB;AAGASY;wKA7RASM;2PA2FFCQA/BFnBiB,Q;+LA+HyBoByB;wHAKY7fkB;+BAMmB+eiC;AAC3BMyB;AACqBCY;oLAiBnBQuC;2BAEI9fkB;yKAcNsfa;uDAGQtfkB;gOEqcvBAa;oDAEd+f+B;8HAkMERyB;mHAYAAyB;0+BGrwCevfiB;iEAydAgeAVzcPhemB,A;2BU8eCgeAV9eDhemB,A;wBUsfeAyB;0CA8PRAe;gRE5iBXggBmB;yFAsBoBhgBc;2BAGxBggBkC;4CAKF1CAfuRACe,A;AetRO9JS;68BC3PUzTmB;mBAGfsdAhB8gBFCiB,A;gCgBngBEDAhBmgBFCyB,A;iDgB7fO9JS;+DA4BqByBA9B2gBElVyB,A;A8B1gBEkVAzB7CFlVwB,A;kQsBuDnBAe;6vFAyWAAW;8TA4ZAAc;ouBA+DTqGc;i5BAsGFAgB;iqCEx5Bc6OcEypBgBlVgBArH8BAAA7HDigBsC,A,AAuB7DjgBAAsGAAY,A,A,A;6CF7hBqBkVkBEkpBWlVgBArH8BAAA7HDigBsC,A,AAuB7DjgBAAsGAAY,A,A,A;iG9BrlBgCAwB;sGAmBR+Tc;4S6BxChBuJe;gBAGFAc;AACAAAhBsgBJCW,A;AgBrgBIDW;q1BAiWEtdS;2EEmPwBAmC;kIA+BnBkgB8D;qNA2RXC4B;wZDt1BSCY;wEAGEAc;iKAeAAc;ykCAwfTCAAxBFjHY,qD;wLAgL8BpZoBArH8BAAA7HDigBc,A,A;uCAkP7BjgBAA3NhCAAAsGAAY,A,A;0IAmJkBAe;+MAaIAe;2FAxHesgBAAAAtgBiB,A;wOGhpBzBAoC;SAAAAY;UAAAAuB;gJAwECA+B;oJAiCPugBS;sUAkBOvgBc;kIAgBPwgBe;ioBA0HFpHY;8eAoD2BlEAlCyPClVyB,A;qgBmCpcFygBa;mGAeIAkB;+RAgZZCkB;MAEhBCAA4RJAArB9RiBEa,A,A;iBqBKTFAAyRRAArB9RiBEa,A,A;aqBQTFAAsRRAArB9RiBEc,A,A;cqBWTFAAmRRAArB9RiBEc,A,A;cqBcTFAAgRRAArB9RiBEc,A,A;cqBiBTFAA6QRAArB9RiBEc,A,A;cqBoBTFAA0QRAArB9RiBEc,A,A;AqBqBTFAAyQRAArB9RiBEa,A,A;AqBsBTFAAwQRAArB9RiBEa,A,A;WqBuBTFAAuQRAArB9RiBEyB,A,A;OqBwBTFAAsQRAArB9RiBEyB,A,A;sCqB4BGHkB;MAEhBCAAgQJAArB9RiBEa,A,A;AqB+BbFAA+PJAArB9RiBEa,A,A;SqBmCfCAAmPFxDiB,A;OAjPEoDe;6GAWQ1gBuB;iJA+BR+gBwC;CAAAAiB;wHAcACmB;yBAGAFiB;yBAGAAkB;0BAGAAiB;sCAGAAkB;WAAAAS;yDAOACwC;CAAAAQ;kDAMAAwC;CAAAAQ;iDASFDkB;iFAIIAS;eAIJAQ;qDAMEAe;4GAcFAkB;oDAMEAU;4CAGFAS;4PA2GmDrNe;iEAnBtCzTe;AACbihBAAWgBjhBgBAxBZAQ,A,Q;AAcGyTM;6HrB5kBWiJW;2XsBzDZ1cqB;kBClKNkhBO;6EvB6nBI5DgB;AACAAAA1FJCW,A;0SwBEuB4DY;OACDCY;OACACY;OACACY;OACECY;OACACY;OACCCwD;m0DxBqEHzhBe;oEAIlBsdAAjFJCQ,A;i8CyBmFWmEwC;kbzBvkBmBhFc;qYAuhBjBiFO;0BAGFAO;oBAGEAU;wG4B8vgBO3hBAW5jgBKAA/BrvBvBAAAtB0BweAAAAxeqB,A,A,kB,A;yDoBq2hBxB4hBc;kBAkBAAe;sIAs9oBC7mBAEtzqCADADcDkFmB,Q,A;+hFDiplCF6hByB;gFAxDJ7hBAAAAAO,A;2ICpjlCoBAAUisBOAA/BrvBvBAAAtB0BweAAAAxewB,A,A,4B,A;iZsBuMnBhEcD9KA8lBALoVXCAxBvHAAiC,A,KwBuHAAAxBvHAAsD,A,A,A;O8B/CW/lBAD9KA8lBc,A;0IC0LLE2B;gDAISC2C;CAAAAO;yCAIXCuB;CAAAAO;+EAQkDDuC;6DAOlDC8B;CAAAAO;yzBC6bYCA/BhmBRCAAKYEgB,A,A;uhBgCsEFCuC;AADICA9CmGTxiBW,A;Y8CnGSwiBiB;OACfxiBW;0DAISAAOqnBWAA/BrvBvBAAAtB0BweAAAAxeqB,A,A,kB,A;uewBsKZwiBa;sCAOKCwB;iDAETziBAGhKa0iBkB,A;2CHgKb1iBAGlK2B2iBe,AAwBzC3iBAAAAAyB,A,A;AHsJU4hBK;ukBA1CoC5hBW;wKAWtCAS;gFAWU4iBS;OAAAAmB;iWAoB2CCAJ+pnBzC9nBAEn0nBbDADcDkFmB,e,A,A;m0CMlBW8cO;onBA6BDiGA3B7BgBCQ,A;iF2BoCGCwB;4IAW3B3rBAZtEN4pBgB,A;4FYyEM5LgD;yCAMAheAZ/EN4pBoF,A;4BYkFM5LgD;8GASEheAZ3FR4pBgB,A;4FY8FQ5LgD;2iBE3DQtVsBnBkhBlBAAAAAAmD,A,A;iSmB5gBEkjBAnB0tBA3P8C,A;CmB1tBA2PAnB0tBA3PyCAiEoB4P8J,A,A;0ImBrxBCCuB;oDAEAAmB;iDAOVC0G;CAAAAiB;24QpDinDMC0G;qFAUAC8G;mFAUACuD;qFAUAC2D;"
+  }
+}
diff --git a/build_runner/lib/src/server/build_updates_client/module.dart b/build_runner/lib/src/server/build_updates_client/module.dart
new file mode 100644
index 0000000..6604f9b
--- /dev/null
+++ b/build_runner/lib/src/server/build_updates_client/module.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class Library {
+  Object onDestroy();
+
+  bool onSelfUpdate([Object data]);
+
+  bool onChildUpdate(String childId, Library child, [Object data]);
+}
+
+/// Used for representation of amd modules that wraps several dart libraries
+/// inside
+class Module {
+  /// Grouped by absolute library path starting with `package:`
+  final Map<String, Library> libraries;
+
+  Module(this.libraries);
+
+  /// Calls onDestroy on each of underlined libraries and combines returned data
+  Map<String, Object> onDestroy() {
+    var data = <String, Object>{};
+    for (var key in libraries.keys) {
+      data[key] = libraries[key].onDestroy();
+    }
+    return data;
+  }
+
+  /// Calls onSelfUpdate on each of underlined libraries, returns aggregated
+  /// result as "maximum" assuming true < null < false. Stops execution on first
+  /// false result
+  bool onSelfUpdate(Map<String, Object> data) {
+    var result = true;
+    for (var key in libraries.keys) {
+      var success = libraries[key].onSelfUpdate(data[key]);
+      if (success == false) {
+        return false;
+      } else if (success == null) {
+        result = success;
+      }
+    }
+    return result;
+  }
+
+  /// Calls onChildUpdate on each of underlined libraries, returns aggregated
+  /// result as "maximum" assuming true < null < false. Stops execution on first
+  /// false result
+  bool onChildUpdate(String childId, Module child, Map<String, Object> data) {
+    var result = true;
+    // TODO(inayd): This is a rought implementation with lots of false positive
+    // reloads. In current implementation every library in parent module should
+    // know how to handle each library in child module. Also [roughLibraryKeyDecode]
+    // depends on unreliable implementation details. Proper implementation
+    // should rely on inner graph of dependencies between libraries in module,
+    // to require only parent libraries which really depend on child ones to
+    // handle it's updates. See dart-lang/build#1767.
+    for (var parentKey in libraries.keys) {
+      for (var childKey in child.libraries.keys) {
+        var success = libraries[parentKey]
+            .onChildUpdate(childKey, child.libraries[childKey], data[childKey]);
+        if (success == false) {
+          return false;
+        } else if (success == null) {
+          result = success;
+        }
+      }
+    }
+    return result;
+  }
+}
diff --git a/build_runner/lib/src/server/build_updates_client/reload_handler.dart b/build_runner/lib/src/server/build_updates_client/reload_handler.dart
new file mode 100644
index 0000000..0087931
--- /dev/null
+++ b/build_runner/lib/src/server/build_updates_client/reload_handler.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'reloading_manager.dart';
+
+/// Provides [listener] to handle web socket connection and reload invalidated
+/// modules using [ReloadingManager]
+class ReloadHandler {
+  final String Function(String) _moduleIdByPath;
+  final Map<String, String> _digests;
+  final ReloadingManager _reloadingManager;
+
+  ReloadHandler(this._digests, this._moduleIdByPath, this._reloadingManager);
+
+  void listener(String data) async {
+    var updatedAssetDigests = json.decode(data) as Map<String, dynamic>;
+    var moduleIdsToReload = <String>[];
+    for (var path in updatedAssetDigests.keys) {
+      if (_digests[path] == updatedAssetDigests[path]) {
+        continue;
+      }
+      var moduleId = _moduleIdByPath(path);
+      if (_digests.containsKey(path) && moduleId != null) {
+        moduleIdsToReload.add(moduleId);
+      }
+      _digests[path] = updatedAssetDigests[path] as String;
+    }
+    if (moduleIdsToReload.isNotEmpty) {
+      _reloadingManager.updateGraph();
+      await _reloadingManager.reload(moduleIdsToReload);
+    }
+  }
+}
diff --git a/build_runner/lib/src/server/build_updates_client/reloading_manager.dart b/build_runner/lib/src/server/build_updates_client/reloading_manager.dart
new file mode 100644
index 0000000..969aaee
--- /dev/null
+++ b/build_runner/lib/src/server/build_updates_client/reloading_manager.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:graphs/graphs.dart' as graphs;
+
+import 'module.dart';
+
+class HotReloadFailedException implements Exception {
+  HotReloadFailedException(this._s);
+
+  @override
+  String toString() => "HotReloadFailedException: '$_s'";
+  final String _s;
+}
+
+/// Handles reloading order and hooks invocation
+class ReloadingManager {
+  final Future<Module> Function(String) _reloadModule;
+  final Module Function(String) _moduleLibraries;
+  final void Function() _reloadPage;
+  final List<String> Function(String moduleId) _moduleParents;
+  final Iterable<String> Function() _allModules;
+
+  final Map<String, int> _moduleOrdering = {};
+  SplayTreeSet<String> _dirtyModules;
+  Completer<void> _running = Completer()..complete();
+
+  int moduleTopologicalCompare(String module1, String module2) {
+    var topological =
+        Comparable.compare(_moduleOrdering[module2], _moduleOrdering[module1]);
+    // If modules are in cycle (same strongly connected component) compare their
+    // string id, to ensure total ordering for SplayTreeSet uniqueness.
+    return topological != 0 ? topological : module1.compareTo(module2);
+  }
+
+  void updateGraph() {
+    var allModules = _allModules();
+    var stronglyConnectedComponents =
+        graphs.stronglyConnectedComponents(allModules, _moduleParents);
+    _moduleOrdering.clear();
+    for (var i = 0; i < stronglyConnectedComponents.length; i++) {
+      for (var module in stronglyConnectedComponents[i]) {
+        _moduleOrdering[module] = i;
+      }
+    }
+  }
+
+  ReloadingManager(this._reloadModule, this._moduleLibraries, this._reloadPage,
+      this._moduleParents, this._allModules) {
+    _dirtyModules = SplayTreeSet(moduleTopologicalCompare);
+  }
+
+  Future<void> reload(List<String> modules) async {
+    _dirtyModules.addAll(modules);
+
+    // As function is async, it can potentially be called second time while
+    // first invocation is still running. In this case just mark as dirty and
+    // wait until loop from the first call will do the work
+    if (!_running.isCompleted) return await _running.future;
+    _running = Completer();
+
+    var reloadedModules = 0;
+
+    try {
+      while (_dirtyModules.isNotEmpty) {
+        var moduleId = _dirtyModules.first;
+        _dirtyModules.remove(moduleId);
+        ++reloadedModules;
+
+        var existing = _moduleLibraries(moduleId);
+        var data = existing.onDestroy();
+
+        var newVersion = await _reloadModule(moduleId);
+        var success = newVersion.onSelfUpdate(data);
+        if (success == true) continue;
+        if (success == false) {
+          print("Module '$moduleId' is marked as unreloadable. "
+              'Firing full page reload.');
+          _reloadPage();
+          _running.complete();
+          return;
+        }
+
+        var parentIds = _moduleParents(moduleId);
+        if (parentIds == null || parentIds.isEmpty) {
+          print("Module reloading wasn't handled by any of parents. "
+              'Firing full page reload.');
+          _reloadPage();
+          _running.complete();
+          return;
+        }
+        parentIds.sort(moduleTopologicalCompare);
+        for (var parentId in parentIds) {
+          var parentModule = _moduleLibraries(parentId);
+          success = parentModule.onChildUpdate(moduleId, newVersion, data);
+          if (success == true) continue;
+          if (success == false) {
+            print("Module '$moduleId' is marked as unreloadable. "
+                'Firing full page reload.');
+            _reloadPage();
+            _running.complete();
+            return;
+          }
+          _dirtyModules.add(parentId);
+        }
+      }
+      print('$reloadedModules modules were hot-reloaded.');
+    } on HotReloadFailedException catch (e) {
+      print('Error during script reloading. Firing full page reload. $e');
+      _reloadPage();
+    }
+    _running.complete();
+  }
+}
diff --git a/build_runner/lib/src/server/graph_viz_main.dart b/build_runner/lib/src/server/graph_viz_main.dart
new file mode 100644
index 0000000..be16751
--- /dev/null
+++ b/build_runner/lib/src/server/graph_viz_main.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+import 'dart:html';
+import 'dart:js' as js;
+
+final _graphReference = js.context[r'$build'];
+final _details = document.getElementById('details');
+
+main() async {
+  var filterBox = document.getElementById('filter') as InputElement;
+  var searchBox = document.getElementById('searchbox') as InputElement;
+  var searchForm = document.getElementById('searchform');
+  searchForm.onSubmit.listen((e) {
+    e.preventDefault();
+    _focus(searchBox.value.trim(),
+        filter: filterBox.value.isNotEmpty ? filterBox.value : null);
+    return null;
+  });
+  _graphReference.callMethod('initializeGraph', [_focus]);
+}
+
+void _error(String message, [Object error, StackTrace stack]) {
+  var msg = [message, error, stack].where((e) => e != null).join('\n');
+  _details.innerHtml = '<pre>$msg</pre>';
+}
+
+Future _focus(String query, {String filter}) async {
+  if (query.isEmpty) {
+    _error('Provide content in the query.');
+    return;
+  }
+
+  Map nodeInfo;
+  var queryParams = {'q': query};
+  if (filter != null) queryParams['f'] = filter;
+  var uri = Uri(queryParameters: queryParams);
+  try {
+    nodeInfo = json.decode(await HttpRequest.getString(uri.toString()))
+        as Map<String, dynamic>;
+  } catch (e, stack) {
+    var msg = 'Error requesting query "$query".';
+    if (e is ProgressEvent) {
+      var target = e.target;
+      if (target is HttpRequest) {
+        msg = [
+          msg,
+          '${target.status} ${target.statusText}',
+          target.responseText
+        ].join('\n');
+      }
+      _error(msg);
+    } else {
+      _error(msg, e, stack);
+    }
+    return;
+  }
+
+  var graphData = {'edges': nodeInfo['edges'], 'nodes': nodeInfo['nodes']};
+  _graphReference.callMethod('setData', [js.JsObject.jsify(graphData)]);
+  var primaryNode = nodeInfo['primary'];
+  _details.innerHtml = '<strong>ID:</strong> ${primaryNode['id']} <br />'
+      '<strong>Type:</strong> ${primaryNode['type']}<br />'
+      '<strong>Hidden:</strong> ${primaryNode['hidden']} <br />'
+      '<strong>State:</strong> ${primaryNode['state']} <br />'
+      '<strong>Was Output:</strong> ${primaryNode['wasOutput']} <br />'
+      '<strong>Failed:</strong> ${primaryNode['isFailure']} <br />'
+      '<strong>Phase:</strong> ${primaryNode['phaseNumber']} <br />'
+      '<strong>Glob:</strong> ${primaryNode['glob']}<br />'
+      '<strong>Last Digest:</strong> ${primaryNode['lastKnownDigest']}<br />';
+}
diff --git a/build_runner/lib/src/server/graph_viz_main.dart.js.map b/build_runner/lib/src/server/graph_viz_main.dart.js.map
new file mode 100644
index 0000000..3e09cad
--- /dev/null
+++ b/build_runner/lib/src/server/graph_viz_main.dart.js.map
@@ -0,0 +1,16 @@
+{
+  "version": 3,
+  "engine": "v2",
+  "file": "graph_viz_main.dart.js",
+  "sourceRoot": "",
+  "sources": ["org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_array.dart","org-dartlang-sdk:///sdk/lib/internal/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/list.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_string.dart","org-dartlang-sdk:///sdk/lib/core/errors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/internal_patch.dart","org-dartlang-sdk:///sdk/lib/internal/symbol.dart","org-dartlang-sdk:///sdk/lib/js/_js_client.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_rti.dart","org-dartlang-sdk:///sdk/lib/core/exceptions.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/regexp_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_names.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_typed_data.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart","org-dartlang-sdk:///sdk/lib/async/future_impl.dart","org-dartlang-sdk:///sdk/lib/async/schedule_microtask.dart","org-dartlang-sdk:///sdk/lib/async/zone.dart","org-dartlang-sdk:///sdk/lib/async/stream.dart","org-dartlang-sdk:///sdk/lib/async/stream_impl.dart","org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart","org-dartlang-sdk:///sdk/lib/collection/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/linked_hash_set.dart","org-dartlang-sdk:///sdk/lib/collection/maps.dart","org-dartlang-sdk:///sdk/lib/collection/set.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart","org-dartlang-sdk:///sdk/lib/convert/json.dart","org-dartlang-sdk:///sdk/lib/convert/utf.dart","org-dartlang-sdk:///sdk/lib/core/date_time.dart","org-dartlang-sdk:///sdk/lib/core/iterable.dart","org-dartlang-sdk:///sdk/lib/core/null.dart","org-dartlang-sdk:///sdk/lib/core/uri.dart","org-dartlang-sdk:///sdk/lib/convert/codec.dart","org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart","org-dartlang-sdk:///sdk/lib/svg/dart2js/svg_dart2js.dart","graph_viz_main.dart","org-dartlang-sdk:///sdk/lib/async/future.dart"],
+  "names": ["makeDispatchRecord","getNativeInterceptor","Interceptor.==","Interceptor.hashCode","Interceptor.toString","Interceptor.noSuchMethod","JSBool.toString","JSBool.hashCode","JSNull.==","JSNull.toString","JSNull.hashCode","JSNull.noSuchMethod","JavaScriptObject.hashCode","JavaScriptObject.toString","JavaScriptFunction.toString","JSArray.add","JSArray.addAll","JSArray.map","JSArray.join","JSArray.elementAt","JSArray.last","JSArray.any","JSArray.contains","JSArray.toString","JSArray.iterator","JSArray.hashCode","JSArray.length","JSArray.[]","JSArray.markFixed","JSArray.markFixedList","ArrayIterator.current","ArrayIterator.moveNext","JSNumber.toInt","JSNumber.toString","JSNumber.hashCode","JSNumber.<<","JSNumber._shrOtherPositive","JSNumber._shrBothPositive","JSNumber.<=","JSString.codeUnitAt","JSString._codeUnitAt","JSString.+","JSString.startsWith","JSString.startsWith[function-entry$1]","JSString.substring","JSString.substring[function-entry$1]","JSString.toLowerCase","JSString.trim","JSString.*","JSString.indexOf","JSString.indexOf[function-entry$1]","JSString.toString","JSString.hashCode","JSString.length","JSString.[]","JSString._isWhitespace","JSString._skipLeadingWhitespace","JSString._skipTrailingWhitespace","IterableElementError.noElement","IterableElementError.tooMany","ListIterable.iterator","ListIterable.where","ListIterable.map","ListIterator.current","ListIterator.moveNext","MappedIterable.iterator","MappedIterable.length","MappedIterable","MappedIterator.moveNext","MappedIterator.current","MappedListIterable.length","MappedListIterable.elementAt","WhereIterable.iterator","WhereIterable.map","WhereIterator.moveNext","WhereIterator.current","Symbol.hashCode","Symbol.toString","Symbol.==","isBrowserObject","unminifyOrTag","getType","isJsIndexable","S","Primitives.objectHashCode","Primitives.objectTypeName","Primitives._objectClassName","Primitives.stringFromCharCode","Primitives.lazyAsJsDate","Primitives.getYear","Primitives.getMonth","Primitives.getDay","Primitives.getHours","Primitives.getMinutes","Primitives.getSeconds","Primitives.getMilliseconds","Primitives.functionNoSuchMethod","createUnmangledInvocationMirror","Primitives.applyFunctionWithPositionalArguments","Primitives._genericApplyFunctionWithPositionalArguments","iae","ioore","diagnoseIndexError","diagnoseRangeError","argumentErrorValue","wrapException","toStringWrapper","throwExpression","throwConcurrentModificationError","unwrapException","getTraceFromException","objectHashCode","fillLiteralMap","invokeClosure","Exception","convertDartClosureToJS","Closure.fromTearOff","Closure.cspForwardCall","Closure.forwardCallTo","Closure.cspForwardInterceptedCall","Closure.forwardInterceptedCallTo","closureFromTearOff","propertyTypeCastError","interceptedTypeCast","extractFunctionTypeObjectFromInternal","functionTypeTest","_typeDescription","throwCyclicInit","getIsolateAffinityTag","setRuntimeTypeInfo","getRuntimeTypeInfo","getRuntimeTypeArguments","getRuntimeTypeArgumentIntercepted","getRuntimeTypeArgument","getTypeArgumentByIndex","runtimeTypeToString","_runtimeTypeToString","_functionRtiToString","_joinArguments","StringBuffer.write","substitute","checkSubtype","subtypeCast","Primitives.formatType","areSubtypes","computeSignature","_isSubtype","_isFunctionSubtype","namedParametersSubtypeCheck","defineProperty","lookupAndCacheInterceptor","patchProto","patchInteriorProto","makeLeafDispatchRecord","makeDefaultDispatchRecord","initNativeDispatch","initNativeDispatchContinue","initHooks","applyHooksTransformer","ConstantMap.toString","ConstantStringMap.length","ConstantStringMap.containsKey","ConstantStringMap.[]","ConstantStringMap._fetch","ConstantStringMap.forEach","ConstantStringMap.keys","_ConstantMapKeyIterable.iterator","_ConstantMapKeyIterable.length","JSInvocationMirror.memberName","JSInvocationMirror.positionalArguments","JSInvocationMirror.namedArguments","JsLinkedHashMap.es6","ReflectionInfo.defaultValue","ReflectionInfo","Primitives.functionNoSuchMethod.<anonymous function>","TypeErrorDecoder.matchTypeError","TypeErrorDecoder.extractPattern","TypeErrorDecoder.provokeCallErrorOn","TypeErrorDecoder.provokePropertyErrorOn","NullError.toString","NullError","JsNoSuchMethodError.toString","JsNoSuchMethodError","UnknownJsTypeError.toString","unwrapException.saveStackTrace","_StackTrace.toString","Closure.toString","StaticClosure.toString","BoundClosure.==","BoundClosure.hashCode","BoundClosure.toString","BoundClosure.selfOf","BoundClosure.receiverOf","BoundClosure.computeFieldNamed","CastErrorImplementation.toString","CastErrorImplementation","RuntimeError.toString","RuntimeError","JsLinkedHashMap.length","JsLinkedHashMap.keys","JsLinkedHashMap.[]","JsLinkedHashMap.internalGet","JsLinkedHashMap._getBucket","JsLinkedHashMap.[]=","JsLinkedHashMap.internalSet","JsLinkedHashMap.forEach","JsLinkedHashMap._addHashTableEntry","JsLinkedHashMap._modified","JsLinkedHashMap._newLinkedCell","JsLinkedHashMap.internalFindBucketIndex","JsLinkedHashMap.toString","JsLinkedHashMap._getTableCell","JsLinkedHashMap._getTableBucket","JsLinkedHashMap._setTableEntry","JsLinkedHashMap._deleteTableEntry","JsLinkedHashMap._newHashTable","LinkedHashMapKeyIterable.length","LinkedHashMapKeyIterable.iterator","LinkedHashMapKeyIterator","LinkedHashMapKeyIterator.current","LinkedHashMapKeyIterator.moveNext","initHooks.<anonymous function>","JSSyntaxRegExp.toString","JSSyntaxRegExp.makeNative","extractKeys","_checkValidIndex","_checkValidRange","NativeTypedArray.length","NativeTypedArrayOfDouble.[]","NativeInt16List.[]","NativeInt32List.[]","NativeInt8List.[]","NativeUint16List.[]","NativeUint32List.[]","NativeUint8ClampedList.length","NativeUint8ClampedList.[]","NativeUint8List.length","NativeUint8List.[]","_AsyncRun._initializeScheduleImmediate","_AsyncRun._scheduleImmediateJsOverride","_AsyncRun._scheduleImmediateWithSetImmediate","_AsyncRun._scheduleImmediateWithTimer","_makeAsyncAwaitCompleter","Completer.sync","_Completer.future","_asyncStartSync","_asyncAwait","_asyncReturn","_asyncRethrow","_awaitOnObject","_wrapJsFunctionForAsync","_registerErrorHandler","_microtaskLoop","_startMicrotaskLoop","_scheduleAsyncCallback","_schedulePriorityAsyncCallback","scheduleMicrotask","StreamIterator","_rootHandleUncaughtError","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_AsyncRun._initializeScheduleImmediate.internalCallback","_AsyncRun._initializeScheduleImmediate.<anonymous function>","_AsyncRun._scheduleImmediateJsOverride.internalCallback","_AsyncRun._scheduleImmediateWithSetImmediate.internalCallback","_TimerImpl","_TimerImpl.internalCallback","_AsyncAwaitCompleter.complete","_AsyncAwaitCompleter.completeError","_AsyncAwaitCompleter.complete.<anonymous function>","_AsyncAwaitCompleter.completeError.<anonymous function>","_awaitOnObject.<anonymous function>","_wrapJsFunctionForAsync.<anonymous function>","_Completer.completeError","_nonNullError","_Completer.completeError[function-entry$1]","_AsyncCompleter.complete","_AsyncCompleter._completeError","_SyncCompleter.complete","_SyncCompleter.complete[function-entry$0]","_SyncCompleter._completeError","_FutureListener.matchesErrorTest","_FutureListener.handleError","_Future.then","_Future.then[function-entry$1]","_Future._thenNoZoneRegistration","_Future._addListener","_Future._prependListeners","_Future._removeListeners","_Future._reverseListeners","_Future._complete","_Future._completeError","_Future._setError","_Future._asyncComplete","_Future._chainFuture","_Future._asyncCompleteError","_Future._chainForeignFuture","_Future._chainCoreFuture","_Future._propagateToListeners","_Future._addListener.<anonymous function>","_Future._prependListeners.<anonymous function>","_Future._chainForeignFuture.<anonymous function>","_Future._chainForeignFuture[function-entry$1].<anonymous function>","_Future._asyncComplete.<anonymous function>","_Future._completeWithValue","_Future._chainFuture.<anonymous function>","_Future._asyncCompleteError.<anonymous function>","_Future._propagateToListeners.handleWhenCompleteCallback","_Future._propagateToListeners.handleWhenCompleteCallback.<anonymous function>","_Future._propagateToListeners.handleValueCallback","_Future._propagateToListeners.handleError","Stream.length","_Future","Stream.length.<anonymous function>","Stream_length_closure","AsyncError.toString","_rootHandleUncaughtError.<anonymous function>","_RootZone.runGuarded","_RootZone.runUnaryGuarded","_RootZone.runUnaryGuarded[function-entry$2]","_RootZone.bindCallback","_RootZone.bindCallback[function-entry$1]","_RootZone.bindCallbackGuarded","_RootZone.bindUnaryCallbackGuarded","_RootZone.[]","_RootZone.run","_RootZone.run[function-entry$1]","_RootZone.runUnary","_RootZone.runUnary[function-entry$2]","_RootZone.runBinary","_RootZone.runBinary[function-entry$3]","_RootZone.registerBinaryCallback","_RootZone.registerBinaryCallback[function-entry$1]","_RootZone.bindCallback.<anonymous function>","_RootZone.bindCallbackGuarded.<anonymous function>","_RootZone.bindUnaryCallbackGuarded.<anonymous function>","_RootZone_bindUnaryCallbackGuarded_closure","_HashMap._getTableEntry","_HashMap._setTableEntry","_HashMap._newHashTable","LinkedHashMap._literal","LinkedHashMap._empty","LinkedHashSet","IterableBase.iterableToShortString","IterableBase.iterableToFullString","_isToStringVisiting","_iterablePartsToStrings","LinkedHashSet.from","MapBase.mapToString","_HashMap.length","_HashMap.keys","_HashMap.containsKey","_HashMap._containsKey","_HashMap.[]","_HashMap._get","_HashMap.[]=","_IdentityHashMap._computeHashCode","_HashMap.forEach","_HashMap._computeKeys","_HashMap._getBucket","_IdentityHashMap._findBucketIndex","_HashMapKeyIterable.length","_HashMapKeyIterable.iterator","_HashMapKeyIterator.current","_HashMapKeyIterator.moveNext","_LinkedHashSet.iterator","_LinkedHashSetIterator","_LinkedHashSet.length","_LinkedHashSet.contains","_LinkedHashSet._contains","_LinkedHashSet.add","_LinkedHashSet._add","_LinkedHashSet._addHashTableEntry","_LinkedHashSet._newLinkedCell","_LinkedHashSet._computeHashCode","_LinkedHashSet._findBucketIndex","_LinkedHashSet._newHashTable","_LinkedHashSetIterator.current","_LinkedHashSetIterator.moveNext","ListMixin.iterator","ListMixin.elementAt","ListMixin.map","ListMixin.toString","MapBase.mapToString.<anonymous function>","MapMixin.forEach","MapMixin.length","MapMixin.toString","MapView.[]","MapView.forEach","MapView.length","MapView.keys","MapView.toString","SetMixin.addAll","SetMixin.map","SetMixin.toString","_parseJson","_convertJsonToDartLazy","_JsonMap.[]","_JsonMap.length","_JsonMap.keys","_JsonMap.forEach","_JsonMap._computeKeys","_JsonMap._process","_JsonMapKeyIterable.length","_JsonMapKeyIterable.elementAt","_JsonMapKeyIterable.iterator","JsonCodec.decode","JsonCodec.decode[function-entry$1]","JsonCodec.decoder","Utf8Codec.encoder","Utf8Encoder.convert","Utf8Encoder.convert[function-entry$1]","_Utf8Encoder._writeSurrogate","_Utf8Encoder._fillBuffer","Error._objectToString","List.from","RegExp","Error.safeToString","NoSuchMethodError.toString.<anonymous function>","DateTime.==","DateTime.hashCode","DateTime.toString","DateTime._fourDigits","DateTime._threeDigits","DateTime._twoDigits","NullThrownError.toString","ArgumentError._errorName","ArgumentError._errorExplanation","ArgumentError.toString","ArgumentError","ArgumentError.value","RangeError._errorName","RangeError._errorExplanation","RangeError.value","RangeError.range","RangeError.checkValidRange","IndexError._errorName","IndexError._errorExplanation","IndexError","NoSuchMethodError.toString","NoSuchMethodError","UnsupportedError.toString","UnsupportedError","UnimplementedError.toString","UnimplementedError","StateError.toString","StateError","ConcurrentModificationError.toString","ConcurrentModificationError","OutOfMemoryError.toString","StackOverflowError.toString","CyclicInitializationError.toString","_Exception.toString","FormatException.toString","FormatException","Iterable.map","Iterable.where","Iterable.join","Iterable.length","Iterable.single","Iterable.elementAt","Iterable.toString","Null.hashCode","Null.toString","Object.==","Object.hashCode","Object.toString","Object.noSuchMethod","StringBuffer.length","StringBuffer.toString","StringBuffer._writeAll","_Uri.host","_Uri.port","_Uri.toString","_Uri._initializeText","_Uri.==","_Uri.hashCode","_Uri._uriEncode","JSSyntaxRegExp.hasMatch","StringBuffer.writeCharCode","_Uri._defaultPort","_Uri._fail","_Uri._makePort","_Uri._makeHost","_Uri._makeScheme","_Uri._canonicalizeScheme","_Uri._makeUserInfo","_Uri._makePath","_Uri._makeQuery","_Uri._makeFragment","_Uri._mayContainDotSegments","_Uri._removeDotSegments","JSArray.isNotEmpty","_Uri._normalizeRelativePath","_Uri._escapeScheme","_Uri._isAlphabeticCharacter","_Uri._makeQuery.writeParameter","_Uri._makeQuery.<anonymous function>","document","Element.html","ListMixin.where","Node.nodes","Element._safeTagName","HttpRequest.getString","HttpRequest.request","Completer","_convertNativeToDart_EventTarget","_wrapZone","AnchorElement.toString","AreaElement.toString","DomException.toString","Element.attributes","Element.toString","Element.createFragment","NodeValidatorBuilder.common","NodeValidatorBuilder.allowHtml5","NodeValidatorBuilder.allowTemplating","Element._canBeUsedToCreateContextualFragment","Element.createFragment[function-entry$1$treeSanitizer]","Element.innerHtml","Element.setInnerHtml","Element.setInnerHtml[function-entry$1]","Element.onSubmit","EventStreamProvider.forElement","Element.html.<anonymous function>","EventTarget._addEventListener","HttpRequest.open","HttpRequest.open[function-entry$2$async]","HttpRequest.getString.<anonymous function>","HttpRequest.request.<anonymous function>","Location.toString","_ChildNodeListLazy.single","_ChildNodeListLazy.addAll","_ChildNodeListLazy.iterator","ImmutableListMixin.iterator","_ChildNodeListLazy.length","_ChildNodeListLazy.[]","Node.remove","Node.toString","NodeList.length","NodeList.[]","NodeList.elementAt","TableElement.createFragment","TableRowElement.createFragment","TableSectionElement.createFragment","TemplateElement.setInnerHtml","TemplateElement.setInnerHtml[function-entry$1]","_NamedNodeMap.length","_NamedNodeMap.[]","_NamedNodeMap.elementAt","_AttributeMap.forEach","_AttributeMap.keys","_ElementAttributeMap.[]","_ElementAttributeMap.length","_EventStreamSubscription._tryResume","_EventStreamSubscription","_EventStreamSubscription.<anonymous function>","_Html5NodeValidator","_Html5NodeValidator.allowsElement","_Html5NodeValidator.allowsAttribute","_SameOriginUriPolicy._hiddenAnchor","UriPolicy","_Html5NodeValidator._standardAttributeValidator","_Html5NodeValidator._uriAttributeValidator","NodeValidatorBuilder.allowsElement","NodeValidatorBuilder.allowsAttribute","NodeValidatorBuilder.allowsElement.<anonymous function>","NodeValidatorBuilder.allowsAttribute.<anonymous function>","_SimpleNodeValidator","_SimpleNodeValidator.allowsElement","_SimpleNodeValidator.allowsAttribute","_SimpleNodeValidator.<anonymous function>","_TemplatingNodeValidator.allowsAttribute","_TemplatingNodeValidator","_TemplatingNodeValidator.<anonymous function>","_SvgNodeValidator.allowsElement","_SvgNodeValidator.allowsAttribute","FixedSizeListIterator.moveNext","FixedSizeListIterator.current","_DOMWindowCrossFrame._createSafe","_ValidatingTreeSanitizer.sanitizeTree","_ValidatingTreeSanitizer._removeNode","_ValidatingTreeSanitizer._sanitizeUntrustedElement","_ValidatingTreeSanitizer._sanitizeElement","JSArray.toList","_ValidatingTreeSanitizer.sanitizeTree.walk","_callDartFunction","Function._apply1","_defineProperty","_getOwnProperty","_convertToJS","_getJsProxy","_convertToDart","DateTime._withValue","_wrapToDart","_getDartProxy","JsObject.[]","JsObject.hashCode","JsObject.==","JsObject.toString","JsObject.callMethod","JsObject._convertDataTree","JsObject._convertDataTree._convert","JsArray._checkIndex","JsArray.[]","JsArray.length","_convertToJS.<anonymous function>","_wrapToDart.<anonymous function>","SvgElement.innerHtml","SvgElement.createFragment","NodeValidatorBuilder.allowSvg","NodeTreeSanitizer","SvgElement.onSubmit","main","_error","JSArray.where","_focus","_focus[function-entry$1]","main.<anonymous function>","_error.<anonymous function>","DART_CLOSURE_PROPERTY_NAME","JS_INTEROP_INTERCEPTOR_TAG","TypeErrorDecoder.noSuchMethodPattern","TypeErrorDecoder.notClosurePattern","TypeErrorDecoder.nullCallPattern","TypeErrorDecoder.nullLiteralCallPattern","TypeErrorDecoder.undefinedCallPattern","TypeErrorDecoder.undefinedLiteralCallPattern","TypeErrorDecoder.nullPropertyPattern","TypeErrorDecoder.nullLiteralPropertyPattern","TypeErrorDecoder.undefinedPropertyPattern","TypeErrorDecoder.undefinedLiteralPropertyPattern","_AsyncRun._scheduleImmediateClosure","_toStringVisiting","_Uri._needsNoEncoding","_Html5NodeValidator._allowedElements","_Html5NodeValidator._attributeValidators","context","_DART_OBJECT_PROPERTY_NAME","_dartProxyCtor","_graphReference","_details","InputElement","main_closure","","Future","String","_ElementEventStreamImpl","Event","_current","_wrapJsFunctionForAsync_closure","_skipLeadingWhitespace","_skipTrailingWhitespace","_isWhitespace","NullThrownError","safeToString","_objectToString","Closure","objectTypeName","_objectClassName","StringBuffer","Object","markFixed","markFixedList","value","int","Null","UnknownJavaScriptObject","RangeError","CyclicInitializationError","iterableToFullString","_writeAll","FixedSizeListIterator","ArrayIterator","ListIterator","_StreamIterator","ExceptionAndStackTrace","_StackTrace","unwrapException_saveStackTrace","UnknownJsTypeError","StackOverflowError","Error","extractPattern","TypeErrorDecoder","provokePropertyErrorOn","provokeCallErrorOn","_awaitOnObject_closure","StackTrace","Function","_FutureListener","_Future__addListener_closure","_propagateToListeners","_Future__propagateToListeners_handleWhenCompleteCallback","_Future__propagateToListeners_handleValueCallback","_Future__propagateToListeners_handleError","_chainCoreFuture","AsyncError","_Future__propagateToListeners_handleWhenCompleteCallback_closure","_Future__prependListeners_closure","_rootHandleUncaughtError_closure","_nextCallback","_lastPriorityCallback","_lastCallback","_AsyncCallbackEntry","_isInCallbackLoop","_initializeScheduleImmediate","_AsyncRun__initializeScheduleImmediate_internalCallback","_AsyncRun__initializeScheduleImmediate_closure","_TimerImpl_internalCallback","_AsyncRun__scheduleImmediateWithSetImmediate_internalCallback","_Exception","_AsyncRun__scheduleImmediateJsOverride_internalCallback","_RootZone_bindCallback_closure","_RootZone_bindCallbackGuarded_closure","initNativeDispatchFlag","getTagFunction","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","alternateTagFunction","JavaScriptIndexingBehavior","prototypeForTagFunction","initHooks_closure","_AsyncAwaitCompleter","_SyncCompleter","_chainForeignFuture","_Future__chainForeignFuture_closure","_AsyncAwaitCompleter_completeError_closure","_AsyncAwaitCompleter_complete_closure","fromTearOff","receiverOf","selfOf","List","StaticClosure","BoundClosure","functionCounter","forwardCallTo","forwardInterceptedCallTo","cspForwardCall","selfFieldNameCache","computeFieldNamed","receiverFieldNameCache","cspForwardInterceptedCall","_literal","_makeScheme","_makeUserInfo","_makeHost","_makeQuery","_makeFragment","_makePort","_makePath","_normalizeRelativePath","_removeDotSegments","_Uri","getString","Map","ProgressEvent","HttpRequest","_convertDataTree","JsObject","_JsonMap","mapToString","MapBase_mapToString_closure","LinkedHashMapKeyIterable","_JsonMapKeyIterable","iterableToShortString","range","Uri","_defaultPort","MappedListIterable","from","TypedData","DateTime","getYear","_fourDigits","getMonth","_twoDigits","getDay","getHours","getMinutes","getSeconds","getMilliseconds","_threeDigits","lazyAsJsDate","Blob","KeyRange","ImageData","Node","Window","WorkerGlobalScope","_convertToJS_closure","applyFunctionWithPositionalArguments","ListMixin","_genericApplyFunctionWithPositionalArguments","functionNoSuchMethod","Primitives_functionNoSuchMethod_closure","JSInvocationMirror","Symbol","NoSuchMethodError_toString_closure","JsLinkedHashMap","ConstantMapView","NodeValidator","_SvgNodeValidator","_ValidatingTreeSanitizer","NodeValidatorBuilder","_ChildNodeListLazy","_TemplatingNodeValidator_closure","_SimpleNodeValidator_closure","WhereIterable","Iterable","WhereIterator","_LinkedHashSet","_newHashTable","_LinkedHashSetCell","_SameOriginUriPolicy","_empty","html","Element_Element$html_closure","Element","noElement","tooMany","_defaultValidator","_defaultSanitizer","_parseDocument","_parseRange","BodyElement","_ValidatingTreeSanitizer_sanitizeTree_walk","_safeTagName","_ElementAttributeMap","TemplateElement","NodeValidatorBuilder_allowsAttribute_closure","ScriptElement","SvgElement","NodeValidatorBuilder_allowsElement_closure","_wrapToDart_closure","JsArray","JsFunction","JsObject__convertDataTree__convert","_IdentityHashMap","EfficientLengthMappedIterable","MappedIterator","ListIterable","EfficientLengthIterable","_ConstantMapKeyIterable","_setTableEntry","_getTableEntry","_HashMapKeyIterable","_HashMapKeyIterator","_createSafe","EventTarget","_DOMWindowCrossFrame","request","HttpRequest_getString_closure","_AsyncCompleter","HttpRequest_request_closure","_Future__asyncComplete_closure","_Future__chainFuture_closure","_Future__asyncCompleteError_closure","_mayContainDotSegments","_escapeScheme","_isAlphabeticCharacter","_Uri__makeQuery_closure","_Uri__makeQuery_writeParameter","_uriEncode","stringFromCharCode","checkValidRange","_Utf8Encoder","JSSyntaxRegExp","makeNative","_fail","_canonicalizeScheme","LinkedHashMapCell","_error_closure","bool","_EventStreamSubscription_closure","JS_CONST","Interceptor","JSBool","JSNull","JavaScriptObject","PlainJavaScriptObject","JavaScriptFunction","JSArray","JSUnmodifiableArray","num","JSNumber","JSInt","JSDouble","JSString","FixedLengthListMixin","ConstantMap","ConstantStringMap","noSuchMethodPattern","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","TearOffClosure","NativeTypedData","NativeTypedArray","double","NativeTypedArrayOfDouble","NativeTypedArrayOfInt","NativeInt16List","NativeInt32List","NativeInt8List","NativeUint16List","NativeUint32List","NativeUint8ClampedList","NativeUint8List","_Completer","Stream","StreamSubscription","StreamTransformerBase","_Zone","_RootZone","_HashMap","_HashSetBase","ListBase","MapBase","MapMixin","_UnmodifiableMapMixin","MapView","UnmodifiableMapView","SetMixin","SetBase","Codec","Converter","Encoding","JsonCodec","JsonDecoder","Utf8Codec","Utf8Encoder","OutOfMemoryError","Iterator","_needsNoEncoding","HtmlElement","AnchorElement","AreaElement","CharacterData","DomException","FormElement","HttpRequestEventTarget","Location","NodeList","SelectElement","TableElement","TableRowElement","TableSectionElement","_NamedNodeMap","_AttributeMap","_EventStream","_allowedElements","_attributeValidators","ImmutableListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin&FixedLengthListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin&FixedLengthListMixin","_ListBase&Object&ListMixin","_UnmodifiableMapView&MapView&_UnmodifiableMapMixin","_NodeList&Interceptor&ListMixin","_NodeList&Interceptor&ListMixin&ImmutableListMixin","__NamedNodeMap&Interceptor&ListMixin","__NamedNodeMap&Interceptor&ListMixin&ImmutableListMixin","_JsArray&JsObject&ListMixin","_scheduleImmediateJsOverride","_scheduleImmediateWithSetImmediate","_scheduleImmediateWithTimer","_standardAttributeValidator","_uriAttributeValidator","_scheduleImmediateClosure","$intercepted$get$onSubmit$x","getInterceptor$x","graph_viz_main___focus$closure","$intercepted$trim0$s","getInterceptor$s","$intercepted$toString0$IJavaScriptFunctionJavaScriptObjectabnsux","getInterceptor$","$intercepted$get$length$asx","getInterceptor$asx","$intercepted$get$iterator$ax","getInterceptor$ax","$intercepted$[]$asx","async___startMicrotaskLoop$closure","async__AsyncRun__scheduleImmediateJsOverride$closure","async__AsyncRun__scheduleImmediateWithSetImmediate$closure","async__AsyncRun__scheduleImmediateWithTimer$closure","$intercepted$startsWith1$s","$intercepted$get$_get_target$x","$intercepted$get$status$x","$intercepted$get$statusText$x","$intercepted$get$responseText$x","$intercepted$set$innerHtml$x","$intercepted$get$hashCode$IJavaScriptObjectabnsu","$intercepted$$eq$Iu","js___convertToJS$closure","$intercepted$elementAt1$ax","js___convertToDart$closure","$intercepted$map11$ax","$intercepted$noSuchMethod1$Iu","html__Html5NodeValidator__standardAttributeValidator$closure","html__Html5NodeValidator__uriAttributeValidator$closure","$intercepted$remove0$x","$intercepted$get$previousNode$x","$intercepted$get$attributes$x","$intercepted$toLowerCase0$s","$intercepted$_codeUnitAt1$s","$intercepted$codeUnitAt1$s","$intercepted$_addEventListener3$x","functionThatReturnsNull","makeConstantList","where","[]","toString","noSuchMethod","createFragment","allowsAttribute","status","dart.dom.html#_get_target","last","runBinary","open","call","indexOf","toLowerCase","registerBinaryCallback","contains","dart.async#_asyncCompleteError","allowsUri","dart.async#_thenNoZoneRegistration","responseText","_js_helper#_modified","dart.collection#_get","moveNext","iterator","attributes","_js_helper#_deleteTableEntry","run","dart.async#_removeListeners","complete","handleError","internalFindBucketIndex","dart.async#_reverseListeners","tagName","dart.dom.html#_sanitizeElement","map","dart.collection#_contains","namedArguments","dart.js#_checkIndex","dart.collection#_getBucket","_js_helper#_getTableBucket","host","dart.convert#_writeSurrogate","dart.convert#_fillBuffer","runUnary","_interceptors#_codeUnitAt","addAll","dart.dom.html#_removeNode","dart.collection#_addHashTableEntry","dart.collection#_containsKey","completeError","dart.async#_addListener","_js_helper#_newLinkedCell","_js_helper#_getTableCell","callMethod","dart.convert#_process","startsWith","decoder","bindCallback","matchesErrorTest","positionalArguments","dart.core#_errorName","dart.async#_asyncComplete","forEach","bindUnaryCallbackGuarded","dart.convert#_computeKeys","internalGet","dart.async#_complete","dart.collection#_computeHashCode","dart.collection#_newLinkedCell","then","_js_helper#_newHashTable","allowsElement","_interceptors#_shrBothPositive","encoder","dart.async#_state","dart.collection#_computeKeys","current","sanitizeTree","dart.collection#_findBucketIndex","runUnaryGuarded","single","hashCode","dart.dom.html#_sanitizeUntrustedElement","dart.dom.html#_addEventListener","decode","any","_js_helper#_fetch","matchTypeError","runGuarded","dart.dom.html#_tryResume","join","containsKey","dart.collection#_add","substring","bindCallbackGuarded","memberName","convert","trim","setInnerHtml","remove","length","dart.async#_chainFuture","_js_helper#_addHashTableEntry","dart.async#_resultOrListeners","codeUnitAt","defaultValue","port","add","toInt","keys","dart.core#_errorExplanation","dart.async#_completeError","dart.async#_prependListeners","dart.core#_contents=","innerHtml=","_interceptors#_shrOtherPositive","dart.dom.html#_element","elementAt","statusText","_js_helper#_setTableEntry","previousNode","onSubmit","$indexSet","$le","$index","$eq","$shr","$ge","$and","$lt","$mul","$shl","$add","lookupInterceptorByConstructor","cacheInterceptorOnConstructor","objectToHumanReadableString","checkGrowable","listToString","_codeUnitAt","_","joinArguments","selfFieldName","receiverFieldName","extractFunctionTypeObjectFrom","isFunctionSubtype","_getRuntimeTypeAsString","write","_writeString","checkArguments","computeTypeName","formatType","isJsArray","setDispatchProperty","markUnmodifiableList","es6","unvalidated","internal","_getBucket","internalComputeHashCode","internalSet","_createTimer","_completer","sync","_AsyncAwaitCompleter._completer","future","_setValue","_scheduleImmediate","inSameErrorZone","_zone","_mayAddListener","_chainSource","_isComplete","_cloneResult","_setError","_setErrorObject","_setPendingComplete","_setChained","_hasError","handleUncaughtError","handlesValue","handlesComplete","_removeListeners","_clearPendingComplete","_completeWithValue","handleWhenComplete","handleValue","listen","_rethrow","writeAll","_set","_computeHashCode","_HashMap._set","identityHashCode","_modified","_isUpgraded","withBufferSize","sublist","_combineSurrogatePair","year","month","day","hour","minute","second","millisecond","checkNotNegative","_writeOne","_initializeText","hasAuthority","_writeAuthority","hasQuery","hasFragment","hasMatch","checkString","encode","writeCharCode","fromCharCode","_isSchemeCharacter","isNotEmpty","isEmpty","encodeQueryComponent","nodes","common","_validators","allowHtml5","allowTemplating","_canBeUsedToCreateContextualFragment","_cannotBeUsedToCreateContextualFragment","forElement","addEventListener","_hiddenAnchor","allowedElements","allowedAttributes","allowedUriAttributes","warn","toList","_toListGrowable","sanitizeNode","_removeNode","apply","_apply1","Function.apply","applyFunction","fromMillisecondsSinceEpoch","_withValue","_fromJs","allowSvg","target","jsify","provokeCallErrorOnNull","provokeCallErrorOnUndefined","provokePropertyErrorOnNull","provokePropertyErrorOnUndefined"],
+  "mappings": "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",
+  "x_org_dartlang_dart2js": {
+    "minified_names": {
+      "global": "b3,644,d5,123,i8,645,aK,646,q,647,f,648,j,129,aT,615,cQ,245,hm,246,cP,247,cO,248,d_,250,cW,242,cx,649,a9,650,i,651,hG,652,ar,618,e5,653,e6,654,ca,655,c,105,Z,102,ah,107,da,106,bf,656,b,83,af,104,F,431,a8,657,dS,658,d,659,ab,660,ew,661,a0,130,bs,138,aq,662,N,136,ai,80,e,101,hx,137,a,663,hQ,224,e1,664,b5,665,bR,666,eS,316,x,314,P,667,t,134,v,668,a1,140,bj,669,aG,666,aF,670,by,128,dM,671,b4,672,br,347,cn,673,c2,674,az,646,dZ,440,aW,675,bE,108,G,646,dI,450,ce,676,M,225,hX,100,fU,677,p,109,O,110,b1,678,cG,679,ig,680,ba,646,ch,646,eW,681,cm,682,o,683,D,684,eU,685,cq,686,aI,687,es,180,e9,182,hn,249,ho,688,hp,688,I,689,hB,251,bw,125,d3,124,cV,147,y,146,ia,148,al,690,d1,144,fk,691,fl,692,X,262,V,693,aN,258,fv,694,fu,695,ft,696,aL,697,aw,698,cY,260,hD,261,fw,699,cX,259,fs,700,hC,701,hE,255,W,702,cZ,254,ae,703,ad,704,cv,705,bq,706,hz,252,f6,707,f8,708,at,115,f7,709,h_,646,fZ,267,h0,710,aJ,646,eY,444,fa,711,i3,113,fj,712,f9,713,fO,714,fN,715,bA,716,i1,155,cs,646,i7,150,d4,717,aO,718,aS,719,d0,720,aU,153,d8,152,bB,0,R,721,eV,446,i2,156,hY,157,d9,722,i9,154,Y,158,hZ,723,i_,723,i0,723,f2,724,fW,725,ac,646,bg,448,ag,141,cy,726,fo,727,fp,727,fq,727,bD,256,f3,728,f4,729,dH,730,hT,81,bU,731,aZ,732,r,733,ck,646,eO,734,aY,735,B,736,bW,737,dG,738,dE,739,a5,740,ax,741,bT,742,dF,743,eL,646,eK,197,eI,173,hw,618,bo,616,cc,744,hd,745,he,746,h7,747,ha,748,h6,749,h9,750,h8,751,hf,752,hg,753,h3,754,dV,755,S,756,id,142,cj,757,hs,508,ay,758,ea,759,bt,596,J,760,hA,397,b2,646,aM,398,fE,761,aE,762,ei,763,bb,764,fF,765,e_,766,hy,348,U,767,ef,218,T,111,eZ,768,h5,769,dT,456,ap,770,aC,771,cR,594,d6,79,cr,772,bQ,646,b_,773,eF,774,dN,775,eD,776,ak,777,ez,778,eA,779,eC,780,eE,781,eB,782,dO,783,L,784,bS,785,cb,786,c3,787,m,788,ct,789,cu,790,ht,791,cT,593,hu,791,hq,588,bn,590,ex,792,cS,592,u,793,hS,132,ev,794,ci,795,ey,796,e4,797,bi,798,cf,646,ep,799,eo,442,aH,798,b9,800,dK,801,cU,591,aa,802,cB,646,cH,646,fV,803,cN,804,cg,805,w,806,cd,771,fX,575,aB,646,fY,807,fS,808,fT,808,bk,809,k,810,bz,133,f1,811,fG,812,bm,813,fH,814,fI,368,fQ,815,bl,559,eg,816,dP,817,dQ,818,a6,819,c5,820,e0,821,c0,822,c_,823,H,824,b0,825,aX,826,hi,827,a7,828,ff,829,cp,830,eq,831,cl,832,bh,833,er,834,hP,500,hH,835,bp,597,hI,835,hJ,835,b7,836,b8,837,eb,838,fC,839,bZ,840,el,841,bd,67,ao,842,ek,646,l,843,fc,844,fA,813,d7,111,cA,845,cz,846,fy,847,fz,848,fe,849,Q,850,fd,851,dX,852,dW,853,f5,854,dY,855,fn,856,fr,857,fm,858,bV,646,dD,195,hF,126,ic,135,cL,859,cI,860,cK,861,hb,862,hc,863,cM,864,eG,865,eH,866,hh,867,hr,226,hO,103,eJ,646,e7,868,e8,869,cJ,870,h4,871,ee,872,hR,112,hv,873,as,874,fi,875,hK,509,fh,557,fP,338,ib,122,ip,876,n,877,e2,878,c8,879,b6,880,eu,881,an,882,am,883,io,884,bC,885,c9,886,c7,887,e3,888,aA,889,c1,890,dJ,891,dL,892,iE,893,iF,894,iG,895,iH,896,iK,897,iL,898,iJ,899,iI,900,iN,901,iM,902,co,903,en,904,be,905,aP,906,em,907,K,908,is,909,it,910,iu,911,iv,912,iw,913,ix,914,iy,915,cw,916,eP,917,eQ,918,eR,919,hj,920,fM,921,fx,922,fB,923,eh,924,aD,925,bc,926,h1,927,ej,928,eX,929,eN,930,eM,931,bX,932,bY,933,dR,934,ec,935,ed,936,f_,937,f0,938,et,939,c6,940,iY,941,C,942,ih,943,ii,944,ij,945,il,946,im,947,dU,948,ir,949,iz,950,iA,951,eT,952,iC,953,iD,954,iX,955,fb,956,fg,957,iT,958,iU,959,c4,960,fR,570,cC,961,cD,962,cE,963,cF,964,fJ,965,h2,966,fK,967,fL,968,hk,969,hl,970,fD,971,aR,1,i4,82,bu,121,ie,127,j6,131,j3,145,j5,149,iP,972,iQ,973,iR,974,j1,253,iB,646,iV,975,iW,976,ik,622,iq,623,iO,977,j2,635,j4,639,iS,640,iZ,641,j0,642,j_,643,bL,642,aV,622,aj,635,db,893,dc,894,dd,895,de,896,dh,897,di,898,dg,899,df,900,dk,901,dj,902,bG,977,bF,623,bK,643,bJ,641,bI,959,dl,958,bH,640,dm,941,dn,639,du,978,z,979,hU,980,dC,981,a_,982,a4,983,h,984,a3,985,aQ,986,E,987,bx,988,av,989,d2,990,hL,991,hM,992,hN,993,bP,994,ds,995,dx,996,dy,997,dw,998,bO,999,a2,1000,au,1001,i6,1002,dr,1003,i5,1004,dz,1005,dA,1006,hV,1007,hW,1008,bN,1009,dv,1010,dt,1011,dB,1012,dq,1013,bM,1014,dp,1015,bv,1016,A,1017",
+      "instance": "aV,1018,aX,1019,aU,1020,b1,646,b0,646,aT,1021,a1,1022,aY,1020,aZ,1023,aW,1020,b_,646,bv,1022,aR,1024,h,1020,be,1025,aC,1026,bN,1027,bG,1028,aN,1029,bD,1030,aM,1031,bI,1032,t,1033,b5,1034,bm,1035,aa,1036,bK,1037,bf,1038,bd,1039,l,1040,n,1041,bn,1042,ba,1043,aJ,1044,W,1045,bC,1030,ac,1021,I,1046,bB,1047,aB,1048,X,1049,H,1023,aK,1050,bL,1044,bi,1051,J,1052,b8,1053,aE,1054,b7,1055,bX,1046,aq,1056,ar,1057,bY,1022,az,1058,au,1059,bc,1060,ad,1061,F,1062,u,1063,R,1064,ak,1065,b9,1066,ay,1067,al,1068,a2,1069,a5,1070,ax,1071,bg,1072,U,1073,by,1074,bp,1075,ae,1018,bF,1076,bZ,1028,aH,1077,a4,1078,b4,1079,v,1080,bq,1081,V,1082,bE,1083,an,1084,ao,1085,a7,1086,Z,1087,a6,1088,O,1089,bP,1061,bk,1090,bA,1091,at,1092,am,1093,m,1094,ah,1095,N,1096,bQ,1097,L,1098,p,1099,S,1067,bj,1100,b3,1101,bx,1102,av,1103,ap,1104,B,1105,bO,1106,bl,1107,T,1108,aQ,1073,ab,1109,b2,1110,M,1111,aw,1112,aD,1113,bo,1075,bt,1114,bT,1115,a0,1116,bJ,1117,j,1118,b6,1119,bs,1067,aj,1120,aL,1087,bh,1121,P,1122,bz,1123,bu,1114,aG,1124,Y,1125,ai,1111,bS,1126,br,1046,A,1022,q,1127,a3,1128,G,1129,as,1130,w,1131,aA,1132,bw,1102,bR,1097,a9,1133,bb,1134,C,1135,aI,1032,aS,1136,a8,1137,a_,1116,bH,1138,aF,1139,bM,1027,E,1140,af,1141,i,1142,D,1143,bW,1144,bV,1145,bU,1146,ag,1147,aO,1148,aP,1149,K,1150"
+    },
+    "frames": "iqTAiKoB+nCyB;0NA+BhBCqE;6IA8I8BCW;swBEnN9BC+C;yBA+GAAyC;8DAwBW5fc;yhBAwUiB6fe;yBAcE7fsB;2lCIrkBvB8f8B;okEHu2B4B9fsB;wBAEFA6B;wDA31BHA8B;mEA8IUAiB;0RA4LVAS;oIAPjBAmB;QAEF+fmB;scAkEmB/fS;+CAGU+fiB;+rCFkPrBCK;wtCAuaUriCAAxzBpBqiBqC,A;6zBA8tCmBoB0B;iLAqBjBqG0C;+BAOEAwC;QAIJrGwB;yBASAAuB;kCAqCcpBa;qvCAkjBfAmC;yFAKKAU;0EAWaA4E;yHASbAU;kFAmCmBAW;4DAGtBAW;6VA4DFAAWjtE8BAgE,A;gXX81E1BAgD;AAEAA4I;qgDA0M+BigByC;6NAYXAyC;s5BAkGAAyC;AACIC6C;k6BAuhBbCe;2BAElBCmB;+CAqFoBDU;oFA2DjBngBY;kNUltGNngBmC;8CAYYAmC;iQA8CPwgCkC;4rCAyJiBrgBe;8CAExBsgBAEqNACQ,A;oWFvGKC8B;gKAiBWCqBARACAVoMCVyC,A,A;iPU1GfngCK;YAAAAiB;idAmMU8gCuD;sUAgCAAuD;mKAoBPHqB;4pDGvkBEv/BAA2BT2/B+G,A;iIAZS3/BAAYT2/B+G,A;swCAsKgBp/B4D;shBC9QHwee;yEA8B+B2YAb6aZ3YsB,A;6ND/Of6gBK;8PASDCAejUJ9gByB,A;uGfmUA+gBkB;OAGC/gBoB;4OA4DAghBgD;+uBAq5CAhhBmR;u7DAq+BO2fY;4FAkCC3f8C;6cetxFRAe;6UAyDEihBYA+KFCmB,A;8QA9JTC0CAOSDoB,sH;gRAmGkBlhBgB;mlBA0JlBAkBA0BbAAAAAAQ,A,A;8sFIvUQohBS;0CA0IGphBSAnCYqhBAAAACAuB4oBSthBStB9xB5BAAAjC0BwhBAAAAxhB+B,A,A,A,A,A,A;qRDoTPAwB;AACrByhBY;glBE7QYCU;4CAYqB1hBkB;oCAIrB0hBU;oGAsBkB1hBc;mKAsD3BtYgB;iCEw6DGsYc;sbDn6BkB2hBgC;gmBHzhC1B3hBU;kkBAyLUAc;gJCpSAlXAsB+4BuCkXa,A;moBtBvxBtC4hBW;oRAmHe5hByB;QACPyb6B;kCA0EboGS;4CAQiBCS;AACLCM;uBAIZCoB;oBAIFt6BgB;iFAQEm6BS;wFAeiBCS;AACLCM;uBAIZCoB;kCAIFt6BgB;+RA6FA+5BkB;8CAkBFQAA/KACS,AAAoBliBqB,A;sFAoMpBmiBS;oBACAz6BgB;qFASIy6BS;oBACAz6BgB;iFAeJy6BS;oBACAz6BgB;4DA3HAy6BU;iIAkCkBLM;iBAIhBEgB;oBAIAIY;sFA6FuBCU;kBAGYnkBM;6BACxBokBsB;sFA6BcCM;mCACFXY;uBACGD6B;uDAGfWsB;OAMWtGM;0BAsEPwGM;uKAwBKCwB;AACZTgB;4CAaISwB;mBAEVhBiB;AAGASY;wKA7RAQM;0PA2FFCQA/BFlBiB,Q;+LA+HyBmByB;wHAKY5iBkB;+BAMmB+hBiC;AAC3BMyB;AACqBnkBY;mLAiBnB2kBuC;2BAEI7iBkB;yKAcN9Ba;uDAGQ8BkB;2EGuPXAAH3rBHgcM,A;MG6rBlB8GmB;4BAFqB9iBkB;gTD8MZAa;oDAEd+iB+B;8HAkMETyB;mHAYAAyB;qtCI/wBuCxBAXte/B9gBoB,A;2BW8eC8gBAX9eD9gBmB,A;+BW6oCOAiB;8LCr8BXgjBmB;yFAsBoBhjBc;2BAGxBgjBkC;4CAKF1CAfuRACe,A;AetROjJS;qlCE3PUtXmB;mBAGfsgBAjB8gBFCiB,A;gCiBngBEDAjBmgBFCyB,A;iDiB7fOjJS;sGHuCItXe;kqBAkETijBuCAOSCAA+NuBEoB,A,mI;4nBAhCvBFAAgCuBEkB,A;2PAiEvBpjBW;uRA6zBAA4BAwXbAAAAAAW,A,A;wPA9VeihBiB;4gBA0JiBjhBc;+EAS9BqjByB;+kBvBl4C8BrjBwB;iEA0IUAc;+I0B/JlCsgBe;gBAGFAc;AACAAAjBsgBJCW,A;AiBrgBIDW;mWA2TuBrCAd3ShBjeY,U;wBc6SQsXY;kICtObtXiB;gcClBKA+B;gGAiCPsjBS;yNAiBiCrFa;OAAAAAhBvG1BjeY,U;QgBwGAAc;6vBA8LkB2YA9ByPC3YyB,A;wL+BpcFoda;8SChEDmGkB;6DAcZCmC;yJA4CFC8B;0jCrBuFK9DW;oHA+SZ3f4B;+NAmHFsgBgB;AACAAAA1FJCW,A;8PsBEuBmDY;OACDCY;OACACY;OACACY;OACECY;OACACY;OACCCoD;61DtBqEHhkBe;oEAIlBsgBAAjFJCQ,A;wnEuB5V6CvgBiB;4FAwJnBAQ;8TAuRfikBwC;4cvBvkBmBtEc;4VAuhBjBuEO;0BAGFAO;oBAGEAU;qRyBmjEICiCAObCmB,4BAIFCuD,AAEF/De,qF;gPAeIgEmB;AAAkBAgB;uCAElBCmB;AAAqBAgB;4SzBh+DQCAIvlBcCsD,A;mBJ8lBnCCgB;wHAKRCAAjKaC8F,A;mXyB2+CVCgE;CAAAA8C;6QA6EU7kBe;sCAuBVsXM;mRAkPQwNApC5yDOCW,A;gcoCg2DXAW;2CAA4CAuB;siBAvTrDzEW;AAAiB0EoB;0BAEf1EAzBrkDJCU,A;AyBskDIDS;AAAiB0EoB;+QZ2qTL5NAtBhmX6BpXW,A;AsBgmX7BilBAAmoTLjlBW,A;mTA7kJSAAiB5jgBKAAtBrvBvBAAAtB0BwhBAAAAxhBqB,A,A,kB,A;4CKq2hBxB8iBc;kBAkBAAe;oyDA35JoC9iBW;6GA2pBVklBAAw+vBuBCiB,cAyBvDDAAAAAAACEEAAoFArHO,Y,AAnFAsHAAiKAtHO,4B,A,A,A;mBA/pwB4B/d8B;yWAmCxBslBAAwBDCgF,A;+eAg1CgCCAAo8oBxBxlB8B,A;+yEAltaEwd+B;2RAwGiC7EAA47bnC3YuB,A;+qCAhkQQAoC;sBACVilBAA10LEjlBW,A;IA00LiBilBAA10LjBjlBY,A;6KA05LQA6B;mDAIdilBAA95LMjlBa,A;qBAg6LOilBAAh6LPjlBa,A;gCAi6LFilBAAj6LEjlBW,A;IAi6LeilBAAj6LfjlBY,A;8KAy9LQA6B;mDAIdilBAA79LMjlBa,A;gCA+9LFilBAA/9LEjlBW,A;IA+9LmBilBAA/9LnBjlBY,A;k8BA8xXOqXmB;keAogDhBoO6B;gFAxDJzlBAAAAAO,A;0cA+mBsDAAA27F3BAAAea0lBAAAA1lB8B,A,8B,A;cA38FxCAQ;4GAoCiBqYqL;2EAaJrYyB;i8BAgtDCqXmC;qHAdRrXAA5KkC2lBuB,AACECuB,AACGC6B,A;AA2E7C7lBU;AAkGcsZAxB9upCDtZa,A;YwB8upCCsZuB;2jBAwnBCtZW;iOAksBFqX4f;+XAmCFyOkH;+WAqBQCAxBrxrCJCW,A;AwBsxrCMxI4B;uEAGgBnG2B;+DAEXA8E;AACpBkGwC;gGAvHF0I8F;+EAaICMAkBJ3IgD,iB;2ScrpsCyB4IA3BvCrBCAAKYEY,A,A;m8B2B4gBPCAL3ObCAtBvHAAuB,A,UsBuHAAAtBvHAAiE,A,A;O2BkWaDc;wvBA5P6BjNAtCxG7BtZW,A;QsCwG6BsZyB;kEAtHZtZyB;46BA6XkBymBW;2CAIAAkB;2CAGFAU;yKCwwExBvBAf6ujCiCCiB,AAyBvDDAAAAAAACEEAAoFArHO,Y,AAnFAsHAAiKAtHO,Q,A,A,A;Aez6jCiD2IAfk2jCjD3IO,AAAQ/dY,A;Aeh2jCcAAfuwmChBAW,A;AezwmCcklBa;4EAUEllB6B;WAEFilBAfshlBTjlBa,A;0Fe5rkBwBwlBAfmv+BxBxlB8B,A;mtDgBz8kCF8iB+B;kMAUD1LAxCuMGpXa,A;YwCvMHoXW;maAaApXa;+CAAAA6V;kNAOS2mBgB;gQAgBgCCwB;o4ZzCqnDhCC0G;qFAUAC8G;mFAUACuD;qFAUAC2D;"
+  }
+}
diff --git a/build_runner/lib/src/server/path_to_asset_id.dart b/build_runner/lib/src/server/path_to_asset_id.dart
new file mode 100644
index 0000000..3169b0f
--- /dev/null
+++ b/build_runner/lib/src/server/path_to_asset_id.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:path/path.dart' as p;
+
+AssetId pathToAssetId(
+    String rootPackage, String rootDir, List<String> pathSegments) {
+  var packagesIndex = pathSegments.indexOf('packages');
+  rootDir ??= '';
+  return packagesIndex >= 0
+      ? AssetId(pathSegments[packagesIndex + 1],
+          p.join('lib', p.joinAll(pathSegments.sublist(packagesIndex + 2))))
+      : AssetId(rootPackage, p.joinAll([rootDir].followedBy(pathSegments)));
+}
+
+/// Returns null for paths that neither a lib nor starts from a rootDir
+String assetIdToPath(AssetId assetId, String rootDir) =>
+    assetId.path.startsWith('lib/')
+        ? assetId.path.replaceFirst('lib/', 'packages/${assetId.package}/')
+        : assetId.path.startsWith('$rootDir/')
+            ? assetId.path.substring(rootDir.length + 1)
+            : null;
diff --git a/build_runner/lib/src/server/server.dart b/build_runner/lib/src/server/server.dart
new file mode 100644
index 0000000..bdf0150
--- /dev/null
+++ b/build_runner/lib/src/server/server.dart
@@ -0,0 +1,667 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:build/build.dart';
+import 'package:build_runner/src/entrypoint/options.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/generate/performance_tracker.dart';
+import 'package:crypto/crypto.dart';
+import 'package:glob/glob.dart';
+import 'package:logging/logging.dart';
+import 'package:mime/mime.dart';
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:timing/timing.dart';
+import 'package:web_socket_channel/web_socket_channel.dart';
+
+import '../generate/watch_impl.dart';
+import 'asset_graph_handler.dart';
+import 'path_to_asset_id.dart';
+
+const _performancePath = r'$perf';
+final _graphPath = r'$graph';
+final _assetsDigestPath = r'$assetDigests';
+final _buildUpdatesProtocol = r'$buildUpdates';
+final entrypointExtensionMarker = '/* ENTRYPOINT_EXTENTION_MARKER */';
+
+final _logger = Logger('Serve');
+
+enum PerfSortOrder {
+  startTimeAsc,
+  startTimeDesc,
+  stopTimeAsc,
+  stopTimeDesc,
+  durationAsc,
+  durationDesc,
+  innerDurationAsc,
+  innerDurationDesc
+}
+
+ServeHandler createServeHandler(WatchImpl watch) {
+  var rootPackage = watch.packageGraph.root.name;
+  var assetGraphHanderCompleter = Completer<AssetGraphHandler>();
+  var assetHandlerCompleter = Completer<AssetHandler>();
+  watch.ready.then((_) async {
+    assetHandlerCompleter.complete(AssetHandler(watch.reader, rootPackage));
+    assetGraphHanderCompleter.complete(
+        AssetGraphHandler(watch.reader, rootPackage, watch.assetGraph));
+  });
+  return ServeHandler._(watch, assetHandlerCompleter.future,
+      assetGraphHanderCompleter.future, rootPackage);
+}
+
+class ServeHandler implements BuildState {
+  final WatchImpl _state;
+  BuildResult _lastBuildResult;
+  final String _rootPackage;
+
+  final Future<AssetHandler> _assetHandler;
+  final Future<AssetGraphHandler> _assetGraphHandler;
+
+  final BuildUpdatesWebSocketHandler _webSocketHandler;
+
+  ServeHandler._(this._state, this._assetHandler, this._assetGraphHandler,
+      this._rootPackage)
+      : _webSocketHandler = BuildUpdatesWebSocketHandler(_state) {
+    _state.buildResults.listen((result) {
+      _lastBuildResult = result;
+      _webSocketHandler.emitUpdateMessage(result);
+    }).onDone(_webSocketHandler.close);
+  }
+
+  @override
+  Future<BuildResult> get currentBuild => _state.currentBuild;
+
+  @override
+  Stream<BuildResult> get buildResults => _state.buildResults;
+
+  shelf.Handler handlerFor(String rootDir,
+      {bool logRequests, BuildUpdatesOption buildUpdates}) {
+    buildUpdates ??= BuildUpdatesOption.none;
+    logRequests ??= false;
+    if (p.url.split(rootDir).length != 1) {
+      throw ArgumentError.value(
+          rootDir, 'rootDir', 'Only top level directories are supported');
+    }
+    _state.currentBuild.then((_) {
+      // If the first build fails with a handled exception, we might not have
+      // an asset graph and can't do this check.
+      if (_state.assetGraph == null) return;
+      _warnForEmptyDirectory(rootDir);
+    });
+    var cascade = shelf.Cascade();
+    if (buildUpdates != BuildUpdatesOption.none) {
+      cascade = cascade.add(_webSocketHandler.createHandlerByRootDir(rootDir));
+    }
+    cascade =
+        cascade.add(_blockOnCurrentBuild).add((shelf.Request request) async {
+      if (request.url.path == _performancePath) {
+        return _performanceHandler(request);
+      }
+      if (request.url.path == _assetsDigestPath) {
+        return _assetsDigestHandler(request, rootDir);
+      }
+      if (request.url.path.startsWith(_graphPath)) {
+        var graphHandler = await _assetGraphHandler;
+        return await graphHandler.handle(
+            request.change(path: _graphPath), rootDir);
+      }
+      var assetHandler = await _assetHandler;
+      return assetHandler.handle(request, rootDir: rootDir);
+    });
+    var pipeline = shelf.Pipeline();
+    if (logRequests) {
+      pipeline = pipeline.addMiddleware(_logRequests);
+    }
+    switch (buildUpdates) {
+      case BuildUpdatesOption.liveReload:
+        pipeline = pipeline.addMiddleware(_injectLiveReloadClientCode);
+        break;
+      case BuildUpdatesOption.hotReload:
+        pipeline = pipeline.addMiddleware(_injectHotReloadClientCode);
+        break;
+      case BuildUpdatesOption.none:
+        break;
+    }
+    return pipeline.addHandler(cascade.handler);
+  }
+
+  Future<shelf.Response> _blockOnCurrentBuild(_) async {
+    await currentBuild;
+    return shelf.Response.notFound('');
+  }
+
+  shelf.Response _performanceHandler(shelf.Request request) {
+    var hideSkipped = false;
+    var detailedSlices = false;
+    var slicesResolution = 5;
+    var sortOrder = PerfSortOrder.startTimeAsc;
+    var filter = request.url.queryParameters['filter'] ?? '';
+    if (request.url.queryParameters['hideSkipped']?.toLowerCase() == 'true') {
+      hideSkipped = true;
+    }
+    if (request.url.queryParameters['detailedSlices']?.toLowerCase() ==
+        'true') {
+      detailedSlices = true;
+    }
+    if (request.url.queryParameters.containsKey('slicesResolution')) {
+      slicesResolution =
+          int.parse(request.url.queryParameters['slicesResolution']);
+    }
+    if (request.url.queryParameters.containsKey('sortOrder')) {
+      sortOrder = PerfSortOrder
+          .values[int.parse(request.url.queryParameters['sortOrder'])];
+    }
+    return shelf.Response.ok(
+        _renderPerformance(_lastBuildResult.performance, hideSkipped,
+            detailedSlices, slicesResolution, sortOrder, filter),
+        headers: {HttpHeaders.contentTypeHeader: 'text/html'});
+  }
+
+  Future<shelf.Response> _assetsDigestHandler(
+      shelf.Request request, String rootDir) async {
+    var assertPathList =
+        (jsonDecode(await request.readAsString()) as List).cast<String>();
+    var rootPackage = _state.packageGraph.root.name;
+    var results = <String, String>{};
+    for (final path in assertPathList) {
+      try {
+        var assetId = pathToAssetId(rootPackage, rootDir, p.url.split(path));
+        var digest = await _state.reader.digest(assetId);
+        results[path] = digest.toString();
+      } on AssetNotFoundException {
+        results.remove(path);
+      }
+    }
+    return shelf.Response.ok(jsonEncode(results),
+        headers: {HttpHeaders.contentTypeHeader: 'application/json'});
+  }
+
+  void _warnForEmptyDirectory(String rootDir) {
+    if (!_state.assetGraph
+        .packageNodes(_rootPackage)
+        .any((n) => n.id.path.startsWith('$rootDir/'))) {
+      _logger.warning('Requested a server for `$rootDir` but this directory '
+          'has no assets in the build. You may need to add some sources or '
+          'include this directory in some target in your `build.yaml`');
+    }
+  }
+}
+
+/// Class that manages web socket connection handler to inform clients about
+/// build updates
+class BuildUpdatesWebSocketHandler {
+  final connectionsByRootDir = <String, List<WebSocketChannel>>{};
+  final shelf.Handler Function(Function, {Iterable<String> protocols})
+      _handlerFactory;
+  final _internalHandlers = <String, shelf.Handler>{};
+  final WatchImpl _state;
+
+  BuildUpdatesWebSocketHandler(this._state,
+      [this._handlerFactory = webSocketHandler]);
+
+  shelf.Handler createHandlerByRootDir(String rootDir) {
+    if (!_internalHandlers.containsKey(rootDir)) {
+      var closureForRootDir = (WebSocketChannel webSocket, String protocol) =>
+          _handleConnection(webSocket, protocol, rootDir);
+      _internalHandlers[rootDir] = _handlerFactory(closureForRootDir,
+          protocols: [_buildUpdatesProtocol]);
+    }
+    return _internalHandlers[rootDir];
+  }
+
+  Future emitUpdateMessage(BuildResult buildResult) async {
+    if (buildResult.status != BuildStatus.success) return;
+    var digests = <AssetId, String>{};
+    for (var assetId in buildResult.outputs) {
+      var digest = await _state.reader.digest(assetId);
+      digests[assetId] = digest.toString();
+    }
+    for (var rootDir in connectionsByRootDir.keys) {
+      var resultMap = <String, String>{};
+      for (var assetId in digests.keys) {
+        var path = assetIdToPath(assetId, rootDir);
+        if (path != null) {
+          resultMap[path] = digests[assetId];
+        }
+      }
+      for (var connection in connectionsByRootDir[rootDir]) {
+        connection.sink.add(jsonEncode(resultMap));
+      }
+    }
+  }
+
+  void _handleConnection(
+      WebSocketChannel webSocket, String protocol, String rootDir) async {
+    if (!connectionsByRootDir.containsKey(rootDir)) {
+      connectionsByRootDir[rootDir] = [];
+    }
+    connectionsByRootDir[rootDir].add(webSocket);
+    await webSocket.stream.drain();
+    connectionsByRootDir[rootDir].remove(webSocket);
+    if (connectionsByRootDir[rootDir].isEmpty) {
+      connectionsByRootDir.remove(rootDir);
+    }
+  }
+
+  Future<void> close() {
+    return Future.wait(connectionsByRootDir.values
+        .expand((x) => x)
+        .map((connection) => connection.sink.close()));
+  }
+}
+
+shelf.Handler Function(shelf.Handler) _injectBuildUpdatesClientCode(
+        String scriptName) =>
+    (innerHandler) {
+      return (shelf.Request request) async {
+        if (!request.url.path.endsWith('.js')) {
+          return innerHandler(request);
+        }
+        var response = await innerHandler(request);
+        // TODO: Find a way how to check and/or modify body without reading it
+        // whole.
+        var body = await response.readAsString();
+        if (body.startsWith(entrypointExtensionMarker)) {
+          body += _buildUpdatesInjectedJS(scriptName);
+          var originalEtag = response.headers[HttpHeaders.etagHeader];
+          if (originalEtag != null) {
+            var newEtag = base64.encode(md5.convert(body.codeUnits).bytes);
+            var newHeaders = Map.of(response.headers);
+            newHeaders[HttpHeaders.etagHeader] = newEtag;
+
+            if (request.headers[HttpHeaders.ifNoneMatchHeader] == newEtag) {
+              return shelf.Response.notModified(headers: newHeaders);
+            }
+
+            response = response.change(headers: newHeaders);
+          }
+        }
+        return response.change(body: body);
+      };
+    };
+
+final _injectHotReloadClientCode =
+    _injectBuildUpdatesClientCode('hot_reload_client.dart');
+
+final _injectLiveReloadClientCode =
+    _injectBuildUpdatesClientCode('live_reload_client');
+
+/// Hot-/live- reload config
+///
+/// Listen WebSocket for updates in build results
+String _buildUpdatesInjectedJS(String scriptName) => '''\n
+// Injected by build_runner for build updates support
+window.\$dartLoader.forceLoadModule('packages/build_runner/src/server/build_updates_client/$scriptName');
+''';
+
+class AssetHandler {
+  final FinalizedReader _reader;
+  final String _rootPackage;
+
+  final _typeResolver = MimeTypeResolver();
+
+  AssetHandler(this._reader, this._rootPackage);
+
+  Future<shelf.Response> handle(shelf.Request request, {String rootDir}) =>
+      (request.url.path.endsWith('/') || request.url.path.isEmpty)
+          ? _handle(
+              request.headers,
+              pathToAssetId(
+                  _rootPackage,
+                  rootDir,
+                  request.url.pathSegments
+                      .followedBy(const ['index.html']).toList()),
+              fallbackToDirectoryList: true)
+          : _handle(request.headers,
+              pathToAssetId(_rootPackage, rootDir, request.url.pathSegments));
+
+  Future<shelf.Response> _handle(
+      Map<String, String> requestHeaders, AssetId assetId,
+      {bool fallbackToDirectoryList = false}) async {
+    try {
+      if (!await _reader.canRead(assetId)) {
+        var reason = await _reader.unreadableReason(assetId);
+        switch (reason) {
+          case UnreadableReason.failed:
+            return shelf.Response.internalServerError(
+                body: 'Build failed for $assetId');
+          case UnreadableReason.notOutput:
+            return shelf.Response.notFound('$assetId was not output');
+          case UnreadableReason.notFound:
+            if (fallbackToDirectoryList) {
+              return shelf.Response.notFound(await _findDirectoryList(assetId));
+            }
+            return shelf.Response.notFound('Not Found');
+          default:
+            return shelf.Response.notFound('Not Found');
+        }
+      }
+    } on ArgumentError catch (_) {
+      return shelf.Response.notFound('Not Found');
+    }
+
+    var etag = base64.encode((await _reader.digest(assetId)).bytes);
+    var headers = {
+      HttpHeaders.contentTypeHeader: _typeResolver.lookup(assetId.path),
+      HttpHeaders.etagHeader: etag,
+      // We always want this revalidated, which requires specifying both
+      // max-age=0 and must-revalidate.
+      //
+      // See spec https://goo.gl/Lhvttg for more info about this header.
+      HttpHeaders.cacheControlHeader: 'max-age=0, must-revalidate',
+    };
+
+    if (requestHeaders[HttpHeaders.ifNoneMatchHeader] == etag) {
+      // This behavior is still useful for cases where a file is hit
+      // without a cache-busting query string.
+      return shelf.Response.notModified(headers: headers);
+    }
+
+    var bytes = await _reader.readAsBytes(assetId);
+    headers[HttpHeaders.contentLengthHeader] = '${bytes.length}';
+    return shelf.Response.ok(bytes, headers: headers);
+  }
+
+  Future<String> _findDirectoryList(AssetId from) async {
+    var directoryPath = p.url.dirname(from.path);
+    var glob = p.url.join(directoryPath, '*');
+    var result =
+        await _reader.findAssets(Glob(glob)).map((a) => a.path).toList();
+    return (result.isEmpty)
+        ? 'Could not find ${from.path} or any files in $directoryPath.'
+        : 'Could not find ${from.path}. $directoryPath contains:\n'
+        '${result.join('\n')}';
+  }
+}
+
+String _renderPerformance(
+    BuildPerformance performance,
+    bool hideSkipped,
+    bool detailedSlices,
+    int slicesResolution,
+    PerfSortOrder sortOrder,
+    String filter) {
+  try {
+    var rows = StringBuffer();
+    final resolution = Duration(milliseconds: slicesResolution);
+    var count = 0,
+        maxSlices = 1,
+        max = 0,
+        min = performance.stopTime.millisecondsSinceEpoch -
+            performance.startTime.millisecondsSinceEpoch;
+
+    void writeRow(BuilderActionPerformance action,
+        BuilderActionStagePerformance stage, TimeSlice slice) {
+      var actionKey = '${action.builderKey}:${action.primaryInput}';
+      var tooltip = '<div class=perf-tooltip>'
+          '<p><b>Builder:</b> ${action.builderKey}</p>'
+          '<p><b>Input:</b> ${action.primaryInput}</p>'
+          '<p><b>Stage:</b> ${stage.label}</p>'
+          '<p><b>Stage time:</b> '
+          '${stage.startTime.difference(performance.startTime).inMilliseconds / 1000}s - '
+          '${stage.stopTime.difference(performance.startTime).inMilliseconds / 1000}s</p>'
+          '<p><b>Stage real duration:</b> ${stage.duration.inMilliseconds / 1000} seconds</p>'
+          '<p><b>Stage user duration:</b> ${stage.innerDuration.inMilliseconds / 1000} seconds</p>';
+      if (slice != stage) {
+        tooltip += '<p><b>Slice time:</b> '
+            '${slice.startTime.difference(performance.startTime).inMilliseconds / 1000}s - '
+            '${slice.stopTime.difference(performance.startTime).inMilliseconds / 1000}s</p>'
+            '<p><b>Slice duration:</b> ${slice.duration.inMilliseconds / 1000} seconds</p>';
+      }
+      tooltip += '</div>';
+      var start = slice.startTime.millisecondsSinceEpoch -
+          performance.startTime.millisecondsSinceEpoch;
+      var end = slice.stopTime.millisecondsSinceEpoch -
+          performance.startTime.millisecondsSinceEpoch;
+
+      if (min > start) min = start;
+      if (max < end) max = end;
+
+      rows.writeln(
+          '          ["$actionKey", "${stage.label}", "$tooltip", $start, $end],');
+      ++count;
+    }
+
+    final filterRegex = filter.isNotEmpty ? RegExp(filter) : null;
+
+    final actions = performance.actions
+        .where((action) =>
+            !hideSkipped ||
+            action.stages.any((stage) => stage.label == 'Build'))
+        .where((action) =>
+            filterRegex == null ||
+            filterRegex.hasMatch('${action.builderKey}:${action.primaryInput}'))
+        .toList();
+
+    int Function(BuilderActionPerformance, BuilderActionPerformance) comparator;
+    switch (sortOrder) {
+      case PerfSortOrder.startTimeAsc:
+        comparator = (a1, a2) => a1.startTime.compareTo(a2.startTime);
+        break;
+      case PerfSortOrder.startTimeDesc:
+        comparator = (a1, a2) => a2.startTime.compareTo(a1.startTime);
+        break;
+      case PerfSortOrder.stopTimeAsc:
+        comparator = (a1, a2) => a1.stopTime.compareTo(a2.stopTime);
+        break;
+      case PerfSortOrder.stopTimeDesc:
+        comparator = (a1, a2) => a2.stopTime.compareTo(a1.stopTime);
+        break;
+      case PerfSortOrder.durationAsc:
+        comparator = (a1, a2) => a1.duration.compareTo(a2.duration);
+        break;
+      case PerfSortOrder.durationDesc:
+        comparator = (a1, a2) => a2.duration.compareTo(a1.duration);
+        break;
+      case PerfSortOrder.innerDurationAsc:
+        comparator = (a1, a2) => a1.innerDuration.compareTo(a2.innerDuration);
+        break;
+      case PerfSortOrder.innerDurationDesc:
+        comparator = (a1, a2) => a2.innerDuration.compareTo(a1.innerDuration);
+        break;
+    }
+    actions.sort(comparator);
+
+    for (var action in actions) {
+      if (hideSkipped &&
+          !action.stages.any((stage) => stage.label == 'Build')) {
+        continue;
+      }
+      for (var stage in action.stages) {
+        if (!detailedSlices) {
+          writeRow(action, stage, stage);
+          continue;
+        }
+        var slices = stage.slices.fold<List<TimeSlice>>([], (list, slice) {
+          if (list.isNotEmpty &&
+              slice.startTime.difference(list.last.stopTime) < resolution) {
+            // concat with previous if gap less than resolution
+            list.last = TimeSlice(list.last.startTime, slice.stopTime);
+          } else {
+            if (list.length > 1 && list.last.duration < resolution) {
+              // remove previous if its duration less than resolution
+              list.last = slice;
+            } else {
+              list.add(slice);
+            }
+          }
+          return list;
+        });
+        if (slices.isNotEmpty) {
+          for (var slice in slices) {
+            writeRow(action, stage, slice);
+          }
+        } else {
+          writeRow(action, stage, stage);
+        }
+        if (maxSlices < slices.length) maxSlices = slices.length;
+      }
+    }
+    if (max - min < 1000) {
+      rows.writeln('          ['
+          '"https://github.com/google/google-visualization-issues/issues/2269"'
+          ', "", "", $min, ${min + 1000}]');
+    }
+    return '''
+  <html>
+    <head>
+      <script src="https://www.gstatic.com/charts/loader.js"></script>
+      <script>
+        google.charts.load('current', {'packages':['timeline']});
+        google.charts.setOnLoadCallback(drawChart);
+        function drawChart() {
+          var container = document.getElementById('timeline');
+          var chart = new google.visualization.Timeline(container);
+          var dataTable = new google.visualization.DataTable();
+
+          dataTable.addColumn({ type: 'string', id: 'ActionKey' });
+          dataTable.addColumn({ type: 'string', id: 'Stage' });
+          dataTable.addColumn({ type: 'string', role: 'tooltip', p: { html: true } });
+          dataTable.addColumn({ type: 'number', id: 'Start' });
+          dataTable.addColumn({ type: 'number', id: 'End' });
+          dataTable.addRows([
+  $rows
+          ]);
+
+          console.log('rendering', $count, 'blocks, max', $maxSlices,
+            'slices in stage, resolution', $slicesResolution, 'ms');
+          var options = {
+            tooltip: { isHtml: true }
+          };
+          var statusText = document.getElementById('status');
+          var timeoutId;
+          var updateFunc = function () {
+              if (timeoutId) {
+                  // don't schedule more than one at a time
+                  return;
+              }
+              statusText.innerText = 'Drawing table...';
+              console.time('draw-time');
+
+              timeoutId = setTimeout(function () {
+                  chart.draw(dataTable, options);
+                  console.timeEnd('draw-time');
+                  statusText.innerText = '';
+                  timeoutId = null;
+              });
+          };
+
+          updateFunc();
+
+          window.addEventListener('resize', updateFunc);
+        }
+      </script>
+      <style>
+      html, body {
+        width: 100%;
+        height: 100%;
+        margin: 0;
+      }
+
+      body {
+        display: flex;
+        flex-direction: column;
+      }
+
+      #timeline {
+        display: flex;
+        flex-direction: row;
+        flex: 1;
+      }
+      .controls-header p {
+        display: inline-block;
+        margin: 0.5em;
+      }
+      .perf-tooltip {
+        margin: 0.5em;
+      }
+      </style>
+    </head>
+    <body>
+      <form class="controls-header" action="/$_performancePath" onchange="this.submit()">
+        <p><label><input type="checkbox" name="hideSkipped" value="true" ${hideSkipped ? 'checked' : ''}> Hide Skipped Actions</label></p>
+        <p><label><input type="checkbox" name="detailedSlices" value="true" ${detailedSlices ? 'checked' : ''}> Show Async Slices</label></p>
+        <p>Sort by: <select name="sortOrder">
+          <option value="0" ${sortOrder.index == 0 ? 'selected' : ''}>Start Time Asc</option>
+          <option value="1" ${sortOrder.index == 1 ? 'selected' : ''}>Start Time Desc</option>
+          <option value="2" ${sortOrder.index == 2 ? 'selected' : ''}>Stop Time Asc</option>
+          <option value="3" ${sortOrder.index == 3 ? 'selected' : ''}>Stop Time Desc</option>
+          <option value="5" ${sortOrder.index == 4 ? 'selected' : ''}>Real Duration Asc</option>
+          <option value="5" ${sortOrder.index == 5 ? 'selected' : ''}>Real Duration Desc</option>
+          <option value="6" ${sortOrder.index == 6 ? 'selected' : ''}>User Duration Asc</option>
+          <option value="7" ${sortOrder.index == 7 ? 'selected' : ''}>User Duration Desc</option>
+        </select></p>
+        <p>Slices Resolution: <select name="slicesResolution">
+          <option value="0" ${slicesResolution == 0 ? 'selected' : ''}>0</option>
+          <option value="1" ${slicesResolution == 1 ? 'selected' : ''}>1</option>
+          <option value="3" ${slicesResolution == 3 ? 'selected' : ''}>3</option>
+          <option value="5" ${slicesResolution == 5 ? 'selected' : ''}>5</option>
+          <option value="10" ${slicesResolution == 10 ? 'selected' : ''}>10</option>
+          <option value="15" ${slicesResolution == 15 ? 'selected' : ''}>15</option>
+          <option value="20" ${slicesResolution == 20 ? 'selected' : ''}>20</option>
+          <option value="25" ${slicesResolution == 25 ? 'selected' : ''}>25</option>
+        </select></p>
+        <p>Filter (RegExp): <input type="text" name="filter" value="$filter"></p>
+        <p id="status"></p>
+      </form>
+      <div id="timeline"></div>
+    </body>
+  </html>
+  ''';
+  } on UnimplementedError catch (_) {
+    return _enablePerformanceTracking;
+  } on UnsupportedError catch (_) {
+    return _enablePerformanceTracking;
+  }
+}
+
+final _enablePerformanceTracking = '''
+<html>
+  <body>
+    <p>
+      Performance information not available, you must pass the
+      `--track-performance` command line arg to enable performance tracking.
+    </p>
+  <body>
+</html>
+''';
+
+/// [shelf.Middleware] that logs all requests, inspired by [shelf.logRequests].
+shelf.Handler _logRequests(shelf.Handler innerHandler) {
+  return (shelf.Request request) {
+    var startTime = DateTime.now();
+    var watch = Stopwatch()..start();
+
+    return Future.sync(() => innerHandler(request)).then((response) {
+      var logFn = response.statusCode >= 500 ? _logger.warning : _logger.info;
+      var msg = _getMessage(startTime, response.statusCode,
+          request.requestedUri, request.method, watch.elapsed);
+      logFn(msg);
+      return response;
+    }, onError: (error, stackTrace) {
+      if (error is shelf.HijackException) throw error;
+      var msg = _getMessage(
+          startTime, 500, request.requestedUri, request.method, watch.elapsed);
+      _logger.severe('$msg\r\n$error\r\n$stackTrace', true);
+      throw error;
+    });
+  };
+}
+
+String _getMessage(DateTime requestTime, int statusCode, Uri requestedUri,
+    String method, Duration elapsedTime) {
+  return '${requestTime.toIso8601String()} '
+      '${humanReadable(elapsedTime)} '
+      '$method [$statusCode] '
+      '${requestedUri.path}${_formatQuery(requestedUri.query)}\r\n';
+}
+
+String _formatQuery(String query) {
+  return query == '' ? '' : '?$query';
+}
diff --git a/build_runner/lib/src/watcher/asset_change.dart b/build_runner/lib/src/watcher/asset_change.dart
new file mode 100644
index 0000000..7796ede
--- /dev/null
+++ b/build_runner/lib/src/watcher/asset_change.dart
@@ -0,0 +1,51 @@
+// 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:build/build.dart';
+import 'package:path/path.dart' as p;
+import 'package:watcher/watcher.dart';
+
+import 'package:build_runner_core/build_runner_core.dart';
+
+/// Represents an [id] that was modified on disk as a result of [type].
+class AssetChange {
+  /// Asset that was changed.
+  final AssetId id;
+
+  /// What caused the asset to be detected as changed.
+  final ChangeType type;
+
+  const AssetChange(this.id, this.type);
+
+  /// Creates a new change record in [package] from an existing watcher [event].
+  factory AssetChange.fromEvent(PackageNode package, WatchEvent event) {
+    return AssetChange(
+      AssetId(
+        package.name,
+        _normalizeRelativePath(package, event),
+      ),
+      event.type,
+    );
+  }
+
+  static String _normalizeRelativePath(PackageNode package, WatchEvent event) {
+    final pkgPath = package.path;
+    var absoluteEventPath =
+        p.isAbsolute(event.path) ? event.path : p.absolute(event.path);
+    if (!p.isWithin(pkgPath, absoluteEventPath)) {
+      throw ArgumentError('"$absoluteEventPath" is not in "$pkgPath".');
+    }
+    return p.relative(absoluteEventPath, from: pkgPath);
+  }
+
+  @override
+  int get hashCode => id.hashCode ^ type.hashCode;
+
+  @override
+  bool operator ==(Object other) =>
+      other is AssetChange && other.id == id && other.type == type;
+
+  @override
+  String toString() => 'AssetChange {asset: $id, type: $type}';
+}
diff --git a/build_runner/lib/src/watcher/change_filter.dart b/build_runner/lib/src/watcher/change_filter.dart
new file mode 100644
index 0000000..3da8192
--- /dev/null
+++ b/build_runner/lib/src/watcher/change_filter.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:build_runner/src/watcher/asset_change.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_runner_core/src/asset_graph/graph.dart';
+import 'package:build_runner_core/src/asset_graph/node.dart';
+import 'package:watcher/watcher.dart';
+
+/// Returns if a given asset change should be considered for building.
+bool shouldProcess(
+  AssetChange change,
+  AssetGraph assetGraph,
+  BuildOptions buildOptions,
+  bool willCreateOutputDir,
+  Set<AssetId> expectedDeletes,
+) {
+  if (_isCacheFile(change) && !assetGraph.contains(change.id)) return false;
+  var node = assetGraph.get(change.id);
+  if (node != null) {
+    if (!willCreateOutputDir && !node.isInteresting) return false;
+    if (_isAddOrEditOnGeneratedFile(node, change.type)) return false;
+  } else {
+    if (change.type != ChangeType.ADD) return false;
+    if (!buildOptions.targetGraph.anyMatchesAsset(change.id)) return false;
+  }
+  if (_isExpectedDelete(change, expectedDeletes)) return false;
+  return true;
+}
+
+bool _isAddOrEditOnGeneratedFile(AssetNode node, ChangeType changeType) =>
+    node.isGenerated && changeType != ChangeType.REMOVE;
+
+bool _isCacheFile(AssetChange change) => change.id.path.startsWith(cacheDir);
+
+bool _isExpectedDelete(AssetChange change, Set<AssetId> expectedDeletes) =>
+    expectedDeletes.remove(change.id);
diff --git a/build_runner/lib/src/watcher/collect_changes.dart b/build_runner/lib/src/watcher/collect_changes.dart
new file mode 100644
index 0000000..eb6b8d8
--- /dev/null
+++ b/build_runner/lib/src/watcher/collect_changes.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:build_runner/src/watcher/asset_change.dart';
+import 'package:watcher/watcher.dart';
+
+/// Merges [AssetChange] events.
+///
+/// For example, if an asset was added then immediately deleted, no event will
+/// be recorded for the given asset.
+Map<AssetId, ChangeType> collectChanges(List<List<AssetChange>> changes) {
+  var changeMap = <AssetId, ChangeType>{};
+  for (var change in changes.expand((l) => l)) {
+    var originalChangeType = changeMap[change.id];
+    if (originalChangeType != null) {
+      switch (originalChangeType) {
+        case ChangeType.ADD:
+          if (change.type == ChangeType.REMOVE) {
+            // ADD followed by REMOVE, just remove the change.
+            changeMap.remove(change.id);
+          }
+          break;
+        case ChangeType.REMOVE:
+          if (change.type == ChangeType.ADD) {
+            // REMOVE followed by ADD, convert to a MODIFY
+            changeMap[change.id] = ChangeType.MODIFY;
+          } else if (change.type == ChangeType.MODIFY) {
+            // REMOVE followed by MODIFY isn't sensible, just throw.
+            throw StateError(
+                'Internal error, got REMOVE event followed by MODIFY event for '
+                '${change.id}.');
+          }
+          break;
+        case ChangeType.MODIFY:
+          if (change.type == ChangeType.REMOVE) {
+            // MODIFY followed by REMOVE, convert to REMOVE
+            changeMap[change.id] = change.type;
+          } else if (change.type == ChangeType.ADD) {
+            // MODIFY followed by ADD isn't sensible, just throw.
+            throw StateError(
+                'Internal error, got MODIFY event followed by ADD event for '
+                '${change.id}.');
+          }
+          break;
+      }
+    } else {
+      changeMap[change.id] = change.type;
+    }
+  }
+  return changeMap;
+}
diff --git a/build_runner/lib/src/watcher/delete_writer.dart b/build_runner/lib/src/watcher/delete_writer.dart
new file mode 100644
index 0000000..40b248e
--- /dev/null
+++ b/build_runner/lib/src/watcher/delete_writer.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+
+import 'package:build/build.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+
+/// A [RunnerAssetWriter] that forwards delete events to [_onDelete];
+class OnDeleteWriter implements RunnerAssetWriter {
+  RunnerAssetWriter _writer;
+  Function(AssetId id) _onDelete;
+
+  OnDeleteWriter(this._writer, this._onDelete);
+
+  @override
+  Future delete(AssetId id) {
+    _onDelete(id);
+    return _writer.delete(id);
+  }
+
+  @override
+  Future writeAsBytes(AssetId id, List<int> bytes) =>
+      _writer.writeAsBytes(id, bytes);
+
+  @override
+  Future writeAsString(AssetId id, String contents,
+          {Encoding encoding = utf8}) =>
+      _writer.writeAsString(id, contents, encoding: encoding);
+}
diff --git a/build_runner/lib/src/watcher/graph_watcher.dart b/build_runner/lib/src/watcher/graph_watcher.dart
new file mode 100644
index 0000000..6a1d134
--- /dev/null
+++ b/build_runner/lib/src/watcher/graph_watcher.dart
@@ -0,0 +1,85 @@
+// 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:io';
+
+import 'package:async/async.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:logging/logging.dart';
+
+import 'asset_change.dart';
+import 'node_watcher.dart';
+
+PackageNodeWatcher _default(PackageNode node) => PackageNodeWatcher(node);
+
+/// Allows watching an entire graph of packages to schedule rebuilds.
+class PackageGraphWatcher {
+  // TODO: Consider pulling logging out and providing hooks instead.
+  final Logger _logger;
+  final PackageNodeWatcher Function(PackageNode) _strategy;
+  final PackageGraph _graph;
+
+  final _readyCompleter = Completer<Null>();
+  Future<Null> get ready => _readyCompleter.future;
+
+  bool _isWatching = false;
+
+  /// Creates a new watcher for a [PackageGraph].
+  ///
+  /// May optionally specify a [watch] strategy, otherwise will attempt a
+  /// reasonable default based on the current platform.
+  PackageGraphWatcher(
+    this._graph, {
+    Logger logger,
+    PackageNodeWatcher watch(PackageNode node),
+  })  : _logger = logger ?? Logger('build_runner'),
+        _strategy = watch ?? _default;
+
+  /// Returns a stream of records for assets that changed in the package graph.
+  Stream<AssetChange> watch() {
+    assert(!_isWatching);
+    _isWatching = true;
+    return LazyStream(
+        () => logTimedSync(_logger, 'Setting up file watchers', _watch));
+  }
+
+  Stream<AssetChange> _watch() {
+    final allWatchers = _graph.allPackages.values
+        .where((node) => node.dependencyType == DependencyType.path)
+        .map(_strategy)
+        .toList();
+    final filteredEvents = allWatchers
+        .map((w) => w.watch().where(_nestedPathFilter(w.node)))
+        .toList();
+    // Asynchronously complete the `_readyCompleter` once all the watchers
+    // are done.
+    () async {
+      await Future.wait(
+          allWatchers.map((nodeWatcher) => nodeWatcher.watcher.ready));
+      _readyCompleter.complete();
+    }();
+    return StreamGroup.merge(filteredEvents);
+  }
+
+  bool Function(AssetChange) _nestedPathFilter(PackageNode rootNode) {
+    final ignorePaths = _nestedPaths(rootNode);
+    return (change) => !ignorePaths.any(change.id.path.startsWith);
+  }
+
+  // Returns a set of all package paths that are "nested" within a node.
+  //
+  // This allows the watcher to optimize and avoid duplicate events.
+  List<String> _nestedPaths(PackageNode rootNode) {
+    return _graph.allPackages.values
+        .where((node) {
+          return node.path.length > rootNode.path.length &&
+              node.path.startsWith(rootNode.path);
+        })
+        .map((node) =>
+            node.path.substring(rootNode.path.length + 1) +
+            Platform.pathSeparator)
+        .toList();
+  }
+}
diff --git a/build_runner/lib/src/watcher/node_watcher.dart b/build_runner/lib/src/watcher/node_watcher.dart
new file mode 100644
index 0000000..e52a076
--- /dev/null
+++ b/build_runner/lib/src/watcher/node_watcher.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:watcher/watcher.dart';
+
+import 'asset_change.dart';
+
+Watcher _default(String path) => Watcher(path);
+
+/// Allows watching significant files and directories in a given package.
+class PackageNodeWatcher {
+  final Watcher Function(String) _strategy;
+  final PackageNode node;
+
+  /// The actual watcher instance.
+  Watcher _watcher;
+  Watcher get watcher => _watcher;
+
+  /// Creates a new watcher for a [PackageNode].
+  ///
+  /// May optionally specify a [watch] strategy, otherwise will attempt a
+  /// reasonable default based on the current platform and the type of path
+  /// (i.e. a file versus directory).
+  PackageNodeWatcher(
+    this.node, {
+    Watcher watch(String path),
+  }) : _strategy = watch ?? _default;
+
+  /// Returns a stream of records for assets that change recursively.
+  Stream<AssetChange> watch() {
+    assert(_watcher == null);
+    _watcher = _strategy(node.path);
+    final events = _watcher.events;
+    return events.map((e) => AssetChange.fromEvent(node, e));
+  }
+}
diff --git a/build_runner/mono_pkg.yaml b/build_runner/mono_pkg.yaml
new file mode 100644
index 0000000..cebfcb2
--- /dev/null
+++ b/build_runner/mono_pkg.yaml
@@ -0,0 +1,15 @@
+dart:
+  - dev
+
+stages:
+  - analyze_and_format:
+    - group:
+      - dartfmt: sdk
+      - dartanalyzer: --fatal-infos --fatal-warnings .
+  - unit_test:
+    - test: -x integration
+  - e2e_test:
+    - test: -t integration --total-shards 4 --shard-index 0
+    - test: -t integration --total-shards 4 --shard-index 1
+    - test: -t integration --total-shards 4 --shard-index 2
+    - test: -t integration --total-shards 4 --shard-index 3
diff --git a/build_runner/pubspec.yaml b/build_runner/pubspec.yaml
new file mode 100644
index 0000000..acbb7c1
--- /dev/null
+++ b/build_runner/pubspec.yaml
@@ -0,0 +1,55 @@
+name: build_runner
+version: 1.2.8
+description: Tools to write binaries that run builders.
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/build/tree/master/build_runner
+
+environment:
+  sdk: ">=2.0.0 <3.0.0"
+
+dependencies:
+  args: ">=1.4.0 <2.0.0"
+  async: ">=1.13.3 <3.0.0"
+  build: ">=1.0.0 <1.2.0"
+  build_config: ^0.3.1
+  build_daemon: ^0.4.0
+  build_resolvers: "^1.0.0"
+  build_runner_core: ^2.0.3
+  code_builder: ">2.3.0 <4.0.0"
+  collection: ^1.14.0
+  crypto: ">=0.9.2 <3.0.0"
+  dart_style: ^1.0.0
+  glob: ^1.1.0
+  graphs: ^0.2.0
+  http_multi_server: ^2.0.0
+  io: ^0.3.0
+  js: ^0.6.1+1
+  logging: ^0.11.2
+  meta: ^1.1.0
+  mime: ^0.9.3
+  path: ^1.1.0
+  pedantic: ^1.0.0
+  pool: ^1.0.0
+  pub_semver: ^1.4.0
+  pubspec_parse: ^0.1.0
+  shelf: ">=0.6.5 <0.8.0"
+  shelf_web_socket: ^0.2.2+4
+  stack_trace: ^1.9.0
+  stream_transform: ^0.0.9
+  timing: ^0.1.1
+  watcher: ^0.9.7
+  web_socket_channel: ^1.0.9
+  yaml: ^2.1.0
+
+dev_dependencies:
+  build_test: ^0.10.0
+  build_modules: '>=0.4.0 <2.0.0'
+  build_web_compilers: ^1.0.0
+  mockito: ^4.0.0
+  package_resolver: ^1.0.2
+  stream_channel: ^1.6.0
+  test: ^1.3.3
+  test_descriptor: ^1.0.0
+  test_process: ^1.0.0
+  _test_common:
+    path: ../_test_common
diff --git a/build_runner/tool/build.dart b/build_runner/tool/build.dart
new file mode 100644
index 0000000..45bcdc3
--- /dev/null
+++ b/build_runner/tool/build.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:build_config/build_config.dart';
+import 'package:build_modules/builders.dart';
+import 'package:build_runner/build_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:build_web_compilers/builders.dart';
+
+main(List<String> args) async {
+  await run(args, [
+    apply(
+        'build_modules|dart2js',
+        [
+          moduleLibraryBuilder,
+          metaModuleBuilderFactoryForPlatform('dart2js'),
+          metaModuleCleanBuilderFactoryForPlatform('dart2js'),
+          moduleBuilderFactoryForPlatform('dart2js'),
+        ],
+        toAllPackages(),
+        isOptional: true,
+        hideOutput: true),
+    apply(
+        'build_web_compilers|entrypoint',
+        [
+          (_) => webEntrypointBuilder(BuilderOptions({
+                'compiler': 'dart2js',
+                'dart2js_args': ['--minify', '--omit-implicit-checks']
+              }))
+        ],
+        toAllPackages(),
+        isOptional: false,
+        hideOutput: false,
+        defaultGenerateFor: InputSet(include: [
+          'lib/src/server/graph_viz_main.dart',
+          'lib/src/server/build_updates_client/hot_reload_client.dart',
+        ])),
+  ]);
+}
diff --git a/build_test/BUILD.gn b/build_test/BUILD.gn
new file mode 100644
index 0000000..73d3814
--- /dev/null
+++ b/build_test/BUILD.gn
@@ -0,0 +1,31 @@
+# This file is generated by importer.py for build_test-0.10.6
+
+import("//build/dart/dart_library.gni")
+
+dart_library("build_test") {
+  package_name = "build_test"
+
+  # This parameter is left empty as we don't care about analysis or exporting
+  # these sources outside of the tree.
+  sources = []
+
+  disable_analysis = true
+
+  deps = [
+    "//third_party/dart-pkg/pub/pedantic",
+    "//third_party/dart-pkg/pub/logging",
+    "//third_party/dart-pkg/pub/async",
+    "//third_party/dart-pkg/pub/matcher",
+    "//third_party/dart-pkg/pub/glob",
+    "//third_party/dart-pkg/pub/crypto",
+    "//third_party/dart-pkg/pub/watcher",
+    "//third_party/dart-pkg/pub/stream_transform",
+    "//third_party/dart-pkg/pub/html",
+    "//third_party/dart-pkg/pub/build",
+    "//third_party/dart-pkg/pub/build_resolvers",
+    "//third_party/dart-pkg/pub/test",
+    "//third_party/dart-pkg/pub/package_resolver",
+    "//third_party/dart-pkg/pub/build_config",
+    "//third_party/dart-pkg/pub/path",
+  ]
+}
diff --git a/build_test/CHANGELOG.md b/build_test/CHANGELOG.md
new file mode 100644
index 0000000..dc8c5a6
--- /dev/null
+++ b/build_test/CHANGELOG.md
@@ -0,0 +1,364 @@
+## 0.10.6
+
+- Allow build_resolvers version `1.0.0`.
+
+## 0.10.5
+
+- Improve error messages for unresolvable URIs in the PackageAssetReader.
+
+## 0.10.4
+
+- Allow using `PackageAssetReader` when the current working directory is not the
+  root package directory as long as it uses a pub layout.
+
+## 0.10.3+4
+
+- Increased the upper bound for `package:analyzer` to `<0.35.0`.
+
+## 0.10.3+3
+
+- Increased the upper bound for `package:analyzer` to '<0.34.0'.
+
+## 0.10.3+2
+
+- Declare support for `package:build` version 1.0.0.
+
+## 0.10.3+1
+
+- Increased the upper bound for the sdk to `<3.0.0`.
+
+## 0.10.3
+
+- Require test version ^0.12.42 and use `TypeMatcher`.
+- Improve performance of test methods which use a `Resolver` by keeping a cached
+  instance of `AnalyzerResolvers`.
+
+## 0.10.2+4
+
+- Allow the latest build_config.
+
+## 0.10.2+3
+
+- Remove package:build_barback dependency, and use public apis from package:test
+  to directly do the bootstrapping instead of wrapping the transformer.
+
+## 0.10.2+2
+
+- Avoid looking for files from `Uri.path` paths.
+
+## 0.10.2+1
+
+- Add back an implementation of `findAssets` in `PackageAssetReader`.
+
+## 0.10.2
+
+- Added a `DebugIndexBuilder`, which by default generates a `test/index.html`
+  with links to debug tests in your `test/**_test.dart` folder, linking to the
+  generated `*_test.debug.html` files. **NOTE**: This only works for web-based
+  tests.
+- Fix `PackageAssetReader` when running with a package map pointing to a
+  "packages" directory structure, as is generated by `build_runner`. Drop
+  support for a broken `findAssets` implementation.
+
+## 0.10.1+1
+
+- Replace `BarbackResolvers` with `AnalyzerResolvers` from `build_resolvers` by
+  default.
+
+## 0.10.1
+
+- Allow overriding the `Resolvers` used for `resolve*` utilities.
+- Bug Fix: Don't call the `action` multiple times when there are multiple
+  sources passed to `resolve*`.
+
+## 0.10.0
+
+- Added automatic generation of `.debug.html` files for all tests, which can
+  be loaded in the browser to directly run tests and debug them without going
+  through the package:test runner.
+- Update to package:build version `0.12.0`.
+- Removed `CopyBuilder` in favor of `TestBuilder` which takes closures to
+  change behavior rather than adding configuration for every possible
+  modification.
+- Added support for the special placeholder `{$lib/$test/$web}` assets
+  supported by the `build_runner` and `bazel_codegen` implementations of
+  `package:build`. For an example see `test/test_builder_test.dart`. Note that
+  this is technically a **BREAKING CHANGE**, as additional inputs will be
+  matched for overzealous builders (like `TestBuilder`).
+- Added `resolverFor` as an optional parameter to `resolveSources`. By default
+  a `Resolver` is returned for the _first_ asset provided; to modify that the
+  name of another asset may be provided. This is a **BREAKING CHANGE**, as
+  previously the last asset was used.
+
+## 0.9.4
+
+- Added `InMemoryAssetReader.shareAssetCache` constructor. This is useful for the
+  case where the reader should be kept up to date as assets are written through
+  a writer.
+- Added `buildInputs` stream to `CopyBuilder` which emits an event for each
+  `BuildStep.inputId` at the top of the `build` method.
+- `CopyBuilder` automatically skips the placeholder files (any file ending in
+  `$`). This is technically breaking but should not affect any real users and is
+  not being released as a breaking change.
+- Changed `TestBootstrapBuilder` to only target `_test.dart` files.
+
+## 0.9.3
+
+- Added `resolveSources`, a way to resolve multiple libraries for testing,
+  including any combination of fake files (in-memory, created in the test) and
+  real ones (from on-disk packages):
+
+```dart
+test('multiple assets, some mock, some on disk', () async {
+  final real = 'build_test|test/_files/example_lib.dart';
+  final mock = 'build_test|test/_files/not_really_here.dart';
+  final library = await resolveSources(
+    {
+      real: useAssetReader,
+      mock: r'''
+        // This is a fake library that we're mocking.
+        library example;
+
+        // This is a real on-disk library we are using.
+        import 'example_lib.dart';
+
+        class ExamplePrime extends Example {}
+      ''',
+    },
+    (resolver) => resolver.findLibraryByName('example'),
+  );
+  final type = library.getType('ExamplePrime');
+  expect(type, isNotNull);
+  expect(type.supertype.name, 'Example');
+});
+```
+
+## 0.9.2
+
+- Add `inputExtension` argument to `CopyBuilder`. When used the builder with
+  throw if any assets are provided that don't match the input extension.
+
+## 0.9.1
+
+- Allow `build_barback` version `0.5.x`. The breaking behavior change should not
+  impact test uses that don't already have a version constraint on that package.
+
+## 0.9.0
+
+- Added the `TestBootstrapBuilder` under the `builder.dart` library. This can
+  be used to bootstrap tests similar to the `test/pub_serve` Transformer.
+  - **Known Issue**: Custom html files are not supported.
+- **Breaking**: All `AssetReader#findAssets` implementations now return a
+  `Stream<AssetId>` to match the latest `build` package.
+- **Breaking**: The `DatedValue`, `DatedString`, and `DatedBytes` apis are now
+  gone, since timestamps are no longer used by package:build. Instead the
+  `InMemoryAssetReader` and other apis take a `Map<AssetId, dynamic>`, and will
+  automatically convert any `String` values into  `List<int>` values.
+- **Breaking**: The `outputs` map of `testBuilder` works a little bit
+  differently due to the removal of `DatedValue` and `DatedString`.
+  * If a value provided is a `String`, then the asset is by default decoded
+    using UTF8, and matched against the string.
+  * If the value is a `matcher`, it will match againt the actual bytes of the
+    asset (in `List<int>` form).
+  * A new matcher was added, `decodedMatches`, which can be combined with other
+    matchers to match against the string contents. For example, to match a
+    string containing a substring, you would do
+    `decodedMatches(contains('some substring'))`.
+
+## 0.8.0
+
+- `InMemoryAssetReader`, `MultiAssetReader`, `StubAssetReader` and
+  `PackageAssetReader` now implement the `MultiPackageAssetReader` interface.
+- `testBuilder` now supports `Builder`s that call `findAssets` in non-root
+  packages.
+- Added a `GlobbingBuilder` which globs files in a package.
+- Added the `RecordingAssetReader` interface, which adds the
+  `Iterable<AssetId> get assetsRead` getter.
+- `InMemoryAssetReader` now implements `RecordingAssetReader`.
+- **Breaking**: The `MultiAssetReader` now requires all its wrapped readers to
+  implement the `MultiPackageAssetReader` interface.
+  - This should not affect most users, since all readers provided by this
+    package now implement that interface.
+
+## 0.7.1
+
+- Add `mapAssetIds` argument to `checkOutputs` for cases where the logical asset
+  location recorded by the builder does not match the written location.
+
+- Add `recordLogs`, a top-level function that invokes `scopeLog` and captures
+  the resulting `Stream<LogRecord>` for testing. Can be used with the provided
+  `anyLogOf`, `infoLogOf`, `warningLogOf`, `severeLogOf` matchers in order to
+  test a build process:
+
+```dart
+test('should log "uh oh!"', () async {
+  final logs = recordLogs(() => runBuilder());
+  expect(logs, emitsInOrder([
+    anyLogOf('uh oh!'),
+  ]);
+});
+```
+
+- Add the constructors `forPackages` and `forPackageRoot` to
+  `PackageAssetReader` - these are convenience constructors for pointing to a
+  small set of packages (fake or real) for testing purposes. For example:
+
+```dart
+test('should resolve multiple libraries', () async {
+  reader = new PackageAssetReader.forPackages({
+    'example_a': '_libs/example_a',
+    'example_b': '_libs/example_b',
+  });
+  expect(await reader.canRead(fileFromExampleLibA), isTrue);
+  expect(await reader.canRead(fileFromExampleLibB), isTrue);
+  expect(await reader.canRead(fileFromExampleLibC), isFalse);
+});
+```
+
+## 0.7.0+1
+
+- Switch to a typedef from function type syntax for compatibility with older
+  SDKs.
+
+## 0.7.0
+
+- **Breaking**: `resolveSource` and `resolveAsset` now take an `action` to
+  perform with the Resolver instance.
+
+## 0.6.4+1
+
+- Allow `package:build_barback` v0.4.x
+
+## 0.6.4
+
+- Allow `package:build` v0.10.x
+- `AssetReader` implementations always return `Future` from `canRead`
+
+## 0.6.3
+
+- Added `resolveAsset`, which is similar to `resolveSource` but specifies a
+  real asset that lives on the file system. For example, to resolve the main
+  library of `package:collection`:
+
+```dart
+var pkgCollection = new AssetId('collection', 'lib/collection.dart');
+var resolver = await resolveAsset(pkgCollection);
+// ...
+```
+
+- Supports `package:build_barback >=0.2.0 <0.4.0`.
+
+## 0.6.2
+
+- Internal version bump.
+
+## 0.6.1
+
+- Declare an output extension in `_ResolveSourceBuilder` so it is not skipped
+
+## 0.6.0
+
+- Support build 0.9.0
+  - Rename `hasInput` to `canRead` in `AssetReader` implementations
+  - Replace `declareOutputs` with `buildExtensions` in `Builder` implementations
+- **Breaking** `CopyBuilder` no longer has an `outputPackage` field since outputs
+  can only ever be in the same package as inputs.
+
+## 0.5.2
+
+- Add `MultiAssetReader` to the public API.
+
+## 0.5.1
+
+- Add `PackageAssetReader`, a standalone asset reader that uses a
+  `PackageResolver` to map an `AssetId` to a location on disk.
+- Add `resolveSource`, a top-level function that can resolve arbitrary Dart
+  source code. This can be useful in testing your own code that uses a
+  `Resolver` to do type checks.
+
+## 0.5.0
+
+- Add `findAssets` implementations to StubAssetReader an InMemoryAssetReader
+- **BREAKING**: InMemoryAssetReader constructor uses named optional parameters
+
+## 0.4.1
+
+- Make `scopeLog` visible so tests can be run with an available `log` without
+  going through runBuilder.
+
+## 0.4.0+1
+
+- Bug Fix: Correctly identify missing outputs in testBuilder
+
+## 0.4.0
+
+Updates to work with `build` version 0.7.0.
+
+### New Features
+- The `testBuilder` method now accepts `List<int>` values for both
+  `sourceAssets` and `outputs`.
+- The `checkOutputs` method is now public.
+
+### Breaking Changes
+- The `testBuilder` method now requires a `RecordingAssetWriter` instead of
+  just an `AssetWriter` for the `writer` parameter.
+- If a `Matcher` is provided as a value in `outputs`, then it will match against
+  the same value that was written. For example if your builder uses
+  `writeAsString` then it will match against that string. If you use
+  `writeAsBytes` then it will match against those bytes. It will not
+  automatically convert to/from bytes and strings.
+- Deleted the `makeAsset` and `makeAssets` methods. There is no more `Asset`
+  class so these don't really have any value any more.
+- The signature of `addAssets` has changed to
+  `void addAssets(Map<AssetId, dynamic> assets, InMemoryAssetWriter writer)`.
+  Values of the map may be either `String` or `List<int>`.
+- `InMemoryAssetReader#assets` and `InMemoryAssetWriter#assets` have changed to
+  a type of `Map<AssetId, DatedValue>` from a type of
+  `Map<AssetId, DatedString>`. `DatedValue` has both a `stringValue` and
+  `bytesValue` getter.
+- `InMemoryAssetReader` and `InMemoryAssetWriter` have been updated to implement
+  the new `AssetReader` and `AssetWriter` interfaces (see the `build` package
+  CHANGELOG for more details).
+- `InMemoryAssetReader#cacheAsset` has been changed to two separate methods,
+  `void cacheStringAsset(AssetId id, String contents)` and
+  `void cacheBytesAsset(AssetId id, List<int> bytes)`.
+- The `equalsAsset` matcher has been removed, since there is no more `Asset`
+  class.
+
+## 0.3.1
+
+- Additional capabilities in testBuilder:
+  - Filter sourceAssets to inputs with `isInput`
+  - Get log records
+  - Ignore output expectations when `outputs` is null
+  - Use a custom `writer`
+
+## 0.3.0
+
+- **BREAKING** removed testPhases utility. Tests should be using testBuilder
+- Drop dependency on build_runner package
+
+## 0.2.1
+
+- Support the package split into build/build_runner/build_barback
+- Expose additional test utilities that used to be internal to build
+
+## 0.2.0
+
+- Upgrade build package to 0.4.0
+- Delete now unnecessary `GenericBuilderTransformer` and use
+  `BuilderTransformer` in the tests.
+
+## 0.1.2
+
+- Add `logLevel` and `onLog` named args to `testPhases`. These can be used
+  to test your log messages, see `test/utils_test.dart` for an example.
+
+## 0.1.1
+
+- Allow String or Matcher for expected output values in `testPhases`.
+
+## 0.1.0
+
+- Initial version, exposes many basic utilities for testing `Builder`s using in
+  memory data structures. Most notably, the `testPhases` method.
diff --git a/build_test/LICENSE b/build_test/LICENSE
new file mode 100644
index 0000000..82e9b52
--- /dev/null
+++ b/build_test/LICENSE
@@ -0,0 +1,26 @@
+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/build_test/README.md b/build_test/README.md
new file mode 100644
index 0000000..1ecba2a
--- /dev/null
+++ b/build_test/README.md
@@ -0,0 +1,115 @@
+# build_test
+
+<p align="center">
+  Testing utilities for users of <a href="https://pub.dartlang.org/packages/build"><code>package:build</code></a>.
+  <br>
+  <a href="https://travis-ci.org/dart-lang/build">
+    <img src="https://travis-ci.org/dart-lang/build.svg?branch=master" alt="Build Status" />
+  </a>
+  <a href="https://github.com/dart-lang/build/labels/package%3A%20build_test">
+    <img src="https://img.shields.io/github/issues-raw/dart-lang/build/package%3A%20build_test.svg" alt="Issues related to build_test" />
+  </a>
+  <a href="https://pub.dartlang.org/packages/build_test">
+    <img src="https://img.shields.io/pub/v/build_test.svg" alt="Pub Package Version" />
+  </a>
+  <a href="https://pub.dartlang.org/documentation/build_test/latest">
+    <img src="https://img.shields.io/badge/dartdocs-latest-blue.svg" alt="Latest Dartdocs" />
+  </a>
+  <a href="https://gitter.im/dart-lang/build">
+    <img src="https://badges.gitter.im/dart-lang/build.svg" alt="Join the chat on Gitter" />
+  </a>
+</p>
+
+## Installation
+
+This package is intended to only be as a [development dependency][] for users
+of [`package:build`][], and should not be used in any production code. Simply
+add to your `pubspec.yaml`:
+
+```yaml
+dev_dependencies:
+  build_test:
+```
+
+## Running tests
+
+To run tests, you should go through the `pub run build_runner test` command.
+This will compile all your tests to a temp directory and run them using
+`pub run test`. If you would like to see the output directory, you can use the
+`--output=<dir>` option to force the output to go to a specific place.
+
+### Forwarding additional args to `pub run test`
+
+It is very common to need to pass some arguments through to the eventual call
+to `pub run test`. To do this, add all those args after an empty `--` arg.
+
+For example, to run all chrome platform tests you would do
+`pub run build_runner test -- -p chrome`.
+
+## Debugging web tests
+
+This package will automatically create `*.debug.html` files next to all your
+`*_test.dart` files, which can be loaded in a browser from the normal
+development server (`pub run build_runner serve`).
+
+You may also view an index of links to every `*.debug.html` file by navigating
+to `http://localhost:8081` (or wherever your `test` folder is being served).
+
+## Writing tests for your custom Builder
+
+In addition to assiting in running normal tests, this package provides some
+utilities for testing your custom `Builder` classes.
+
+_See the `test` folder in the `build` package for more examples_.
+
+### Run a `Builder` within a test environment
+
+Using [`testBuilder`][api:testBuilder], you can run a functional test of a
+`Builder`, including feeding specific assets, and more. It automatically
+creates an in-memory representation of various utility classes.
+
+### Resolve source code for testing
+
+Using [`resolveAsset`][api:resolveAsset] and
+[`resolveSource`][api:resolveSource], you can resolve Dart source code into a
+static element model, suitable for probing and using within tests of code you
+might have written for a `Builder`:
+
+```dart
+test('should resolve a simple dart file', () async {
+  var resolver = await resolveSource(r'''
+    library example;
+
+    class Foo {}
+  ''');
+  var libExample = resolver.getLibraryByName('example');
+  expect(libExample.getType('Foo'), isNotNull);
+});
+```
+
+### Various test implementations of classes
+
+* [`FakeWatcher`][api:FakeWatcher]
+* [`InMemoryAssetReader`][api:InMemoryAssetReader]
+* [`InMemoryAssetWriter`][api:InMemoryAssetWriter]
+* [`MultiAssetReader`][api:MultiAssetReader]
+* [`PackageAssetReader`][api:PackageAssetReader]
+* [`RecordingAssetWriter`][api:RecordingAssetWriter]
+* [`StubAssetReader`][api:StubAssetReader]
+* [`StubAssetWriter`][api:StubAssetWriter]
+
+[development dependency]: https://www.dartlang.org/tools/pub/dependencies#dev-dependencies
+[`package:build`]: https://pub.dartlang.org/packages/build
+
+[api:FakeWatcher]: https://www.dartdocs.org/documentation/build_test/latest/build_test/FakeWatcher-class.html
+[api:InMemoryAssetReader]: https://www.dartdocs.org/documentation/build_test/latest/build_test/InMemoryAssetReader-class.html
+[api:InMemoryAssetWriter]: https://www.dartdocs.org/documentation/build_test/latest/build_test/InMemoryAssetWriter-class.html
+[api:MultiAssetReader]: https://www.dartdocs.org/documentation/build_test/latest/build_test/MultiAssetReader-class.html
+[api:PackageAssetReader]: https://www.dartdocs.org/documentation/build_test/latest/build_test/PackageAssetReader-class.html
+[api:RecordingAssetWriter]: https://www.dartdocs.org/documentation/build_test/latest/build_test/RecordingAssetWriter-class.html
+[api:StubAssetReader]: https://www.dartdocs.org/documentation/build_test/latest/build_test/StubAssetReader-class.html
+[api:StubAssetWriter]: https://www.dartdocs.org/documentation/build_test/latest/build_test/StubAssetWriter-class.html
+
+[api:resolveAsset]: https://www.dartdocs.org/documentation/build_test/latest/build_test/resolveAsset.html
+[api:resolveSource]: https://www.dartdocs.org/documentation/build_test/latest/build_test/resolveSource.html
+[api:testBuilder]: https://www.dartdocs.org/documentation/build_test/latest/build_test/testBuilder.html
diff --git a/build_test/build.yaml b/build_test/build.yaml
new file mode 100644
index 0000000..2283e15
--- /dev/null
+++ b/build_test/build.yaml
@@ -0,0 +1,22 @@
+builders:
+  test_bootstrap:
+    target: "build_test"
+    import: "package:build_test/builder.dart"
+    builder_factories:
+        - "debugIndexBuilder"
+        - "debugTestBuilder"
+        - "testBootstrapBuilder"
+    build_extensions:
+      $test$:
+        - index.html
+      _test.dart:
+        - _test.dart.vm_test.dart
+        - _test.dart.browser_test.dart
+        - _test.dart.node_test.dart
+        - _test.html
+        - _test.debug.html
+    is_optional: False
+    build_to: cache
+    auto_apply: root_package
+    defaults:
+      generate_for: ["test/**"]
diff --git a/build_test/lib/build_test.dart b/build_test/lib/build_test.dart
new file mode 100644
index 0000000..69ed09d
--- /dev/null
+++ b/build_test/lib/build_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:build/src/builder/logging.dart' show scopeLogAsync;
+
+export 'src/assets.dart';
+export 'src/builder.dart';
+export 'src/fake_watcher.dart';
+export 'src/globbing_builder.dart';
+export 'src/in_memory_reader.dart';
+export 'src/in_memory_writer.dart';
+export 'src/matchers.dart';
+export 'src/multi_asset_reader.dart' show MultiAssetReader;
+export 'src/package_reader.dart' show PackageAssetReader;
+export 'src/record_logs.dart';
+export 'src/resolve_source.dart'
+    show useAssetReader, resolveSource, resolveSources, resolveAsset;
+export 'src/stub_reader.dart';
+export 'src/stub_writer.dart';
+export 'src/test_builder.dart';
diff --git a/build_test/lib/builder.dart b/build_test/lib/builder.dart
new file mode 100644
index 0000000..44d7697
--- /dev/null
+++ b/build_test/lib/builder.dart
@@ -0,0 +1,13 @@
+// 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 'src/debug_test_builder.dart';
+import 'src/test_bootstrap_builder.dart';
+
+export 'src/debug_test_builder.dart' show DebugTestBuilder;
+export 'src/test_bootstrap_builder.dart' show TestBootstrapBuilder;
+
+DebugTestBuilder debugTestBuilder(_) => const DebugTestBuilder();
+DebugIndexBuilder debugIndexBuilder(_) => const DebugIndexBuilder();
+TestBootstrapBuilder testBootstrapBuilder(_) => TestBootstrapBuilder();
diff --git a/build_test/lib/src/assets.dart b/build_test/lib/src/assets.dart
new file mode 100644
index 0000000..53597a8
--- /dev/null
+++ b/build_test/lib/src/assets.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.
+
+import 'dart:convert';
+
+import 'package:build/build.dart';
+
+import 'in_memory_writer.dart';
+
+int _nextId = 0;
+AssetId makeAssetId([String assetIdString]) {
+  if (assetIdString == null) {
+    assetIdString = 'a|web/asset_$_nextId.txt';
+    _nextId++;
+  }
+  return AssetId.parse(assetIdString);
+}
+
+void addAssets(Map<AssetId, dynamic> assets, InMemoryAssetWriter writer) {
+  assets.forEach((id, value) {
+    if (value is String) {
+      writer.assets[id] = utf8.encode(value);
+    } else if (value is List<int>) {
+      writer.assets[id] = value;
+    } else {
+      throw ArgumentError(
+          '`assets` values must be of type `String` or `List<int>`, got '
+          '${value.runtimeType}.');
+    }
+  });
+}
diff --git a/build_test/lib/src/builder.dart b/build_test/lib/src/builder.dart
new file mode 100644
index 0000000..a2c903f
--- /dev/null
+++ b/build_test/lib/src/builder.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+
+/// Overridable behavior for a [Builder.build] method.
+typedef FutureOr BuildBehavior(
+    BuildStep buildStep, Map<String, List<String>> buildExtensions);
+
+/// Copy the input asset to all possible output assets.
+void _defaultBehavior(
+        BuildStep buildStep, Map<String, List<String>> buildExtensions) =>
+    _copyToAll(buildStep, buildExtensions);
+
+T _identity<T>(T value) => value;
+Future<String> _readAsset(BuildStep buildStep, AssetId assetId) =>
+    buildStep.readAsString(assetId);
+
+/// Pass the input assetId through [readFrom] and duplicate the results of
+/// [read] on that asset into every matching output based on [buildExtensions].
+void _copyToAll(BuildStep buildStep, Map<String, List<String>> buildExtensions,
+    {AssetId readFrom(AssetId assetId) = _identity,
+    Future<String> read(BuildStep buildStep, AssetId assetId) = _readAsset}) {
+  if (!buildExtensions.keys.any((e) => buildStep.inputId.path.endsWith(e))) {
+    throw ArgumentError('Only expected inputs with extension in '
+        '${buildExtensions.keys.toList()} but got ${buildStep.inputId}');
+  }
+  for (final inputExtension in buildExtensions.keys) {
+    if (!buildStep.inputId.path.endsWith(inputExtension)) continue;
+    for (final outputExtension in buildExtensions[inputExtension]) {
+      final newPath = _replaceSuffix(
+          buildStep.inputId.path, inputExtension, outputExtension);
+      final id = AssetId(buildStep.inputId.package, newPath);
+      buildStep.writeAsString(id, read(buildStep, readFrom(buildStep.inputId)));
+    }
+  }
+}
+
+/// A build behavior which reads [assetId] and copies it's content into every
+/// output.
+BuildBehavior copyFrom(AssetId assetId) => (buildStep, buildExtensions) =>
+    _copyToAll(buildStep, buildExtensions, readFrom: (_) => assetId);
+
+/// A build behavior which writes either 'true' or 'false' depending on whether
+/// [assetId] can be read.
+BuildBehavior writeCanRead(AssetId assetId) =>
+    (BuildStep buildStep, Map<String, List<String>> buildExtensions) =>
+        _copyToAll(buildStep, buildExtensions,
+            readFrom: (_) => assetId,
+            read: (buildStep, assetId) async =>
+                '${await buildStep.canRead(assetId)}');
+
+/// A [Builder.buildExtensions] which operats on assets ending in [from] and
+/// creates outputs with [postFix] appended as the extension.
+///
+/// If [numCopies] is greater than 1 the postFix will also get a `.0`, `.1`...
+Map<String, List<String>> appendExtension(String postFix,
+        {String from = '', int numCopies = 1}) =>
+    {
+      from: numCopies == 1
+          ? ['$from$postFix']
+          : List.generate(numCopies, (i) => '$from$postFix.$i')
+    };
+
+Map<String, List<String>> replaceExtension(String from, String to) => {
+      from: [to]
+    };
+
+/// A [Builder] whose [build] method can be replaced with a closure.
+class TestBuilder implements Builder {
+  @override
+  final Map<String, List<String>> buildExtensions;
+
+  final BuildBehavior _build;
+  final BuildBehavior _extraWork;
+
+  /// A stream of all the [BuildStep.inputId]s that are seen.
+  ///
+  /// Events are added at the start of the [build] method.
+  final _buildInputsController = StreamController<AssetId>.broadcast();
+  Stream<AssetId> get buildInputs => _buildInputsController.stream;
+
+  /// A stream of all the [BuildStep.inputId]s that are completed.
+  ///
+  /// Events are added at the end of the [build] method.
+  final _buildsCompletedController = StreamController<AssetId>.broadcast();
+  Stream<AssetId> get buildsCompleted => _buildsCompletedController.stream;
+
+  TestBuilder({
+    Map<String, List<String>> buildExtensions,
+    BuildBehavior build,
+    BuildBehavior extraWork,
+  })  : buildExtensions = buildExtensions ?? appendExtension('.copy'),
+        _build = build ?? _defaultBehavior,
+        _extraWork = extraWork;
+
+  @override
+  Future build(BuildStep buildStep) async {
+    if (!await buildStep.canRead(buildStep.inputId)) return;
+    _buildInputsController.add(buildStep.inputId);
+    await _build(buildStep, buildExtensions);
+    if (_extraWork != null) await _extraWork(buildStep, buildExtensions);
+    _buildsCompletedController.add(buildStep.inputId);
+  }
+}
+
+String _replaceSuffix(String path, String old, String replacement) =>
+    path.substring(0, path.length - old.length) + replacement;
diff --git a/build_test/lib/src/debug_test_builder.dart b/build_test/lib/src/debug_test_builder.dart
new file mode 100644
index 0000000..8650711
--- /dev/null
+++ b/build_test/lib/src/debug_test_builder.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:glob/glob.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:path/path.dart' as p;
+
+const _inputExtension = '_test.dart';
+const _outputExtension = '_test.debug.html';
+
+/// Returns the (optional) user-provided HTML file to use as an input.
+///
+/// For example, for `test/foo_test.dart`, we look for `test/foo_test.html`.
+AssetId _customHtmlId(AssetId test) => test.changeExtension('.html');
+
+/// Returns the builder-generated HTML file for browsers to navigate to.
+AssetId _debugHtmlId(AssetId test) => test.changeExtension('.debug.html');
+
+/// Returns the JS script path for the browser for [dartTest].
+String _jsScriptPath(AssetId dartTest) => '${p.basename(dartTest.path)}.js';
+
+/// Generates a `*.debug.html` for every file in `test/**/*_test.dart`.
+///
+/// This is normally used in order to use Chrome (or another browser's)
+/// debugging tools (such as setting breakpoints) while running a test suite.
+class DebugTestBuilder implements Builder {
+  /// Generates a `.debug.html` for the provided `._test.dart` file.
+  static Future<void> _generateDebugHtml(
+    BuildStep buildStep,
+    AssetId dartTest,
+  ) async {
+    final customHtmlId = _customHtmlId(dartTest);
+    final jsScriptPath = _jsScriptPath(buildStep.inputId);
+    String debugHtml;
+    if (await buildStep.canRead(customHtmlId)) {
+      debugHtml = _replaceCustomHtml(
+        await buildStep.readAsString(customHtmlId),
+        jsScriptPath,
+      );
+    } else {
+      debugHtml = _createDebugHtml(jsScriptPath);
+    }
+    return buildStep.writeAsString(_debugHtmlId(dartTest), debugHtml);
+  }
+
+  /// Returns the content of [customHtml] modified to work with this package.
+  static String _replaceCustomHtml(String customHtml, String jsScriptPath) {
+    final document = parse(customHtml);
+
+    // Replace <link rel="x-dart-test"> with <script src="{jsScriptPath}">.
+    final linkTag = document.querySelector('link[rel="x-dart-test"]');
+    final scriptTag = Element.tag('script');
+    scriptTag.attributes['src'] = jsScriptPath;
+    linkTag.replaceWith(scriptTag);
+
+    // Remove the <script src="packages/test/dart.js"></script> if present.
+    document.querySelector('script[src="packages/test/dart.js"]')?.remove();
+
+    return document.outerHtml;
+  }
+
+  static String _createDebugHtml(String jsScriptPath) => ''
+      '<html>\n'
+      '  <head>\n'
+      '    <script src="$jsScriptPath"></script>\n'
+      '  </head>\n'
+      '</html>\n';
+
+  const DebugTestBuilder();
+
+  @override
+  final buildExtensions = const {
+    _inputExtension: [_outputExtension],
+  };
+
+  @override
+  Future<void> build(BuildStep buildStep) {
+    return _generateDebugHtml(buildStep, buildStep.inputId);
+  }
+}
+
+/// Generates `text/index.html`, useful for navigating and running tests.
+class DebugIndexBuilder implements Builder {
+  static final _allTests = Glob(p.join('test', '**$_inputExtension'));
+
+  static AssetId _outputFor(BuildStep buildStep) {
+    return AssetId(buildStep.inputId.package, p.join('test', 'index.html'));
+  }
+
+  static String _generateHtml(Iterable<AssetId> tests) {
+    if (tests.isEmpty) {
+      return '<strong>No tests found!</strong>';
+    }
+    final buffer = StringBuffer('    <ul>');
+    for (final test in tests) {
+      final path = p.joinAll(p.split(_debugHtmlId(test).path)..removeAt(0));
+      buffer.writeln('      <li><a href="/$path">${test.path}</a></li>');
+    }
+    buffer.writeln('    </ul>');
+    return buffer.toString();
+  }
+
+  const DebugIndexBuilder();
+
+  @override
+  final buildExtensions = const {
+    r'$test$': ['index.html'],
+  };
+
+  @override
+  Future<void> build(BuildStep buildStep) async {
+    final files = await buildStep.findAssets(_allTests).toList();
+    final output = _outputFor(buildStep);
+    return buildStep.writeAsString(
+        output,
+        '<html>\n'
+        '  <body>\n'
+        '    ${_generateHtml(files)}\n'
+        '  </body>\n'
+        '</html>');
+  }
+}
diff --git a/build_test/lib/src/fake_watcher.dart b/build_test/lib/src/fake_watcher.dart
new file mode 100644
index 0000000..b41ebaa
--- /dev/null
+++ b/build_test/lib/src/fake_watcher.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 'package:watcher/watcher.dart';
+
+/// A fake [DirectoryWatcher].
+///
+/// Use the static [notifyWatchers] method to add simulated events.
+class FakeWatcher implements DirectoryWatcher {
+  @override
+  String get directory => path;
+
+  @override
+  final String path;
+
+  FakeWatcher(this.path) {
+    watchers.add(this);
+  }
+
+  final _eventsController = StreamController<WatchEvent>();
+
+  @override
+  Stream<WatchEvent> get events => _eventsController.stream;
+
+  @override
+  Future get ready => Future(() {});
+
+  @override
+  bool get isReady => true;
+
+  /// All watchers.
+  static final List<FakeWatcher> watchers = <FakeWatcher>[];
+
+  /// Notify all active watchers of [event] if their [FakeWatcher#path] matches.
+  /// The path will also be adjusted to remove the path.
+  static void notifyWatchers(WatchEvent event) {
+    for (var watcher in watchers) {
+      if (event.path.startsWith(watcher.path)) {
+        watcher._eventsController.add(WatchEvent(event.type, event.path));
+      }
+    }
+  }
+}
diff --git a/build_test/lib/src/globbing_builder.dart b/build_test/lib/src/globbing_builder.dart
new file mode 100644
index 0000000..918ec1f
--- /dev/null
+++ b/build_test/lib/src/globbing_builder.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 'package:build/build.dart';
+import 'package:glob/glob.dart';
+
+/// A simple builder which globs files in a package and outputs a file that
+/// lists each matching file in alphabetical order into another file, one
+/// per line.
+class GlobbingBuilder extends Builder {
+  @override
+  final buildExtensions = {
+    '.globPlaceholder': ['.matchingFiles'],
+  };
+
+  final Glob glob;
+
+  GlobbingBuilder(this.glob);
+
+  @override
+  Future build(BuildStep buildStep) async {
+    var allAssets = await buildStep.findAssets(glob).toList();
+    allAssets.sort((a, b) => a.path.compareTo(b.path));
+    await buildStep.writeAsString(
+        buildStep.inputId.changeExtension('.matchingFiles'),
+        allAssets.map((id) => id.toString()).join('\n'));
+  }
+}
diff --git a/build_test/lib/src/in_memory_reader.dart b/build_test/lib/src/in_memory_reader.dart
new file mode 100644
index 0000000..11ecd35
--- /dev/null
+++ b/build_test/lib/src/in_memory_reader.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+
+/// An [AssetReader] that records which assets have been read to [assetsRead].
+abstract class RecordingAssetReader implements AssetReader {
+  Iterable<AssetId> get assetsRead;
+}
+
+/// An implementation of [AssetReader] with primed in-memory assets.
+class InMemoryAssetReader extends AssetReader
+    implements MultiPackageAssetReader, RecordingAssetReader {
+  final Map<AssetId, List<int>> assets;
+  final String rootPackage;
+
+  @override
+  final Set<AssetId> assetsRead = Set<AssetId>();
+
+  /// Create a new asset reader that contains [sourceAssets].
+  ///
+  /// Any items in [sourceAssets] which are [String]s will be converted into
+  /// a [List<int>] of bytes.
+  ///
+  /// May optionally define a [rootPackage], which is required for some APIs.
+  InMemoryAssetReader({Map<AssetId, dynamic> sourceAssets, this.rootPackage})
+      : assets = _assetsAsBytes(sourceAssets) ?? <AssetId, List<int>>{};
+
+  /// Create a new asset reader backed by [assets].
+  InMemoryAssetReader.shareAssetCache(this.assets, {this.rootPackage});
+
+  static Map<AssetId, List<int>> _assetsAsBytes(Map<AssetId, dynamic> assets) {
+    if (assets == null || assets.isEmpty) {
+      return {};
+    }
+    final output = <AssetId, List<int>>{};
+    assets.forEach((id, stringOrBytes) {
+      if (stringOrBytes is List<int>) {
+        output[id] = stringOrBytes;
+      } else if (stringOrBytes is String) {
+        output[id] = utf8.encode(stringOrBytes);
+      } else {
+        throw UnsupportedError('Invalid asset contents: $stringOrBytes.');
+      }
+    });
+    return output;
+  }
+
+  @override
+  Future<bool> canRead(AssetId id) async {
+    assetsRead.add(id);
+    return assets.containsKey(id);
+  }
+
+  @override
+  Future<List<int>> readAsBytes(AssetId id) async {
+    if (!await canRead(id)) throw AssetNotFoundException(id);
+    assetsRead.add(id);
+    return assets[id];
+  }
+
+  @override
+  Future<String> readAsString(AssetId id, {Encoding encoding = utf8}) async {
+    if (!await canRead(id)) throw AssetNotFoundException(id);
+    assetsRead.add(id);
+    return utf8.decode(assets[id]);
+  }
+
+  @override
+  Stream<AssetId> findAssets(Glob glob, {String package}) {
+    package ??= rootPackage;
+    if (package == null) {
+      throw UnsupportedError(
+          'Root package is required to use findAssets without providing an '
+          'explicit package.');
+    }
+    return Stream.fromIterable(assets.keys
+        .where((id) => id.package == package && glob.matches(id.path)));
+  }
+
+  void cacheBytesAsset(AssetId id, List<int> bytes) {
+    assets[id] = bytes;
+  }
+
+  void cacheStringAsset(AssetId id, String contents, {Encoding encoding}) {
+    encoding ??= utf8;
+    assets[id] = encoding.encode(contents);
+  }
+}
diff --git a/build_test/lib/src/in_memory_writer.dart b/build_test/lib/src/in_memory_writer.dart
new file mode 100644
index 0000000..8bb35cc
--- /dev/null
+++ b/build_test/lib/src/in_memory_writer.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:async';
+import 'dart:convert';
+
+import 'package:build/build.dart';
+
+/// An implementation of [AssetWriter] that records outputs to [assets].
+abstract class RecordingAssetWriter implements AssetWriter {
+  Map<AssetId, List<int>> get assets;
+}
+
+/// An implementation of [AssetWriter] that writes outputs to memory.
+class InMemoryAssetWriter implements RecordingAssetWriter {
+  @override
+  final Map<AssetId, List<int>> assets = {};
+
+  InMemoryAssetWriter();
+
+  @override
+  Future writeAsBytes(AssetId id, List<int> bytes) async {
+    assets[id] = bytes;
+  }
+
+  @override
+  Future writeAsString(AssetId id, String contents,
+      {Encoding encoding = utf8}) async {
+    assets[id] = encoding.encode(contents);
+  }
+}
diff --git a/build_test/lib/src/matchers.dart b/build_test/lib/src/matchers.dart
new file mode 100644
index 0000000..92f3c16
--- /dev/null
+++ b/build_test/lib/src/matchers.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:convert';
+
+import 'package:test/test.dart';
+
+import 'package:build/build.dart';
+
+/// Matches instance of [AssetNotFoundException].
+final assetNotFoundException = const TypeMatcher<AssetNotFoundException>();
+
+/// Matches instance of [InvalidInputException].
+final invalidInputException = const TypeMatcher<InvalidInputException>();
+
+/// Matches instance of [InvalidOutputException].
+final invalidOutputException = const TypeMatcher<InvalidOutputException>();
+
+/// Matches instance of [PackageNotFoundException].
+final packageNotFoundException = const TypeMatcher<PackageNotFoundException>();
+
+/// Decodes the value using [encoding] and matches it against [expected].
+TypeMatcher<List<int>> decodedMatches(dynamic expected, {Encoding encoding}) {
+  encoding ??= utf8;
+  return TypeMatcher<List<int>>().having(
+      (e) => encoding.decode(e), '${encoding.name} decoded bytes', expected);
+}
diff --git a/build_test/lib/src/multi_asset_reader.dart b/build_test/lib/src/multi_asset_reader.dart
new file mode 100644
index 0000000..a487263
--- /dev/null
+++ b/build_test/lib/src/multi_asset_reader.dart
@@ -0,0 +1,61 @@
+// 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:convert';
+
+import 'package:async/async.dart';
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+
+/// A [MultiPackageAssetReader] that delegates to multiple other asset
+/// readers.
+///
+/// [MultiAssetReader] attempts to check every provided
+/// [MultiPackageAssetReader] to see if they are capable of reading an
+/// [AssetId], otherwise checks the next reader.
+class MultiAssetReader extends AssetReader implements MultiPackageAssetReader {
+  final List<MultiPackageAssetReader> _readers;
+
+  MultiAssetReader(this._readers);
+
+  @override
+  Future<bool> canRead(AssetId id) async {
+    for (var reader in _readers) {
+      if (await reader.canRead(id)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  Future<List<int>> readAsBytes(AssetId id) async =>
+      (await _readerWith(id)).readAsBytes(id);
+
+  @override
+  Future<String> readAsString(AssetId id, {Encoding encoding = utf8}) async =>
+      (await _readerWith(id)).readAsString(id, encoding: encoding);
+
+  /// Returns all readable assets matching [glob] under [package].
+  ///
+  /// **NOTE**: This is a combined view of all provided readers. As such it is
+  /// possible that an [AssetId] will be iterated over more than once, unlike
+  /// other implementations of [AssetReader].
+  @override
+  Stream<AssetId> findAssets(Glob glob, {String package}) => StreamGroup.merge(
+      _readers.map((reader) => reader.findAssets(glob, package: package)));
+
+  /// Returns the first [AssetReader] that contains [id].
+  ///
+  /// Otherwise throws [AssetNotFoundException].
+  Future<AssetReader> _readerWith(AssetId id) async {
+    for (var reader in _readers) {
+      if (await reader.canRead(id)) {
+        return reader;
+      }
+    }
+    throw AssetNotFoundException(id);
+  }
+}
diff --git a/build_test/lib/src/package_reader.dart b/build_test/lib/src/package_reader.dart
new file mode 100644
index 0000000..a9024b5
--- /dev/null
+++ b/build_test/lib/src/package_reader.dart
@@ -0,0 +1,153 @@
+// 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:convert';
+import 'dart:io';
+
+import 'package:build/build.dart';
+import 'package:glob/glob.dart';
+import 'package:package_resolver/package_resolver.dart';
+import 'package:path/path.dart' as p;
+import 'package:stream_transform/stream_transform.dart';
+
+/// Resolves using a [SyncPackageResolver] before reading from the file system.
+///
+/// For a simple implementation that uses the current isolate's package
+/// resolution logic (i.e. whatever you have generated in `.packages` in most
+/// cases), use [currentIsolate]:
+/// ```dart
+/// var assetReader = await PackageAssetReader.currentIsolate();
+/// ```
+class PackageAssetReader extends AssetReader
+    implements MultiPackageAssetReader {
+  final SyncPackageResolver _packageResolver;
+
+  /// What package is the originating build occurring in.
+  final String _rootPackage;
+
+  /// Wrap a [SyncPackageResolver] to identify where files are located.
+  ///
+  /// To use a normal [PackageResolver] use `asSync`:
+  /// ```
+  /// new PackageAssetReader(await packageResolver.asSync);
+  /// ```
+  PackageAssetReader(this._packageResolver, [this._rootPackage]);
+
+  /// A [PackageAssetReader] with a single [packageRoot] configured.
+  ///
+  /// It is assumed that every _directory_ in [packageRoot] is a package where
+  /// the name of the package is the name of the directory. This is similar to
+  /// the older "packages" folder paradigm for resolution.
+  factory PackageAssetReader.forPackageRoot(String packageRoot,
+      [String rootPackage]) {
+    // This purposefully doesn't use SyncPackageResolver.root, because that is
+    // assuming a symlink collection and not directories, and this factory is
+    // more useful for a user-created collection of folders for testing.
+    final directory = Directory(packageRoot);
+    final packages = <String, String>{};
+    for (final entity in directory.listSync()) {
+      if (entity is Directory) {
+        final name = p.basename(entity.path);
+        packages[name] = entity.uri.toString();
+      }
+    }
+    return PackageAssetReader.forPackages(packages, rootPackage);
+  }
+
+  /// Returns a [PackageAssetReader] with a simple [packageToPath] mapping.
+  factory PackageAssetReader.forPackages(Map<String, String> packageToPath,
+          [String rootPackage]) =>
+      PackageAssetReader(
+          SyncPackageResolver.config(packageToPath.map((k, v) => MapEntry(
+              k, Uri.parse(p.absolute(v, 'lib')).replace(scheme: 'file')))),
+          rootPackage);
+
+  /// A reader that can resolve files known to the current isolate.
+  ///
+  /// A [rootPackage] should be provided for full API compatibility.
+  static Future<PackageAssetReader> currentIsolate({String rootPackage}) async {
+    var resolver = PackageResolver.current;
+    return PackageAssetReader(await resolver.asSync, rootPackage);
+  }
+
+  File _resolve(AssetId id) {
+    final uri = id.uri;
+    if (uri.isScheme('package')) {
+      final uri = _packageResolver.resolveUri(id.uri);
+      if (uri != null) {
+        return File.fromUri(uri);
+      }
+    }
+    if (id.package == _rootPackage) {
+      return File(p.canonicalize(p.join(_rootPackagePath, id.path)));
+    }
+    throw UnsupportedError('Unable to resolve $id');
+  }
+
+  String get _rootPackagePath {
+    // If the root package has a pub layout, use `packagePath`.
+    final root = _packageResolver.packagePath(_rootPackage);
+    if (Directory(p.join(root, 'lib')).existsSync()) {
+      return root;
+    }
+    // Assume the cwd is the package root.
+    return p.current;
+  }
+
+  @override
+  Stream<AssetId> findAssets(Glob glob, {String package}) {
+    package ??= _rootPackage;
+    if (package == null) {
+      throw UnsupportedError(
+          'Root package must be provided to use `findAssets` without an '
+          'explicit `package`.');
+    }
+    var packageLibDir = _packageResolver.packageConfigMap[package];
+    if (packageLibDir == null) {
+      throw UnsupportedError('Unable to find package $package');
+    }
+
+    var packageFiles = Directory.fromUri(packageLibDir)
+        .list(recursive: true)
+        .where((e) => e is File)
+        .map((f) =>
+            p.join('lib', p.relative(f.path, from: p.fromUri(packageLibDir))));
+    if (package == _rootPackage) {
+      packageFiles = packageFiles.transform(merge(Directory(_rootPackagePath)
+          .list(recursive: true)
+          .where((e) => e is File)
+          .map((f) => p.relative(f.path, from: _rootPackagePath))
+          .where((p) => !(p.startsWith('packages/') || p.startsWith('lib/')))));
+    }
+    return packageFiles.where(glob.matches).map((p) => AssetId(package, p));
+  }
+
+  @override
+  Future<bool> canRead(AssetId id) {
+    final file = _resolve(id);
+    if (file == null) {
+      return Future.value(false);
+    }
+    return file.exists();
+  }
+
+  @override
+  Future<List<int>> readAsBytes(AssetId id) {
+    final file = _resolve(id);
+    if (file == null) {
+      throw ArgumentError('Could not read $id.');
+    }
+    return file.readAsBytes();
+  }
+
+  @override
+  Future<String> readAsString(AssetId id, {Encoding encoding = utf8}) {
+    final file = _resolve(id);
+    if (file == null) {
+      throw ArgumentError('Could not read $id.');
+    }
+    return file.readAsString(encoding: encoding);
+  }
+}
diff --git a/build_test/lib/src/record_logs.dart b/build_test/lib/src/record_logs.dart
new file mode 100644
index 0000000..35cf8a0
--- /dev/null
+++ b/build_test/lib/src/record_logs.dart
@@ -0,0 +1,91 @@
+// 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:build/src/builder/logging.dart';
+import 'package:matcher/matcher.dart';
+import 'package:logging/logging.dart';
+
+/// Executes [run] with a new [Logger], returning the resulting log records.
+///
+/// The returned [Stream] is _closed_ after the [run] function is executed. If
+/// [run] returns a [Future], that future is awaited _before_ the stream is
+/// closed.
+///
+/// ```dart
+/// test('should log "uh oh!"', () async {
+///   final logs = recordLogs(() => runBuilder());
+///   expect(logs, emitsInOrder([
+///     anyLogOf('uh oh!'),
+///   ]);
+/// });
+/// ```
+Stream<LogRecord> recordLogs(dynamic run(), {String name = ''}) {
+  final logger = Logger(name);
+  Timer.run(() async {
+    await scopeLogAsync(() => Future.value(run()), logger);
+    logger.clearListeners();
+  });
+  return logger.onRecord;
+}
+
+/// Matches [LogRecord] of any level whose message is [messageOrMatcher].
+///
+/// ```dart
+/// anyLogOf('Hello World)';     // Exactly match 'Hello World'.
+/// anyLogOf(contains('ERROR')); // Contains the sub-string 'ERROR'.
+/// ```
+Matcher anyLogOf(dynamic messageOrMatcher) =>
+    _LogRecordMatcher(anything, messageOrMatcher);
+
+/// Matches [LogRecord] of [Level.INFO] where message is [messageOrMatcher].
+Matcher infoLogOf(dynamic messageOrMatcher) =>
+    _LogRecordMatcher(Level.INFO, messageOrMatcher);
+
+/// Matches [LogRecord] of [Level.WARNING] where message is [messageOrMatcher].
+Matcher warningLogOf(dynamic messageOrMatcher) =>
+    _LogRecordMatcher(Level.WARNING, messageOrMatcher);
+
+/// Matches [LogRecord] of [Level.SEVERE] where message is [messageOrMatcher].
+Matcher severeLogOf(dynamic messageOrMatcher) =>
+    _LogRecordMatcher(Level.SEVERE, messageOrMatcher);
+
+class _LogRecordMatcher extends Matcher {
+  final Matcher _level;
+  final Matcher _message;
+
+  factory _LogRecordMatcher(dynamic levelOr, dynamic messageOr) =>
+      _LogRecordMatcher._(levelOr is Matcher ? levelOr : equals(levelOr),
+          messageOr is Matcher ? messageOr : equals(messageOr));
+
+  _LogRecordMatcher._(this._level, this._message);
+
+  @override
+  Description describe(Description description) {
+    description.add('level: ');
+    _level.describe(description);
+    description.add(', message: ');
+    _message.describe(description);
+    return description;
+  }
+
+  @override
+  Description describeMismatch(
+      covariant LogRecord item, Description description, _, __) {
+    if (!_level.matches(item.level, {})) {
+      _level.describeMismatch(item.level, description, {}, false);
+    }
+    if (!_message.matches(item.message, {})) {
+      _message.describeMismatch(item.message, description, {}, false);
+    }
+    return description;
+  }
+
+  @override
+  bool matches(item, _) =>
+      item is LogRecord &&
+      _level.matches(item.level, {}) &&
+      _message.matches(item.message, {});
+}
diff --git a/build_test/lib/src/resolve_source.dart b/build_test/lib/src/resolve_source.dart
new file mode 100644
index 0000000..bd07d23
--- /dev/null
+++ b/build_test/lib/src/resolve_source.dart
@@ -0,0 +1,234 @@
+// 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:build/build.dart';
+import 'package:build_resolvers/build_resolvers.dart';
+import 'package:package_resolver/package_resolver.dart';
+import 'package:pedantic/pedantic.dart';
+
+import 'in_memory_reader.dart';
+import 'in_memory_writer.dart';
+import 'multi_asset_reader.dart';
+import 'package_reader.dart';
+
+final defaultResolvers = AnalyzerResolvers();
+
+/// Marker constant that may be used in combination with [resolveSources].
+///
+/// Use of this string means instead of using the contents of the string as the
+/// source of a given asset, instead read the file from the default or provided
+/// [AssetReader].
+const useAssetReader = '__useAssetReader__';
+
+/// A convenience method for using [resolveSources] with a single source file.
+Future<T> resolveSource<T>(
+  String inputSource,
+  FutureOr<T> action(Resolver resolver), {
+  AssetId inputId,
+  PackageResolver resolver,
+  Future<Null> tearDown,
+  Resolvers resolvers,
+}) {
+  inputId ??= AssetId('_resolve_source', 'lib/_resolve_source.dart');
+  return _resolveAssets(
+    {
+      '${inputId.package}|${inputId.path}': inputSource,
+    },
+    inputId.package,
+    action,
+    resolver: resolver,
+    resolverFor: inputId,
+    tearDown: tearDown,
+    resolvers: resolvers,
+  );
+}
+
+/// Resolves and runs [action] using a created resolver for [inputs].
+///
+/// Inputs accepts the pattern of `<package>|<path>.dart`, for example:
+/// ```
+/// {
+///   'test_lib|lib/test_lib.dart': r'''
+///     // Contents of test_lib.dart go here.
+///   ''',
+/// }
+/// ```
+///
+/// You may provide [useAssetReader] as the value of any input in order to read
+/// it from the file system instead of being forced to provide it inline as a
+/// string. This is useful for mixing real and mocked assets.
+///
+/// Example use:
+/// ```
+/// import 'package:build_test/build_test.dart';
+/// import 'package:test/test.dart';
+///
+/// void main() {
+///   test('should find a Foo type', () async {
+///     var library = await resolveSources({
+///       'test_lib|lib/test_lib.dart': r'''
+///         library example;
+///
+///         class Foo {}
+///       ''',
+///     }, (resolver) => resolver.findLibraryByName('example'));
+///     expect(library.getType('Foo'), isNotNull);
+///   });
+/// }
+/// ```
+///
+/// By default the [Resolver] is unusable after [action] completes. To keep the
+/// resolver active across multiple tests (for example, use `setUpAll` and
+/// `tearDownAll`, provide a `tearDown` [Future]:
+/// ```
+/// import 'dart:async';
+/// import 'package:build/build.dart';
+/// import 'package:build_test/build_test.dart';
+/// import 'package:test/test.dart';
+///
+/// void main() {
+///   Resolver resolver;
+///   var resolverDone = new Completer<Null>();
+///
+///   setUpAll(() async {
+///     resolver = await resolveSources(
+///       {...},
+///       (resolver) => resolver,
+///       tearDown: resolverDone.future,
+///     );
+///   });
+///
+///   tearDownAll(() => resolverDone.complete());
+///
+///   test('...', () async {
+///     // Use the resolver here, and in other tests.
+///   });
+/// }
+/// ```
+///
+/// May provide [resolverFor] to return the [Resolver] for the asset provided,
+/// otherwise defaults to the first one in [inputs].
+///
+/// **NOTE**: All `package` dependencies are resolved using [PackageAssetReader]
+/// - by default, [PackageAssetReader.currentIsolate]. A custom [resolver] may
+/// be provided to map files not visible to the current package's runtime.
+Future<T> resolveSources<T>(
+  Map<String, String> inputs,
+  FutureOr<T> action(Resolver resolver), {
+  PackageResolver resolver,
+  String resolverFor,
+  String rootPackage,
+  Future<Null> tearDown,
+  Resolvers resolvers,
+}) {
+  if (inputs == null || inputs.isEmpty) {
+    throw ArgumentError.value(inputs, 'inputs', 'Must be a non-empty Map');
+  }
+  return _resolveAssets(
+    inputs,
+    rootPackage ?? AssetId.parse(inputs.keys.first).package,
+    action,
+    resolver: resolver,
+    resolverFor: AssetId.parse(resolverFor ?? inputs.keys.first),
+    tearDown: tearDown,
+    resolvers: resolvers,
+  );
+}
+
+/// A convenience for using [resolveSources] with a single [inputId] from disk.
+Future<T> resolveAsset<T>(
+  AssetId inputId,
+  FutureOr<T> action(Resolver resolver), {
+  PackageResolver resolver,
+  Future<Null> tearDown,
+  Resolvers resolvers,
+}) {
+  return _resolveAssets(
+    {
+      '${inputId.package}|${inputId.path}': useAssetReader,
+    },
+    inputId.package,
+    action,
+    resolver: resolver,
+    resolverFor: inputId,
+    tearDown: tearDown,
+    resolvers: resolvers,
+  );
+}
+
+/// Internal-only backing implementation of `resolve{Asset|Source(s)}`.
+///
+/// If the value of an entry of [inputs] is [useAssetReader] then the value is
+/// instead read from the file system, otherwise the provided text is used as
+/// the contents of the asset.
+Future<T> _resolveAssets<T>(
+  Map<String, String> inputs,
+  String rootPackage,
+  FutureOr<T> action(Resolver resolver), {
+  PackageResolver resolver,
+  AssetId resolverFor,
+  Future<Null> tearDown,
+  Resolvers resolvers,
+}) async {
+  final syncResolver = await (resolver ?? PackageResolver.current).asSync;
+  final assetReader = PackageAssetReader(syncResolver, rootPackage);
+  final resolveBuilder = _ResolveSourceBuilder(
+    action,
+    resolverFor,
+    tearDown,
+  );
+  final inputAssets = <AssetId, String>{};
+  await Future.wait(inputs.keys.map((String rawAssetId) async {
+    final assetId = AssetId.parse(rawAssetId);
+    var assetValue = inputs[rawAssetId];
+    if (assetValue == useAssetReader) {
+      assetValue = await assetReader.readAsString(assetId);
+    }
+    inputAssets[assetId] = assetValue;
+  }));
+  final inMemory = InMemoryAssetReader(
+    sourceAssets: inputAssets,
+    rootPackage: rootPackage,
+  );
+  // We don't care about the results of this build.
+  unawaited(runBuilder(
+    resolveBuilder,
+    inputAssets.keys,
+    MultiAssetReader([inMemory, assetReader]),
+    InMemoryAssetWriter(),
+    resolvers ?? defaultResolvers,
+  ));
+  return resolveBuilder.onDone.future;
+}
+
+typedef FutureOr<T> _ResolverAction<T>(Resolver resolver);
+
+/// A [Builder] that is only used to retrieve a [Resolver] instance.
+///
+/// It simulates what a user builder would do in order to resolve a primary
+/// input given a set of dependencies to also use. See `resolveSource`.
+class _ResolveSourceBuilder<T> implements Builder {
+  final _ResolverAction<T> _action;
+  final Future _tearDown;
+  final AssetId _resolverFor;
+
+  final onDone = Completer<T>();
+
+  _ResolveSourceBuilder(this._action, this._resolverFor, this._tearDown);
+
+  @override
+  Future<Null> build(BuildStep buildStep) async {
+    if (_resolverFor != buildStep.inputId) return;
+    var result = await _action(buildStep.resolver);
+    onDone.complete(result);
+    await _tearDown;
+  }
+
+  @override
+  final buildExtensions = const {
+    '': ['.unused']
+  };
+}
diff --git a/build_test/lib/src/stub_reader.dart b/build_test/lib/src/stub_reader.dart
new file mode 100644
index 0000000..50e274a
--- /dev/null
+++ b/build_test/lib/src/stub_reader.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 'dart:convert';
+
+import 'package:build/build.dart';
+import 'package:crypto/crypto.dart';
+import 'package:glob/glob.dart';
+
+/// A no-op implementation of [AssetReader].
+class StubAssetReader extends AssetReader implements MultiPackageAssetReader {
+  StubAssetReader();
+
+  @override
+  Future<bool> canRead(AssetId id) => Future.value(null);
+
+  @override
+  Future<List<int>> readAsBytes(AssetId id) => Future.value(null);
+
+  @override
+  Future<String> readAsString(AssetId id, {Encoding encoding}) =>
+      Future.value(null);
+
+  @override
+  Stream<AssetId> findAssets(Glob glob, {String package}) => null;
+
+  @override
+  Future<Digest> digest(AssetId id) => Future.value(Digest([1, 2, 3]));
+}
diff --git a/build_test/lib/src/stub_writer.dart b/build_test/lib/src/stub_writer.dart
new file mode 100644
index 0000000..d7e0899
--- /dev/null
+++ b/build_test/lib/src/stub_writer.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:build/build.dart';
+
+/// A no-op implementation of [AssetWriter].
+class StubAssetWriter implements AssetWriter {
+  const StubAssetWriter();
+
+  @override
+  Future writeAsBytes(_, __) => Future.value(null);
+
+  @override
+  Future writeAsString(_, __, {Encoding encoding}) => Future.value(null);
+}
diff --git a/build_test/lib/src/test_bootstrap_builder.dart b/build_test/lib/src/test_bootstrap_builder.dart
new file mode 100644
index 0000000..c4ececf
--- /dev/null
+++ b/build_test/lib/src/test_bootstrap_builder.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:path/path.dart' as p;
+
+/// A [Builder] that injects bootstrapping code used by the test runner to run
+/// tests in --precompiled mode.
+///
+/// This doesn't modify existing code at all, it just adds wrapper files that
+/// can be used to load isolates or iframes.
+class TestBootstrapBuilder extends Builder {
+  @override
+  final buildExtensions = const {
+    '_test.dart': [
+      '_test.dart.vm_test.dart',
+      '_test.dart.browser_test.dart',
+      '_test.dart.node_test.dart',
+    ]
+  };
+  TestBootstrapBuilder();
+
+  @override
+  Future<Null> build(BuildStep buildStep) async {
+    var id = buildStep.inputId;
+
+    await buildStep.writeAsString(id.addExtension('.vm_test.dart'), '''
+          import "dart:isolate";
+
+          import "package:test/bootstrap/vm.dart";
+
+          import "${p.url.basename(id.path)}" as test;
+
+          void main(_, SendPort message) {
+            internalBootstrapVmTest(() => test.main, message);
+          }
+        ''');
+
+    await buildStep.writeAsString(id.addExtension('.browser_test.dart'), '''
+          import "package:test/bootstrap/browser.dart";
+
+          import "${p.url.basename(id.path)}" as test;
+
+          void main() {
+            internalBootstrapBrowserTest(() => test.main);
+          }
+        ''');
+
+    await buildStep.writeAsString(id.addExtension('.node_test.dart'), '''
+          import "package:test/bootstrap/node.dart";
+
+          import "${p.url.basename(id.path)}" as test;
+
+          void main() {
+            internalBootstrapNodeTest(() => test.main);
+          }
+        ''');
+  }
+}
diff --git a/build_test/lib/src/test_builder.dart b/build_test/lib/src/test_builder.dart
new file mode 100644
index 0000000..729bfb7
--- /dev/null
+++ b/build_test/lib/src/test_builder.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:build/build.dart';
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+
+import 'assets.dart';
+import 'in_memory_reader.dart';
+import 'in_memory_writer.dart';
+import 'resolve_source.dart';
+
+AssetId _passThrough(AssetId id) => id;
+
+/// Validates that [actualAssets] matches the expected [outputs].
+///
+/// The keys in [outputs] should be serialized AssetIds in the form
+/// `'package|path'`. The values should match the expected content for the
+/// written asset and may be a String (for `writeAsString`), a `List<int>` (for
+/// `writeAsBytes`) or a [Matcher] for a String or bytes.
+///
+/// [actualAssets] are the IDs that were recorded as written during the build.
+///
+/// Assets are checked against those that were written to [writer]. If other
+/// assets were written through the writer, but not as part of the build
+/// process, they will be ignored. Only the IDs in [actualAssets] are checked.
+///
+/// If assets are written to a location that does not match their logical
+/// association to a package pass `[mapAssetIds]` to translate from the logical
+/// location to the actual written location.
+void checkOutputs(
+    Map<String, /*List<int>|String|Matcher<String|List<int>>*/ dynamic> outputs,
+    Iterable<AssetId> actualAssets,
+    RecordingAssetWriter writer,
+    {AssetId mapAssetIds(AssetId id) = _passThrough}) {
+  var modifiableActualAssets = Set.from(actualAssets);
+  if (outputs != null) {
+    outputs.forEach((serializedId, contentsMatcher) {
+      assert(contentsMatcher is String ||
+          contentsMatcher is List<int> ||
+          contentsMatcher is Matcher);
+
+      var assetId = makeAssetId(serializedId);
+
+      // Check that the asset was produced.
+      expect(modifiableActualAssets, contains(assetId),
+          reason: 'Builder failed to write asset $assetId');
+      modifiableActualAssets.remove(assetId);
+      var actual = writer.assets[mapAssetIds(assetId)];
+      Object expected;
+      if (contentsMatcher is String) {
+        expected = utf8.decode(actual);
+      } else if (contentsMatcher is List<int>) {
+        expected = actual;
+      } else if (contentsMatcher is Matcher) {
+        expected = actual;
+      } else {
+        throw ArgumentError('Expected values for `outputs` to be of type '
+            '`String`, `List<int>`, or `Matcher`, but got `$contentsMatcher`.');
+      }
+      expect(expected, contentsMatcher,
+          reason: 'Unexpected content for $assetId in result.outputs.');
+    });
+    // Check that no extra assets were produced.
+    expect(modifiableActualAssets, isEmpty,
+        reason:
+            'Unexpected outputs found `$actualAssets`. Only expected $outputs');
+  }
+}
+
+/// Runs [builder] in a test environment.
+///
+/// The test environment supplies in-memory build [sourceAssets] to the builders
+/// under test. [outputs] may be optionally provided to verify that the builders
+/// produce the expected output. If outputs is omitted the only validation this
+/// method provides is that the build did not `throw`.
+///
+/// [generateFor] or the [isInput] call back can specify which assets should be
+/// given as inputs to the builder. These can be omitted if every asset in
+/// [sourceAssets] should be considered an input. [isInput] precedent over
+/// [generateFor] if both are provided.
+///
+/// The keys in [sourceAssets] and [outputs] are paths to file assets and the
+/// values are file contents. The paths must use the following format:
+///
+///     PACKAGE_NAME|PATH_WITHIN_PACKAGE
+///
+/// Where `PACKAGE_NAME` is the name of the package, and `PATH_WITHIN_PACKAGE`
+/// is the path to a file relative to the package. `PATH_WITHIN_PACKAGE` must
+/// include `lib`, `web`, `bin` or `test`. Example: "myapp|lib/utils.dart".
+///
+/// Callers may optionally provide a [writer] to stub different behavior or do
+/// more complex validation than what is possible with [outputs].
+///
+/// Callers may optionally provide an [onLog] callback to do validaiton on the
+/// logging output of the builder.
+Future testBuilder(
+    Builder builder, Map<String, /*String|List<int>*/ dynamic> sourceAssets,
+    {Set<String> generateFor,
+    bool isInput(String assetId),
+    String rootPackage,
+    RecordingAssetWriter writer,
+    Map<String, /*String|List<int>|Matcher<String|List<int>>*/ dynamic> outputs,
+    void onLog(LogRecord log)}) async {
+  writer ??= InMemoryAssetWriter();
+  final reader = InMemoryAssetReader(rootPackage: rootPackage);
+
+  var inputIds = <AssetId>[];
+  sourceAssets.forEach((serializedId, contents) {
+    var id = makeAssetId(serializedId);
+    if (contents is String) {
+      reader.cacheStringAsset(id, contents);
+    } else if (contents is List<int>) {
+      reader.cacheBytesAsset(id, contents);
+    }
+    inputIds.add(id);
+  });
+
+  var allPackages = reader.assets.keys.map((a) => a.package).toSet();
+  for (var pkg in allPackages) {
+    for (var dir in const ['lib', 'web', 'test']) {
+      var asset = AssetId(pkg, '$dir/\$$dir\$');
+      inputIds.add(asset);
+    }
+  }
+
+  isInput ??= generateFor?.contains ?? (_) => true;
+  inputIds = inputIds.where((id) => isInput('$id')).toList();
+
+  var writerSpy = AssetWriterSpy(writer);
+  var logger = Logger('testBuilder');
+  var logSubscription = logger.onRecord.listen(onLog);
+  await runBuilder(builder, inputIds, reader, writerSpy, defaultResolvers,
+      logger: logger);
+  await logSubscription.cancel();
+  var actualOutputs = writerSpy.assetsWritten;
+  checkOutputs(outputs, actualOutputs, writer);
+}
diff --git a/build_test/mono_pkg.yaml b/build_test/mono_pkg.yaml
new file mode 100644
index 0000000..54c8b5b
--- /dev/null
+++ b/build_test/mono_pkg.yaml
@@ -0,0 +1,14 @@
+dart:
+  - dev
+
+stages:
+  - analyze_and_format:
+    - group:
+        - dartfmt: sdk
+        - dartanalyzer: --fatal-infos --fatal-warnings .
+  - unit_test:
+    - command: pub run build_runner test
+
+cache:
+  directories:
+    - .dart_tool/build
diff --git a/build_test/pubspec.yaml b/build_test/pubspec.yaml
new file mode 100644
index 0000000..2a36fea
--- /dev/null
+++ b/build_test/pubspec.yaml
@@ -0,0 +1,31 @@
+name: build_test
+description: Utilities for writing unit tests of Builders.
+version: 0.10.6
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/build/tree/master/build_test
+
+environment:
+  sdk: ">=2.0.0 <3.0.0"
+
+dependencies:
+  async: ">=1.2.0 <3.0.0"
+  build: ">=0.12.0 <2.0.0"
+  build_config: ">=0.2.0 <0.4.0"
+  build_resolvers: ">=0.2.0 <2.0.0"
+  crypto: ">=0.9.2 <3.0.0"
+  glob: ^1.1.0
+  html: ">=0.9.0 <=0.14.0"
+  logging: ^0.11.2
+  matcher: ^0.12.0
+  package_resolver: ^1.0.2
+  path: ^1.4.1
+  pedantic: ^1.0.0
+  stream_transform: ^0.0.11
+  test: '>=0.12.42 <2.0.0'
+  watcher: ^0.9.7
+
+dev_dependencies:
+  analyzer: ">=0.27.1 <0.36.0"
+  build_runner: ^1.0.0
+  build_vm_compilers: ^0.1.0
+  collection: ^1.14.0
diff --git a/build_vm_compilers/BUILD.gn b/build_vm_compilers/BUILD.gn
new file mode 100644
index 0000000..e163e9f
--- /dev/null
+++ b/build_vm_compilers/BUILD.gn
@@ -0,0 +1,21 @@
+# This file is generated by importer.py for build_vm_compilers-0.1.1+5
+
+import("//build/dart/dart_library.gni")
+
+dart_library("build_vm_compilers") {
+  package_name = "build_vm_compilers"
+
+  # This parameter is left empty as we don't care about analysis or exporting
+  # these sources outside of the tree.
+  sources = []
+
+  disable_analysis = true
+
+  deps = [
+    "//third_party/dart/pkg/analyzer",
+    "//third_party/dart-pkg/pub/path",
+    "//third_party/dart-pkg/pub/build_modules",
+    "//third_party/dart-pkg/pub/build",
+    "//third_party/dart-pkg/pub/pool",
+  ]
+}
diff --git a/build_vm_compilers/CHANGELOG.md b/build_vm_compilers/CHANGELOG.md
new file mode 100644
index 0000000..0db80db
--- /dev/null
+++ b/build_vm_compilers/CHANGELOG.md
@@ -0,0 +1,28 @@
+## 0.1.1+5
+
+- Increased the upper bound for `package:analyzer` to `<0.36.0`.
+
+## 0.1.1+4
+
+- Increased the upper bound for `package:analyzer` to `<0.35.0`.
+
+## 0.1.1+3
+
+- Increased the upper bound for `package:analyzer` to '<0.34.0'.
+
+## 0.1.1+2
+
+Support `package:build_modules` version `1.x.x`.
+
+## 0.1.1+1
+
+Support `package:build` version `1.x.x`.
+
+## 0.1.1
+
+Support the latest build_modules.
+
+## 0.1.0
+
+Initial release, adds the modular kernel compiler for the vm platform, and the
+entrypoint builder which concatenates all the modules into a single kernel file.
diff --git a/build_vm_compilers/LICENSE b/build_vm_compilers/LICENSE
new file mode 100644
index 0000000..c4dc9ba
--- /dev/null
+++ b/build_vm_compilers/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2018, 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/build_vm_compilers/README.md b/build_vm_compilers/README.md
new file mode 100644
index 0000000..d036c1f
--- /dev/null
+++ b/build_vm_compilers/README.md
@@ -0,0 +1,72 @@
+# build_vm_compilers
+
+<p align="center">
+  Vm compilers for users of <a href="https://pub.dartlang.org/packages/build"><code>package:build</code></a>.
+  <br>
+  <a href="https://travis-ci.org/dart-lang/build">
+    <img src="https://travis-ci.org/dart-lang/build.svg?branch=master" alt="Build Status" />
+  </a>
+  <a href="https://github.com/dart-lang/build/labels/package%3A%20build_vm_compilers">
+    <img src="https://img.shields.io/github/issues-raw/dart-lang/build/package%3A%20build_vm_compilers.svg" alt="Issues related to build_vm_compilers" />
+  </a>
+  <a href="https://pub.dartlang.org/packages/build_vm_compilers">
+    <img src="https://img.shields.io/pub/v/build_vm_compilers.svg" alt="Pub Package Version" />
+  </a>
+  <a href="https://pub.dartlang.org/documentation/build_vm_compilers/latest">
+    <img src="https://img.shields.io/badge/dartdocs-latest-blue.svg" alt="Latest Dartdocs" />
+  </a>
+  <a href="https://gitter.im/dart-lang/build">
+    <img src="https://badges.gitter.im/dart-lang/build.svg" alt="Join the chat on Gitter" />
+  </a>
+</p>
+
+* [Installation](#installation)
+* [Usage](#usage)
+* [Configuration](#configuration)
+* [Manual Usage](#manual-usage)
+
+## Installation
+
+This package is intended to be used as a [development dependency][] for users
+of [`package:build`][] who want to run code in the Dart vm with precompiled
+kernel files. This allows you to share compilation of dependencies between
+multiple entrypoints, instead of doing a monolithic compile of each entrypoint
+like the Dart VM would normally do on each run.
+
+**Note**: If you want to use this package for running tests with
+`pub run build_runner test` you will also need a `build_test` dev dependency.
+
+## Usage
+
+This package creates a `.vm.app.dill` file corresponding to each `.dart` file
+that contains a `main` function.
+
+These files can be passed directly to the vm, instead of the dart script, and
+the vm will skip its initial parse and compile step.
+
+You can find the output either by using the `-o <dir>` option for build_runner,
+or by finding it in the generated cache directory, which is located at
+`.dart_tool/build/generated/<your-package>`.
+
+## Configuration
+
+There are no configuration options available at this time.
+
+## Custom Build Script Integration
+
+If you are using a custom build script, you will need to add the following
+builder applications to what you already have, sometime after the
+`build_modules` builder applications:
+
+```dart
+    apply('build_vm_compilers|entrypoint',
+        [vmKernelEntrypointBuilder], toRoot(),
+        hideOutput: true,
+        // These globs should match your entrypoints only.
+        defaultGenerateFor: const InputSet(
+            include: const ['bin/**', 'tool/**', 'test/**.vm_test.dart'])),
+]
+```
+
+[development dependency]: https://www.dartlang.org/tools/pub/dependencies#dev-dependencies
+[`package:build`]: https://pub.dartlang.org/packages/build
diff --git a/build_vm_compilers/build.yaml b/build_vm_compilers/build.yaml
new file mode 100644
index 0000000..bb089d0
--- /dev/null
+++ b/build_vm_compilers/build.yaml
@@ -0,0 +1,36 @@
+builders:
+  vm:
+    import: "package:build_vm_compilers/builders.dart"
+    builder_factories:
+      - vmKernelModuleBuilder
+    build_extensions:
+      .dart:
+        - .vm.dill
+    is_optional: True
+    auto_apply: all_packages
+    required_inputs:
+      - .dart
+      - .vm.module
+    applies_builders:
+      - build_modules|vm
+  entrypoint:
+    import: "package:build_vm_compilers/builders.dart"
+    builder_factories:
+      - vmKernelEntrypointBuilder
+    build_extensions:
+      .dart:
+        - .vm.app.dill
+    required_inputs:
+      - .dart
+      - .vm.dill
+      - .vm.module
+    build_to: cache
+    auto_apply: root_package
+    defaults:
+      generate_for:
+        include:
+          - bin/**
+          - tool/**
+          - test/**.dart.vm_test.dart
+          - example/**
+          - benchmark/**
diff --git a/build_vm_compilers/lib/build_vm_compilers.dart b/build_vm_compilers/lib/build_vm_compilers.dart
new file mode 100644
index 0000000..1d7368b
--- /dev/null
+++ b/build_vm_compilers/lib/build_vm_compilers.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/vm_entrypoint_builder.dart' show VmEntrypointBuilder;
diff --git a/build_vm_compilers/lib/builders.dart b/build_vm_compilers/lib/builders.dart
new file mode 100644
index 0000000..47ddd2d
--- /dev/null
+++ b/build_vm_compilers/lib/builders.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:build/build.dart';
+import 'package:build_modules/build_modules.dart';
+import 'package:path/path.dart' as p;
+
+import 'src/vm_entrypoint_builder.dart';
+
+const vmKernelModuleExtension = '.vm.dill';
+const vmKernelEntrypointExtension = '.vm.app.dill';
+
+Builder vmKernelModuleBuilder(_) => KernelBuilder(
+      summaryOnly: false,
+      sdkKernelPath: p.join('lib', '_internal', 'vm_platform_strong.dill'),
+      outputExtension: vmKernelModuleExtension,
+      platform: DartPlatform.vm,
+    );
+
+Builder vmKernelEntrypointBuilder(_) => VmEntrypointBuilder();
diff --git a/build_vm_compilers/lib/src/vm_entrypoint_builder.dart b/build_vm_compilers/lib/src/vm_entrypoint_builder.dart
new file mode 100644
index 0000000..2025997
--- /dev/null
+++ b/build_vm_compilers/lib/src/vm_entrypoint_builder.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+
+// ignore: deprecated_member_use
+import 'package:analyzer/analyzer.dart';
+import 'package:build/build.dart';
+import 'package:build_modules/build_modules.dart';
+import 'package:pool/pool.dart';
+
+import '../builders.dart';
+
+/// Because we hold bytes in memory we don't want to compile to many app entry
+/// points at once.
+final _buildPool = Pool(16);
+
+/// A builder which combines several [vmKernelModuleExtension] modules into a
+/// single [vmKernelEntrypointExtension] file, which represents an entire
+/// application.
+class VmEntrypointBuilder implements Builder {
+  const VmEntrypointBuilder();
+
+  @override
+  final buildExtensions = const {
+    '.dart': [vmKernelEntrypointExtension],
+  };
+
+  @override
+  Future<Null> build(BuildStep buildStep) async {
+    await _buildPool.withResource(() async {
+      var dartEntrypointId = buildStep.inputId;
+      var isAppEntrypoint = await _isAppEntryPoint(dartEntrypointId, buildStep);
+      if (!isAppEntrypoint) return;
+
+      var moduleId =
+          buildStep.inputId.changeExtension(moduleExtension(DartPlatform.vm));
+      var module = Module.fromJson(
+          json.decode(await buildStep.readAsString(moduleId))
+              as Map<String, dynamic>);
+      var transitiveModules =
+          await module.computeTransitiveDependencies(buildStep);
+      var transitiveKernelModules = [
+        module.primarySource.changeExtension(vmKernelModuleExtension)
+      ].followedBy(transitiveModules.map(
+          (m) => m.primarySource.changeExtension(vmKernelModuleExtension)));
+      var appContents = <int>[];
+      for (var dependencyId in transitiveKernelModules) {
+        appContents.addAll(await buildStep.readAsBytes(dependencyId));
+      }
+      await buildStep.writeAsBytes(
+          buildStep.inputId.changeExtension(vmKernelEntrypointExtension),
+          appContents);
+    });
+  }
+}
+
+/// Returns whether or not [dartId] is an app entrypoint (basically, whether
+/// or not it has a `main` function).
+Future<bool> _isAppEntryPoint(AssetId dartId, AssetReader reader) async {
+  assert(dartId.extension == '.dart');
+  // Skip reporting errors here, dartdevc will report them later with nicer
+  // formatting.
+  var parsed = parseCompilationUnit(await reader.readAsString(dartId),
+      suppressErrors: true);
+  // Allow two or fewer arguments so that entrypoints intended for use with
+  // [spawnUri] get counted.
+  //
+  // TODO: This misses the case where a Dart file doesn't contain main(),
+  // but has a part that does, or it exports a `main` from another library.
+  return parsed.declarations.any((node) {
+    return node is FunctionDeclaration &&
+        node.name.name == 'main' &&
+        node.functionExpression.parameters.parameters.length <= 2;
+  });
+}
diff --git a/build_vm_compilers/mono_pkg.yaml b/build_vm_compilers/mono_pkg.yaml
new file mode 100644
index 0000000..86a29d0
--- /dev/null
+++ b/build_vm_compilers/mono_pkg.yaml
@@ -0,0 +1,10 @@
+dart:
+  - dev
+
+stages:
+  - analyze_and_format:
+    - group:
+        - dartfmt: sdk
+        - dartanalyzer: --fatal-infos --fatal-warnings .
+  - unit_test:
+    - test
diff --git a/build_vm_compilers/pubspec.yaml b/build_vm_compilers/pubspec.yaml
new file mode 100644
index 0000000..58112ae
--- /dev/null
+++ b/build_vm_compilers/pubspec.yaml
@@ -0,0 +1,22 @@
+name: build_vm_compilers
+version: 0.1.1+5
+description: Builder implementations wrapping Dart VM compilers.
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/build/tree/master/build_vm_compilers
+
+environment:
+  sdk: ">=2.0.0 <3.0.0"
+
+dependencies:
+  analyzer: ">=0.30.0 <0.36.0"
+  build: '>=0.12.0 <2.0.0'
+  build_modules: '>=0.4.0 <2.0.0'
+  path: ^1.6.0
+  pool: ^1.3.0
+
+dev_dependencies:
+  build_runner: ^1.0.0
+  test: ^1.0.0
+  test_descriptor: ^1.1.0
+  _test_common:
+    path: ../_test_common
diff --git a/built_value/BUILD.gn b/built_value/BUILD.gn
index e1c2bce..1f5331f 100644
--- a/built_value/BUILD.gn
+++ b/built_value/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for built_value-6.3.0
+# This file is generated by importer.py for built_value-6.3.1
 
 import("//build/dart/dart_library.gni")
 
diff --git a/built_value/CHANGELOG.md b/built_value/CHANGELOG.md
index 0b609ad..f10e241 100644
--- a/built_value/CHANGELOG.md
+++ b/built_value/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Changelog
 
+# 6.3.1
+
+- Fix `BuiltList` serialization when using `StandardJsonPlugin` with
+  unspecified type and when list length is 1.
+
 # 6.3.0
 
 - Allow custom builders to use setter/getter pairs instead of normal fields.
diff --git a/built_value/README.md b/built_value/README.md
index 38d8d25..951de35 100644
--- a/built_value/README.md
+++ b/built_value/README.md
@@ -26,6 +26,7 @@
 
 ## Tutorials
 
+ - [Custom Serializers](https://medium.com/@solid.goncalo/creating-custom-built-value-serializers-with-builtvalueserializer-46a52c75d4c5)
  - [Flutter + built_value + Reddit Tutorial](https://steemit.com/utopian-io/@tensor/building-immutable-models-with-built-value-and-built-collection-in-dart-s-flutter-framework);
    [video](https://www.youtube.com/watch?v=hNbOSSgpneI);
    [source code](https://github.com/tensor-programming/built_flutter_tutorial)
diff --git a/built_value/lib/standard_json_plugin.dart b/built_value/lib/standard_json_plugin.dart
index 399b7a9..1901433 100644
--- a/built_value/lib/standard_json_plugin.dart
+++ b/built_value/lib/standard_json_plugin.dart
@@ -93,6 +93,11 @@
   Map _toMapWithDiscriminator(List list) {
     var type = list[0];
 
+    if (type == 'list') {
+      // Embed the list in the map.
+      return <String, Object>{discriminator: type, valueKey: list.sublist(1)};
+    }
+
     // Length is at least two because we have one entry for type and one for
     // the value.
     if (list.length == 2) {
@@ -100,11 +105,6 @@
       return <String, Object>{discriminator: type, valueKey: list[1]};
     }
 
-    if (type == 'list') {
-      // Embed the list in the map.
-      return <String, Object>{discriminator: type, valueKey: list.sublist(1)};
-    }
-
     // If a map has non-String keys then they need encoding to strings before
     // it can be converted to JSON. Because we don't know the type, we also
     // won't know the type on deserialization, and signal this by changing the
diff --git a/built_value/pubspec.yaml b/built_value/pubspec.yaml
index 844a5a3..13a963d 100644
--- a/built_value/pubspec.yaml
+++ b/built_value/pubspec.yaml
@@ -1,5 +1,5 @@
 name: built_value
-version: 6.3.0
+version: 6.3.1
 description: >
   Value types with builders, Dart classes as enums, and serialization.
   This library is the runtime dependency.
diff --git a/flutter_gallery_assets/BUILD.gn b/flutter_gallery_assets/BUILD.gn
index 2215363..8960a68 100644
--- a/flutter_gallery_assets/BUILD.gn
+++ b/flutter_gallery_assets/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for flutter_gallery_assets-0.1.6
+# This file is generated by importer.py for flutter_gallery_assets-0.1.8
 
 import("//build/dart/dart_library.gni")
 
diff --git a/flutter_gallery_assets/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/flutter_gallery_assets/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
new file mode 100644
index 0000000..d007606
--- /dev/null
+++ b/flutter_gallery_assets/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
@@ -0,0 +1,23 @@
+package io.flutter.plugins;
+
+import io.flutter.plugin.common.PluginRegistry;
+
+/**
+ * Generated file. Do not edit.
+ */
+public final class GeneratedPluginRegistrant {
+  public static void registerWith(PluginRegistry registry) {
+    if (alreadyRegisteredWith(registry)) {
+      return;
+    }
+  }
+
+  private static boolean alreadyRegisteredWith(PluginRegistry registry) {
+    final String key = GeneratedPluginRegistrant.class.getCanonicalName();
+    if (registry.hasPlugin(key)) {
+      return true;
+    }
+    registry.registrarFor(key);
+    return false;
+  }
+}
diff --git a/flutter_gallery_assets/android/local.properties b/flutter_gallery_assets/android/local.properties
new file mode 100644
index 0000000..0a08f2d
--- /dev/null
+++ b/flutter_gallery_assets/android/local.properties
@@ -0,0 +1,2 @@
+sdk.dir=/Users/larche/Library/Android/sdk
+flutter.sdk=/Users/larche/flutter
\ No newline at end of file
diff --git a/flutter_gallery_assets/ios/Flutter/Generated.xcconfig b/flutter_gallery_assets/ios/Flutter/Generated.xcconfig
new file mode 100644
index 0000000..14f694e
--- /dev/null
+++ b/flutter_gallery_assets/ios/Flutter/Generated.xcconfig
@@ -0,0 +1,8 @@
+// This is a generated file; do not edit or check into version control.
+FLUTTER_ROOT=/Users/larche/flutter
+FLUTTER_APPLICATION_PATH=/Users/larche/flutter_gallery_assets
+FLUTTER_TARGET=lib/main.dart
+FLUTTER_BUILD_DIR=build
+SYMROOT=${SOURCE_ROOT}/../build/ios
+FLUTTER_FRAMEWORK_DIR=/Users/larche/flutter/bin/cache/artifacts/engine/ios
+FLUTTER_BUILD_NAME=0.1.8
diff --git a/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.h b/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.h
new file mode 100644
index 0000000..3b700eb
--- /dev/null
+++ b/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.h
@@ -0,0 +1,14 @@
+//
+//  Generated file. Do not edit.
+//
+
+#ifndef GeneratedPluginRegistrant_h
+#define GeneratedPluginRegistrant_h
+
+#import <Flutter/Flutter.h>
+
+@interface GeneratedPluginRegistrant : NSObject
++ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;
+@end
+
+#endif /* GeneratedPluginRegistrant_h */
diff --git a/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.m b/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.m
new file mode 100644
index 0000000..60dfa42
--- /dev/null
+++ b/flutter_gallery_assets/ios/Runner/GeneratedPluginRegistrant.m
@@ -0,0 +1,12 @@
+//
+//  Generated file. Do not edit.
+//
+
+#import "GeneratedPluginRegistrant.h"
+
+@implementation GeneratedPluginRegistrant
+
++ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
+}
+
+@end
diff --git a/flutter_gallery_assets/lib/customized/3.0x/ic_circle_arrow.png b/flutter_gallery_assets/lib/customized/3.0x/ic_circle_arrow.png
new file mode 100644
index 0000000..aeecf48
--- /dev/null
+++ b/flutter_gallery_assets/lib/customized/3.0x/ic_circle_arrow.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/customized/bg_hero.png b/flutter_gallery_assets/lib/customized/bg_hero.png
new file mode 100644
index 0000000..f0d3982
--- /dev/null
+++ b/flutter_gallery_assets/lib/customized/bg_hero.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/customized/bg_runner.png b/flutter_gallery_assets/lib/customized/bg_runner.png
new file mode 100644
index 0000000..70ef70c
--- /dev/null
+++ b/flutter_gallery_assets/lib/customized/bg_runner.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/customized/fg_hero.png b/flutter_gallery_assets/lib/customized/fg_hero.png
new file mode 100755
index 0000000..b3c5f21
--- /dev/null
+++ b/flutter_gallery_assets/lib/customized/fg_hero.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/customized/run_path.png b/flutter_gallery_assets/lib/customized/run_path.png
new file mode 100644
index 0000000..175d676
--- /dev/null
+++ b/flutter_gallery_assets/lib/customized/run_path.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Bold.ttf b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Bold.ttf
new file mode 100755
index 0000000..b43e97c
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Bold.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Light.ttf b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Light.ttf
new file mode 100755
index 0000000..2167ab4
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Light.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Medium.ttf b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Medium.ttf
new file mode 100755
index 0000000..41daf85
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Medium.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Regular.ttf b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Regular.ttf
new file mode 100755
index 0000000..487c31e
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/LibreFranklin-Regular.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/OFL.txt b/flutter_gallery_assets/lib/fonts/librefranklin/OFL.txt
new file mode 100755
index 0000000..9df4654
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2015, Impallari Type (www.impallari.com)

+

+This Font Software is licensed under the SIL Open Font License, Version 1.1.

+This license is copied below, and is also available with a FAQ at:

+http://scripts.sil.org/OFL

+

+

+-----------------------------------------------------------

+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007

+-----------------------------------------------------------

+

+PREAMBLE

+The goals of the Open Font License (OFL) are to stimulate worldwide

+development of collaborative font projects, to support the font creation

+efforts of academic and linguistic communities, and to provide a free and

+open framework in which fonts may be shared and improved in partnership

+with others.

+

+The OFL allows the licensed fonts to be used, studied, modified and

+redistributed freely as long as they are not sold by themselves. The

+fonts, including any derivative works, can be bundled, embedded, 

+redistributed and/or sold with any software provided that any reserved

+names are not used by derivative works. The fonts and derivatives,

+however, cannot be released under any other type of license. The

+requirement for fonts to remain under this license does not apply

+to any document created using the fonts or their derivatives.

+

+DEFINITIONS

+"Font Software" refers to the set of files released by the Copyright

+Holder(s) under this license and clearly marked as such. This may

+include source files, build scripts and documentation.

+

+"Reserved Font Name" refers to any names specified as such after the

+copyright statement(s).

+

+"Original Version" refers to the collection of Font Software components as

+distributed by the Copyright Holder(s).

+

+"Modified Version" refers to any derivative made by adding to, deleting,

+or substituting -- in part or in whole -- any of the components of the

+Original Version, by changing formats or by porting the Font Software to a

+new environment.

+

+"Author" refers to any designer, engineer, programmer, technical

+writer or other person who contributed to the Font Software.

+

+PERMISSION & CONDITIONS

+Permission is hereby granted, free of charge, to any person obtaining

+a copy of the Font Software, to use, study, copy, merge, embed, modify,

+redistribute, and sell modified and unmodified copies of the Font

+Software, subject to the following conditions:

+

+1) Neither the Font Software nor any of its individual components,

+in Original or Modified Versions, may be sold by itself.

+

+2) Original or Modified Versions of the Font Software may be bundled,

+redistributed and/or sold with any software, provided that each copy

+contains the above copyright notice and this license. These can be

+included either as stand-alone text files, human-readable headers or

+in the appropriate machine-readable metadata fields within text or

+binary files as long as those fields can be easily viewed by the user.

+

+3) No Modified Version of the Font Software may use the Reserved Font

+Name(s) unless explicit written permission is granted by the corresponding

+Copyright Holder. This restriction only applies to the primary font name as

+presented to the users.

+

+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font

+Software shall not be used to promote, endorse or advertise any

+Modified Version, except to acknowledge the contribution(s) of the

+Copyright Holder(s) and the Author(s) or with their explicit written

+permission.

+

+5) The Font Software, modified or unmodified, in part or in whole,

+must be distributed entirely under this license, and must not be

+distributed under any other license. The requirement for fonts to

+remain under this license does not apply to any document created

+using the Font Software.

+

+TERMINATION

+This license becomes null and void if any of the above conditions are

+not met.

+

+DISCLAIMER

+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF

+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT

+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE

+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,

+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL

+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM

+OTHER DEALINGS IN THE FONT SOFTWARE.

diff --git a/flutter_gallery_assets/lib/fonts/librefranklin/README.md b/flutter_gallery_assets/lib/fonts/librefranklin/README.md
new file mode 100644
index 0000000..61ebe89
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/librefranklin/README.md
@@ -0,0 +1,3 @@
+Flutter Gallery, Fortnightly Demo Assets
+
+The Libre Frankline font was downloaded from https://fonts.google.com/specimen/Libre+Franklin
diff --git a/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-BlackItalic.ttf b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-BlackItalic.ttf
new file mode 100755
index 0000000..04cc484
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-BlackItalic.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Italic.ttf b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Italic.ttf
new file mode 100755
index 0000000..f9f8fab
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Italic.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Light.ttf b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Light.ttf
new file mode 100755
index 0000000..3b17a2d
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Light.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Regular.ttf b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Regular.ttf
new file mode 100755
index 0000000..2ee9a69
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/Merriweather-Regular.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/fonts/merriweather/OFL.txt b/flutter_gallery_assets/lib/fonts/merriweather/OFL.txt
new file mode 100755
index 0000000..ab1138c
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2016 The Merriweather Project Authors (https://github.com/EbenSorkin/Merriweather), with Reserved Font Name "Merriweather".

+

+This Font Software is licensed under the SIL Open Font License, Version 1.1.

+This license is copied below, and is also available with a FAQ at:

+http://scripts.sil.org/OFL

+

+

+-----------------------------------------------------------

+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007

+-----------------------------------------------------------

+

+PREAMBLE

+The goals of the Open Font License (OFL) are to stimulate worldwide

+development of collaborative font projects, to support the font creation

+efforts of academic and linguistic communities, and to provide a free and

+open framework in which fonts may be shared and improved in partnership

+with others.

+

+The OFL allows the licensed fonts to be used, studied, modified and

+redistributed freely as long as they are not sold by themselves. The

+fonts, including any derivative works, can be bundled, embedded, 

+redistributed and/or sold with any software provided that any reserved

+names are not used by derivative works. The fonts and derivatives,

+however, cannot be released under any other type of license. The

+requirement for fonts to remain under this license does not apply

+to any document created using the fonts or their derivatives.

+

+DEFINITIONS

+"Font Software" refers to the set of files released by the Copyright

+Holder(s) under this license and clearly marked as such. This may

+include source files, build scripts and documentation.

+

+"Reserved Font Name" refers to any names specified as such after the

+copyright statement(s).

+

+"Original Version" refers to the collection of Font Software components as

+distributed by the Copyright Holder(s).

+

+"Modified Version" refers to any derivative made by adding to, deleting,

+or substituting -- in part or in whole -- any of the components of the

+Original Version, by changing formats or by porting the Font Software to a

+new environment.

+

+"Author" refers to any designer, engineer, programmer, technical

+writer or other person who contributed to the Font Software.

+

+PERMISSION & CONDITIONS

+Permission is hereby granted, free of charge, to any person obtaining

+a copy of the Font Software, to use, study, copy, merge, embed, modify,

+redistribute, and sell modified and unmodified copies of the Font

+Software, subject to the following conditions:

+

+1) Neither the Font Software nor any of its individual components,

+in Original or Modified Versions, may be sold by itself.

+

+2) Original or Modified Versions of the Font Software may be bundled,

+redistributed and/or sold with any software, provided that each copy

+contains the above copyright notice and this license. These can be

+included either as stand-alone text files, human-readable headers or

+in the appropriate machine-readable metadata fields within text or

+binary files as long as those fields can be easily viewed by the user.

+

+3) No Modified Version of the Font Software may use the Reserved Font

+Name(s) unless explicit written permission is granted by the corresponding

+Copyright Holder. This restriction only applies to the primary font name as

+presented to the users.

+

+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font

+Software shall not be used to promote, endorse or advertise any

+Modified Version, except to acknowledge the contribution(s) of the

+Copyright Holder(s) and the Author(s) or with their explicit written

+permission.

+

+5) The Font Software, modified or unmodified, in part or in whole,

+must be distributed entirely under this license, and must not be

+distributed under any other license. The requirement for fonts to

+remain under this license does not apply to any document created

+using the Font Software.

+

+TERMINATION

+This license becomes null and void if any of the above conditions are

+not met.

+

+DISCLAIMER

+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF

+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT

+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE

+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,

+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL

+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM

+OTHER DEALINGS IN THE FONT SOFTWARE.

diff --git a/flutter_gallery_assets/lib/fonts/merriweather/README.md b/flutter_gallery_assets/lib/fonts/merriweather/README.md
new file mode 100644
index 0000000..783790f
--- /dev/null
+++ b/flutter_gallery_assets/lib/fonts/merriweather/README.md
@@ -0,0 +1,3 @@
+Flutter Gallery, Fortnightly Demo Assets
+
+The Merriweather font was downloaded from https://fonts.google.com/specimen/Merriweather
diff --git a/flutter_gallery_assets/lib/fonts/private/gallery_icons/GalleryIcons.ttf b/flutter_gallery_assets/lib/fonts/private/gallery_icons/GalleryIcons.ttf
index 53c5d2d..549ba8c 100644
--- a/flutter_gallery_assets/lib/fonts/private/gallery_icons/GalleryIcons.ttf
+++ b/flutter_gallery_assets/lib/fonts/private/gallery_icons/GalleryIcons.ttf
Binary files differ
diff --git a/flutter_gallery_assets/lib/food/fruits.png b/flutter_gallery_assets/lib/food/fruits.png
new file mode 100644
index 0000000..1a47940
--- /dev/null
+++ b/flutter_gallery_assets/lib/food/fruits.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/logos/fortnightly/1.5x/fortnightly_logo.png b/flutter_gallery_assets/lib/logos/fortnightly/1.5x/fortnightly_logo.png
new file mode 100644
index 0000000..e79ffb0
--- /dev/null
+++ b/flutter_gallery_assets/lib/logos/fortnightly/1.5x/fortnightly_logo.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/logos/fortnightly/2.0x/fortnightly_logo.png b/flutter_gallery_assets/lib/logos/fortnightly/2.0x/fortnightly_logo.png
new file mode 100644
index 0000000..4887dcf
--- /dev/null
+++ b/flutter_gallery_assets/lib/logos/fortnightly/2.0x/fortnightly_logo.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/logos/fortnightly/3.0x/fortnightly_logo.png b/flutter_gallery_assets/lib/logos/fortnightly/3.0x/fortnightly_logo.png
new file mode 100644
index 0000000..5c0785a
--- /dev/null
+++ b/flutter_gallery_assets/lib/logos/fortnightly/3.0x/fortnightly_logo.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/logos/fortnightly/fortnightly_logo.png b/flutter_gallery_assets/lib/logos/fortnightly/fortnightly_logo.png
new file mode 100644
index 0000000..634ba94
--- /dev/null
+++ b/flutter_gallery_assets/lib/logos/fortnightly/fortnightly_logo.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/ic_documentation.png b/flutter_gallery_assets/lib/welcome/ic_documentation.png
new file mode 100644
index 0000000..e5a3001
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/ic_documentation.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_documentation.png b/flutter_gallery_assets/lib/welcome/welcome_documentation.png
new file mode 100644
index 0000000..10a1a68
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_documentation.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_documentation_focus.png b/flutter_gallery_assets/lib/welcome/welcome_documentation_focus.png
new file mode 100644
index 0000000..785edd4
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_documentation_focus.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_explore_flutter.png b/flutter_gallery_assets/lib/welcome/welcome_explore_flutter.png
new file mode 100644
index 0000000..d2806bc
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_explore_flutter.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_flutter_logo.png b/flutter_gallery_assets/lib/welcome/welcome_flutter_logo.png
new file mode 100644
index 0000000..5f9c048
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_flutter_logo.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_hello.png b/flutter_gallery_assets/lib/welcome/welcome_hello.png
new file mode 100644
index 0000000..bc9ccc2
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_hello.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_playground.png b/flutter_gallery_assets/lib/welcome/welcome_playground.png
new file mode 100644
index 0000000..e84b774
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_playground.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_pop_1.png b/flutter_gallery_assets/lib/welcome/welcome_pop_1.png
new file mode 100644
index 0000000..5865c81
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_pop_1.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_pop_2.png b/flutter_gallery_assets/lib/welcome/welcome_pop_2.png
new file mode 100644
index 0000000..ec1d1b9
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_pop_2.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_pop_3.png b/flutter_gallery_assets/lib/welcome/welcome_pop_3.png
new file mode 100644
index 0000000..aefdab7
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_pop_3.png
Binary files differ
diff --git a/flutter_gallery_assets/lib/welcome/welcome_pop_4.png b/flutter_gallery_assets/lib/welcome/welcome_pop_4.png
new file mode 100644
index 0000000..2549715
--- /dev/null
+++ b/flutter_gallery_assets/lib/welcome/welcome_pop_4.png
Binary files differ
diff --git a/flutter_gallery_assets/pubspec.yaml b/flutter_gallery_assets/pubspec.yaml
index b71f622..722891d 100644
--- a/flutter_gallery_assets/pubspec.yaml
+++ b/flutter_gallery_assets/pubspec.yaml
@@ -1,9 +1,9 @@
 name: flutter_gallery_assets
 description: Images and fonts for the Flutter gallery demo
-version: 0.1.6
+version: 0.1.8
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: http://flutter.io
 environment:
   sdk: '>=1.19.0 <3.0.0'
   flutter: '>=0.1.0 <2.0.0'
-  
+
diff --git a/package_resolver/.travis.yml b/package_resolver/.travis.yml
index 8f4447d..781f46d 100644
--- a/package_resolver/.travis.yml
+++ b/package_resolver/.travis.yml
@@ -2,16 +2,13 @@
 
 dart:
   - dev
+  - stable
+
 dart_task:
   - test: --platform vm
   - test: --platform firefox
-
-matrix:
-  include:
-    - dart: dev
-      dart_task: dartfmt
-    - dart: dev
-      dart_task: dartanalyzer
+  - dartfmt
+  - dartanalyzer: --fatal-infos --fatal-warnings .
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/package_resolver/BUILD.gn b/package_resolver/BUILD.gn
index 7feec91..e4cb6f3 100644
--- a/package_resolver/BUILD.gn
+++ b/package_resolver/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for package_resolver-1.0.6
+# This file is generated by importer.py for package_resolver-1.0.10
 
 import("//build/dart/dart_library.gni")
 
diff --git a/package_resolver/CHANGELOG.md b/package_resolver/CHANGELOG.md
index 2707d20..b65db46 100644
--- a/package_resolver/CHANGELOG.md
+++ b/package_resolver/CHANGELOG.md
@@ -1,10 +1,29 @@
+## 1.0.10
+
+* Use conditional imports to avoid `dart:isolate` imports on the web.
+* Bump minimum SDK to `2.1.0`.
+
+## 1.0.9
+
+* Identical to `1.0.6` - republishing with a higher version number to get around
+  issues with conditional `dart:isolate` imports on the version of
+  `build_modules` which is compatible with the `2.0.0` SDK.
+
+## 1.0.8
+
+* Fix issue on Dart `2.0.0`.
+
+## 1.0.7
+
+* Use conditional imports to avoid `dart:isolate` imports on the web.
+
 ## 1.0.6
 
 * Support package:http version `0.12.x`.
 
 ## 1.0.5
 
-* Use conditional imports to avoid dart:io imports on the web.
+* Use conditional imports to avoid `dart:io` imports on the web.
 
 ## 1.0.4
 
diff --git a/package_resolver/lib/src/async_package_resolver.dart b/package_resolver/lib/src/async_package_resolver.dart
index 06c61e7..ef75081 100644
--- a/package_resolver/lib/src/async_package_resolver.dart
+++ b/package_resolver/lib/src/async_package_resolver.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_resolver.dart';
 import 'sync_package_resolver.dart';
 
diff --git a/package_resolver/lib/src/current_isolate_resolver.dart b/package_resolver/lib/src/current_isolate_resolver.dart
index 22d9fbf..1244b5c 100644
--- a/package_resolver/lib/src/current_isolate_resolver.dart
+++ b/package_resolver/lib/src/current_isolate_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:isolate';
 
 import 'package:path/path.dart' as p;
@@ -14,7 +13,9 @@
 import 'utils.dart';
 
 /// The package resolution strategy used by the current isolate.
-class CurrentIsolateResolver implements PackageResolver {
+PackageResolver currentIsolateResolver() => _CurrentIsolateResolver();
+
+class _CurrentIsolateResolver implements PackageResolver {
   Future<Map<String, Uri>> get packageConfigMap async {
     if (_packageConfigMap != null) return _packageConfigMap;
 
@@ -28,6 +29,7 @@
 
   Future<Uri> get packageConfigUri => Isolate.packageConfig;
 
+  // ignore: deprecated_member_use
   Future<Uri> get packageRoot => Isolate.packageRoot;
 
   Future<SyncPackageResolver> get asSync async {
diff --git a/package_resolver/lib/src/current_isolate_resolver_stub.dart b/package_resolver/lib/src/current_isolate_resolver_stub.dart
new file mode 100644
index 0000000..110701d
--- /dev/null
+++ b/package_resolver/lib/src/current_isolate_resolver_stub.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for 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_resolver.dart';
+
+PackageResolver currentIsolateResolver() =>
+    throw UnsupportedError('No current isolate support on this platform');
diff --git a/package_resolver/lib/src/package_resolver.dart b/package_resolver/lib/src/package_resolver.dart
index c72fc9d..d53d761 100644
--- a/package_resolver/lib/src/package_resolver.dart
+++ b/package_resolver/lib/src/package_resolver.dart
@@ -2,15 +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.
 
-import 'dart:async';
-
 import 'package:http/http.dart' as http;
 
-import 'current_isolate_resolver.dart';
 import 'package_config_resolver.dart';
 import 'package_root_resolver.dart';
 import 'sync_package_resolver.dart';
 
+// ignore: uri_does_not_exist
+import 'current_isolate_resolver_stub.dart'
+    // ignore: uri_does_not_exist
+    if (dart.library.isolate) 'current_isolate_resolver.dart' as isolate;
+
 /// A class that defines how to resolve `package:` URIs.
 ///
 /// This includes the information necessary to resolve `package:` URIs using
@@ -81,7 +83,7 @@
 
   /// Returns package resolution strategy describing how the current isolate
   /// resolves `package:` URIs.
-  static final PackageResolver current = new CurrentIsolateResolver();
+  static final PackageResolver current = isolate.currentIsolateResolver();
 
   /// Returns a package resolution strategy that is unable to resolve any
   /// `package:` URIs.
diff --git a/package_resolver/lib/src/sync_package_resolver.dart b/package_resolver/lib/src/sync_package_resolver.dart
index daaf46c..5cb4c99 100644
--- a/package_resolver/lib/src/sync_package_resolver.dart
+++ b/package_resolver/lib/src/sync_package_resolver.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:http/http.dart' as http;
 
 import 'no_package_resolver.dart';
diff --git a/package_resolver/lib/src/utils.dart b/package_resolver/lib/src/utils.dart
index 5e4b411..b588c54 100644
--- a/package_resolver/lib/src/utils.dart
+++ b/package_resolver/lib/src/utils.dart
@@ -2,19 +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.
 
-// TODO(nweiz): Avoid importing dart:io directly when cross-platform libraries
-// exist.
-import 'dart:async';
 import 'dart:convert';
-import 'dart:isolate';
 
 import 'package:http/http.dart' as http;
 import 'package:package_config/packages_file.dart' as packages_file;
 
 // ignore: uri_does_not_exist
-import 'utils_stub.dart'
+import 'utils_io_stub.dart'
     // ignore: uri_does_not_exist
-    if (dart.library.io) 'utils_io.dart' as conditional;
+    if (dart.library.io) 'utils_io.dart' as io;
+// ignore: uri_does_not_exist
+import 'utils_isolate_stub.dart'
+    // ignore: uri_does_not_exist
+    if (dart.library.isolate) 'utils_isolate.dart' as isolate;
 
 /// Loads the configuration map from [uri].
 ///
@@ -28,11 +28,11 @@
   if (resolved.scheme == 'http') {
     text = await (client == null ? http.read(resolved) : client.read(resolved));
   } else if (resolved.scheme == 'file') {
-    text = await conditional.readFileAsString(resolved);
+    text = await io.readFileAsString(resolved);
   } else if (resolved.scheme == 'data') {
     text = resolved.data.contentAsString();
   } else if (resolved.scheme == 'package') {
-    return loadConfigMap(await Isolate.resolvePackageUri(uri), client: client);
+    return loadConfigMap(await isolate.resolvePackageUri(uri), client: client);
   } else {
     throw new UnsupportedError(
         'PackageInfo.loadConfig doesn\'t support URI scheme "${uri.scheme}:".');
@@ -83,4 +83,4 @@
 }
 
 String packagePathForRoot(String package, Uri root) =>
-    conditional.packagePathForRoot(package, root);
+    io.packagePathForRoot(package, root);
diff --git a/package_resolver/lib/src/utils_io.dart b/package_resolver/lib/src/utils_io.dart
index 8959f4d..df768e6 100644
--- a/package_resolver/lib/src/utils_io.dart
+++ b/package_resolver/lib/src/utils_io.dart
@@ -2,14 +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.
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
 
-Future<String> readFileAsString(Uri uri) async {
+Future<String> readFileAsString(Uri uri) {
   var path = uri.toFilePath(windows: Platform.isWindows);
-  return await new File(path).readAsString();
+  return new File(path).readAsString();
 }
 
 String packagePathForRoot(String package, Uri root) {
diff --git a/package_resolver/lib/src/utils_io_stub.dart b/package_resolver/lib/src/utils_io_stub.dart
new file mode 100644
index 0000000..7683079
--- /dev/null
+++ b/package_resolver/lib/src/utils_io_stub.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+Future<String> readFileAsString(Uri uri) => throw UnsupportedError(
+    'Reading files is only supported where dart:io is available.');
+
+String packagePathForRoot(String package, Uri root) => throw UnsupportedError(
+    'Computing package paths from a root is only supported where dart:io is '
+    'available.');
diff --git a/package_resolver/lib/src/utils_isolate.dart b/package_resolver/lib/src/utils_isolate.dart
new file mode 100644
index 0000000..a58c4db
--- /dev/null
+++ b/package_resolver/lib/src/utils_isolate.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+Future<Uri> resolvePackageUri(Uri packageUri) =>
+    Isolate.resolvePackageUri(packageUri);
diff --git a/package_resolver/lib/src/utils_isolate_stub.dart b/package_resolver/lib/src/utils_isolate_stub.dart
new file mode 100644
index 0000000..4639b97
--- /dev/null
+++ b/package_resolver/lib/src/utils_isolate_stub.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+Future<Uri> resolvePackageUri(Uri packageUri) =>
+    throw UnsupportedError('May not use a package URI');
diff --git a/package_resolver/lib/src/utils_stub.dart b/package_resolver/lib/src/utils_stub.dart
index cefa097..7683079 100644
--- a/package_resolver/lib/src/utils_stub.dart
+++ b/package_resolver/lib/src/utils_stub.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';
-
 Future<String> readFileAsString(Uri uri) => throw UnsupportedError(
     'Reading files is only supported where dart:io is available.');
 
diff --git a/package_resolver/pubspec.yaml b/package_resolver/pubspec.yaml
index 35d42c6..344aac8 100644
--- a/package_resolver/pubspec.yaml
+++ b/package_resolver/pubspec.yaml
@@ -1,12 +1,12 @@
 name: package_resolver
-version: 1.0.6
+version: 1.0.10
 
 description: First-class package resolution strategy classes.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/package_resolver
 
 environment:
-  sdk: '>=2.0.0-dev.37.0 <3.0.0'
+  sdk: '>=2.1.0 <3.0.0'
 
 dependencies:
   collection: ^1.9.0
diff --git a/protobuf/BUILD.gn b/protobuf/BUILD.gn
index 2def32f..70afc57 100644
--- a/protobuf/BUILD.gn
+++ b/protobuf/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for protobuf-0.13.3
+# This file is generated by importer.py for protobuf-0.13.4
 
 import("//build/dart/dart_library.gni")
 
diff --git a/protobuf/CHANGELOG.md b/protobuf/CHANGELOG.md
index 34752a5..ffba15a 100644
--- a/protobuf/CHANGELOG.md
+++ b/protobuf/CHANGELOG.md
@@ -1,10 +1,17 @@
+## 0.13.4
+
+* Add new method `pc` on BuilderInfo for adding repeated composite fields and remove redundant type check on items added
+  to a PbList.
+
+  Deprecated `BuilderInfo.pp` and `PbList.forFieldType`.
+
 ## 0.13.3
 
 * Fix issue with parsing map field entries. The values for two different keys would sometimes be
   merged.
   
 * Deprecated `PBMap.add`.
-  
+
 ## 0.13.2
 
 * Include extension fields in GeneratedMessage.toString().
diff --git a/protobuf/lib/src/protobuf/builder_info.dart b/protobuf/lib/src/protobuf/builder_info.dart
index c63c2b1..d626c16 100644
--- a/protobuf/lib/src/protobuf/builder_info.dart
+++ b/protobuf/lib/src/protobuf/builder_info.dart
@@ -113,13 +113,24 @@
   }
 
   // Repeated message, group, or enum.
+  void pc<T>(int tagNumber, String name, int fieldType,
+      [CreateBuilderFunc subBuilder,
+      ValueOfFunc valueOf,
+      List<ProtobufEnum> enumValues]) {
+    assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType));
+    addRepeated<T>(tagNumber, name, fieldType, _checkNotNull, subBuilder,
+        valueOf, enumValues);
+  }
+
+  @Deprecated('Use [pc] instead. The given [check] function is ignored.'
+      'This function will be removed in the next major version.')
   void pp<T>(int tagNumber, String name, int fieldType, CheckFunc<T> check,
       [CreateBuilderFunc subBuilder,
       ValueOfFunc valueOf,
       List<ProtobufEnum> enumValues]) {
     assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType));
-    addRepeated<T>(
-        tagNumber, name, fieldType, check, subBuilder, valueOf, enumValues);
+    addRepeated<T>(tagNumber, name, fieldType, _checkNotNull, subBuilder,
+        valueOf, enumValues);
   }
 
   // oneof declarations.
diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart
index b6f4020..e555220 100644
--- a/protobuf/lib/src/protobuf/coded_buffer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer.dart
@@ -30,27 +30,6 @@
     _FieldSet fs, CodedBufferReader input, ExtensionRegistry registry) {
   assert(registry != null);
 
-  void readPackableToList(int wireType, FieldInfo fi, Function readToList) {
-    List list = fs._ensureRepeatedField(fi);
-
-    if (wireType == WIRETYPE_LENGTH_DELIMITED) {
-      // Packed.
-      input._withLimit(input.readInt32(), () {
-        while (!input.isAtEnd()) {
-          readToList(list);
-        }
-      });
-    } else {
-      // Not packed.
-      readToList(list);
-    }
-  }
-
-  void readPackable(int wireType, FieldInfo fi, Function readFunc) {
-    void readToList(List list) => list.add(readFunc());
-    readPackableToList(wireType, fi, readToList);
-  }
-
   while (true) {
     int tag = input.readTag();
     if (tag == 0) return;
@@ -149,7 +128,7 @@
         fs._setFieldUnchecked(fi, subMessage);
         break;
       case PbFieldType._REPEATED_BOOL:
-        readPackable(wireType, fi, input.readBool);
+        _readPackable(fs, input, wireType, fi, input.readBool);
         break;
       case PbFieldType._REPEATED_BYTES:
         fs._ensureRepeatedField(fi).add(input.readBytes());
@@ -158,22 +137,13 @@
         fs._ensureRepeatedField(fi).add(input.readString());
         break;
       case PbFieldType._REPEATED_FLOAT:
-        readPackable(wireType, fi, input.readFloat);
+        _readPackable(fs, input, wireType, fi, input.readFloat);
         break;
       case PbFieldType._REPEATED_DOUBLE:
-        readPackable(wireType, fi, input.readDouble);
+        _readPackable(fs, input, wireType, fi, input.readDouble);
         break;
       case PbFieldType._REPEATED_ENUM:
-        readPackableToList(wireType, fi, (List list) {
-          int rawValue = input.readEnum();
-          var value = fs._meta._decodeEnum(tagNumber, registry, rawValue);
-          if (value == null) {
-            var unknown = fs._ensureUnknownFields();
-            unknown.mergeVarintField(tagNumber, new Int64(rawValue));
-          } else {
-            list.add(value);
-          }
-        });
+        _readPackableToListEnum(fs, input, wireType, fi, tagNumber, registry);
         break;
       case PbFieldType._REPEATED_GROUP:
         GeneratedMessage subMessage =
@@ -182,34 +152,34 @@
         fs._ensureRepeatedField(fi).add(subMessage);
         break;
       case PbFieldType._REPEATED_INT32:
-        readPackable(wireType, fi, input.readInt32);
+        _readPackable(fs, input, wireType, fi, input.readInt32);
         break;
       case PbFieldType._REPEATED_INT64:
-        readPackable(wireType, fi, input.readInt64);
+        _readPackable(fs, input, wireType, fi, input.readInt64);
         break;
       case PbFieldType._REPEATED_SINT32:
-        readPackable(wireType, fi, input.readSint32);
+        _readPackable(fs, input, wireType, fi, input.readSint32);
         break;
       case PbFieldType._REPEATED_SINT64:
-        readPackable(wireType, fi, input.readSint64);
+        _readPackable(fs, input, wireType, fi, input.readSint64);
         break;
       case PbFieldType._REPEATED_UINT32:
-        readPackable(wireType, fi, input.readUint32);
+        _readPackable(fs, input, wireType, fi, input.readUint32);
         break;
       case PbFieldType._REPEATED_UINT64:
-        readPackable(wireType, fi, input.readUint64);
+        _readPackable(fs, input, wireType, fi, input.readUint64);
         break;
       case PbFieldType._REPEATED_FIXED32:
-        readPackable(wireType, fi, input.readFixed32);
+        _readPackable(fs, input, wireType, fi, input.readFixed32);
         break;
       case PbFieldType._REPEATED_FIXED64:
-        readPackable(wireType, fi, input.readFixed64);
+        _readPackable(fs, input, wireType, fi, input.readFixed64);
         break;
       case PbFieldType._REPEATED_SFIXED32:
-        readPackable(wireType, fi, input.readSfixed32);
+        _readPackable(fs, input, wireType, fi, input.readSfixed32);
         break;
       case PbFieldType._REPEATED_SFIXED64:
-        readPackable(wireType, fi, input.readSfixed64);
+        _readPackable(fs, input, wireType, fi, input.readSfixed64);
         break;
       case PbFieldType._REPEATED_MESSAGE:
         GeneratedMessage subMessage =
@@ -225,3 +195,42 @@
     }
   }
 }
+
+void _readPackable(_FieldSet fs, CodedBufferReader input, int wireType,
+    FieldInfo fi, Function readFunc) {
+  void readToList(List list) => list.add(readFunc());
+  _readPackableToList(fs, input, wireType, fi, readToList);
+}
+
+void _readPackableToListEnum(_FieldSet fs, CodedBufferReader input,
+    int wireType, FieldInfo fi, int tagNumber, ExtensionRegistry registry) {
+  void readToList(List list) {
+    int rawValue = input.readEnum();
+    var value = fs._meta._decodeEnum(tagNumber, registry, rawValue);
+    if (value == null) {
+      var unknown = fs._ensureUnknownFields();
+      unknown.mergeVarintField(tagNumber, new Int64(rawValue));
+    } else {
+      list.add(value);
+    }
+  }
+
+  _readPackableToList(fs, input, wireType, fi, readToList);
+}
+
+void _readPackableToList(_FieldSet fs, CodedBufferReader input, int wireType,
+    FieldInfo fi, Function readToList) {
+  List list = fs._ensureRepeatedField(fi);
+
+  if (wireType == WIRETYPE_LENGTH_DELIMITED) {
+    // Packed.
+    input._withLimit(input.readInt32(), () {
+      while (!input.isAtEnd()) {
+        readToList(list);
+      }
+    });
+  } else {
+    // Not packed.
+    readToList(list);
+  }
+}
diff --git a/protobuf/lib/src/protobuf/coded_buffer_reader.dart b/protobuf/lib/src/protobuf/coded_buffer_reader.dart
index bab15f6..79e02be 100644
--- a/protobuf/lib/src/protobuf/coded_buffer_reader.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer_reader.dart
@@ -106,7 +106,7 @@
   }
 
   int readEnum() => readInt32();
-  int readInt32() => _readRawVarint32();
+  int readInt32() => _readRawVarint32(true);
   Int64 readInt64() => _readRawVarint64();
   int readUint32() => _readRawVarint32(false);
   Int64 readUint64() => _readRawVarint64();
@@ -121,7 +121,7 @@
     return new Int64.fromBytes(view);
   }
 
-  bool readBool() => _readRawVarint32() != 0;
+  bool readBool() => _readRawVarint32(true) != 0;
   List<int> readBytes() {
     int length = readInt32();
     _checkLimit(length);
@@ -164,19 +164,24 @@
     return _buffer[_bufferPos - 1];
   }
 
-  int _readRawVarint32([bool signed = true]) {
+  int _readRawVarint32(bool signed) {
     // Read up to 10 bytes.
-    int bytes = _currentLimit - _bufferPos;
+    // We use a local [bufferPos] variable to avoid repeatedly loading/store the
+    // this._bufferpos field.
+    int bufferPos = _bufferPos;
+    int bytes = _currentLimit - bufferPos;
     if (bytes > 10) bytes = 10;
     int result = 0;
     for (int i = 0; i < bytes; i++) {
-      int byte = _buffer[_bufferPos++];
+      int byte = _buffer[bufferPos++];
       result |= (byte & 0x7f) << (i * 7);
       if ((byte & 0x80) == 0) {
         result &= 0xffffffff;
+        _bufferPos = bufferPos;
         return signed ? result - 2 * (0x80000000 & result) : result;
       }
     }
+    _bufferPos = bufferPos;
     throw new InvalidProtocolBufferException.malformedVarint();
   }
 
diff --git a/protobuf/lib/src/protobuf/field_error.dart b/protobuf/lib/src/protobuf/field_error.dart
index 7644653..0a84df7 100644
--- a/protobuf/lib/src/protobuf/field_error.dart
+++ b/protobuf/lib/src/protobuf/field_error.dart
@@ -73,29 +73,17 @@
 
 /// Returns a function for validating items in a repeated field.
 ///
-/// For enum, group, and message fields, the check is only approximate,
-/// because the exact type isn't included in [fieldType].
+/// For most types this is a not-null check, except for floats, and signed and
+/// unsigned 32 bit ints where there also is a range check.
 CheckFunc getCheckFunction(int fieldType) {
   switch (fieldType & ~0x7) {
     case PbFieldType._BOOL_BIT:
-      return _checkBool;
     case PbFieldType._BYTES_BIT:
-      return _checkBytes;
     case PbFieldType._STRING_BIT:
-      return _checkString;
-    case PbFieldType._FLOAT_BIT:
-      return _checkFloat;
     case PbFieldType._DOUBLE_BIT:
-      return _checkDouble;
-
-    case PbFieldType._INT32_BIT:
-    case PbFieldType._SINT32_BIT:
-    case PbFieldType._SFIXED32_BIT:
-      return _checkSigned32;
-
-    case PbFieldType._UINT32_BIT:
-    case PbFieldType._FIXED32_BIT:
-      return _checkUnsigned32;
+    case PbFieldType._ENUM_BIT:
+    case PbFieldType._GROUP_BIT:
+    case PbFieldType._MESSAGE_BIT:
 
     case PbFieldType._INT64_BIT:
     case PbFieldType._SINT64_BIT:
@@ -105,13 +93,19 @@
       // We always use the full range of the same Dart type.
       // It's up to the caller to treat the Int64 as signed or unsigned.
       // See: https://github.com/dart-lang/protobuf/issues/44
-      return _checkAnyInt64;
+      return _checkNotNull;
 
-    case PbFieldType._ENUM_BIT:
-      return _checkAnyEnum;
-    case PbFieldType._GROUP_BIT:
-    case PbFieldType._MESSAGE_BIT:
-      return _checkAnyMessage;
+    case PbFieldType._FLOAT_BIT:
+      return _checkFloat;
+
+    case PbFieldType._INT32_BIT:
+    case PbFieldType._SINT32_BIT:
+    case PbFieldType._SFIXED32_BIT:
+      return _checkSigned32;
+
+    case PbFieldType._UINT32_BIT:
+    case PbFieldType._FIXED32_BIT:
+      return _checkUnsigned32;
   }
   throw new ArgumentError('check function not implemented: ${fieldType}');
 }
@@ -124,60 +118,20 @@
   }
 }
 
-void _checkBool(Object val) {
-  if (val is! bool) throw _createFieldTypeError(val, 'a bool');
-}
-
-void _checkBytes(Object val) {
-  if (val is! List<int>) throw _createFieldTypeError(val, 'a List<int>');
-}
-
-void _checkString(Object val) {
-  if (val is! String) throw _createFieldTypeError(val, 'a String');
-}
-
 void _checkFloat(Object val) {
-  _checkDouble(val);
   if (!_isFloat32(val)) throw _createFieldRangeError(val, 'a float');
 }
 
-void _checkDouble(Object val) {
-  if (val is! double) throw _createFieldTypeError(val, 'a double');
-}
-
-void _checkInt(Object val) {
-  if (val is! int) throw _createFieldTypeError(val, 'an int');
-}
-
 void _checkSigned32(Object val) {
-  _checkInt(val);
   if (!_isSigned32(val)) throw _createFieldRangeError(val, 'a signed int32');
 }
 
 void _checkUnsigned32(Object val) {
-  _checkInt(val);
   if (!_isUnsigned32(val)) {
     throw _createFieldRangeError(val, 'an unsigned int32');
   }
 }
 
-void _checkAnyInt64(Object val) {
-  if (val is! Int64) throw _createFieldTypeError(val, 'an Int64');
-}
-
-void _checkAnyEnum(Object val) {
-  if (val is! ProtobufEnum) throw _createFieldTypeError(val, 'a ProtobufEnum');
-}
-
-void _checkAnyMessage(Object val) {
-  if (val is! GeneratedMessage) {
-    throw _createFieldTypeError(val, 'a GeneratedMessage');
-  }
-}
-
-ArgumentError _createFieldTypeError(val, String wantedType) =>
-    new ArgumentError('Value ($val) is not ${wantedType}');
-
 RangeError _createFieldRangeError(val, String wantedType) =>
     new RangeError('Value ($val) is not ${wantedType}');
 
diff --git a/protobuf/lib/src/protobuf/field_type.dart b/protobuf/lib/src/protobuf/field_type.dart
index 4705895..b1f6485 100644
--- a/protobuf/lib/src/protobuf/field_type.dart
+++ b/protobuf/lib/src/protobuf/field_type.dart
@@ -67,7 +67,7 @@
 
   // Closures commonly used by initializers.
   static String _STRING_EMPTY() => '';
-  static List<int> _BYTES_EMPTY() => new PbList<int>(check: _checkInt);
+  static List<int> _BYTES_EMPTY() => <int>[];
   static bool _BOOL_FALSE() => false;
   static int _INT_ZERO() => 0;
   static double _DOUBLE_ZERO() => 0.0;
diff --git a/protobuf/lib/src/protobuf/pb_list.dart b/protobuf/lib/src/protobuf/pb_list.dart
index 7c2c1c3..e8a23e4 100644
--- a/protobuf/lib/src/protobuf/pb_list.dart
+++ b/protobuf/lib/src/protobuf/pb_list.dart
@@ -48,6 +48,8 @@
 
   PbList.from(List from) : super._from(from);
 
+  @Deprecated('Instead use the default constructor with a check function.'
+      'This constructor will be removed in the next major version.')
   PbList.forFieldType(int fieldType)
       : super._noList(check: getCheckFunction(fieldType));
 
@@ -57,7 +59,7 @@
   /// Adds [value] at the end of the list, extending the length by one.
   /// Throws an [UnsupportedError] if the list is not extendable.
   void add(E value) {
-    _validate(value);
+    check(value);
     _wrappedList.add(value);
   }
 
@@ -65,7 +67,7 @@
   /// Extends the length of the list by the length of [collection].
   /// Throws an [UnsupportedError] if the list is not extendable.
   void addAll(Iterable<E> collection) {
-    collection.forEach(_validate);
+    collection.forEach(check);
     _wrappedList.addAll(collection);
   }
 
@@ -85,7 +87,7 @@
   /// Inserts a new element in the list.
   /// The element must be valid (and not nullable) for the PbList type.
   void insert(int index, E element) {
-    _validate(element);
+    check(element);
     _wrappedList.insert(index, element);
   }
 
@@ -93,7 +95,7 @@
   ///
   /// Elements in [iterable] must be valid and not nullable for the PbList type.
   void insertAll(int index, Iterable<E> iterable) {
-    iterable.forEach(_validate);
+    iterable.forEach(check);
     _wrappedList.insertAll(index, iterable);
   }
 
@@ -102,7 +104,7 @@
   ///
   /// Elements in [iterable] must be valid and not nullable for the PbList type.
   void setAll(int index, Iterable<E> iterable) {
-    iterable.forEach(_validate);
+    iterable.forEach(check);
     _wrappedList.setAll(index, iterable);
   }
 
@@ -127,7 +129,7 @@
   void setRange(int start, int end, Iterable<E> from, [int skipCount = 0]) {
     // NOTE: In case `take()` returns less than `end - start` elements, the
     // _wrappedList will fail with a `StateError`.
-    from.skip(skipCount).take(end - start).forEach(_validate);
+    from.skip(skipCount).take(end - start).forEach(check);
     _wrappedList.setRange(start, end, from, skipCount);
   }
 
@@ -137,7 +139,7 @@
   /// Sets the objects in the range [start] inclusive to [end] exclusive to the
   /// given [fillValue].
   void fillRange(int start, int end, [E fillValue]) {
-    _validate(fillValue);
+    check(fillValue);
     _wrappedList.fillRange(start, end, fillValue);
   }
 
@@ -145,7 +147,7 @@
   /// inserts the contents of [replacement] in its place.
   void replaceRange(int start, int end, Iterable<E> replacement) {
     final values = replacement.toList();
-    replacement.forEach(_validate);
+    replacement.forEach(check);
     _wrappedList.replaceRange(start, end, values);
   }
 }
@@ -308,7 +310,7 @@
   /// Throws an [IndexOutOfRangeException] if [index] is out of bounds.
   @override
   void operator []=(int index, E value) {
-    _validate(value);
+    check(value);
     _wrappedList[index] = value;
   }
 
@@ -323,12 +325,4 @@
     }
     _wrappedList.length = newLength;
   }
-
-  void _validate(E val) {
-    check(val);
-    // TODO: remove after migration to check functions is finished
-    if (val is! E) {
-      throw new ArgumentError('Value ($val) is not of the correct type');
-    }
-  }
 }
diff --git a/protobuf/lib/src/protobuf/readonly_message.dart b/protobuf/lib/src/protobuf/readonly_message.dart
index d7e7428..c096f7c 100644
--- a/protobuf/lib/src/protobuf/readonly_message.dart
+++ b/protobuf/lib/src/protobuf/readonly_message.dart
@@ -49,7 +49,7 @@
   void setExtension(Extension extension, var value) =>
       _readonly("setExtension");
 
-  void setField(int tagNumber, var value, [int fieldType = null]) =>
+  void setField(int tagNumber, var value, [int fieldType]) =>
       _readonly("setField");
 
   void _readonly(String methodName) {
diff --git a/protobuf/pubspec.yaml b/protobuf/pubspec.yaml
index c53dbc9..856e999 100644
--- a/protobuf/pubspec.yaml
+++ b/protobuf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protobuf
-version: 0.13.3
+version: 0.13.4
 author: Dart Team <misc@dartlang.org>
 description: >
   Runtime library for protocol buffers support.
diff --git a/source_span/BUILD.gn b/source_span/BUILD.gn
index 48b2cce..c298a1c 100644
--- a/source_span/BUILD.gn
+++ b/source_span/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for source_span-1.5.4
+# This file is generated by importer.py for source_span-1.5.5
 
 import("//build/dart/dart_library.gni")
 
diff --git a/source_span/CHANGELOG.md b/source_span/CHANGELOG.md
index a07a0e6..ddb4ff0 100644
--- a/source_span/CHANGELOG.md
+++ b/source_span/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.5.5
+
+* Fix a bug where `FileSpan.highlight()` would crash for spans that covered a
+  trailing newline and a single additional empty line.
+
 # 1.5.4
 
 * `FileSpan.highlight()` now properly highlights point spans at the beginning of
diff --git a/source_span/lib/src/highlighter.dart b/source_span/lib/src/highlighter.dart
index 8a928b3..17a47bc 100644
--- a/source_span/lib/src/highlighter.dart
+++ b/source_span/lib/src/highlighter.dart
@@ -117,6 +117,10 @@
       SourceSpanWithContext span) {
     if (!span.context.endsWith("\n")) return span;
 
+    // If there's a full blank line on the end of [span.context], it's probably
+    // significant, so we shouldn't trim it.
+    if (span.text.endsWith("\n\n")) return span;
+
     var context = span.context.substring(0, span.context.length - 1);
     var text = span.text;
     var start = span.start;
@@ -156,9 +160,13 @@
     if (text.isEmpty) return 0;
 
     // The "- 1" here avoids counting the newline itself.
-    return text.codeUnitAt(text.length - 1) == $lf
-        ? text.length - text.lastIndexOf("\n", text.length - 2) - 1
-        : text.length - text.lastIndexOf("\n") - 1;
+    if (text.codeUnitAt(text.length - 1) == $lf) {
+      return text.length == 1
+          ? 0
+          : text.length - text.lastIndexOf("\n", text.length - 2) - 1;
+    } else {
+      return text.length - text.lastIndexOf("\n") - 1;
+    }
   }
 
   /// Returns whether [span]'s text runs all the way to the end of its context.
diff --git a/source_span/pubspec.yaml b/source_span/pubspec.yaml
index a470875..0cb9326 100644
--- a/source_span/pubspec.yaml
+++ b/source_span/pubspec.yaml
@@ -1,5 +1,5 @@
 name: source_span
-version: 1.5.4
+version: 1.5.5
 
 description: A library for identifying source spans and locations.
 author: Dart Team <misc@dartlang.org>