diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 26c1a02..800b6e3 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -33,7 +33,7 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/strong/checker.dart' as checker
-    show isKnownFunction;
+    show hasStrictArrow;
 
 /**
  * A visitor used to traverse an AST structure looking for additional errors and
@@ -2298,7 +2298,9 @@
             return;
           }
         }
-      } else if (expectedReturnType.isDynamic || expectedReturnType.isVoid) {
+      } else if (expectedReturnType.isDynamic ||
+          expectedReturnType.isVoid ||
+          expectedReturnType.isDartCoreNull) {
         return;
       }
       _hasReturnWithoutValue = true;
@@ -2505,7 +2507,6 @@
       DartType actualStaticType,
       DartType expectedStaticType,
       ErrorCode errorCode) {
-    // TODO(leafp): Move the Downcast functionality here.
     if (!_expressionIsAssignableAtType(
         expression, actualStaticType, expectedStaticType)) {
       _errorReporter.reportTypeErrorForNode(
@@ -6234,11 +6235,10 @@
 
   bool _expressionIsAssignableAtType(Expression expression,
       DartType actualStaticType, DartType expectedStaticType) {
-    bool concrete = _options.strongMode && checker.isKnownFunction(expression);
+    bool concrete = _options.strongMode && checker.hasStrictArrow(expression);
     if (concrete && actualStaticType is FunctionType) {
       actualStaticType =
           _typeSystem.functionTypeToConcreteType(actualStaticType);
-      // TODO(leafp): Move the Downcast functionality here.
     }
     return _typeSystem.isAssignableTo(actualStaticType, expectedStaticType);
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 973ef70..56e59c5 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4189,9 +4189,6 @@
     if (_returnStack.isNotEmpty && _inferredReturn.isNotEmpty) {
       DartType context = _returnStack.removeLast() ?? DynamicTypeImpl.instance;
       DartType inferred = _inferredReturn.removeLast();
-      if (inferred.isBottom || inferred.isDartCoreNull) {
-        return;
-      }
 
       if (_typeSystem.isSubtypeOf(inferred, context)) {
         setType(node, inferred);
@@ -4206,7 +4203,7 @@
    */
   void pushReturnContext(BlockFunctionBody node) {
     _returnStack.add(getContext(node));
-    _inferredReturn.add(BottomTypeImpl.instance);
+    _inferredReturn.add(_typeProvider.nullType);
   }
 
   /**
@@ -5217,8 +5214,26 @@
   }
 
   /**
+   * Returns true if this method is `Future.then` or an override thereof.
+   *
+   * If so we will apply special typing rules in strong mode, to handle the
+   * implicit union of `S | Future<S>`
+   */
+  // TODO(leafp): Eliminate this when code is switched to using FutureOr
+  bool isFutureThen(Element element) {
+    // If we are a method named then
+    if (element is MethodElement && element.name == 'then') {
+      DartType type = element.enclosingElement.type;
+      // On Future or a subtype, then we're good.
+      return (type.isDartAsyncFuture || isSubtypeOfFuture(type));
+    }
+    return false;
+  }
+
+  /**
    * Returns true if this type is any subtype of the built in Future type.
    */
+  // TODO(leafp): Eliminate this when code is switched to using FutureOr
   bool isSubtypeOfFuture(DartType type) =>
       typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType);
 
@@ -6059,8 +6074,27 @@
               matchFunctionTypeParameters(node.typeParameters, functionType);
           if (functionType is FunctionType) {
             _inferFormalParameterList(node.parameters, functionType);
-            InferenceContext.setType(
-                node.body, _computeReturnOrYieldType(functionType.returnType));
+            DartType returnType;
+            ParameterElement parameterElement =
+                resolutionMap.staticParameterElementForExpression(node);
+            if (isFutureThen(parameterElement?.enclosingElement)) {
+              var futureThenType =
+                  InferenceContext.getContext(node.parent) as FunctionType;
+
+              // TODO(leafp): Get rid of this once code has been updated to use
+              // FutureOr
+              // Introduce FutureOr<T> for backwards compatibility if it was
+              // missing in old code.
+              if (futureThenType.parameters.isNotEmpty) {
+                if (!futureThenType.parameters[0].type.isDartAsyncFutureOr) {
+                  var typeParamS =
+                      futureThenType.returnType.flattenFutures(typeSystem);
+                  returnType = _createFutureOr(typeParamS);
+                }
+              }
+            }
+            returnType ??= _computeReturnOrYieldType(functionType.returnType);
+            InferenceContext.setType(node.body, returnType);
           }
         }
         super.visitFunctionExpression(node);
@@ -9029,6 +9063,11 @@
   InterfaceType get futureNullType;
 
   /**
+   * Return the type representing 'FutureOr<Null>'.
+   */
+  InterfaceType get futureOrNullType;
+
+  /**
    * Return the type representing the built-in type 'FutureOr'.
    */
   InterfaceType get futureOrType;
@@ -9222,6 +9261,11 @@
   InterfaceType _futureNullType;
 
   /**
+   * The type representing 'FutureOr<Null>'.
+   */
+  InterfaceType _futureOrNullType;
+
+  /**
    * The type representing the built-in type 'FutureOr'.
    */
   InterfaceType _futureOrType;
@@ -9357,6 +9401,9 @@
   InterfaceType get futureNullType => _futureNullType;
 
   @override
+  InterfaceType get futureOrNullType => _futureOrNullType;
+
+  @override
   InterfaceType get futureOrType => _futureOrType;
 
   @override
@@ -9461,6 +9508,7 @@
     _undefinedType = UndefinedTypeImpl.instance;
     _futureDynamicType = _futureType.instantiate(<DartType>[_dynamicType]);
     _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
+    _futureOrNullType = _futureOrType.instantiate(<DartType>[_nullType]);
     _iterableDynamicType = _iterableType.instantiate(<DartType>[_dynamicType]);
     _streamDynamicType = _streamType.instantiate(<DartType>[_dynamicType]);
   }
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index a2aeae1..b0d106c 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -1967,6 +1967,45 @@
           argTypes.add(argumentList.arguments[i].staticType);
         }
       }
+
+      // TODO(leafp): remove this again after code has been updated to
+      // use FutureOr on classes that implement Future
+      // Special case Future<T>.then upwards inference. It has signature:
+      //
+      //     <S>(T -> (S | Future<S>)) -> Future<S>
+      //
+      // Based on the first argument type, we'll pick one of these signatures:
+      //
+      //     <S>(T -> S) -> Future<S>
+      //     <S>(T -> Future<S>) -> Future<S>
+      //
+      // ... and finish the inference using that.
+      if (argTypes.isNotEmpty && _resolver.isFutureThen(fnType.element)) {
+        var firstArgType = argTypes[0];
+        var firstParamType = paramTypes[0];
+        if (firstArgType is FunctionType &&
+            firstParamType is FunctionType &&
+            !firstParamType.returnType.isDartAsyncFutureOr) {
+          var argReturnType = firstArgType.returnType;
+          // Skip the inference if we have the top type. It can only lead to
+          // worse inference. For example, this happens when the lambda returns
+          // S or Future<S> in a conditional.
+          if (!argReturnType.isObject && !argReturnType.isDynamic) {
+            DartType paramReturnType = _typeProvider.futureOrType
+                .instantiate([fnType.typeFormals[0].type]);
+
+            // Adjust the expected parameter type to have this return type.
+            var function = new FunctionElementImpl(firstParamType.name, -1)
+              ..isSynthetic = true
+              ..shareParameters(firstParamType.parameters)
+              ..returnType = paramReturnType;
+            function.type = new FunctionTypeImpl(function);
+            // Use this as the expected 1st parameter type.
+            paramTypes[0] = function.type;
+          }
+        }
+      }
+
       return ts.inferGenericFunctionCall(fnType, paramTypes, argTypes,
           fnType.returnType, InferenceContext.getContext(node),
           errorReporter: _resolver.errorReporter, errorNode: errorNode);
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 8460484..cb70a53 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -66,6 +66,11 @@
   /**
    * The type representing the built-in type 'FutureOr'
    */
+  InterfaceType _futureOrNullType;
+
+  /**
+   * The type representing the built-in type 'FutureOr'
+   */
   InterfaceType _futureOrType;
 
   /**
@@ -267,6 +272,14 @@
   }
 
   @override
+  InterfaceType get futureOrNullType {
+    if (_futureOrNullType == null) {
+      _futureOrNullType = futureOrType.instantiate(<DartType>[nullType]);
+    }
+    return _futureOrNullType;
+  }
+
+  @override
   InterfaceType get futureOrType {
     if (_futureOrType == null) {
       Source asyncSource = _context.sourceFactory.forUri(DartSdk.DART_ASYNC);
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index bcf8ad5..1e1d182 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1554,7 +1554,6 @@
         lowerBound = bound.upper;
         upperBound = bound.lower;
       }
-
       inferredTypes[i] =
           variance.passedIn && !upperBound.isDynamic || lowerBound.isBottom
               ? upperBound
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 486ddc3..22725aa 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -4683,6 +4683,7 @@
   InterfaceType _functionType;
   InterfaceType _futureDynamicType;
   InterfaceType _futureNullType;
+  InterfaceType _futureOrNullType;
   InterfaceType _futureOrType;
   InterfaceType _futureType;
   InterfaceType _intType;
@@ -4733,6 +4734,10 @@
       _futureNullType ??= futureType.instantiate(<DartType>[nullType]);
 
   @override
+  InterfaceType get futureOrNullType =>
+      _futureOrNullType ??= futureOrType.instantiate(<DartType>[nullType]);
+
+  @override
   InterfaceType get futureOrType =>
       _futureOrType ??= _buildInterfaceType(_linker.asyncLibrary, 'FutureOr');
 
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index b178fdc..fcdc232 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -123,6 +123,7 @@
   InterfaceType _functionType;
   InterfaceType _futureDynamicType;
   InterfaceType _futureNullType;
+  InterfaceType _futureOrNullType;
   InterfaceType _futureOrType;
   InterfaceType _futureType;
   InterfaceType _intType;
@@ -190,6 +191,13 @@
   }
 
   @override
+  InterfaceType get futureOrNullType {
+    assert(_asyncLibrary != null);
+    _futureOrNullType ??= futureOrType.instantiate(<DartType>[nullType]);
+    return _futureOrNullType;
+  }
+
+  @override
   InterfaceType get futureOrType {
     assert(_asyncLibrary != null);
     _futureOrType ??= _getType(_asyncLibrary, "FutureOr");
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 7ccdcc9..491b50a 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -36,21 +36,13 @@
   DartType type = expression.staticType ?? DynamicTypeImpl.instance;
   if (typeSystem is StrongTypeSystemImpl &&
       type is FunctionType &&
-      _hasStrictArrow(expression)) {
+      hasStrictArrow(expression)) {
     // Remove fuzzy arrow if possible.
     return typeSystem.functionTypeToConcreteType(type);
   }
   return type;
 }
 
-bool isKnownFunction(Expression expression) {
-  var element = _getKnownElement(expression);
-  // First class functions and static methods, where we know the original
-  // declaration, will have an exact type, so we know a downcast will fail.
-  return element is FunctionElement ||
-      element is MethodElement && element.isStatic;
-}
-
 DartType _elementType(Element e) {
   if (e == null) {
     // Malformed code - just return dynamic.
@@ -61,9 +53,10 @@
 
 Element _getKnownElement(Expression expression) {
   if (expression is ParenthesizedExpression) {
-    expression = (expression as ParenthesizedExpression).expression;
-  }
-  if (expression is FunctionExpression) {
+    return _getKnownElement(expression.expression);
+  } else if (expression is NamedExpression) {
+    return _getKnownElement(expression.expression);
+  } else if (expression is FunctionExpression) {
     return expression.element;
   } else if (expression is PropertyAccess) {
     return expression.propertyName.staticElement;
@@ -105,7 +98,7 @@
 FunctionType _getMemberType(InterfaceType type, ExecutableElement member) =>
     _memberTypeGetter(member)(type);
 
-bool _hasStrictArrow(Expression expression) {
+bool hasStrictArrow(Expression expression) {
   var element = _getKnownElement(expression);
   return element is FunctionElement || element is MethodElement;
 }
@@ -1002,7 +995,7 @@
     // a dynamic parameter type requires a dynamic call in general.
     // However, as an optimization, if we have an original definition, we know
     // dynamic is reified as Object - in this case a regular call is fine.
-    if (_hasStrictArrow(call.function)) {
+    if (hasStrictArrow(call.function)) {
       return false;
     }
     return rules.anyParameterType(ft, (pt) => pt.isDynamic);
@@ -1090,8 +1083,8 @@
       }
     }
 
-    if (isKnownFunction(expr)) {
-      Element e = _getKnownElement(expr);
+    Element e = _getKnownElement(expr);
+    if (e is FunctionElement || e is MethodElement && e.isStatic) {
       _recordMessage(
           expr,
           e is MethodElement
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index bc5bd88..838f146 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -39,8 +39,10 @@
   Asserter<DartType> _isDynamic;
   Asserter<InterfaceType> _isFutureOfDynamic;
   Asserter<InterfaceType> _isFutureOfInt;
+  Asserter<InterfaceType> _isFutureOfNull;
   Asserter<InterfaceType> _isFutureOrOfInt;
   Asserter<DartType> _isInt;
+  Asserter<DartType> _isNull;
   Asserter<DartType> _isNum;
   Asserter<DartType> _isObject;
   Asserter<DartType> _isString;
@@ -69,6 +71,7 @@
       _hasElement = _assertions.hasElement;
       _isInstantiationOf = _assertions.isInstantiationOf;
       _isInt = _assertions.isInt;
+      _isNull = _assertions.isNull;
       _isNum = _assertions.isNum;
       _isObject = _assertions.isObject;
       _isString = _assertions.isString;
@@ -82,6 +85,7 @@
           _isInstantiationOf(_hasElementOf(typeProvider.futureOrType));
       _isFutureOfDynamic = _isFutureOf([_isDynamic]);
       _isFutureOfInt = _isFutureOf([_isInt]);
+      _isFutureOfNull = _isFutureOf([_isNull]);
       _isFutureOrOfInt = _isFutureOrOf([_isInt]);
       _isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType));
     }
@@ -1113,6 +1117,39 @@
     _isDynamic(invoke.staticType);
   }
 
+  test_futureOr_no_return() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then((int x) {});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfDynamic(invoke.staticType);
+  }
+
+  test_futureOr_no_return_value() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then((int x) {return;});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfDynamic(invoke.staticType);
+  }
+
+  test_futureOr_return_null() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then((int x) {});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfDynamic(invoke.staticType);
+  }
+
   test_futureOr_upwards1() async {
     // Test that upwards inference correctly prefers to instantiate type
     // variables with the "smaller" solution when both are possible.
@@ -1135,6 +1172,39 @@
     _isFutureOf([_isObject])(invoke.staticType);
   }
 
+  test_futureOrNull_no_return_value() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then<Null>((int x) {return;});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfNull(invoke.staticType);
+  }
+
+  test_futureOrNull_no_return() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then<Null>((int x) {});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfNull(invoke.staticType);
+  }
+
+  test_futureOrNull_return_null() async {
+    MethodInvocation invoke = await _testFutureOr(r'''
+    FutureOr<T> mk<T>(Future<T> x) => x;
+    Future<int> f;
+    test() => f.then<Null>((int x) {});
+    ''');
+    _isFunction2Of(_isInt, _isNull)(
+        invoke.argumentList.arguments[0].staticType);
+    _isFutureOfNull(invoke.staticType);
+  }
+
   test_inference_hints() async {
     Source source = addSource(r'''
       void main () {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index e185566..266f772 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -107,14 +107,26 @@
 
   @override
   @failingTest
-  void test_blockBodiedLambdas_doesNotInferBottom_asyncStar_topLevel() {
-    super.test_blockBodiedLambdas_doesNotInferBottom_asyncStar_topLevel();
+  void test_blockBodiedLambdas_inferBottom_async_topLevel() {
+    super.test_blockBodiedLambdas_inferBottom_async_topLevel();
   }
 
   @override
   @failingTest
-  void test_blockBodiedLambdas_doesNotInferBottom_syncStar_topLevel() {
-    super.test_blockBodiedLambdas_doesNotInferBottom_syncStar_topLevel();
+  void test_blockBodiedLambdas_inferBottom_asyncStar_topLevel() {
+    super.test_blockBodiedLambdas_inferBottom_asyncStar_topLevel();
+  }
+
+  @override
+  @failingTest
+  void test_blockBodiedLambdas_inferBottom_sync_topLevel() {
+    super.test_blockBodiedLambdas_inferBottom_sync_topLevel();
+  }
+
+  @override
+  @failingTest
+  void test_blockBodiedLambdas_inferBottom_syncStar_topLevel() {
+    super.test_blockBodiedLambdas_inferBottom_syncStar_topLevel();
   }
 
   @override
@@ -553,6 +565,18 @@
 
   @override
   @failingTest
+  void test_inferredType_blockBodiedClosure_noArguments() {
+    super.test_inferredType_blockBodiedClosure_noArguments();
+  }
+
+  @override
+  @failingTest
+  void test_inferredType_blockClosure_noArgs_noReturn() {
+    super.test_inferredType_blockClosure_noArgs_noReturn();
+  }
+
+  @override
+  @failingTest
   void test_inferredType_opAssignToProperty_prefixedIdentifier() {
     super.test_inferredType_opAssignToProperty_prefixedIdentifier();
   }
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index c38122e..0d95689 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -2389,12 +2389,12 @@
   void test_implicitDynamic_return() {
     addFile(r'''
 // function
-/*error:IMPLICIT_DYNAMIC_RETURN*/f0() {}
+/*error:IMPLICIT_DYNAMIC_RETURN*/f0() {return f0();}
 dynamic f1() { return 42; }
 
 // nested function
 void main() {
-  /*error:IMPLICIT_DYNAMIC_RETURN*/g0() {}
+  /*error:IMPLICIT_DYNAMIC_RETURN*/g0() {return g0();}
   dynamic g1() { return 42; }
 }
 
@@ -3231,8 +3231,10 @@
     // Regression test for https://github.com/dart-lang/sdk/issues/26155
     checkFile(r'''
 void takesF(void f(int x)) {
-  takesF(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/([x]) { bool z = x.isEven; });
-  takesF(/*info:INFERRED_TYPE_CLOSURE*/(y) { bool z = y.isEven; });
+  takesF(/*info:INFERRED_TYPE_CLOSURE,
+           info:INFERRED_TYPE_CLOSURE*/([x]) { bool z = x.isEven; });
+  takesF(/*info:INFERRED_TYPE_CLOSURE,
+           info:INFERRED_TYPE_CLOSURE*/(y) { bool z = y.isEven; });
 }
     ''');
   }
@@ -3663,6 +3665,61 @@
 ''');
   }
 
+  void test_tearOffTreatedConsistentlyAsStrictArrow() {
+    checkFile(r'''
+void foo(void f(String x)) {}
+
+class A {
+  Null bar1(dynamic x) => null;
+  void bar2(dynamic x) => null;
+  Null bar3(String x) => null;
+  void test() {
+    foo(bar1);
+    foo(bar2);
+    foo(bar3);
+  }
+}
+
+
+Null baz1(dynamic x) => null;
+void baz2(dynamic x) => null;
+Null baz3(String x) => null;
+void test() {
+  foo(baz1);
+  foo(baz2);
+  foo(baz3);
+}
+    ''');
+  }
+
+  void test_tearOffTreatedConsistentlyAsStrictArrowNamedParam() {
+    checkFile(r'''
+typedef void Handler(String x);
+void foo({Handler f}) {}
+
+class A {
+  Null bar1(dynamic x) => null;
+  void bar2(dynamic x) => null;
+  Null bar3(String x) => null;
+  void test() {
+    foo(f: bar1);
+    foo(f: bar2);
+    foo(f: bar3);
+  }
+}
+
+
+Null baz1(dynamic x) => null;
+void baz2(dynamic x) => null;
+Null baz3(String x) => null;
+void test() {
+  foo(f: baz1);
+  foo(f: baz2);
+  foo(f: baz3);
+}
+    ''');
+  }
+
   void test_ternaryOperator() {
     checkFile('''
 abstract class Comparable<T> {
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 6077b7c..048d414 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -247,113 +247,6 @@
 ''');
   }
 
-  void test_blockBodiedLambdas_doesNotInferBottom_async() {
-    if (!mayCheckTypesOfLocals) {
-      return;
-    }
-    var mainUnit = checkFile(r'''
-import 'dart:async';
-main() async {
-  var f = () async { return null; };
-  Future y = f();
-  Future<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
-  String s = /*info:DYNAMIC_CAST*/await f();
-}
-''');
-    var f = mainUnit.functions[0].localVariables[0];
-    expect(f.type.toString(), '() → Future<dynamic>');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_async_topLevel() {
-    var mainUnit = checkFile(r'''
-import 'dart:async';
-var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,info:INFERRED_TYPE_CLOSURE*/() async { return null; };
-''');
-    var f = mainUnit.topLevelVariables[0];
-    expect(f.type.toString(), '() → Future<dynamic>');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_asyncStar() {
-    if (!mayCheckTypesOfLocals) {
-      return;
-    }
-    var mainUnit = checkFile(r'''
-import 'dart:async';
-main() async {
-  var f = () async* { yield null; };
-  Stream y = f();
-  Stream<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
-  String s = /*info:DYNAMIC_CAST*/await f().first;
-}
-''');
-    var f = mainUnit.functions[0].localVariables[0];
-    expect(f.type.toString(), '() → Stream<dynamic>');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_asyncStar_topLevel() {
-    var mainUnit = checkFile(r'''
-import 'dart:async';
-var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async* { yield null; };
-''');
-    var f = mainUnit.topLevelVariables[0];
-    expect(f.type.toString(), '() → Stream<dynamic>');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_sync() {
-    if (!mayCheckTypesOfLocals) {
-      return;
-    }
-    var mainUnit = checkFile(r'''
-var h = null;
-void foo(int f(Object _)) {}
-
-main() {
-  var f = (Object x) { return null; };
-  String y = /*info:DYNAMIC_CAST*/f(42);
-
-  f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
-
-  foo(/*info:INFERRED_TYPE_CLOSURE*/(x) { return null; });
-  foo(/*info:INFERRED_TYPE_CLOSURE*/(x) { throw "not implemented"; });
-}
-''');
-
-    var f = mainUnit.functions[1].localVariables[0];
-    expect(f.type.toString(), '(Object) → dynamic');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_sync_topLevel() {
-    var mainUnit = checkFile(r'''
-var f = (Object x) { return null; };
-''');
-    var f = mainUnit.topLevelVariables[0];
-    expect(f.type.toString(), '(Object) → dynamic');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_syncStar() {
-    if (!mayCheckTypesOfLocals) {
-      return;
-    }
-    var mainUnit = checkFile(r'''
-main() {
-  var f = () sync* { yield null; };
-  Iterable y = f();
-  Iterable<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
-  String s = /*info:DYNAMIC_CAST*/f().first;
-}
-''');
-    var f = mainUnit.functions[0].localVariables[0];
-    expect(f.type.toString(), '() → Iterable<dynamic>');
-  }
-
-  void test_blockBodiedLambdas_doesNotInferBottom_syncStar_topLevel() {
-    var mainUnit = checkFile(r'''
-var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() sync* { yield null; };
-''');
-    var f = mainUnit.topLevelVariables[0];
-    expect(f.type.toString(), '() → Iterable<dynamic>');
-  }
-
   void test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference() {
     if (!mayCheckTypesOfLocals) {
       return;
@@ -379,6 +272,115 @@
     expect(f.type.toString(), '() → String');
   }
 
+  void test_blockBodiedLambdas_inferBottom_async() {
+    if (!mayCheckTypesOfLocals) {
+      return;
+    }
+    var mainUnit = checkFile(r'''
+import 'dart:async';
+main() async {
+  var f = /*info:INFERRED_TYPE_CLOSURE*/() async { return null; };
+  Future y = f();
+  Future<String> z = f();
+  String s = await f();
+}
+''');
+    var f = mainUnit.functions[0].localVariables[0];
+    expect(f.type.toString(), '() → Future<Null>');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_async_topLevel() {
+    var mainUnit = checkFile(r'''
+import 'dart:async';
+var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,info:INFERRED_TYPE_CLOSURE*/() async { return null; };
+''');
+    var f = mainUnit.topLevelVariables[0];
+    expect(f.type.toString(), '() → Future<Null>');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_asyncStar() {
+    if (!mayCheckTypesOfLocals) {
+      return;
+    }
+    var mainUnit = checkFile(r'''
+import 'dart:async';
+main() async {
+  var f = /*info:INFERRED_TYPE_CLOSURE*/() async* { yield null; };
+  Stream y = f();
+  Stream<String> z = f();
+  String s = await f().first;
+}
+''');
+    var f = mainUnit.functions[0].localVariables[0];
+    expect(f.type.toString(), '() → Stream<Null>');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_asyncStar_topLevel() {
+    var mainUnit = checkFile(r'''
+import 'dart:async';
+var f = /*info:INFERRED_TYPE_CLOSURE, warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async* { yield null; };
+''');
+    var f = mainUnit.topLevelVariables[0];
+    expect(f.type.toString(), '() → Stream<Null>');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_sync() {
+    if (!mayCheckTypesOfLocals) {
+      return;
+    }
+    var mainUnit = checkFile(r'''
+var h = null;
+void foo(int f(Object _)) {}
+
+main() {
+  var f = /*info:INFERRED_TYPE_CLOSURE*/(Object x) { return null; };
+  String y = f(42);
+
+  f = /*error:INVALID_CAST_FUNCTION_EXPR, info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
+
+  foo(/*info:INFERRED_TYPE_CLOSURE,
+        info:INFERRED_TYPE_CLOSURE*/(x) { return null; });
+  foo(/*info:INFERRED_TYPE_CLOSURE,
+        info:INFERRED_TYPE_CLOSURE*/(x) { throw "not implemented"; });
+}
+''');
+
+    var f = mainUnit.functions[1].localVariables[0];
+    expect(f.type.toString(), '(Object) → Null');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_sync_topLevel() {
+    var mainUnit = checkFile(r'''
+var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(Object x) { return null; };
+''');
+    var f = mainUnit.topLevelVariables[0];
+    expect(f.type.toString(), '(Object) → Null');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_syncStar() {
+    if (!mayCheckTypesOfLocals) {
+      return;
+    }
+    var mainUnit = checkFile(r'''
+main() {
+  var f = /*info:INFERRED_TYPE_CLOSURE*/() sync* { yield null; };
+  Iterable y = f();
+  Iterable<String> z = f();
+  String s = f().first;
+}
+''');
+    var f = mainUnit.functions[0].localVariables[0];
+    expect(f.type.toString(), '() → Iterable<Null>');
+  }
+
+  void test_blockBodiedLambdas_inferBottom_syncStar_topLevel() {
+    var mainUnit = checkFile(r'''
+var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() sync* { yield null; };
+''');
+    var f = mainUnit.topLevelVariables[0];
+    expect(f.type.toString(), '() → Iterable<Null>');
+  }
+
   void test_blockBodiedLambdas_LUB() {
     checkFile(r'''
 import 'dart:math' show Random;
@@ -447,7 +449,7 @@
     var mainUnit = checkFile(r'''
 test1() {
   List<int> o;
-  var y = o.map(/*info:INFERRED_TYPE_CLOSURE*/(x) { });
+  var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { });
   Iterable<int> z = /*warning:DOWN_CAST_COMPOSITE*/y;
 }
 ''');
@@ -458,7 +460,7 @@
   void test_blockBodiedLambdas_noReturn_topLevel() {
     var mainUnit = checkFile(r'''
 final List<int> o = <int>[];
-var y = o.map((x) { });
+var y = o.map(/*info:INFERRED_TYPE_CLOSURE, warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(x) { });
 ''');
     var f = mainUnit.topLevelVariables[1];
     expect(f.type.toString(), 'Iterable<dynamic>');
@@ -1695,6 +1697,48 @@
     ''');
   }
 
+  void test_futureThen_deprecated() {
+// Tests the deprecated ad hoc future inference for classes which implement
+// Future but haven't been updated to use FutureOr
+    String build({String declared, String downwards, String upwards}) => '''
+import 'dart:async';
+class MyFuture<T> implements Future<T> {
+  MyFuture() {}
+  MyFuture.value(T x) {}
+  dynamic noSuchMethod(invocation);
+  MyFuture<S> then<S>(dynamic f(T x), {Function onError}) => null;
+}
+
+void main() {
+  $declared f;
+  $downwards<int> t1 = f.then((_) async => await new $upwards<int>.value(3));
+  $downwards<int> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
+     return await new $upwards<int>.value(3);});
+  $downwards<int> t3 = f.then((_) async => 3);
+  $downwards<int> t4 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
+    return 3;});
+  $downwards<int> t5 = f.then((_) => new $upwards<int>.value(3));
+  $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) {return new $upwards<int>.value(3);});
+  $downwards<int> t7 = f.then((_) async => new $upwards<int>.value(3));
+  $downwards<int> t8 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
+    return new $upwards<int>.value(3);});
+}
+''';
+
+    checkFile(
+        build(declared: "MyFuture", downwards: "Future", upwards: "Future"));
+    checkFile(
+        build(declared: "MyFuture", downwards: "Future", upwards: "MyFuture"));
+    checkFile(
+        build(declared: "MyFuture", downwards: "MyFuture", upwards: "Future"));
+    checkFile(build(
+        declared: "MyFuture", downwards: "MyFuture", upwards: "MyFuture"));
+    checkFile(
+        build(declared: "Future", downwards: "Future", upwards: "MyFuture"));
+    checkFile(
+        build(declared: "Future", downwards: "Future", upwards: "Future"));
+  }
+
   void test_futureThen() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -1735,32 +1779,30 @@
         build(declared: "Future", downwards: "Future", upwards: "Future"));
   }
 
-  void test_futureThen_comment() {
+  void test_futureThen_conditional_deprecated() {
+// Tests the deprecated ad hoc future inference for classes which implement
+// Future but haven't been updated to use FutureOr
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
   dynamic noSuchMethod(invocation);
-  MyFuture/*<S>*/ then/*<S>*/(dynamic f(T x), {Function onError}) => null;
+  MyFuture<S> then<S>(dynamic f(T x), {Function onError}) => null;
 }
 
 void main() {
-  $declared f;
-  $downwards<int> t1 = f.then((_) async => await new $upwards<int>.value(3));
-  $downwards<int> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-     return await new $upwards<int>.value(3);});
-  $downwards<int> t3 = f.then((_) async => 3);
-  $downwards<int> t4 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-    return 3;});
-  $downwards<int> t5 = f.then((_) => new $upwards<int>.value(3));
-  $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) {return new $upwards<int>.value(3);});
-  $downwards<int> t7 = f.then((_) async => new $upwards<int>.value(3));
-  $downwards<int> t8 = f.then(/*info:INFERRED_TYPE_CLOSURE*/(_) async {
-    return new $upwards<int>.value(3);});
+  $declared<bool> f;
+  $downwards<int> t1 = f.then(/*info:INFERRED_TYPE_CLOSURE*/
+      (x) async => x ? 2 : await new $upwards<int>.value(3));
+  $downwards<int> t2 = f.then(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) async { // TODO(leafp): Why the duplicate here?
+    return await x ? 2 : new $upwards<int>.value(3);});
+  $downwards<int> t5 = f.then(/*info:INFERRED_TYPE_CLOSURE*/
+      (x) => x ? 2 : new $upwards<int>.value(3));
+  $downwards<int> t6 = f.then(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/
+      (x) {return /*warning:DOWN_CAST_COMPOSITE*/x ? 2 : new $upwards<int>.value(3);});
 }
 ''';
-
     checkFile(
         build(declared: "MyFuture", downwards: "Future", upwards: "Future"));
     checkFile(
@@ -1769,10 +1811,6 @@
         build(declared: "MyFuture", downwards: "MyFuture", upwards: "Future"));
     checkFile(build(
         declared: "MyFuture", downwards: "MyFuture", upwards: "MyFuture"));
-    checkFile(
-        build(declared: "Future", downwards: "Future", upwards: "MyFuture"));
-    checkFile(
-        build(declared: "Future", downwards: "Future", upwards: "Future"));
   }
 
   void test_futureThen_conditional() {
@@ -1819,7 +1857,7 @@
   Future<int> f;
   Future<List<int>> b = /*info:ASSIGNMENT_CAST should be pass*/f
       .then(/*info:INFERRED_TYPE_CLOSURE*/(x) => [])
-      .whenComplete(/*pass should be info:INFERRED_TYPE_LITERAL*/() {});
+      .whenComplete(/*info:INFERRED_TYPE_CLOSURE*/() {});
   b = f.then(/*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
 }
     ''');
@@ -1830,7 +1868,9 @@
 import "dart:async";
 m1() {
   Future<int> f;
-  var x = f.then<Future<List<int>>>(/*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(x) => []);
+  var x = f.then<Future<List<int>>>(/*info:INFERRED_TYPE_CLOSURE,
+                                      error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/
+                                    (x) => /*info:INFERRED_TYPE_LITERAL*/[]);
   Future<List<int>> y = x;
 }
 m2() {
@@ -1841,6 +1881,38 @@
     ''');
   }
 
+  void test_futureThen_upwards_deprecated() {
+    // Tests the deprecated ad hoc future inference for classes which implement
+    // Future but haven't been updated to use FutureOr
+    // Regression test for https://github.com/dart-lang/sdk/issues/27088.
+    String build({String declared, String downwards, String upwards}) => '''
+import 'dart:async';
+class MyFuture<T> implements Future<T> {
+  MyFuture() {}
+  MyFuture.value(T x) {}
+  dynamic noSuchMethod(invocation);
+  MyFuture<S> then<S>(dynamic f(T x), {Function onError}) => null;
+}
+
+void main() {
+  var f = foo().then((_) => 2.3);
+  $downwards<int> f2 = /*error:INVALID_ASSIGNMENT*/f;
+
+  // The unnecessary cast is to illustrate that we inferred <double> for
+  // the generic type args, even though we had a return type context.
+  $downwards<num> f3 = /*info:UNNECESSARY_CAST*/foo().then(
+      (_) => 2.3) as $upwards<double>;
+}
+$declared foo() => new $declared<int>.value(1);
+    ''';
+    checkFile(
+        build(declared: "MyFuture", downwards: "Future", upwards: "Future"));
+    checkFile(build(
+        declared: "MyFuture", downwards: "MyFuture", upwards: "MyFuture"));
+    checkFile(
+        build(declared: "Future", downwards: "Future", upwards: "Future"));
+  }
+
   void test_futureThen_upwards() {
     // Regression test for https://github.com/dart-lang/sdk/issues/27088.
     String build({String declared, String downwards, String upwards}) => '''
@@ -1885,6 +1957,31 @@
     ''');
   }
 
+  void test_futureUnion_asyncConditional_deprecated() {
+    // Tests the deprecated ad hoc future inference for classes which implement
+    // Future but haven't been updated to use FutureOr
+    String build({String declared, String downwards, String upwards}) => '''
+import 'dart:async';
+class MyFuture<T> implements Future<T> {
+  MyFuture() {}
+  MyFuture.value(x) {}
+  dynamic noSuchMethod(invocation);
+  MyFuture<S> then<S>(dynamic f(T x), {Function onError}) => null;
+}
+
+$downwards<int> g1(bool x) async {
+  return x ? 42 : /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(42); }
+$downwards<int> g2(bool x) async =>
+  x ? 42 : /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(42);
+$downwards<int> g3(bool x) async {
+  var y = x ? 42 : new $upwards.value(42);
+  return y;
+}
+    ''';
+    checkFile(build(downwards: "Future", upwards: "Future"));
+    checkFile(build(downwards: "Future", upwards: "MyFuture"));
+  }
+
   void test_futureUnion_asyncConditional() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -1908,27 +2005,46 @@
     checkFile(build(downwards: "Future", upwards: "MyFuture"));
   }
 
-  void test_futureUnion_asyncConditional_comment() {
-    String build({String declared, String downwards, String upwards}) => '''
+  void test_futureUnion_downwards_deprecated() {
+    // Tests the deprecated ad hoc future inference for classes which implement
+    // Future but haven't been updated to use FutureOr
+    String build({String declared, String downwards, String upwards}) {
+      // TODO(leafp): The use of matchTypes in visitInstanceCreationExpression
+      // in the resolver visitor isn't powerful enough to catch this for the
+      // subclass.  See the TODO there.
+      var allocInfo =
+          (upwards == "Future") ? "/*info:INFERRED_TYPE_ALLOCATION*/" : "";
+      return '''
 import 'dart:async';
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
-  MyFuture.value(x) {}
+  MyFuture.value([x]) {}
   dynamic noSuchMethod(invocation);
-  MyFuture/*<S>*/ then/*<S>*/(dynamic f(T x), {Function onError}) => null;
+  MyFuture<S> then<S>(dynamic f(T x), {Function onError}) => null;
 }
 
-$downwards<int> g1(bool x) async {
-  return x ? 42 : /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(42); }
-$downwards<int> g2(bool x) async =>
-  x ? 42 : /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(42);
-$downwards<int> g3(bool x) async {
-  var y = x ? 42 : new $upwards.value(42);
-  return y;
-}
-    ''';
-    checkFile(build(downwards: "Future", upwards: "Future"));
-    checkFile(build(downwards: "Future", upwards: "MyFuture"));
+$declared f;
+// Instantiates Future<int>
+$downwards<int> t1 = f.then((_) =>
+   ${allocInfo}new $upwards.value('hi'));
+
+// Instantiates List<int>
+$downwards<List<int>> t2 = f.then((_) => /*info:INFERRED_TYPE_LITERAL*/[3]);
+$downwards<List<int>> g2() async { return /*info:INFERRED_TYPE_LITERAL*/[3]; }
+$downwards<List<int>> g3() async {
+  return /*info:INFERRED_TYPE_ALLOCATION*/new $upwards.value(
+      /*info:INFERRED_TYPE_LITERAL*/[3]); }
+''';
+    }
+
+    checkFile(
+        build(declared: "MyFuture", downwards: "Future", upwards: "Future"));
+    checkFile(
+        build(declared: "MyFuture", downwards: "Future", upwards: "MyFuture"));
+    checkFile(
+        build(declared: "Future", downwards: "Future", upwards: "Future"));
+    checkFile(
+        build(declared: "Future", downwards: "Future", upwards: "MyFuture"));
   }
 
   void test_futureUnion_downwards() {
@@ -3437,19 +3553,21 @@
   void test_inferredType_blockBodiedClosure_noArguments() {
     var mainUnit = checkFile('''
 class C {
-  static final v = () {};
+  static final v = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,
+                     info:INFERRED_TYPE_CLOSURE*/() {};
 }
 ''');
     var v = mainUnit.getType('C').fields[0];
-    expect(v.type.toString(), '() → dynamic');
+    expect(v.type.toString(), '() → Null');
   }
 
   void test_inferredType_blockClosure_noArgs_noReturn() {
     var mainUnit = checkFile('''
-var f = () {};
+var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,
+                     info:INFERRED_TYPE_CLOSURE*/() {};
 ''');
     var f = mainUnit.topLevelVariables[0];
-    expect(f.type.toString(), '() → dynamic');
+    expect(f.type.toString(), '() → Null');
   }
 
   void test_inferredType_customBinaryOp() {
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 4d1314e..154a266 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -229,6 +229,11 @@
   Asserter<DartType> get isMap => hasElementOf(_typeProvider.mapType);
 
   /**
+   * Primitive assertion for the Null type
+   */
+  Asserter<DartType> get isNull => isType(_typeProvider.nullType);
+
+  /**
    * Primitive assertion for the num type
    */
   Asserter<DartType> get isNum => isType(_typeProvider.numType);
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index bfa802af..b612e9f 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -549,6 +549,7 @@
   let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
   let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
   let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
+  let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
   let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
   let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
   let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
@@ -654,13 +655,12 @@
   let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
   let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
   let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
-  let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
+  let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
   let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
   let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
   let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
-  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+  let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
+  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
   let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
   let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
   let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -674,19 +674,22 @@
   let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
   let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
   let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
+  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
   let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
   let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
   let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
   let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
   let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
+  let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
+  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
   let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-  let ListToFutureOr = () => (ListToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [core.List])))();
-  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
-  let dynamicToFutureOr$ = () => (dynamicToFutureOr$ = dart.constFn(dart.definiteFunctionType(async.FutureOr, [dart.dynamic])))();
-  let TimerTovoid$ = () => (TimerTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
+  let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
+  let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
+  let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+  let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
   let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
-  let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
+  let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
   let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
   let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
@@ -729,7 +732,7 @@
   let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
   let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
-  let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
+  let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -742,11 +745,12 @@
   let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
   let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
   let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
+  let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
   let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
   let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
+  let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
   let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
-  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
+  let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
   let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
   let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
   let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
@@ -787,10 +791,11 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
+  let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
   let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
   let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
   let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -815,10 +820,10 @@
   let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
   let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
   let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
-  let ListOfintToFutureOr = () => (ListOfintToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [ListOfint()])))();
+  let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
   let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
-  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
   let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
   let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
@@ -835,7 +840,8 @@
   let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
   let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
   let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let StringAndListOfStringTovoid$ = () => (StringAndListOfStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, ListOfString()])))();
+  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
   let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
   let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
   let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
@@ -846,15 +852,14 @@
   let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
   let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
   let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
-  let CookieTovoid = () => (CookieTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Cookie])))();
+  let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
   let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
   let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
   let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
   let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
   let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.StackTrace])))();
-  let _HttpIncomingTovoid$ = () => (_HttpIncomingTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpIncoming])))();
-  let _HttpIncomingToFutureOr = () => (_HttpIncomingToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._HttpIncoming])))();
+  let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+  let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
   let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
   let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
   let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
@@ -871,8 +876,8 @@
   let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
   let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
   let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketTodynamic = () => (SocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.Socket])))();
-  let _HttpConnectionTovoid = () => (_HttpConnectionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpConnection])))();
+  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+  let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
   let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
   let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
   let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
@@ -886,22 +891,22 @@
   let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
   let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
   let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
-  let RawSecureSocketToFutureOr = () => (RawSecureSocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RawSecureSocket])))();
+  let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
   let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
-  let _FilterStatusToFutureOr = () => (_FilterStatusToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._FilterStatus])))();
+  let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
   let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
   let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
   let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
   let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
   let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
   let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
-  let HttpRequestTovoid$ = () => (HttpRequestTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpRequest])))();
+  let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
   let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
   let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
   let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
   let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
-  let SocketToFutureOr = () => (SocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.Socket])))();
   let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
@@ -920,36 +925,35 @@
   let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
   let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
   let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-  let EventTovoid$ = () => (EventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Event])))();
+  let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
   let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
   let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-  let EventToFutureOr = () => (EventToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [html$.Event])))();
   let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
   let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
   let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
   let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-  let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileSystem])))();
-  let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileError])))();
-  let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Entry])))();
+  let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
+  let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
+  let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
   let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
   let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
-  let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Metadata])))();
-  let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
+  let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
+  let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
   let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
-  let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileWriter])))();
-  let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.File])))();
-  let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Geoposition])))();
-  let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.PositionError])))();
+  let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
+  let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
+  let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
+  let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
   let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
-  let ProgressEventTovoid$ = () => (ProgressEventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.ProgressEvent])))();
-  let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
-  let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.MediaStream])))();
-  let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.NavigatorUserMediaError])))();
-  let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription])))();
-  let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcStatsResponse])))();
+  let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
+  let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
+  let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
+  let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
+  let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
+  let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
   let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
-  let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
-  let BeforeUnloadEventTovoid = () => (BeforeUnloadEventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.BeforeUnloadEvent])))();
+  let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
+  let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
   let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
   let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
   let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
@@ -976,9 +980,9 @@
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
-  let dynamic__Todynamic$0 = () => (dynamic__Todynamic$0 = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
+  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
   let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
-  let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
+  let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
   dart.mixin = function(base, ...mixins) {
     class Mixin extends base {}
     for (let m of mixins) {
@@ -1705,10 +1709,7 @@
         return null;
       }
     }
-    if (ret2 === dart.void) return true;
-    if (ret1 === dart.void) {
-      return ret2 === dart.dynamic || ret2 === async.FutureOr;
-    }
+    if (ret1 === dart.void) return dart._isTop(ret2);
     if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
     return true;
   };
@@ -1729,13 +1730,13 @@
     };
   };
   dart._isBottom = function(type) {
-    return type == dart.bottom;
+    return type == dart.bottom || type == core.Null;
   };
   dart._isTop = function(type) {
     if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
       return dart._isTop(dart.getGenericArgs(type)[0]);
     }
-    return type == core.Object || type == dart.dynamic;
+    return type == core.Object || type == dart.dynamic || type == dart.void;
   };
   dart._isSubtype = function(t1, t2, isCovariant) {
     if (t1 === t2) return true;
@@ -2182,6 +2183,9 @@
     return false;
   };
   dart.is = function(obj, type) {
+    if (obj == null) {
+      return type == core.Null || dart._isTop(type);
+    }
     let result = dart.strongInstanceOf(obj, type);
     if (result !== null) return result;
     let actual = dart.getReifiedType(obj);
@@ -3292,7 +3296,7 @@
       if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
         this.asMap()[dartx.forEach](dart.fn((i, element) => {
           children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
-        }, intAnddynamicTovoid()));
+        }, intAnddynamicToNull()));
       } else {
         for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
           let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
@@ -3693,14 +3697,14 @@
         } else {
           nonGenericProperties._set(core.String._check(name), value);
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
       nonGenericProperties.forEach(dart.fn((name, value) => {
         if (core.Type.is(value)) {
           children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
         } else {
           children.add(new _debugger.NameValuePair({name: name, value: value}));
         }
-      }, StringAndObjectTovoid()));
+      }, StringAndObjectToNull()));
       return children.toList();
     }
     recordGenericParameters(name, genericTypeConstructor) {
@@ -3769,7 +3773,7 @@
       map[dartx.forEach](dart.fn((key, value) => {
         let entryWrapper = new _debugger.MapEntry({key: key, value: value});
         entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       _debugger.addMetadataChildren(object, entries);
       return entries.toList();
     }
@@ -9205,11 +9209,11 @@
     if (_isolate_helper._MainFunctionArgs.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args, null);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else {
       rootContext.eval(core.Function._check(entry));
     }
@@ -9651,7 +9655,7 @@
           if (!dart.test(this.runIteration())) return;
           async.Timer.run(next);
         }).bind(this);
-        dart.fn(next, VoidTodynamic$());
+        dart.fn(next, VoidToNull());
         next();
       } else {
         while (dart.test(this.runIteration())) {
@@ -9804,7 +9808,7 @@
           let context = new _isolate_helper._IsolateContext();
           _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
             _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
-          }, VoidTodynamic$()), 'worker-start');
+          }, VoidToNull()), 'worker-start');
           _isolate_helper._globalState.currentContext = context;
           _isolate_helper._globalState.topEventLoop.run();
           break;
@@ -9854,9 +9858,9 @@
       let replyPort = dart.dindex(msg, 'replyPort');
       _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
         dart.dsend(replyPort, 'send', msg);
-      }, ListToFutureOr()), {onError: dart.fn(errorMessage => {
+      }, ListToNull()), {onError: dart.fn(errorMessage => {
           dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
-        }, StringTodynamic())});
+        }, StringToNull())});
     }
     static _log(msg) {
       if (dart.test(_isolate_helper._globalState.isWorker)) {
@@ -9913,7 +9917,7 @@
           dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
           completer.completeError(dart.dindex(msg, 1));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
       let signalReply = port.sendPort;
       if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
         _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
@@ -9939,7 +9943,7 @@
       _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
         let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
         _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
-      }, VoidTodynamic$()), 'nonworker start');
+      }, VoidToNull()), 'nonworker start');
     }
     static get currentIsolate() {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -10084,7 +10088,7 @@
         if (!dart.test(this[_receivePort][_isClosed])) {
           this[_receivePort][_add](msg);
         }
-      }, VoidTodynamic$()), dart.str`receive ${message}`);
+      }, VoidToNull()), dart.str`receive ${message}`);
     }
     ['=='](other) {
       return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
@@ -10218,13 +10222,11 @@
     let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
     let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
     let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
     let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
     let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
     let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
     let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
     let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
     let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
@@ -10239,12 +10241,14 @@
     let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
     let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
     let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
+    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
     let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
     let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
     let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
     let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
     let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
+    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
     let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
@@ -10252,11 +10256,10 @@
     let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
     let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
     let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
-    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
-    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
+    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     class Stream extends core.Object {
       new() {
       }
@@ -10270,10 +10273,10 @@
         future.then(dart.dynamic)(dart.fn(value => {
           controller[_add$](value);
           controller[_closeUnchecked]();
-        }, TToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+        }, TToNull()), {onError: dart.fn((error, stackTrace) => {
             controller[_addError](error, core.StackTrace._check(stackTrace));
             controller[_closeUnchecked]();
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return controller.stream;
       }
       static fromFutures(futures) {
@@ -10284,13 +10287,13 @@
             controller[_add$](value);
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, TTodynamic$());
+        }, TToNull());
         let onError = dart.fn((error, stack) => {
           if (!dart.test(controller.isClosed)) {
             controller[_addError](error, core.StackTrace._check(stack));
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, dynamicAnddynamicTodynamic$());
+        }, dynamicAnddynamicToNull());
         for (let future of futures) {
           count++;
           future.then(dart.dynamic)(onValue, {onError: onError});
@@ -10327,17 +10330,17 @@
           dart.assert(timer == null);
           timer = async.Timer.periodic(period, dart.fn(timer => {
             sendEvent();
-          }, TimerTovoid$()));
+          }, TimerToNull()));
         }
         dart.fn(startPeriodicTimer, VoidTovoid$());
         controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
             watch.start();
             startPeriodicTimer();
-          }, VoidTovoid$()), onPause: dart.fn(() => {
+          }, VoidToNull()), onPause: dart.fn(() => {
             timer.cancel();
             timer = null;
             watch.stop();
-          }, VoidTovoid$()), onResume: dart.fn(() => {
+          }, VoidToNull()), onResume: dart.fn(() => {
             dart.assert(timer == null);
             let elapsed = watch.elapsed;
             watch.start();
@@ -10345,11 +10348,11 @@
               timer = null;
               startPeriodicTimer();
               sendEvent();
-            }, VoidTovoid$()));
-          }, VoidTovoid$()), onCancel: dart.fn(() => {
+            }, VoidToNull()));
+          }, VoidToNull()), onCancel: dart.fn(() => {
             if (timer != null) timer.cancel();
             timer = null;
-          }, VoidTodynamic$())});
+          }, VoidToNull())});
         return controller.stream;
       }
       static eventTransformed(source, mapSink) {
@@ -10396,21 +10399,21 @@
               } else {
                 controller.add(E.as(newValue));
               }
-            }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10436,21 +10439,21 @@
                 subscription.pause();
                 controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
               }
-            }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10484,12 +10487,12 @@
           if (seenFirst) {
             async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
               value = newValue;
-            }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
+            }, TToNull()), async._cancelAndErrorClosure(subscription, result));
           } else {
             value = element;
             seenFirst = true;
           }
-        }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
             if (!seenFirst) {
               try {
                 dart.throw(_internal.IterableElementError.noElement());
@@ -10501,7 +10504,7 @@
             } else {
               result[_complete](value);
             }
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       fold(S) {
@@ -10512,12 +10515,12 @@
           subscription = this.listen(dart.fn(element => {
             async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
               value = newValue;
-            }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
-          }, TTovoid$()), {onError: dart.fn((e, st) => {
+            }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
+          }, TToNull()), {onError: dart.fn((e, st) => {
               result[_completeError](e, core.StackTrace._check(st));
-            }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+            }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
               result[_complete](value);
-            }, VoidTovoid$()), cancelOnError: true});
+            }, VoidToNull()), cancelOnError: true});
           return result;
         };
       }
@@ -10539,11 +10542,11 @@
             async._cancelAndErrorWithReplacement(subscription, result, e, s);
           }
 
-        }, TTovoid$()), {onError: dart.fn(e => {
+        }, TToNull()), {onError: dart.fn(e => {
             result[_completeError](e);
-          }, dynamicTodynamic$()), onDone: dart.fn(() => {
+          }, dynamicToNull$()), onDone: dart.fn(() => {
             result[_complete](buffer.toString());
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       contains(needle) {
@@ -10554,10 +10557,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       forEach(action) {
@@ -10565,10 +10568,10 @@
         let subscription = null;
         subscription = this.listen(dart.fn(element => {
           async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
-          }, dynamicTodynamic$()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](null);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       every(test) {
@@ -10579,10 +10582,10 @@
             if (!dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, false);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       any(test) {
@@ -10593,10 +10596,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get length() {
@@ -10604,9 +10607,9 @@
         let count = 0;
         this.listen(dart.fn(_ => {
           count++;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](count);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get isEmpty() {
@@ -10614,9 +10617,9 @@
         let subscription = null;
         subscription = this.listen(dart.fn(_ => {
           async._cancelAndValue(subscription, future, false);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toList() {
@@ -10624,9 +10627,9 @@
         let future = new (_FutureOfListOfT())();
         this.listen(dart.fn(data => {
           result[dartx.add](data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toSet() {
@@ -10634,9 +10637,9 @@
         let future = new (_FutureOfSetOfT())();
         this.listen(dart.fn(data => {
           result.add(data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       drain(E) {
@@ -10666,7 +10669,7 @@
         let subscription = null;
         subscription = this.listen(dart.fn(value => {
           async._cancelAndValue(subscription, future, value);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             try {
               dart.throw(_internal.IterableElementError.noElement());
             } catch (e) {
@@ -10674,7 +10677,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get last() {
@@ -10684,7 +10687,7 @@
         this.listen(dart.fn(value => {
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10696,7 +10699,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get single() {
@@ -10717,7 +10720,7 @@
           }
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10729,7 +10732,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       firstWhere(test, opts) {
@@ -10741,8 +10744,8 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, value);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (defaultValue != null) {
               async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
               return;
@@ -10754,7 +10757,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       lastWhere(test, opts) {
@@ -10769,8 +10772,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10786,7 +10789,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       singleWhere(test) {
@@ -10810,8 +10813,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10823,7 +10826,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       elementAt(index) {
@@ -10837,9 +10840,9 @@
             return;
           }
           elementIndex = elementIndex + 1;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       timeout(timeLimit, opts) {
@@ -10873,7 +10876,7 @@
           if (onTimeout == null) {
             timeout = dart.fn(() => {
               controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
-            }, VoidTovoid$());
+            }, VoidToNull());
           } else {
             let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
             let wrapper = new async._ControllerEventSinkWrapper(null);
@@ -10881,7 +10884,7 @@
               wrapper[_sink] = controller;
               zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
               wrapper[_sink] = null;
-            }, VoidTovoid$());
+            }, VoidToNull());
           }
           subscription = this.listen(onData, {onError: onError, onDone: onDone});
           timer = zone.createTimer(timeLimit, timeout);
@@ -10897,10 +10900,10 @@
         controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
           timer.cancel();
           subscription.pause();
-        }, VoidTovoid$()), dart.fn(() => {
+        }, VoidToNull()), dart.fn(() => {
           subscription.resume();
           timer = zone.createTimer(timeLimit, timeout);
-        }, VoidTovoid$()), onCancel);
+        }, VoidToNull()), onCancel);
         return controller.stream;
       }
     }
@@ -11047,7 +11050,7 @@
         _isolate_helper.enterJsAsync();
         this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
           callback(this);
-        }, VoidTodynamic$()), milliseconds);
+        }, VoidToNull()), milliseconds);
       } else {
         dart.throw(new core.UnsupportedError("Periodic timer."));
       }
@@ -12478,14 +12481,14 @@
     let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
     let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class JsLinkedHashMap extends core.Object {
       new() {
         this[_length$0] = 0;
@@ -12540,7 +12543,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
@@ -13810,7 +13813,7 @@
     let obj = {};
     map[dartx.forEach](dart.fn((key, value) => {
       obj[_js_mirrors.getName(key)] = value;
-    }, SymbolAnddynamicTovoid()));
+    }, SymbolAnddynamicToNull()));
     return obj;
   };
   dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
@@ -14025,7 +14028,7 @@
         constructors[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
@@ -14040,23 +14043,23 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let methods = _js_mirrors._getMethods(unwrapped);
         methods[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let getters = _js_mirrors._getGetters(unwrapped);
         getters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let setters = _js_mirrors._getSetters(unwrapped);
         setters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
           symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
         staticFields[dartx.forEach](dart.fn((symbol, t) => {
           let name = _js_mirrors.getName(symbol);
@@ -14066,22 +14069,22 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let statics = _js_mirrors._getStatics(unwrapped);
         statics[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
         staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
         staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -17931,11 +17934,11 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_complete](futureValue);
-          }, VoidTovoid$());
+          }, VoidToNull());
           this[_onError] = dart.fn((error, stackTrace) => {
             this.cancel();
             result[_completeError](error, core.StackTrace._check(stackTrace));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           return result;
         };
       }
@@ -18611,7 +18614,7 @@
   async._SyncBroadcastStreamController$ = dart.generic(T => {
     let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
     let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
+    let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
     class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
       new(onListen, onCancel) {
         super.new(onListen, onCancel);
@@ -18640,19 +18643,19 @@
         }
         this[_forEachListener](dart.fn(subscription => {
           subscription[_add$](data);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendError](error, stackTrace) {
         if (dart.test(this[_isEmpty])) return;
         this[_forEachListener](dart.fn(subscription => {
           subscription[_addError](error, stackTrace);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendDone]() {
         if (!dart.test(this[_isEmpty])) {
           this[_forEachListener](dart.fn(subscription => {
             subscription[_close$]();
-          }, _BufferingStreamSubscriptionOfTTovoid()));
+          }, _BufferingStreamSubscriptionOfTToNull()));
         } else {
           dart.assert(this[_doneFuture] != null);
           dart.assert(this[_doneFuture][_mayComplete]);
@@ -18903,7 +18906,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static microtask(computation) {
@@ -18916,7 +18919,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static sync(computation) {
@@ -18956,7 +18959,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static wait(T) {
@@ -18976,7 +18979,7 @@
                   if (value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                 }
               }
@@ -19006,13 +19009,13 @@
                   if (cleanUp != null && value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                   if (remaining == 0 && !dart.test(eagerError)) {
                     result[_completeError](error, stackTrace);
                   }
                 }
-              }, dart.definiteFunctionType(async.FutureOr, [T])), {onError: handleError});
+              }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
               remaining++;
             }
             if (remaining == 0) {
@@ -19037,10 +19040,10 @@
           let completer = async.Completer$(T).sync();
           let onValue = dart.fn(value => {
             if (!dart.test(completer.isCompleted)) completer.complete(value);
-          }, dart.definiteFunctionType(dart.dynamic, [T]));
+          }, dart.definiteFunctionType(core.Null, [T]));
           let onError = dart.fn((error, stack) => {
             if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           for (let future of futures) {
             future.then(dart.dynamic)(onValue, {onError: onError});
           }
@@ -19063,7 +19066,7 @@
           } else {
             doneSignal[_complete](null);
           }
-        }, boolTodynamic()), {runGuarded: true});
+        }, boolToNull()), {runGuarded: true});
         dart.dcall(nextIteration, true);
         return doneSignal;
       }
@@ -19416,7 +19419,7 @@
     let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
     let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     class _Future extends core.Object {
       new() {
         this[_zone] = async.Zone.current;
@@ -19554,7 +19557,7 @@
           dart.assert(this[_isComplete]);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listener);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_prependListeners](listeners) {
@@ -19582,7 +19585,7 @@
           listeners = this[_reverseListeners](listeners);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listeners);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_removeListeners]() {
@@ -19611,16 +19614,16 @@
             dart.assert(target[_isPendingComplete]);
             target[_clearPendingComplete]();
             target[_complete](value);
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (stackTrace === void 0) stackTrace = null;
               dart.assert(target[_isPendingComplete]);
               target[_completeError](error, core.StackTrace._check(stackTrace));
-            }, dynamic__Todynamic())});
+            }, dynamic__ToNull())});
         } catch (e) {
           let s = dart.stackTrace(e);
           async.scheduleMicrotask(dart.fn(() => {
             target[_completeError](e, s);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
 
       }
@@ -19678,7 +19681,7 @@
               this[_setPendingComplete]();
               this[_zone].scheduleMicrotask(dart.fn(() => {
                 async._Future._chainCoreFuture(coreFuture, this);
-              }, VoidTovoid$()));
+              }, VoidToNull()));
             } else {
               async._Future._chainCoreFuture(coreFuture, this);
             }
@@ -19691,14 +19694,14 @@
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeWithValue](typedValue);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       [_asyncCompleteError](error, stackTrace) {
         dart.assert(!dart.test(this[_isComplete]));
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeError](error, stackTrace);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       static _propagateToListeners(source, listeners) {
         while (true) {
@@ -19842,7 +19845,7 @@
         if (onTimeout == null) {
           timer = async.Timer.new(timeLimit, dart.fn(() => {
             result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         } else {
           let zone = async.Zone.current;
           onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
@@ -19854,19 +19857,19 @@
               result[_completeError](e, s);
             }
 
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
         this.then(dart.dynamic)(dart.fn(v => {
           if (dart.test(timer.isActive)) {
             timer.cancel();
             result[_completeWithValue](v);
           }
-        }, TToFutureOr()), {onError: dart.fn((e, s) => {
+        }, TToNull()), {onError: dart.fn((e, s) => {
             if (dart.test(timer.isActive)) {
               timer.cancel();
               result[_completeError](e, core.StackTrace._check(s));
             }
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return result;
       }
     }
@@ -20048,7 +20051,7 @@
           storedCallback = null;
           f();
         }
-        dart.fn(internalCallback, dynamicTodynamic$());
+        dart.fn(internalCallback, dynamicToNull$());
         ;
         let observer = new _isolate_helper.global.MutationObserver(internalCallback);
         observer.observe(div, {childList: true});
@@ -20057,7 +20060,7 @@
           _isolate_helper.enterJsAsync();
           storedCallback = callback;
           div.firstChild ? div.removeChild(span) : div.appendChild(span);
-        }, _AsyncCallbackTovoid());
+        }, FnToNull());
       } else if (_isolate_helper.global.setImmediate != null) {
         return async._AsyncRun._scheduleImmediateWithSetImmediate;
       }
@@ -20068,7 +20071,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.scheduleImmediate(internalCallback);
@@ -20078,7 +20081,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.setImmediate(internalCallback);
@@ -20492,7 +20495,7 @@
         subscription[_setPendingEvents](pendingEvents);
         subscription[_guardCallback](dart.fn(() => {
           async._runGuarded(this.onListen);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return subscription;
       }
       [_recordCancel](subscription) {
@@ -20752,7 +20755,7 @@
         return dart.fn((e, s) => {
           controller[_addError](e, s);
           controller[_close$]();
-        }, dynamicAndStackTraceTodynamic());
+        }, dynamicAndStackTraceToNull());
       }
       pause() {
         this.addSubscription.pause();
@@ -20768,7 +20771,7 @@
         }
         return cancel.whenComplete(dart.fn(() => {
           this.addStreamFuture[_asyncComplete](null);
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       complete() {
         this.addStreamFuture[_asyncComplete](null);
@@ -20885,7 +20888,7 @@
           this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
           if (oldState == async._PendingEvents._STATE_CANCELED) return;
           this.handleNext(dispatch);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         this[_state] = async._PendingEvents._STATE_SCHEDULED;
       }
       cancelSchedule() {
@@ -21192,7 +21195,7 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_completeWithValue](null);
-          }, VoidTovoid$());
+          }, VoidToNull());
           return result;
         };
       }
@@ -21611,7 +21614,7 @@
   async._cancelAndErrorClosure = function(subscription, future) {
     return dart.fn((error, stackTrace) => {
       async._cancelAndError(subscription, future, error, stackTrace);
-    }, dynamicAndStackTraceTovoid());
+    }, dynamicAndStackTraceToNull());
   };
   dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
   async._cancelAndValue = function(subscription, future, value) {
@@ -23193,7 +23196,7 @@
         if (error == null) error = new core.NullThrownError();
         if (stackTrace == null) dart.throw(error);
         async._rethrow(error, stackTrace);
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     };
   };
   dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
@@ -23629,13 +23632,13 @@
     let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
     let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class _HashMap extends core.Object {
       new() {
         this[_length$1] = 0;
@@ -23683,7 +23686,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(collection._HashMap._isStringKey(key))) {
@@ -24176,11 +24179,11 @@
   collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
     let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
     class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
       new() {
@@ -24213,7 +24216,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         return this[_map$0].get(key);
@@ -25813,7 +25816,7 @@
         let result = HashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -26365,7 +26368,7 @@
         let result = LinkedHashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -27120,7 +27123,7 @@
           result.write(k);
           result.write(': ');
           result.write(v);
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         result.write('}');
       } finally {
         dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
@@ -28247,16 +28250,16 @@
     let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
     let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
     let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
     let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
     let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
     let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
       new(compare, isValidKey) {
         if (compare === void 0) compare = null;
@@ -28279,7 +28282,7 @@
         let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -28365,7 +28368,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       get isEmpty() {
         return this[_root] == null;
@@ -29038,7 +29041,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
     }
     containsValue(value) {
       if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
@@ -31495,7 +31498,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{');
       let separator = '"';
@@ -31596,7 +31599,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{\n');
       this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
@@ -33842,7 +33845,7 @@
           sb.write(": ");
           sb.write(core.Error.safeToString(value));
           i++;
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
       }
       if (this[_existingArgumentNames] == null) {
         return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
@@ -34168,7 +34171,7 @@
       let result = dart.map({}, core.String, dart.dynamic);
       namedArguments[dartx.forEach](dart.fn((symbol, value) => {
         result[dartx._set](core._symbolToString(symbol), value);
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       return result;
     }
   };
@@ -35163,7 +35166,7 @@
             dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
       if (firstSegment === void 0) firstSegment = 0;
@@ -35520,7 +35523,7 @@
             writeParameter(key, value);
           }
         }
-      }, StringAnddynamicTovoid()));
+      }, StringAnddynamicToNull()));
       return result.toString();
     }
     static _makeFragment(fragment, start, end) {
@@ -36508,7 +36511,7 @@
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write('=');
         buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
-      }, StringAndStringTovoid$())));
+      }, StringAndStringToNull())));
     }
     static _validateMimeType(mimeType) {
       let slashIndex = -1;
@@ -39157,7 +39160,7 @@
           this.error(response);
           this.close();
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     onResume() {
       if (!dart.test(this.nextRunning)) {
@@ -39222,7 +39225,7 @@
         } else {
           this.controller.addError(new io.FileSystemException("Internal error"));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     [_cleanup]() {
       this.controller.close();
@@ -39532,13 +39535,13 @@
         if (dart.test(this[_atEnd])) {
           this[_closeFile]();
         }
-      }, ListOfintToFutureOr())).catchError(dart.fn((e, s) => {
+      }, ListOfintToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_unsubscribed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_start$2]() {
       if (dart.notNull(this[_position$0]) < 0) {
@@ -39559,7 +39562,7 @@
               this[_controller$0].addError(e, core.StackTrace._check(s));
               this[_readInProgress] = false;
               this[_closeFile]();
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         } else {
           onReady(file);
         }
@@ -39645,10 +39648,10 @@
             error(e, stackTrace);
           }
 
-        }, ListOfintTovoid$()), {onDone: dart.fn(() => {
+        }, ListOfintToNull()), {onDone: dart.fn(() => {
             completer.complete(this[_file]);
-          }, VoidTovoid$()), onError: error, cancelOnError: true});
-      }, RandomAccessFileToFutureOr())).catchError(dart.bind(completer, 'completeError'));
+          }, VoidToNull()), onError: error, cancelOnError: true});
+      }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
       return completer.future;
     }
     close() {
@@ -39886,7 +39889,7 @@
             } else {
               completer.complete(builder.takeBytes());
             }
-          }, dynamicTodynamic$()), {onError: dart.bind(completer, 'completeError')});
+          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
         }
         dart.fn(read, VoidTovoid$());
         read();
@@ -40437,7 +40440,7 @@
       data[dartx._set](0, this[_pointer]());
       return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
         this[_asyncDispatched] = false;
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     }
     [_checkAvailable]() {
       if (dart.test(this[_asyncDispatched])) {
@@ -42074,7 +42077,7 @@
           sb.write(values[dartx._get](i));
         }
         sb.write("\n");
-      }, StringAndListOfStringTovoid$()));
+      }, StringAndListOfStringToNull()));
       return sb.toString();
     }
     [_parseCookies]() {
@@ -42286,7 +42289,7 @@
           sb.write(name);
           sb.write("=");
           sb.write(value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       return sb.toString();
     }
@@ -42434,7 +42437,7 @@
             value = value[dartx.toLowerCase]();
           }
           this[_parameters][dartx._set](lowerCaseKey, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (charset != null) {
         this[_ensureParameters]();
@@ -42699,7 +42702,7 @@
       this.hasSubscriber = true;
       return this[_stream$].handleError(dart.fn(error => {
         dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-      }, dynamicTodynamic$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     get dataDone() {
       return this[_dataCompleter].future;
@@ -42922,7 +42925,7 @@
       if (values != null) {
         values[dartx.forEach](dart.fn(value => {
           this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
-        }, StringTovoid$()));
+        }, StringToNull()));
       }
       return this[_cookies];
     }
@@ -43146,7 +43149,7 @@
         const targetAddStream = (function() {
           return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
             this[_isBound] = false;
-          }, VoidTodynamic$()));
+          }, VoidToNull()));
         }).bind(this);
         dart.fn(targetAddStream, VoidToFuture());
         if (this[_controllerInstance] == null) return targetAddStream();
@@ -43164,7 +43167,7 @@
         this[_controllerInstance].close();
         return future.whenComplete(dart.fn(() => {
           this[_isBound] = false;
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       close() {
         if (dart.test(this[_isBound])) {
@@ -43215,7 +43218,7 @@
             } else {
               this[_closeTarget]();
             }
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (dart.test(this[_isBound])) {
                 this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
                 this[_controllerCompleter] = null;
@@ -43223,7 +43226,7 @@
               } else {
                 this[_completeDoneError](error, core.StackTrace._check(stackTrace));
               }
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         }
         return this[_controllerInstance];
       }
@@ -43468,7 +43471,7 @@
       }
       this.close();
       this.done.catchError(dart.fn(_ => {
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return future;
     }
     get connectionInfo() {
@@ -43483,7 +43486,7 @@
       if (this[_deadline] == null) return;
       this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
         this[_httpRequest][_httpConnection].destroy();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
     [_writeHeader]() {
       let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
@@ -43548,7 +43551,7 @@
       if (this[_cookies] != null) {
         this[_cookies][dartx.forEach](dart.fn(cookie => {
           this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
-        }, CookieTovoid()));
+        }, CookieToNull()));
       }
       this.headers[_finalize]();
       offset = this.headers[_write](buffer, offset);
@@ -44052,7 +44055,7 @@
         }
         if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
           drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-          }, dynamicTodynamic$()));
+          }, dynamicToNull$()));
         }
       } else {
         drainRequest = false;
@@ -44081,7 +44084,7 @@
       }
       if (dart.test(this.ignoreBody)) {
         stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$()));
+        }, dynamicToNull$()));
         let future = this.writeHeaders();
         if (future != null) {
           return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
@@ -44208,7 +44211,7 @@
           this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
           this[_pendingChunkedFooter] = 2;
           this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
-        }, dynamicTodynamic$())));
+        }, dynamicToNull$())));
       }
     }
     [_ignoreError](error) {
@@ -44364,28 +44367,28 @@
         if (incoming.statusCode == 100) {
           incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
             this[_subscription$].resume();
-          }, dynamicToFutureOr$())).catchError(dart.fn((error, stackTrace) => {
+          }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
             if (stackTrace === void 0) stackTrace = null;
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
-          }, dynamic__Todynamic$()));
+          }, dynamic__ToNull$()));
         } else {
           this[_nextResponseCompleter].complete(incoming);
           this[_nextResponseCompleter] = null;
         }
-      }, _HttpIncomingTovoid$()), {onError: dart.fn((error, stackTrace) => {
+      }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
           if (stackTrace === void 0) stackTrace = null;
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
           }
-        }, dynamic__Todynamic$()), onDone: dart.fn(() => {
+        }, dynamic__ToNull$()), onDone: dart.fn(() => {
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
             this[_nextResponseCompleter] = null;
           }
           this.close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
     }
     send(uri, port, method, proxy) {
       if (dart.test(this.closed)) {
@@ -44441,7 +44444,7 @@
             } else {
               this.destroy();
             }
-          }, dynamicToFutureOr$()));
+          }, dynamicToNull$()));
           if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
             let authInfo = incoming.headers._get("proxy-authentication-info");
             if (authInfo != null && authInfo[dartx.length] == 1) {
@@ -44459,17 +44462,17 @@
             }
           }
           request[_onIncoming](incoming);
-        }, _HttpIncomingToFutureOr())).catchError(dart.fn(error => {
+        }, _HttpIncomingToNull())).catchError(dart.fn(error => {
           dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-        }, dynamicTodynamic$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+        }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
           this.destroy();
           request[_onError$](error, core.StackTrace._check(stackTrace));
-        }, dynamicAnddynamicTodynamic$()));
+        }, dynamicAnddynamicToNull()));
         this[_subscription$].resume();
         return s;
       }, dynamicTodynamic$()), {onError: dart.fn(e => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
       return request;
     }
     detachSocket() {
@@ -44519,7 +44522,7 @@
       this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
         this[_idleTimer] = null;
         this.close();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   dart.setSignature(io._HttpClientConnection, {
@@ -44643,7 +44646,7 @@
         let completer = async.Completer.new();
         this[_pending$].add(dart.fn(() => {
           this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
         return FutureOf_ConnectionInfo()._check(completer.future);
       }
       let currentBadCertificateCallback = client[_badCertificateCallback];
@@ -44672,7 +44675,7 @@
           this[_connecting] = dart.notNull(this[_connecting]) - 1;
           this[_checkPending]();
           dart.throw(error);
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
   };
   dart.setSignature(io._ConnectionTarget, {
@@ -45151,7 +45154,7 @@
         this[_httpServer][_markActive](this);
         incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
           if (dart.test(closing)) this.destroy();
-        }, dynamicToFutureOr$()));
+        }, dynamicToNull$()));
         this[_subscription$].pause();
         this[_state$1] = io._HttpConnection._ACTIVE;
         let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
@@ -45168,17 +45171,17 @@
           } else {
             this.destroy();
           }
-        }, dynamicToFutureOr$()), {onError: dart.fn(_ => {
+        }, dynamicToNull$()), {onError: dart.fn(_ => {
             this.destroy();
-          }, dynamicTodynamic$())});
+          }, dynamicToNull$())});
         outgoing.ignoreBody = request.method == "HEAD";
         response[_httpRequest] = request;
         this[_httpServer][_handleRequest](request);
-      }, _HttpIncomingTovoid$()), {onDone: dart.fn(() => {
+      }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
           this.destroy();
-        }, VoidTovoid$()), onError: dart.fn(error => {
+        }, VoidToNull()), onError: dart.fn(error => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
     markIdle() {
       this[_idleMark] = true;
@@ -45394,7 +45397,7 @@
               idle.markIdle();
             }
           }
-        }, TimerTovoid$()));
+        }, TimerToNull()));
       }
     }
     listen(onData, opts) {
@@ -45405,11 +45408,11 @@
         socket.setOption(io.SocketOption.TCP_NODELAY, true);
         let connection = new io._HttpConnection(socket, this);
         this[_idleConnections].add(connection);
-      }, SocketTodynamic()), {onError: dart.fn((error, stackTrace) => {
+      }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
           if (!io.HandshakeException.is(error)) {
             this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
           }
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.bind(this[_controller$0], 'close')});
+        }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
       return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     close(opts) {
@@ -45487,11 +45490,11 @@
           dart.assert(conn[_isClosing]);
           result.closing = dart.notNull(result.closing) + 1;
         }
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       this[_idleConnections].forEach(dart.fn(conn => {
         result.idle = dart.notNull(result.idle) + 1;
         dart.assert(conn[_isIdle]);
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       return result;
     }
     get [_serviceTypePath]() {
@@ -45666,7 +45669,7 @@
             dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     direct() {
       this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
@@ -46314,7 +46317,7 @@
         if (this[_userOnData] != null) {
           dart.dcall(this[_userOnData], data);
         }
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
@@ -46447,17 +46450,17 @@
       super.new();
       this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
           this[_paused] = false;
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           this[_paused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           this[_paused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       this[_reset]();
     }
     listen(onData, opts) {
@@ -47077,24 +47080,24 @@
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(!dart.test(this[_bodyPaused]));
           this[_bodyPaused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
           this[_closeIncoming](true);
           this[_controller$0].close();
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
       this[_bodyPaused] = true;
       this[_pauseStateChanged]();
@@ -48718,7 +48721,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
     static secureServer(socket, context, opts) {
@@ -48729,7 +48732,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
   };
@@ -48885,11 +48888,11 @@
         } else {
           this[_controller$0].add(secureConnection);
         }
-      }, RawSecureSocketToFutureOr())).catchError(dart.fn((e, s) => {
+      }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_closed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_onPauseStateChange]() {
       if (dart.test(this[_controller$0].isPaused)) {
@@ -49469,7 +49472,7 @@
             }
           }
           this[_tryFilter]();
-        }, _FilterStatusToFutureOr())).catchError(dart.bind(this, _reportError));
+        }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
       }
     }
     [_readSocketOrBufferedData](bytes) {
@@ -50554,7 +50557,7 @@
           completer.completeError(e, s);
         }
 
-      }, ListOfintTovoid$()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
+      }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
       return completer.future;
     }
     close() {
@@ -51546,9 +51549,9 @@
     bind(stream) {
       stream.listen(dart.fn(request => {
         io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
-      }, HttpRequestTovoid$()), {onDone: dart.fn(() => {
+      }, HttpRequestToNull()), {onDone: dart.fn(() => {
           this[_controller$0].close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return this[_controller$0].stream;
     }
     static _upgrade(request, _protocolSelector, compression) {
@@ -51587,7 +51590,7 @@
           response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
           response.close();
           dart.throw(error);
-        }, dynamicTodynamic$())).then(io.WebSocket)(upgrade);
+        }, dynamicToNull$())).then(io.WebSocket)(upgrade);
       } else {
         return FutureOfWebSocket()._check(upgrade(null));
       }
@@ -51617,7 +51620,7 @@
       let isUpgrade = false;
       request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
         if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
-      }, StringTovoid$()));
+      }, StringToNull()));
       if (!isUpgrade) return false;
       let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
       if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
@@ -51812,7 +51815,7 @@
     addFrame(opcode, data) {
       return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
         this[_eventSink$].add(e);
-      }, ListOfintTovoid$()));
+      }, ListOfintToNull()));
     }
     static createFrame(opcode, data, serverSide, compressed) {
       let mask = !dart.test(serverSide);
@@ -51958,7 +51961,7 @@
       this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
         this[_done$]();
         this[_closeCompleter].complete(this.webSocket);
-      }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           this[_closed] = true;
           this[_cancel$]();
           if (core.ArgumentError.is(error)) {
@@ -51969,7 +51972,7 @@
             this[_done$]();
             this[_closeCompleter].complete(this.webSocket);
           }
-        }, dynamicAndStackTraceTodynamic())});
+        }, dynamicAndStackTraceToNull())});
     }
     [_done$](error, stackTrace) {
       if (error === void 0) error = null;
@@ -51992,7 +51995,7 @@
       this[_completer] = async.Completer.new();
       this[_subscription$] = stream.listen(dart.fn(data => {
         this[_controller$0].add(data);
-      }, dynamicTovoid$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
+      }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
       if (dart.test(this[_issuedPause])) {
         this[_subscription$].pause();
         this[_issuedPause] = false;
@@ -52003,7 +52006,7 @@
       this[_ensureController]();
       const closeSocket = (function() {
         return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
       }).bind(this);
       dart.fn(closeSocket, VoidToFuture());
       this[_controller$0].close();
@@ -52094,7 +52097,7 @@
         function error(message) {
           response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
             socket.destroy();
-          }, SocketToFutureOr()));
+          }, SocketToNull()));
           dart.throw(new io.WebSocketException(message));
         }
         dart.fn(error, StringTovoid$());
@@ -52177,7 +52180,7 @@
         } else {
           this[_controller$0].add(data);
         }
-      }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (core.FormatException.is(error)) {
             this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
@@ -52187,7 +52190,7 @@
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
           this[_controller$0].close();
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+        }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (this[_readyState] == io.WebSocket.OPEN) {
             this[_readyState] = io.WebSocket.CLOSING;
@@ -52201,12 +52204,12 @@
           this[_closeCode] = transformer.closeCode;
           this[_closeReason] = transformer.closeReason;
           this[_controller$0].close();
-        }, VoidTodynamic$()), cancelOnError: true}));
+        }, VoidToNull()), cancelOnError: true}));
       this[_subscription$].pause();
       this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
           this[_subscription$].cancel();
           this[_subscription$] = null;
-        }, VoidTodynamic$()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
+        }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
       io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
       try {
         dart.dput(this[_socket], _owner, this);
@@ -52233,8 +52236,8 @@
         this[_consumer].add(new io._WebSocketPing());
         this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
           this[_close$0](io.WebSocketStatus.GOING_AWAY);
-        }, VoidTovoid$()));
-      }, VoidTovoid$()));
+        }, VoidToNull()));
+      }, VoidToNull()));
     }
     get readyState() {
       return this[_readyState];
@@ -52282,7 +52285,7 @@
             if (this[_subscription$] != null) this[_subscription$].cancel();
             this[_controller$0].close();
             io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       return this[_sink$0].close();
@@ -52522,11 +52525,11 @@
       controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
           port = isolate.RawReceivePort.new(handleError);
           this.addErrorListener(port.sendPort);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           this.removeErrorListener(port.sendPort);
           port.close();
           port = null;
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return controller.stream;
     }
   };
@@ -54791,7 +54794,7 @@
         let completer = CompleterOfIdbFactory().sync();
         request[dartx.onSuccess].listen(dart.fn(e => {
           completer.complete(this);
-        }, EventTovoid$()));
+        }, EventToNull()));
         request[dartx.onError].listen(dart.bind(completer, 'completeError'));
         return completer.future;
       } catch (e) {
@@ -54850,7 +54853,7 @@
       request[dartx.onSuccess].listen(dart.fn(e => {
         let result = indexed_db._cast(T)(request[dartx.result]);
         completer.complete(result);
-      }, EventTovoid$()));
+      }, EventToNull()));
       request[dartx.onError].listen(dart.bind(completer, 'completeError'));
       return completer.future;
     };
@@ -55322,7 +55325,7 @@
               cursor[dartx.next]();
             }
           }
-        }, EventTovoid$()));
+        }, EventToNull()));
         return controller.stream;
       };
     }
@@ -55495,15 +55498,15 @@
       let completer = CompleterOfDatabase().new();
       this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
         completer.complete(this[dartx.db]);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
         completer.completeError(e);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
         if (!dart.test(completer.isCompleted)) {
           completer.completeError(e);
         }
-      }, EventToFutureOr()));
+      }, EventToNull()));
       return completer.future;
     }
     static _() {
@@ -61640,9 +61643,9 @@
       let completer = CompleterOfFileSystem().new();
       this[_webkitRequestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.requestFileSystemSync](...args) {
@@ -61658,9 +61661,9 @@
       let completer = CompleterOfEntry().new();
       this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -69300,7 +69303,7 @@
       let completer = CompleterOfString().new();
       this[_getAsString](dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.getAsEntry](...args) {
@@ -69842,9 +69845,9 @@
       let completer = CompleterOfEntry().new();
       this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_getMetadata](...args) {
@@ -69854,9 +69857,9 @@
       let completer = CompleterOfMetadata().new();
       this[_getMetadata](dart.fn(value => {
         completer.complete(value);
-      }, MetadataTovoid()), dart.fn(error => {
+      }, MetadataToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_getParent](...args) {
@@ -69866,9 +69869,9 @@
       let completer = CompleterOfEntry().new();
       this[_getParent](dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_moveTo](...args) {
@@ -69879,9 +69882,9 @@
       let completer = CompleterOfEntry().new();
       this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_remove$](...args) {
@@ -69891,9 +69894,9 @@
       let completer = async.Completer.new();
       this[_remove$](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.toUrl](...args) {
@@ -69992,9 +69995,9 @@
       let completer = CompleterOfEntry().new();
       this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [__getFile](path, opts) {
@@ -70036,9 +70039,9 @@
       let completer = CompleterOfEntry().new();
       this[__getFile](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_removeRecursively](...args) {
@@ -70048,9 +70051,9 @@
       let completer = async.Completer.new();
       this[_removeRecursively](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -70094,9 +70097,9 @@
       let completer = CompleterOfListOfEntry().new();
       this[_readEntries](dart.fn(value => {
         completer.complete(value);
-      }, ListOfEntryTovoid()), dart.fn(error => {
+      }, ListOfEntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -73478,9 +73481,9 @@
       let completer = CompleterOfFileWriter().new();
       this[_createWriter](dart.fn(value => {
         completer.complete(value);
-      }, FileWriterTovoid()), dart.fn(error => {
+      }, FileWriterToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_file$](...args) {
@@ -73490,9 +73493,9 @@
       let completer = CompleterOfFile$().new();
       this[_file$](dart.fn(value => {
         completer.complete(value);
-      }, FileTovoid()), dart.fn(error => {
+      }, FileToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -74556,9 +74559,9 @@
       try {
         this[_getCurrentPosition](dart.fn(position => {
           completer.complete(this[_ensurePosition](position));
-        }, GeopositionTovoid()), dart.fn(error => {
+        }, GeopositionToNull()), dart.fn(error => {
           completer.completeError(error);
-        }, PositionErrorTovoid()), options);
+        }, PositionErrorToNull()), options);
       } catch (e) {
         let stacktrace = dart.stackTrace(e);
         completer.completeError(e, stacktrace);
@@ -74586,13 +74589,13 @@
           dart.assert(watchId == null);
           watchId = this[_watchPosition](dart.fn(position => {
             controller.add(this[_ensurePosition](position));
-          }, GeopositionTovoid()), dart.fn(error => {
+          }, GeopositionToNull()), dart.fn(error => {
             controller.addError(error);
-          }, PositionErrorTovoid()), options);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+          }, PositionErrorToNull()), options);
+        }, VoidToNull()), onCancel: dart.fn(() => {
           dart.assert(watchId != null);
           this[_clearWatch](watchId);
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       return controller.stream;
     }
     [_ensurePosition](domPosition) {
@@ -75996,7 +75999,7 @@
       let parts = [];
       data[dartx.forEach](dart.fn((key, value) => {
         parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       let formData = parts[dartx.join]('&');
       if (requestHeaders == null) {
         requestHeaders = dart.map({}, core.String, core.String);
@@ -76030,7 +76033,7 @@
       if (requestHeaders != null) {
         requestHeaders[dartx.forEach](dart.fn((header, value) => {
           xhr[dartx.setRequestHeader](header, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (onProgress != null) {
         xhr[dartx.onProgress].listen(onProgress);
@@ -76045,7 +76048,7 @@
         } else {
           completer.completeError(e);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
       if (sendData != null) {
         xhr[dartx.send](sendData);
@@ -76082,13 +76085,13 @@
       }
       let xhr = new XDomainRequest();
       xhr.open(method, url);
-      xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         let response = xhr.responseText;
         completer.complete(response);
-      }, dynamicTodynamic$()), 1);
-      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      }, dynamicToNull$()), 1);
+      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         completer.completeError(e);
-      }, dynamicTodynamic$()), 1);
+      }, dynamicToNull$()), 1);
       xhr.onprogress = {};
       xhr.ontimeout = {};
       xhr.timeout = Number.MAX_VALUE;
@@ -79965,7 +79968,7 @@
       let completer = CompleterOfListOfSourceInfo().new();
       html$.MediaStreamTrack._getSources(dart.fn(value => {
         completer.complete(value);
-      }, ListOfSourceInfoTovoid()));
+      }, ListOfSourceInfoToNull()));
       return completer.future;
     }
     [dartx.stop](...args) {
@@ -81186,7 +81189,7 @@
       function override(key, value) {
         if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
       }
-      dart.fn(override, dynamicAnddynamicTodynamic$());
+      dart.fn(override, dynamicAnddynamicToNull());
       override('childList', childList);
       override('attributes', attributes);
       override('characterData', characterData);
@@ -81352,9 +81355,9 @@
       this[_ensureGetUserMedia]();
       this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
         completer.complete(stream);
-      }, MediaStreamTovoid()), dart.fn(error => {
+      }, MediaStreamToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, NavigatorUserMediaErrorTovoid()));
+      }, NavigatorUserMediaErrorToNull()));
       return completer.future;
     }
     [_ensureGetUserMedia]() {
@@ -82226,7 +82229,7 @@
       let completer = CompleterOfString().new();
       html$.Notification._requestPermission(dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     get [dartx.onClick]() {
@@ -85241,9 +85244,9 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createOffer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.createAnswer](mediaConstraints) {
@@ -85251,16 +85254,16 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createAnswer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.getStats](selector) {
       let completer = CompleterOfRtcStatsResponse().new();
       this[_getStats](dart.fn(value => {
         completer.complete(value);
-      }, RtcStatsResponseTovoid()), selector);
+      }, RtcStatsResponseToNull()), selector);
       return completer.future;
     }
     static _() {
@@ -85376,9 +85379,9 @@
       let completer = async.Completer.new();
       this[_setLocalDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [_setRemoteDescription](...args) {
@@ -85388,9 +85391,9 @@
       let completer = async.Completer.new();
       this[_setRemoteDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.updateIce](configuration, mediaConstraints) {
@@ -88208,7 +88211,7 @@
     [dartx.addAll](other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this[dartx._set](k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     [dartx.containsValue](value) {
       return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
@@ -92044,7 +92047,7 @@
       let completer = CompleterOfnum().sync();
       this[dartx.requestAnimationFrame](dart.fn(time => {
         completer.complete(time);
-      }, numTovoid()));
+      }, numToNull()));
       return completer.future;
     }
     get [dartx.document]() {
@@ -92499,9 +92502,9 @@
       let completer = CompleterOfFileSystem().new();
       this[__requestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_resolveLocalFileSystemUrl](...args) {
@@ -92511,9 +92514,9 @@
       let completer = CompleterOfEntry().new();
       this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -93203,7 +93206,7 @@
       stream.listen(dart.fn(event => {
         let wrapped = new html$._BeforeUnloadEvent(event);
         controller.add(wrapped);
-      }, BeforeUnloadEventTovoid()));
+      }, BeforeUnloadEventToNull()));
       return controller.stream;
     }
     getEventType(target) {
@@ -94909,7 +94912,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       for (let v of this.values) {
@@ -95096,7 +95099,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
@@ -95127,7 +95130,7 @@
         if (dart.test(this[_matches](key))) {
           f(this[_strip](key), value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     get keys() {
       let keys = JSArrayOfString().of([]);
@@ -95135,7 +95138,7 @@
         if (dart.test(this[_matches](key))) {
           keys[dartx.add](this[_strip](key));
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return keys;
     }
     get values() {
@@ -95144,7 +95147,7 @@
         if (dart.test(this[_matches](key))) {
           values[dartx.add](value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return values;
     }
     get length() {
@@ -98401,7 +98404,7 @@
         if (request[dartx.readyState] == html$.HttpRequest.DONE) {
           onComplete(request);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       request[dartx.send]();
       return request;
     }
@@ -99147,7 +99150,7 @@
         this.writeSlot(slot, copy);
         e[dartx.forEach](dart.fn((key, value) => {
           this.putIntoMap(copy, key, this.walk(value));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return copy;
       }
       if (core.List.is(e)) {
@@ -99356,7 +99359,7 @@
     }
     dict[dartx.forEach](dart.fn((key, value) => {
       object[key] = value;
-    }, StringAnddynamicTovoid()));
+    }, StringAnddynamicToNull()));
     return object;
   };
   dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
@@ -99381,7 +99384,7 @@
     let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
     return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
   };
-  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic$0());
+  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
   html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
     new() {
       super.new();
@@ -107352,13 +107355,13 @@
       let completer = CompleterOfAudioBuffer().new();
       this[_decodeAudioData](audioData, dart.fn(value => {
         completer.complete(value);
-      }, AudioBufferTovoid()), dart.fn(error => {
+      }, AudioBufferToNull()), dart.fn(error => {
         if (error == null) {
           completer.completeError('');
         } else {
           completer.completeError(error);
         }
-      }, AudioBufferTovoid()));
+      }, AudioBufferToNull()));
       return completer.future;
     }
   };
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 7d32f3c..a35267b 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -549,6 +549,7 @@
   let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
   let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
   let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
+  let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
   let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
   let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
   let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
@@ -654,13 +655,12 @@
   let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
   let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
   let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
-  let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
+  let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
   let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
   let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
   let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
-  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+  let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
+  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
   let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
   let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
   let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -674,19 +674,22 @@
   let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
   let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
   let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
+  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
   let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
   let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
   let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
   let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
   let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
+  let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
+  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
   let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-  let ListToFutureOr = () => (ListToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [core.List])))();
-  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
-  let dynamicToFutureOr$ = () => (dynamicToFutureOr$ = dart.constFn(dart.definiteFunctionType(async.FutureOr, [dart.dynamic])))();
-  let TimerTovoid$ = () => (TimerTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
+  let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
+  let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
+  let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+  let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
   let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
-  let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
+  let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
   let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
   let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
@@ -729,7 +732,7 @@
   let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
   let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
-  let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
+  let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -742,11 +745,12 @@
   let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
   let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
   let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
+  let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
   let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
   let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
+  let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
   let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
-  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
+  let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
   let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
   let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
   let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
@@ -787,10 +791,11 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
+  let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
   let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
   let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
   let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -815,10 +820,10 @@
   let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
   let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
   let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
-  let ListOfintToFutureOr = () => (ListOfintToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [ListOfint()])))();
+  let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
   let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
-  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
   let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
   let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
@@ -835,7 +840,8 @@
   let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
   let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
   let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let StringAndListOfStringTovoid$ = () => (StringAndListOfStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, ListOfString()])))();
+  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
   let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
   let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
   let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
@@ -846,15 +852,14 @@
   let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
   let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
   let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
-  let CookieTovoid = () => (CookieTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Cookie])))();
+  let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
   let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
   let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
   let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
   let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
   let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.StackTrace])))();
-  let _HttpIncomingTovoid$ = () => (_HttpIncomingTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpIncoming])))();
-  let _HttpIncomingToFutureOr = () => (_HttpIncomingToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._HttpIncoming])))();
+  let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+  let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
   let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
   let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
   let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
@@ -871,8 +876,8 @@
   let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
   let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
   let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketTodynamic = () => (SocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.Socket])))();
-  let _HttpConnectionTovoid = () => (_HttpConnectionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpConnection])))();
+  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+  let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
   let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
   let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
   let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
@@ -886,22 +891,22 @@
   let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
   let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
   let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
-  let RawSecureSocketToFutureOr = () => (RawSecureSocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RawSecureSocket])))();
+  let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
   let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
-  let _FilterStatusToFutureOr = () => (_FilterStatusToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._FilterStatus])))();
+  let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
   let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
   let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
   let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
   let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
   let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
   let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
-  let HttpRequestTovoid$ = () => (HttpRequestTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpRequest])))();
+  let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
   let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
   let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
   let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
   let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
-  let SocketToFutureOr = () => (SocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.Socket])))();
   let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
@@ -920,36 +925,35 @@
   let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
   let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
   let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-  let EventTovoid$ = () => (EventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Event])))();
+  let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
   let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
   let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-  let EventToFutureOr = () => (EventToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [html$.Event])))();
   let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
   let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
   let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
   let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-  let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileSystem])))();
-  let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileError])))();
-  let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Entry])))();
+  let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
+  let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
+  let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
   let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
   let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
-  let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Metadata])))();
-  let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
+  let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
+  let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
   let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
-  let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileWriter])))();
-  let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.File])))();
-  let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Geoposition])))();
-  let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.PositionError])))();
+  let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
+  let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
+  let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
+  let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
   let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
-  let ProgressEventTovoid$ = () => (ProgressEventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.ProgressEvent])))();
-  let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
-  let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.MediaStream])))();
-  let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.NavigatorUserMediaError])))();
-  let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription])))();
-  let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcStatsResponse])))();
+  let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
+  let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
+  let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
+  let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
+  let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
+  let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
   let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
-  let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
-  let BeforeUnloadEventTovoid = () => (BeforeUnloadEventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.BeforeUnloadEvent])))();
+  let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
+  let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
   let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
   let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
   let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
@@ -976,9 +980,9 @@
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
-  let dynamic__Todynamic$0 = () => (dynamic__Todynamic$0 = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
+  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
   let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
-  let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
+  let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
   dart.mixin = function(base, ...mixins) {
     class Mixin extends base {}
     for (let m of mixins) {
@@ -1705,10 +1709,7 @@
         return null;
       }
     }
-    if (ret2 === dart.void) return true;
-    if (ret1 === dart.void) {
-      return ret2 === dart.dynamic || ret2 === async.FutureOr;
-    }
+    if (ret1 === dart.void) return dart._isTop(ret2);
     if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
     return true;
   };
@@ -1729,13 +1730,13 @@
     };
   };
   dart._isBottom = function(type) {
-    return type == dart.bottom;
+    return type == dart.bottom || type == core.Null;
   };
   dart._isTop = function(type) {
     if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
       return dart._isTop(dart.getGenericArgs(type)[0]);
     }
-    return type == core.Object || type == dart.dynamic;
+    return type == core.Object || type == dart.dynamic || type == dart.void;
   };
   dart._isSubtype = function(t1, t2, isCovariant) {
     if (t1 === t2) return true;
@@ -2182,6 +2183,9 @@
     return false;
   };
   dart.is = function(obj, type) {
+    if (obj == null) {
+      return type == core.Null || dart._isTop(type);
+    }
     let result = dart.strongInstanceOf(obj, type);
     if (result !== null) return result;
     let actual = dart.getReifiedType(obj);
@@ -3292,7 +3296,7 @@
       if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
         this.asMap()[dartx.forEach](dart.fn((i, element) => {
           children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
-        }, intAnddynamicTovoid()));
+        }, intAnddynamicToNull()));
       } else {
         for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
           let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
@@ -3693,14 +3697,14 @@
         } else {
           nonGenericProperties._set(core.String._check(name), value);
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
       nonGenericProperties.forEach(dart.fn((name, value) => {
         if (core.Type.is(value)) {
           children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
         } else {
           children.add(new _debugger.NameValuePair({name: name, value: value}));
         }
-      }, StringAndObjectTovoid()));
+      }, StringAndObjectToNull()));
       return children.toList();
     }
     recordGenericParameters(name, genericTypeConstructor) {
@@ -3769,7 +3773,7 @@
       map[dartx.forEach](dart.fn((key, value) => {
         let entryWrapper = new _debugger.MapEntry({key: key, value: value});
         entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       _debugger.addMetadataChildren(object, entries);
       return entries.toList();
     }
@@ -9205,11 +9209,11 @@
     if (_isolate_helper._MainFunctionArgs.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args, null);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else {
       rootContext.eval(core.Function._check(entry));
     }
@@ -9651,7 +9655,7 @@
           if (!dart.test(this.runIteration())) return;
           async.Timer.run(next);
         }).bind(this);
-        dart.fn(next, VoidTodynamic$());
+        dart.fn(next, VoidToNull());
         next();
       } else {
         while (dart.test(this.runIteration())) {
@@ -9804,7 +9808,7 @@
           let context = new _isolate_helper._IsolateContext();
           _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
             _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
-          }, VoidTodynamic$()), 'worker-start');
+          }, VoidToNull()), 'worker-start');
           _isolate_helper._globalState.currentContext = context;
           _isolate_helper._globalState.topEventLoop.run();
           break;
@@ -9854,9 +9858,9 @@
       let replyPort = dart.dindex(msg, 'replyPort');
       _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
         dart.dsend(replyPort, 'send', msg);
-      }, ListToFutureOr()), {onError: dart.fn(errorMessage => {
+      }, ListToNull()), {onError: dart.fn(errorMessage => {
           dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
-        }, StringTodynamic())});
+        }, StringToNull())});
     }
     static _log(msg) {
       if (dart.test(_isolate_helper._globalState.isWorker)) {
@@ -9913,7 +9917,7 @@
           dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
           completer.completeError(dart.dindex(msg, 1));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
       let signalReply = port.sendPort;
       if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
         _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
@@ -9939,7 +9943,7 @@
       _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
         let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
         _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
-      }, VoidTodynamic$()), 'nonworker start');
+      }, VoidToNull()), 'nonworker start');
     }
     static get currentIsolate() {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -10084,7 +10088,7 @@
         if (!dart.test(this[_receivePort][_isClosed])) {
           this[_receivePort][_add](msg);
         }
-      }, VoidTodynamic$()), dart.str`receive ${message}`);
+      }, VoidToNull()), dart.str`receive ${message}`);
     }
     ['=='](other) {
       return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
@@ -10218,13 +10222,11 @@
     let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
     let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
     let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
     let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
     let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
     let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
     let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
     let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
     let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
@@ -10239,12 +10241,14 @@
     let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
     let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
     let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
+    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
     let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
     let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
     let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
     let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
     let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
+    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
     let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
@@ -10252,11 +10256,10 @@
     let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
     let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
     let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
-    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
-    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
+    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     class Stream extends core.Object {
       new() {
       }
@@ -10270,10 +10273,10 @@
         future.then(dart.dynamic)(dart.fn(value => {
           controller[_add$](value);
           controller[_closeUnchecked]();
-        }, TToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+        }, TToNull()), {onError: dart.fn((error, stackTrace) => {
             controller[_addError](error, core.StackTrace._check(stackTrace));
             controller[_closeUnchecked]();
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return controller.stream;
       }
       static fromFutures(futures) {
@@ -10284,13 +10287,13 @@
             controller[_add$](value);
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, TTodynamic$());
+        }, TToNull());
         let onError = dart.fn((error, stack) => {
           if (!dart.test(controller.isClosed)) {
             controller[_addError](error, core.StackTrace._check(stack));
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, dynamicAnddynamicTodynamic$());
+        }, dynamicAnddynamicToNull());
         for (let future of futures) {
           count++;
           future.then(dart.dynamic)(onValue, {onError: onError});
@@ -10327,17 +10330,17 @@
           dart.assert(timer == null);
           timer = async.Timer.periodic(period, dart.fn(timer => {
             sendEvent();
-          }, TimerTovoid$()));
+          }, TimerToNull()));
         }
         dart.fn(startPeriodicTimer, VoidTovoid$());
         controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
             watch.start();
             startPeriodicTimer();
-          }, VoidTovoid$()), onPause: dart.fn(() => {
+          }, VoidToNull()), onPause: dart.fn(() => {
             timer.cancel();
             timer = null;
             watch.stop();
-          }, VoidTovoid$()), onResume: dart.fn(() => {
+          }, VoidToNull()), onResume: dart.fn(() => {
             dart.assert(timer == null);
             let elapsed = watch.elapsed;
             watch.start();
@@ -10345,11 +10348,11 @@
               timer = null;
               startPeriodicTimer();
               sendEvent();
-            }, VoidTovoid$()));
-          }, VoidTovoid$()), onCancel: dart.fn(() => {
+            }, VoidToNull()));
+          }, VoidToNull()), onCancel: dart.fn(() => {
             if (timer != null) timer.cancel();
             timer = null;
-          }, VoidTodynamic$())});
+          }, VoidToNull())});
         return controller.stream;
       }
       static eventTransformed(source, mapSink) {
@@ -10396,21 +10399,21 @@
               } else {
                 controller.add(E.as(newValue));
               }
-            }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10436,21 +10439,21 @@
                 subscription.pause();
                 controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
               }
-            }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10484,12 +10487,12 @@
           if (seenFirst) {
             async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
               value = newValue;
-            }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
+            }, TToNull()), async._cancelAndErrorClosure(subscription, result));
           } else {
             value = element;
             seenFirst = true;
           }
-        }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
             if (!seenFirst) {
               try {
                 dart.throw(_internal.IterableElementError.noElement());
@@ -10501,7 +10504,7 @@
             } else {
               result[_complete](value);
             }
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       fold(S) {
@@ -10512,12 +10515,12 @@
           subscription = this.listen(dart.fn(element => {
             async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
               value = newValue;
-            }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
-          }, TTovoid$()), {onError: dart.fn((e, st) => {
+            }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
+          }, TToNull()), {onError: dart.fn((e, st) => {
               result[_completeError](e, core.StackTrace._check(st));
-            }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+            }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
               result[_complete](value);
-            }, VoidTovoid$()), cancelOnError: true});
+            }, VoidToNull()), cancelOnError: true});
           return result;
         };
       }
@@ -10539,11 +10542,11 @@
             async._cancelAndErrorWithReplacement(subscription, result, e, s);
           }
 
-        }, TTovoid$()), {onError: dart.fn(e => {
+        }, TToNull()), {onError: dart.fn(e => {
             result[_completeError](e);
-          }, dynamicTodynamic$()), onDone: dart.fn(() => {
+          }, dynamicToNull$()), onDone: dart.fn(() => {
             result[_complete](buffer.toString());
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       contains(needle) {
@@ -10554,10 +10557,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       forEach(action) {
@@ -10565,10 +10568,10 @@
         let subscription = null;
         subscription = this.listen(dart.fn(element => {
           async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
-          }, dynamicTodynamic$()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](null);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       every(test) {
@@ -10579,10 +10582,10 @@
             if (!dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, false);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       any(test) {
@@ -10593,10 +10596,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get length() {
@@ -10604,9 +10607,9 @@
         let count = 0;
         this.listen(dart.fn(_ => {
           count++;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](count);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get isEmpty() {
@@ -10614,9 +10617,9 @@
         let subscription = null;
         subscription = this.listen(dart.fn(_ => {
           async._cancelAndValue(subscription, future, false);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toList() {
@@ -10624,9 +10627,9 @@
         let future = new (_FutureOfListOfT())();
         this.listen(dart.fn(data => {
           result[dartx.add](data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toSet() {
@@ -10634,9 +10637,9 @@
         let future = new (_FutureOfSetOfT())();
         this.listen(dart.fn(data => {
           result.add(data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       drain(E) {
@@ -10666,7 +10669,7 @@
         let subscription = null;
         subscription = this.listen(dart.fn(value => {
           async._cancelAndValue(subscription, future, value);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             try {
               dart.throw(_internal.IterableElementError.noElement());
             } catch (e) {
@@ -10674,7 +10677,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get last() {
@@ -10684,7 +10687,7 @@
         this.listen(dart.fn(value => {
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10696,7 +10699,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get single() {
@@ -10717,7 +10720,7 @@
           }
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10729,7 +10732,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       firstWhere(test, opts) {
@@ -10741,8 +10744,8 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, value);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (defaultValue != null) {
               async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
               return;
@@ -10754,7 +10757,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       lastWhere(test, opts) {
@@ -10769,8 +10772,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10786,7 +10789,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       singleWhere(test) {
@@ -10810,8 +10813,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10823,7 +10826,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       elementAt(index) {
@@ -10837,9 +10840,9 @@
             return;
           }
           elementIndex = elementIndex + 1;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       timeout(timeLimit, opts) {
@@ -10873,7 +10876,7 @@
           if (onTimeout == null) {
             timeout = dart.fn(() => {
               controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
-            }, VoidTovoid$());
+            }, VoidToNull());
           } else {
             let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
             let wrapper = new async._ControllerEventSinkWrapper(null);
@@ -10881,7 +10884,7 @@
               wrapper[_sink] = controller;
               zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
               wrapper[_sink] = null;
-            }, VoidTovoid$());
+            }, VoidToNull());
           }
           subscription = this.listen(onData, {onError: onError, onDone: onDone});
           timer = zone.createTimer(timeLimit, timeout);
@@ -10897,10 +10900,10 @@
         controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
           timer.cancel();
           subscription.pause();
-        }, VoidTovoid$()), dart.fn(() => {
+        }, VoidToNull()), dart.fn(() => {
           subscription.resume();
           timer = zone.createTimer(timeLimit, timeout);
-        }, VoidTovoid$()), onCancel);
+        }, VoidToNull()), onCancel);
         return controller.stream;
       }
     }
@@ -11047,7 +11050,7 @@
         _isolate_helper.enterJsAsync();
         this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
           callback(this);
-        }, VoidTodynamic$()), milliseconds);
+        }, VoidToNull()), milliseconds);
       } else {
         dart.throw(new core.UnsupportedError("Periodic timer."));
       }
@@ -12478,14 +12481,14 @@
     let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
     let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class JsLinkedHashMap extends core.Object {
       new() {
         this[_length$0] = 0;
@@ -12540,7 +12543,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
@@ -13810,7 +13813,7 @@
     let obj = {};
     map[dartx.forEach](dart.fn((key, value) => {
       obj[_js_mirrors.getName(key)] = value;
-    }, SymbolAnddynamicTovoid()));
+    }, SymbolAnddynamicToNull()));
     return obj;
   };
   dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
@@ -14025,7 +14028,7 @@
         constructors[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
@@ -14040,23 +14043,23 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let methods = _js_mirrors._getMethods(unwrapped);
         methods[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let getters = _js_mirrors._getGetters(unwrapped);
         getters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let setters = _js_mirrors._getSetters(unwrapped);
         setters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
           symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
         staticFields[dartx.forEach](dart.fn((symbol, t) => {
           let name = _js_mirrors.getName(symbol);
@@ -14066,22 +14069,22 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let statics = _js_mirrors._getStatics(unwrapped);
         statics[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
         staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
         staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -17931,11 +17934,11 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_complete](futureValue);
-          }, VoidTovoid$());
+          }, VoidToNull());
           this[_onError] = dart.fn((error, stackTrace) => {
             this.cancel();
             result[_completeError](error, core.StackTrace._check(stackTrace));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           return result;
         };
       }
@@ -18611,7 +18614,7 @@
   async._SyncBroadcastStreamController$ = dart.generic(T => {
     let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
     let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
+    let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
     class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
       new(onListen, onCancel) {
         super.new(onListen, onCancel);
@@ -18640,19 +18643,19 @@
         }
         this[_forEachListener](dart.fn(subscription => {
           subscription[_add$](data);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendError](error, stackTrace) {
         if (dart.test(this[_isEmpty])) return;
         this[_forEachListener](dart.fn(subscription => {
           subscription[_addError](error, stackTrace);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendDone]() {
         if (!dart.test(this[_isEmpty])) {
           this[_forEachListener](dart.fn(subscription => {
             subscription[_close$]();
-          }, _BufferingStreamSubscriptionOfTTovoid()));
+          }, _BufferingStreamSubscriptionOfTToNull()));
         } else {
           dart.assert(this[_doneFuture] != null);
           dart.assert(this[_doneFuture][_mayComplete]);
@@ -18903,7 +18906,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static microtask(computation) {
@@ -18916,7 +18919,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static sync(computation) {
@@ -18956,7 +18959,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static wait(T) {
@@ -18976,7 +18979,7 @@
                   if (value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                 }
               }
@@ -19006,13 +19009,13 @@
                   if (cleanUp != null && value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                   if (remaining == 0 && !dart.test(eagerError)) {
                     result[_completeError](error, stackTrace);
                   }
                 }
-              }, dart.definiteFunctionType(async.FutureOr, [T])), {onError: handleError});
+              }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
               remaining++;
             }
             if (remaining == 0) {
@@ -19037,10 +19040,10 @@
           let completer = async.Completer$(T).sync();
           let onValue = dart.fn(value => {
             if (!dart.test(completer.isCompleted)) completer.complete(value);
-          }, dart.definiteFunctionType(dart.dynamic, [T]));
+          }, dart.definiteFunctionType(core.Null, [T]));
           let onError = dart.fn((error, stack) => {
             if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           for (let future of futures) {
             future.then(dart.dynamic)(onValue, {onError: onError});
           }
@@ -19063,7 +19066,7 @@
           } else {
             doneSignal[_complete](null);
           }
-        }, boolTodynamic()), {runGuarded: true});
+        }, boolToNull()), {runGuarded: true});
         dart.dcall(nextIteration, true);
         return doneSignal;
       }
@@ -19416,7 +19419,7 @@
     let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
     let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     class _Future extends core.Object {
       new() {
         this[_zone] = async.Zone.current;
@@ -19554,7 +19557,7 @@
           dart.assert(this[_isComplete]);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listener);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_prependListeners](listeners) {
@@ -19582,7 +19585,7 @@
           listeners = this[_reverseListeners](listeners);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listeners);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_removeListeners]() {
@@ -19611,16 +19614,16 @@
             dart.assert(target[_isPendingComplete]);
             target[_clearPendingComplete]();
             target[_complete](value);
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (stackTrace === void 0) stackTrace = null;
               dart.assert(target[_isPendingComplete]);
               target[_completeError](error, core.StackTrace._check(stackTrace));
-            }, dynamic__Todynamic())});
+            }, dynamic__ToNull())});
         } catch (e) {
           let s = dart.stackTrace(e);
           async.scheduleMicrotask(dart.fn(() => {
             target[_completeError](e, s);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
 
       }
@@ -19678,7 +19681,7 @@
               this[_setPendingComplete]();
               this[_zone].scheduleMicrotask(dart.fn(() => {
                 async._Future._chainCoreFuture(coreFuture, this);
-              }, VoidTovoid$()));
+              }, VoidToNull()));
             } else {
               async._Future._chainCoreFuture(coreFuture, this);
             }
@@ -19691,14 +19694,14 @@
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeWithValue](typedValue);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       [_asyncCompleteError](error, stackTrace) {
         dart.assert(!dart.test(this[_isComplete]));
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeError](error, stackTrace);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       static _propagateToListeners(source, listeners) {
         while (true) {
@@ -19842,7 +19845,7 @@
         if (onTimeout == null) {
           timer = async.Timer.new(timeLimit, dart.fn(() => {
             result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         } else {
           let zone = async.Zone.current;
           onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
@@ -19854,19 +19857,19 @@
               result[_completeError](e, s);
             }
 
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
         this.then(dart.dynamic)(dart.fn(v => {
           if (dart.test(timer.isActive)) {
             timer.cancel();
             result[_completeWithValue](v);
           }
-        }, TToFutureOr()), {onError: dart.fn((e, s) => {
+        }, TToNull()), {onError: dart.fn((e, s) => {
             if (dart.test(timer.isActive)) {
               timer.cancel();
               result[_completeError](e, core.StackTrace._check(s));
             }
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return result;
       }
     }
@@ -20048,7 +20051,7 @@
           storedCallback = null;
           f();
         }
-        dart.fn(internalCallback, dynamicTodynamic$());
+        dart.fn(internalCallback, dynamicToNull$());
         ;
         let observer = new _isolate_helper.global.MutationObserver(internalCallback);
         observer.observe(div, {childList: true});
@@ -20057,7 +20060,7 @@
           _isolate_helper.enterJsAsync();
           storedCallback = callback;
           div.firstChild ? div.removeChild(span) : div.appendChild(span);
-        }, _AsyncCallbackTovoid());
+        }, FnToNull());
       } else if (_isolate_helper.global.setImmediate != null) {
         return async._AsyncRun._scheduleImmediateWithSetImmediate;
       }
@@ -20068,7 +20071,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.scheduleImmediate(internalCallback);
@@ -20078,7 +20081,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.setImmediate(internalCallback);
@@ -20492,7 +20495,7 @@
         subscription[_setPendingEvents](pendingEvents);
         subscription[_guardCallback](dart.fn(() => {
           async._runGuarded(this.onListen);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return subscription;
       }
       [_recordCancel](subscription) {
@@ -20752,7 +20755,7 @@
         return dart.fn((e, s) => {
           controller[_addError](e, s);
           controller[_close$]();
-        }, dynamicAndStackTraceTodynamic());
+        }, dynamicAndStackTraceToNull());
       }
       pause() {
         this.addSubscription.pause();
@@ -20768,7 +20771,7 @@
         }
         return cancel.whenComplete(dart.fn(() => {
           this.addStreamFuture[_asyncComplete](null);
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       complete() {
         this.addStreamFuture[_asyncComplete](null);
@@ -20885,7 +20888,7 @@
           this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
           if (oldState == async._PendingEvents._STATE_CANCELED) return;
           this.handleNext(dispatch);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         this[_state] = async._PendingEvents._STATE_SCHEDULED;
       }
       cancelSchedule() {
@@ -21192,7 +21195,7 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_completeWithValue](null);
-          }, VoidTovoid$());
+          }, VoidToNull());
           return result;
         };
       }
@@ -21611,7 +21614,7 @@
   async._cancelAndErrorClosure = function(subscription, future) {
     return dart.fn((error, stackTrace) => {
       async._cancelAndError(subscription, future, error, stackTrace);
-    }, dynamicAndStackTraceTovoid());
+    }, dynamicAndStackTraceToNull());
   };
   dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
   async._cancelAndValue = function(subscription, future, value) {
@@ -23193,7 +23196,7 @@
         if (error == null) error = new core.NullThrownError();
         if (stackTrace == null) dart.throw(error);
         async._rethrow(error, stackTrace);
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     };
   };
   dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
@@ -23629,13 +23632,13 @@
     let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
     let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class _HashMap extends core.Object {
       new() {
         this[_length$1] = 0;
@@ -23683,7 +23686,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(collection._HashMap._isStringKey(key))) {
@@ -24176,11 +24179,11 @@
   collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
     let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
     class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
       new() {
@@ -24213,7 +24216,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         return this[_map$0].get(key);
@@ -25813,7 +25816,7 @@
         let result = HashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -26365,7 +26368,7 @@
         let result = LinkedHashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -27120,7 +27123,7 @@
           result.write(k);
           result.write(': ');
           result.write(v);
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         result.write('}');
       } finally {
         dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
@@ -28247,16 +28250,16 @@
     let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
     let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
     let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
     let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
     let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
     let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
       new(compare, isValidKey) {
         if (compare === void 0) compare = null;
@@ -28279,7 +28282,7 @@
         let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -28365,7 +28368,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       get isEmpty() {
         return this[_root] == null;
@@ -29038,7 +29041,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
     }
     containsValue(value) {
       if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
@@ -31495,7 +31498,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{');
       let separator = '"';
@@ -31596,7 +31599,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{\n');
       this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
@@ -33842,7 +33845,7 @@
           sb.write(": ");
           sb.write(core.Error.safeToString(value));
           i++;
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
       }
       if (this[_existingArgumentNames] == null) {
         return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
@@ -34168,7 +34171,7 @@
       let result = dart.map({}, core.String, dart.dynamic);
       namedArguments[dartx.forEach](dart.fn((symbol, value) => {
         result[dartx._set](core._symbolToString(symbol), value);
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       return result;
     }
   };
@@ -35163,7 +35166,7 @@
             dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
       if (firstSegment === void 0) firstSegment = 0;
@@ -35520,7 +35523,7 @@
             writeParameter(key, value);
           }
         }
-      }, StringAnddynamicTovoid()));
+      }, StringAnddynamicToNull()));
       return result.toString();
     }
     static _makeFragment(fragment, start, end) {
@@ -36508,7 +36511,7 @@
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write('=');
         buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
-      }, StringAndStringTovoid$())));
+      }, StringAndStringToNull())));
     }
     static _validateMimeType(mimeType) {
       let slashIndex = -1;
@@ -39157,7 +39160,7 @@
           this.error(response);
           this.close();
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     onResume() {
       if (!dart.test(this.nextRunning)) {
@@ -39222,7 +39225,7 @@
         } else {
           this.controller.addError(new io.FileSystemException("Internal error"));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     [_cleanup]() {
       this.controller.close();
@@ -39532,13 +39535,13 @@
         if (dart.test(this[_atEnd])) {
           this[_closeFile]();
         }
-      }, ListOfintToFutureOr())).catchError(dart.fn((e, s) => {
+      }, ListOfintToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_unsubscribed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_start$2]() {
       if (dart.notNull(this[_position$0]) < 0) {
@@ -39559,7 +39562,7 @@
               this[_controller$0].addError(e, core.StackTrace._check(s));
               this[_readInProgress] = false;
               this[_closeFile]();
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         } else {
           onReady(file);
         }
@@ -39645,10 +39648,10 @@
             error(e, stackTrace);
           }
 
-        }, ListOfintTovoid$()), {onDone: dart.fn(() => {
+        }, ListOfintToNull()), {onDone: dart.fn(() => {
             completer.complete(this[_file]);
-          }, VoidTovoid$()), onError: error, cancelOnError: true});
-      }, RandomAccessFileToFutureOr())).catchError(dart.bind(completer, 'completeError'));
+          }, VoidToNull()), onError: error, cancelOnError: true});
+      }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
       return completer.future;
     }
     close() {
@@ -39886,7 +39889,7 @@
             } else {
               completer.complete(builder.takeBytes());
             }
-          }, dynamicTodynamic$()), {onError: dart.bind(completer, 'completeError')});
+          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
         }
         dart.fn(read, VoidTovoid$());
         read();
@@ -40437,7 +40440,7 @@
       data[dartx._set](0, this[_pointer]());
       return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
         this[_asyncDispatched] = false;
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     }
     [_checkAvailable]() {
       if (dart.test(this[_asyncDispatched])) {
@@ -42074,7 +42077,7 @@
           sb.write(values[dartx._get](i));
         }
         sb.write("\n");
-      }, StringAndListOfStringTovoid$()));
+      }, StringAndListOfStringToNull()));
       return sb.toString();
     }
     [_parseCookies]() {
@@ -42286,7 +42289,7 @@
           sb.write(name);
           sb.write("=");
           sb.write(value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       return sb.toString();
     }
@@ -42434,7 +42437,7 @@
             value = value[dartx.toLowerCase]();
           }
           this[_parameters][dartx._set](lowerCaseKey, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (charset != null) {
         this[_ensureParameters]();
@@ -42699,7 +42702,7 @@
       this.hasSubscriber = true;
       return this[_stream$].handleError(dart.fn(error => {
         dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-      }, dynamicTodynamic$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     get dataDone() {
       return this[_dataCompleter].future;
@@ -42922,7 +42925,7 @@
       if (values != null) {
         values[dartx.forEach](dart.fn(value => {
           this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
-        }, StringTovoid$()));
+        }, StringToNull()));
       }
       return this[_cookies];
     }
@@ -43146,7 +43149,7 @@
         const targetAddStream = (function() {
           return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
             this[_isBound] = false;
-          }, VoidTodynamic$()));
+          }, VoidToNull()));
         }).bind(this);
         dart.fn(targetAddStream, VoidToFuture());
         if (this[_controllerInstance] == null) return targetAddStream();
@@ -43164,7 +43167,7 @@
         this[_controllerInstance].close();
         return future.whenComplete(dart.fn(() => {
           this[_isBound] = false;
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       close() {
         if (dart.test(this[_isBound])) {
@@ -43215,7 +43218,7 @@
             } else {
               this[_closeTarget]();
             }
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (dart.test(this[_isBound])) {
                 this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
                 this[_controllerCompleter] = null;
@@ -43223,7 +43226,7 @@
               } else {
                 this[_completeDoneError](error, core.StackTrace._check(stackTrace));
               }
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         }
         return this[_controllerInstance];
       }
@@ -43468,7 +43471,7 @@
       }
       this.close();
       this.done.catchError(dart.fn(_ => {
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return future;
     }
     get connectionInfo() {
@@ -43483,7 +43486,7 @@
       if (this[_deadline] == null) return;
       this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
         this[_httpRequest][_httpConnection].destroy();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
     [_writeHeader]() {
       let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
@@ -43548,7 +43551,7 @@
       if (this[_cookies] != null) {
         this[_cookies][dartx.forEach](dart.fn(cookie => {
           this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
-        }, CookieTovoid()));
+        }, CookieToNull()));
       }
       this.headers[_finalize]();
       offset = this.headers[_write](buffer, offset);
@@ -44052,7 +44055,7 @@
         }
         if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
           drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-          }, dynamicTodynamic$()));
+          }, dynamicToNull$()));
         }
       } else {
         drainRequest = false;
@@ -44081,7 +44084,7 @@
       }
       if (dart.test(this.ignoreBody)) {
         stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$()));
+        }, dynamicToNull$()));
         let future = this.writeHeaders();
         if (future != null) {
           return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
@@ -44208,7 +44211,7 @@
           this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
           this[_pendingChunkedFooter] = 2;
           this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
-        }, dynamicTodynamic$())));
+        }, dynamicToNull$())));
       }
     }
     [_ignoreError](error) {
@@ -44364,28 +44367,28 @@
         if (incoming.statusCode == 100) {
           incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
             this[_subscription$].resume();
-          }, dynamicToFutureOr$())).catchError(dart.fn((error, stackTrace) => {
+          }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
             if (stackTrace === void 0) stackTrace = null;
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
-          }, dynamic__Todynamic$()));
+          }, dynamic__ToNull$()));
         } else {
           this[_nextResponseCompleter].complete(incoming);
           this[_nextResponseCompleter] = null;
         }
-      }, _HttpIncomingTovoid$()), {onError: dart.fn((error, stackTrace) => {
+      }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
           if (stackTrace === void 0) stackTrace = null;
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
           }
-        }, dynamic__Todynamic$()), onDone: dart.fn(() => {
+        }, dynamic__ToNull$()), onDone: dart.fn(() => {
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
             this[_nextResponseCompleter] = null;
           }
           this.close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
     }
     send(uri, port, method, proxy) {
       if (dart.test(this.closed)) {
@@ -44441,7 +44444,7 @@
             } else {
               this.destroy();
             }
-          }, dynamicToFutureOr$()));
+          }, dynamicToNull$()));
           if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
             let authInfo = incoming.headers._get("proxy-authentication-info");
             if (authInfo != null && authInfo[dartx.length] == 1) {
@@ -44459,17 +44462,17 @@
             }
           }
           request[_onIncoming](incoming);
-        }, _HttpIncomingToFutureOr())).catchError(dart.fn(error => {
+        }, _HttpIncomingToNull())).catchError(dart.fn(error => {
           dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-        }, dynamicTodynamic$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+        }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
           this.destroy();
           request[_onError$](error, core.StackTrace._check(stackTrace));
-        }, dynamicAnddynamicTodynamic$()));
+        }, dynamicAnddynamicToNull()));
         this[_subscription$].resume();
         return s;
       }, dynamicTodynamic$()), {onError: dart.fn(e => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
       return request;
     }
     detachSocket() {
@@ -44519,7 +44522,7 @@
       this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
         this[_idleTimer] = null;
         this.close();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   dart.setSignature(io._HttpClientConnection, {
@@ -44643,7 +44646,7 @@
         let completer = async.Completer.new();
         this[_pending$].add(dart.fn(() => {
           this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
         return FutureOf_ConnectionInfo()._check(completer.future);
       }
       let currentBadCertificateCallback = client[_badCertificateCallback];
@@ -44672,7 +44675,7 @@
           this[_connecting] = dart.notNull(this[_connecting]) - 1;
           this[_checkPending]();
           dart.throw(error);
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
   };
   dart.setSignature(io._ConnectionTarget, {
@@ -45151,7 +45154,7 @@
         this[_httpServer][_markActive](this);
         incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
           if (dart.test(closing)) this.destroy();
-        }, dynamicToFutureOr$()));
+        }, dynamicToNull$()));
         this[_subscription$].pause();
         this[_state$1] = io._HttpConnection._ACTIVE;
         let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
@@ -45168,17 +45171,17 @@
           } else {
             this.destroy();
           }
-        }, dynamicToFutureOr$()), {onError: dart.fn(_ => {
+        }, dynamicToNull$()), {onError: dart.fn(_ => {
             this.destroy();
-          }, dynamicTodynamic$())});
+          }, dynamicToNull$())});
         outgoing.ignoreBody = request.method == "HEAD";
         response[_httpRequest] = request;
         this[_httpServer][_handleRequest](request);
-      }, _HttpIncomingTovoid$()), {onDone: dart.fn(() => {
+      }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
           this.destroy();
-        }, VoidTovoid$()), onError: dart.fn(error => {
+        }, VoidToNull()), onError: dart.fn(error => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
     markIdle() {
       this[_idleMark] = true;
@@ -45394,7 +45397,7 @@
               idle.markIdle();
             }
           }
-        }, TimerTovoid$()));
+        }, TimerToNull()));
       }
     }
     listen(onData, opts) {
@@ -45405,11 +45408,11 @@
         socket.setOption(io.SocketOption.TCP_NODELAY, true);
         let connection = new io._HttpConnection(socket, this);
         this[_idleConnections].add(connection);
-      }, SocketTodynamic()), {onError: dart.fn((error, stackTrace) => {
+      }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
           if (!io.HandshakeException.is(error)) {
             this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
           }
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.bind(this[_controller$0], 'close')});
+        }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
       return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     close(opts) {
@@ -45487,11 +45490,11 @@
           dart.assert(conn[_isClosing]);
           result.closing = dart.notNull(result.closing) + 1;
         }
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       this[_idleConnections].forEach(dart.fn(conn => {
         result.idle = dart.notNull(result.idle) + 1;
         dart.assert(conn[_isIdle]);
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       return result;
     }
     get [_serviceTypePath]() {
@@ -45666,7 +45669,7 @@
             dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     direct() {
       this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
@@ -46314,7 +46317,7 @@
         if (this[_userOnData] != null) {
           dart.dcall(this[_userOnData], data);
         }
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
@@ -46447,17 +46450,17 @@
       super.new();
       this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
           this[_paused] = false;
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           this[_paused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           this[_paused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       this[_reset]();
     }
     listen(onData, opts) {
@@ -47077,24 +47080,24 @@
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(!dart.test(this[_bodyPaused]));
           this[_bodyPaused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
           this[_closeIncoming](true);
           this[_controller$0].close();
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
       this[_bodyPaused] = true;
       this[_pauseStateChanged]();
@@ -48718,7 +48721,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
     static secureServer(socket, context, opts) {
@@ -48729,7 +48732,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
   };
@@ -48885,11 +48888,11 @@
         } else {
           this[_controller$0].add(secureConnection);
         }
-      }, RawSecureSocketToFutureOr())).catchError(dart.fn((e, s) => {
+      }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_closed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_onPauseStateChange]() {
       if (dart.test(this[_controller$0].isPaused)) {
@@ -49469,7 +49472,7 @@
             }
           }
           this[_tryFilter]();
-        }, _FilterStatusToFutureOr())).catchError(dart.bind(this, _reportError));
+        }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
       }
     }
     [_readSocketOrBufferedData](bytes) {
@@ -50554,7 +50557,7 @@
           completer.completeError(e, s);
         }
 
-      }, ListOfintTovoid$()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
+      }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
       return completer.future;
     }
     close() {
@@ -51546,9 +51549,9 @@
     bind(stream) {
       stream.listen(dart.fn(request => {
         io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
-      }, HttpRequestTovoid$()), {onDone: dart.fn(() => {
+      }, HttpRequestToNull()), {onDone: dart.fn(() => {
           this[_controller$0].close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return this[_controller$0].stream;
     }
     static _upgrade(request, _protocolSelector, compression) {
@@ -51587,7 +51590,7 @@
           response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
           response.close();
           dart.throw(error);
-        }, dynamicTodynamic$())).then(io.WebSocket)(upgrade);
+        }, dynamicToNull$())).then(io.WebSocket)(upgrade);
       } else {
         return FutureOfWebSocket()._check(upgrade(null));
       }
@@ -51617,7 +51620,7 @@
       let isUpgrade = false;
       request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
         if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
-      }, StringTovoid$()));
+      }, StringToNull()));
       if (!isUpgrade) return false;
       let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
       if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
@@ -51812,7 +51815,7 @@
     addFrame(opcode, data) {
       return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
         this[_eventSink$].add(e);
-      }, ListOfintTovoid$()));
+      }, ListOfintToNull()));
     }
     static createFrame(opcode, data, serverSide, compressed) {
       let mask = !dart.test(serverSide);
@@ -51958,7 +51961,7 @@
       this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
         this[_done$]();
         this[_closeCompleter].complete(this.webSocket);
-      }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           this[_closed] = true;
           this[_cancel$]();
           if (core.ArgumentError.is(error)) {
@@ -51969,7 +51972,7 @@
             this[_done$]();
             this[_closeCompleter].complete(this.webSocket);
           }
-        }, dynamicAndStackTraceTodynamic())});
+        }, dynamicAndStackTraceToNull())});
     }
     [_done$](error, stackTrace) {
       if (error === void 0) error = null;
@@ -51992,7 +51995,7 @@
       this[_completer] = async.Completer.new();
       this[_subscription$] = stream.listen(dart.fn(data => {
         this[_controller$0].add(data);
-      }, dynamicTovoid$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
+      }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
       if (dart.test(this[_issuedPause])) {
         this[_subscription$].pause();
         this[_issuedPause] = false;
@@ -52003,7 +52006,7 @@
       this[_ensureController]();
       const closeSocket = (function() {
         return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
       }).bind(this);
       dart.fn(closeSocket, VoidToFuture());
       this[_controller$0].close();
@@ -52094,7 +52097,7 @@
         function error(message) {
           response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
             socket.destroy();
-          }, SocketToFutureOr()));
+          }, SocketToNull()));
           dart.throw(new io.WebSocketException(message));
         }
         dart.fn(error, StringTovoid$());
@@ -52177,7 +52180,7 @@
         } else {
           this[_controller$0].add(data);
         }
-      }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (core.FormatException.is(error)) {
             this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
@@ -52187,7 +52190,7 @@
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
           this[_controller$0].close();
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+        }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (this[_readyState] == io.WebSocket.OPEN) {
             this[_readyState] = io.WebSocket.CLOSING;
@@ -52201,12 +52204,12 @@
           this[_closeCode] = transformer.closeCode;
           this[_closeReason] = transformer.closeReason;
           this[_controller$0].close();
-        }, VoidTodynamic$()), cancelOnError: true}));
+        }, VoidToNull()), cancelOnError: true}));
       this[_subscription$].pause();
       this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
           this[_subscription$].cancel();
           this[_subscription$] = null;
-        }, VoidTodynamic$()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
+        }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
       io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
       try {
         dart.dput(this[_socket], _owner, this);
@@ -52233,8 +52236,8 @@
         this[_consumer].add(new io._WebSocketPing());
         this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
           this[_close$0](io.WebSocketStatus.GOING_AWAY);
-        }, VoidTovoid$()));
-      }, VoidTovoid$()));
+        }, VoidToNull()));
+      }, VoidToNull()));
     }
     get readyState() {
       return this[_readyState];
@@ -52282,7 +52285,7 @@
             if (this[_subscription$] != null) this[_subscription$].cancel();
             this[_controller$0].close();
             io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       return this[_sink$0].close();
@@ -52522,11 +52525,11 @@
       controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
           port = isolate.RawReceivePort.new(handleError);
           this.addErrorListener(port.sendPort);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           this.removeErrorListener(port.sendPort);
           port.close();
           port = null;
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return controller.stream;
     }
   };
@@ -54791,7 +54794,7 @@
         let completer = CompleterOfIdbFactory().sync();
         request[dartx.onSuccess].listen(dart.fn(e => {
           completer.complete(this);
-        }, EventTovoid$()));
+        }, EventToNull()));
         request[dartx.onError].listen(dart.bind(completer, 'completeError'));
         return completer.future;
       } catch (e) {
@@ -54850,7 +54853,7 @@
       request[dartx.onSuccess].listen(dart.fn(e => {
         let result = indexed_db._cast(T)(request[dartx.result]);
         completer.complete(result);
-      }, EventTovoid$()));
+      }, EventToNull()));
       request[dartx.onError].listen(dart.bind(completer, 'completeError'));
       return completer.future;
     };
@@ -55322,7 +55325,7 @@
               cursor[dartx.next]();
             }
           }
-        }, EventTovoid$()));
+        }, EventToNull()));
         return controller.stream;
       };
     }
@@ -55495,15 +55498,15 @@
       let completer = CompleterOfDatabase().new();
       this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
         completer.complete(this[dartx.db]);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
         completer.completeError(e);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
         if (!dart.test(completer.isCompleted)) {
           completer.completeError(e);
         }
-      }, EventToFutureOr()));
+      }, EventToNull()));
       return completer.future;
     }
     static _() {
@@ -61640,9 +61643,9 @@
       let completer = CompleterOfFileSystem().new();
       this[_webkitRequestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.requestFileSystemSync](...args) {
@@ -61658,9 +61661,9 @@
       let completer = CompleterOfEntry().new();
       this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -69300,7 +69303,7 @@
       let completer = CompleterOfString().new();
       this[_getAsString](dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.getAsEntry](...args) {
@@ -69842,9 +69845,9 @@
       let completer = CompleterOfEntry().new();
       this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_getMetadata](...args) {
@@ -69854,9 +69857,9 @@
       let completer = CompleterOfMetadata().new();
       this[_getMetadata](dart.fn(value => {
         completer.complete(value);
-      }, MetadataTovoid()), dart.fn(error => {
+      }, MetadataToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_getParent](...args) {
@@ -69866,9 +69869,9 @@
       let completer = CompleterOfEntry().new();
       this[_getParent](dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_moveTo](...args) {
@@ -69879,9 +69882,9 @@
       let completer = CompleterOfEntry().new();
       this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_remove$](...args) {
@@ -69891,9 +69894,9 @@
       let completer = async.Completer.new();
       this[_remove$](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.toUrl](...args) {
@@ -69992,9 +69995,9 @@
       let completer = CompleterOfEntry().new();
       this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [__getFile](path, opts) {
@@ -70036,9 +70039,9 @@
       let completer = CompleterOfEntry().new();
       this[__getFile](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_removeRecursively](...args) {
@@ -70048,9 +70051,9 @@
       let completer = async.Completer.new();
       this[_removeRecursively](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -70094,9 +70097,9 @@
       let completer = CompleterOfListOfEntry().new();
       this[_readEntries](dart.fn(value => {
         completer.complete(value);
-      }, ListOfEntryTovoid()), dart.fn(error => {
+      }, ListOfEntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -73478,9 +73481,9 @@
       let completer = CompleterOfFileWriter().new();
       this[_createWriter](dart.fn(value => {
         completer.complete(value);
-      }, FileWriterTovoid()), dart.fn(error => {
+      }, FileWriterToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_file$](...args) {
@@ -73490,9 +73493,9 @@
       let completer = CompleterOfFile$().new();
       this[_file$](dart.fn(value => {
         completer.complete(value);
-      }, FileTovoid()), dart.fn(error => {
+      }, FileToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -74556,9 +74559,9 @@
       try {
         this[_getCurrentPosition](dart.fn(position => {
           completer.complete(this[_ensurePosition](position));
-        }, GeopositionTovoid()), dart.fn(error => {
+        }, GeopositionToNull()), dart.fn(error => {
           completer.completeError(error);
-        }, PositionErrorTovoid()), options);
+        }, PositionErrorToNull()), options);
       } catch (e) {
         let stacktrace = dart.stackTrace(e);
         completer.completeError(e, stacktrace);
@@ -74586,13 +74589,13 @@
           dart.assert(watchId == null);
           watchId = this[_watchPosition](dart.fn(position => {
             controller.add(this[_ensurePosition](position));
-          }, GeopositionTovoid()), dart.fn(error => {
+          }, GeopositionToNull()), dart.fn(error => {
             controller.addError(error);
-          }, PositionErrorTovoid()), options);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+          }, PositionErrorToNull()), options);
+        }, VoidToNull()), onCancel: dart.fn(() => {
           dart.assert(watchId != null);
           this[_clearWatch](watchId);
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       return controller.stream;
     }
     [_ensurePosition](domPosition) {
@@ -75996,7 +75999,7 @@
       let parts = [];
       data[dartx.forEach](dart.fn((key, value) => {
         parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       let formData = parts[dartx.join]('&');
       if (requestHeaders == null) {
         requestHeaders = dart.map({}, core.String, core.String);
@@ -76030,7 +76033,7 @@
       if (requestHeaders != null) {
         requestHeaders[dartx.forEach](dart.fn((header, value) => {
           xhr[dartx.setRequestHeader](header, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (onProgress != null) {
         xhr[dartx.onProgress].listen(onProgress);
@@ -76045,7 +76048,7 @@
         } else {
           completer.completeError(e);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
       if (sendData != null) {
         xhr[dartx.send](sendData);
@@ -76082,13 +76085,13 @@
       }
       let xhr = new XDomainRequest();
       xhr.open(method, url);
-      xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         let response = xhr.responseText;
         completer.complete(response);
-      }, dynamicTodynamic$()), 1);
-      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      }, dynamicToNull$()), 1);
+      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         completer.completeError(e);
-      }, dynamicTodynamic$()), 1);
+      }, dynamicToNull$()), 1);
       xhr.onprogress = {};
       xhr.ontimeout = {};
       xhr.timeout = Number.MAX_VALUE;
@@ -79965,7 +79968,7 @@
       let completer = CompleterOfListOfSourceInfo().new();
       html$.MediaStreamTrack._getSources(dart.fn(value => {
         completer.complete(value);
-      }, ListOfSourceInfoTovoid()));
+      }, ListOfSourceInfoToNull()));
       return completer.future;
     }
     [dartx.stop](...args) {
@@ -81186,7 +81189,7 @@
       function override(key, value) {
         if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
       }
-      dart.fn(override, dynamicAnddynamicTodynamic$());
+      dart.fn(override, dynamicAnddynamicToNull());
       override('childList', childList);
       override('attributes', attributes);
       override('characterData', characterData);
@@ -81352,9 +81355,9 @@
       this[_ensureGetUserMedia]();
       this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
         completer.complete(stream);
-      }, MediaStreamTovoid()), dart.fn(error => {
+      }, MediaStreamToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, NavigatorUserMediaErrorTovoid()));
+      }, NavigatorUserMediaErrorToNull()));
       return completer.future;
     }
     [_ensureGetUserMedia]() {
@@ -82226,7 +82229,7 @@
       let completer = CompleterOfString().new();
       html$.Notification._requestPermission(dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     get [dartx.onClick]() {
@@ -85241,9 +85244,9 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createOffer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.createAnswer](mediaConstraints) {
@@ -85251,16 +85254,16 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createAnswer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.getStats](selector) {
       let completer = CompleterOfRtcStatsResponse().new();
       this[_getStats](dart.fn(value => {
         completer.complete(value);
-      }, RtcStatsResponseTovoid()), selector);
+      }, RtcStatsResponseToNull()), selector);
       return completer.future;
     }
     static _() {
@@ -85376,9 +85379,9 @@
       let completer = async.Completer.new();
       this[_setLocalDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [_setRemoteDescription](...args) {
@@ -85388,9 +85391,9 @@
       let completer = async.Completer.new();
       this[_setRemoteDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.updateIce](configuration, mediaConstraints) {
@@ -88208,7 +88211,7 @@
     [dartx.addAll](other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this[dartx._set](k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     [dartx.containsValue](value) {
       return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
@@ -92044,7 +92047,7 @@
       let completer = CompleterOfnum().sync();
       this[dartx.requestAnimationFrame](dart.fn(time => {
         completer.complete(time);
-      }, numTovoid()));
+      }, numToNull()));
       return completer.future;
     }
     get [dartx.document]() {
@@ -92499,9 +92502,9 @@
       let completer = CompleterOfFileSystem().new();
       this[__requestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_resolveLocalFileSystemUrl](...args) {
@@ -92511,9 +92514,9 @@
       let completer = CompleterOfEntry().new();
       this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -93203,7 +93206,7 @@
       stream.listen(dart.fn(event => {
         let wrapped = new html$._BeforeUnloadEvent(event);
         controller.add(wrapped);
-      }, BeforeUnloadEventTovoid()));
+      }, BeforeUnloadEventToNull()));
       return controller.stream;
     }
     getEventType(target) {
@@ -94909,7 +94912,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       for (let v of this.values) {
@@ -95096,7 +95099,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
@@ -95127,7 +95130,7 @@
         if (dart.test(this[_matches](key))) {
           f(this[_strip](key), value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     get keys() {
       let keys = JSArrayOfString().of([]);
@@ -95135,7 +95138,7 @@
         if (dart.test(this[_matches](key))) {
           keys[dartx.add](this[_strip](key));
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return keys;
     }
     get values() {
@@ -95144,7 +95147,7 @@
         if (dart.test(this[_matches](key))) {
           values[dartx.add](value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return values;
     }
     get length() {
@@ -98401,7 +98404,7 @@
         if (request[dartx.readyState] == html$.HttpRequest.DONE) {
           onComplete(request);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       request[dartx.send]();
       return request;
     }
@@ -99147,7 +99150,7 @@
         this.writeSlot(slot, copy);
         e[dartx.forEach](dart.fn((key, value) => {
           this.putIntoMap(copy, key, this.walk(value));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return copy;
       }
       if (core.List.is(e)) {
@@ -99356,7 +99359,7 @@
     }
     dict[dartx.forEach](dart.fn((key, value) => {
       object[key] = value;
-    }, StringAnddynamicTovoid()));
+    }, StringAnddynamicToNull()));
     return object;
   };
   dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
@@ -99381,7 +99384,7 @@
     let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
     return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
   };
-  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic$0());
+  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
   html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
     new() {
       super.new();
@@ -107352,13 +107355,13 @@
       let completer = CompleterOfAudioBuffer().new();
       this[_decodeAudioData](audioData, dart.fn(value => {
         completer.complete(value);
-      }, AudioBufferTovoid()), dart.fn(error => {
+      }, AudioBufferToNull()), dart.fn(error => {
         if (error == null) {
           completer.completeError('');
         } else {
           completer.completeError(error);
         }
-      }, AudioBufferTovoid()));
+      }, AudioBufferToNull()));
       return completer.future;
     }
   };
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 86ce6a6..a7fbad0 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -547,6 +547,7 @@
 let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html.Geoposition)))();
 let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html._CustomEventStreamProvider$(html.Event)))();
 let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html.HttpRequest)))();
+let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
 let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html.ProgressEvent])))();
 let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
 let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html.MediaStreamTrack)))();
@@ -652,13 +653,12 @@
 let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
 let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
 let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
-let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
+let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
 let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
 let StringTobool = () => (StringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
 let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
-let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
+let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
 let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
 let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
 let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -672,19 +672,22 @@
 let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
 let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
 let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
+let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
 let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
 let StringTovoid = () => (StringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
 let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
 let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
 let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
+let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
+let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
 let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-let ListToFutureOr = () => (ListToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [core.List])))();
-let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
-let dynamicToFutureOr = () => (dynamicToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [dart.dynamic])))();
-let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
+let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
+let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
+let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
 let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
-let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
+let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
 let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
 let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
 let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
@@ -727,7 +730,7 @@
 let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
 let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
 let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
-let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
+let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
 let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
 let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
 let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -740,11 +743,12 @@
 let VoidToObject = () => (VoidToObject = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
 let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
 let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
+let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
 let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
 let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
+let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
 let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
-let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
+let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
 let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
 let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
 let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
@@ -785,10 +789,11 @@
 let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
 let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
 let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
-let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
+let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
 let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
 let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
 let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
 let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
 let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
 let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -813,10 +818,10 @@
 let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
 let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
 let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
-let ListOfintToFutureOr = () => (ListOfintToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [ListOfint()])))();
+let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
 let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
 let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
-let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
 let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
 let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
 let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
@@ -833,7 +838,8 @@
 let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
 let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
 let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, ListOfString()])))();
+let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
 let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
 let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
 let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
@@ -844,15 +850,14 @@
 let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
 let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
 let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
-let CookieTovoid = () => (CookieTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Cookie])))();
+let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
 let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
 let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
 let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
 let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
 let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.StackTrace])))();
-let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpIncoming])))();
-let _HttpIncomingToFutureOr = () => (_HttpIncomingToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._HttpIncoming])))();
+let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
 let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
 let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
 let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
@@ -869,8 +874,8 @@
 let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
 let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
 let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-let SocketTodynamic = () => (SocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.Socket])))();
-let _HttpConnectionTovoid = () => (_HttpConnectionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpConnection])))();
+let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
 let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
 let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
 let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
@@ -884,22 +889,22 @@
 let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
 let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
 let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
-let RawSecureSocketToFutureOr = () => (RawSecureSocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RawSecureSocket])))();
+let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
 let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
-let _FilterStatusToFutureOr = () => (_FilterStatusToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._FilterStatus])))();
+let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
 let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
 let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
 let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
 let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
 let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
 let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
-let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpRequest])))();
+let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
 let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
 let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
 let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
 let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
-let SocketToFutureOr = () => (SocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.Socket])))();
 let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
+let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
 let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
 let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
 let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
@@ -918,36 +923,35 @@
 let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
 let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
 let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-let EventTovoid = () => (EventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Event])))();
+let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Event])))();
 let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
 let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-let EventToFutureOr = () => (EventToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [html.Event])))();
 let NodeTobool = () => (NodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Node])))();
 let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
 let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
 let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.FileSystem])))();
-let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.FileError])))();
-let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Entry])))();
+let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileSystem])))();
+let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileError])))();
+let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Entry])))();
 let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html.CssStyleDeclaration, [dart.dynamic])))();
 let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.CssStyleDeclaration])))();
-let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Metadata])))();
-let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
+let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Metadata])))();
+let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
 let ElementTobool = () => (ElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Element])))();
-let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.FileWriter])))();
-let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.File])))();
-let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Geoposition])))();
-let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.PositionError])))();
+let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileWriter])))();
+let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.File])))();
+let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Geoposition])))();
+let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.PositionError])))();
 let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html.HttpRequest])))();
-let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.ProgressEvent])))();
-let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
-let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.MediaStream])))();
-let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.NavigatorUserMediaError])))();
-let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.RtcSessionDescription])))();
-let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.RtcStatsResponse])))();
+let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.ProgressEvent])))();
+let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
+let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.MediaStream])))();
+let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.NavigatorUserMediaError])))();
+let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcSessionDescription])))();
+let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcStatsResponse])))();
 let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.OptionElement])))();
-let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
-let BeforeUnloadEventTovoid = () => (BeforeUnloadEventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.BeforeUnloadEvent])))();
+let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
+let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.BeforeUnloadEvent])))();
 let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Element])))();
 let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html.CssClassSet, [html.Element])))();
 let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
@@ -976,7 +980,7 @@
 let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
 let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
 let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html.Element, [html.Node])))();
-let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
+let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
 dart.mixin = function(base, ...mixins) {
   class Mixin extends base {}
   for (let m of mixins) {
@@ -1703,10 +1707,7 @@
       return null;
     }
   }
-  if (ret2 === dart.void) return true;
-  if (ret1 === dart.void) {
-    return ret2 === dart.dynamic || ret2 === async.FutureOr;
-  }
+  if (ret1 === dart.void) return dart._isTop(ret2);
   if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
   return true;
 };
@@ -1727,13 +1728,13 @@
   };
 };
 dart._isBottom = function(type) {
-  return type == dart.bottom;
+  return type == dart.bottom || type == core.Null;
 };
 dart._isTop = function(type) {
   if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
     return dart._isTop(dart.getGenericArgs(type)[0]);
   }
-  return type == core.Object || type == dart.dynamic;
+  return type == core.Object || type == dart.dynamic || type == dart.void;
 };
 dart._isSubtype = function(t1, t2, isCovariant) {
   if (t1 === t2) return true;
@@ -2180,6 +2181,9 @@
   return false;
 };
 dart.is = function(obj, type) {
+  if (obj == null) {
+    return type == core.Null || dart._isTop(type);
+  }
   let result = dart.strongInstanceOf(obj, type);
   if (result !== null) return result;
   let actual = dart.getReifiedType(obj);
@@ -3290,7 +3294,7 @@
     if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
       this.asMap()[dartx.forEach](dart.fn((i, element) => {
         children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
-      }, intAnddynamicTovoid()));
+      }, intAnddynamicToNull()));
     } else {
       for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
         let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
@@ -3691,14 +3695,14 @@
       } else {
         nonGenericProperties._set(core.String._check(name), value);
       }
-    }, dynamicAnddynamicTodynamic()));
+    }, dynamicAnddynamicToNull()));
     nonGenericProperties.forEach(dart.fn((name, value) => {
       if (core.Type.is(value)) {
         children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
       } else {
         children.add(new _debugger.NameValuePair({name: name, value: value}));
       }
-    }, StringAndObjectTovoid()));
+    }, StringAndObjectToNull()));
     return children.toList();
   }
   recordGenericParameters(name, genericTypeConstructor) {
@@ -3767,7 +3771,7 @@
     map[dartx.forEach](dart.fn((key, value) => {
       let entryWrapper = new _debugger.MapEntry({key: key, value: value});
       entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
-    }, dynamicAnddynamicTovoid()));
+    }, dynamicAnddynamicToNull()));
     _debugger.addMetadataChildren(object, entries);
     return entries.toList();
   }
@@ -9203,11 +9207,11 @@
   if (_isolate_helper._MainFunctionArgs.is(entry)) {
     rootContext.eval(dart.fn(() => {
       dart.dcall(entry, args);
-    }, VoidTodynamic()));
+    }, VoidToNull()));
   } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
     rootContext.eval(dart.fn(() => {
       dart.dcall(entry, args, null);
-    }, VoidTodynamic()));
+    }, VoidToNull()));
   } else {
     rootContext.eval(core.Function._check(entry));
   }
@@ -9649,7 +9653,7 @@
         if (!dart.test(this.runIteration())) return;
         async.Timer.run(next);
       }).bind(this);
-      dart.fn(next, VoidTodynamic());
+      dart.fn(next, VoidToNull());
       next();
     } else {
       while (dart.test(this.runIteration())) {
@@ -9802,7 +9806,7 @@
         let context = new _isolate_helper._IsolateContext();
         _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
           _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
-        }, VoidTodynamic()), 'worker-start');
+        }, VoidToNull()), 'worker-start');
         _isolate_helper._globalState.currentContext = context;
         _isolate_helper._globalState.topEventLoop.run();
         break;
@@ -9852,9 +9856,9 @@
     let replyPort = dart.dindex(msg, 'replyPort');
     _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
       dart.dsend(replyPort, 'send', msg);
-    }, ListToFutureOr()), {onError: dart.fn(errorMessage => {
+    }, ListToNull()), {onError: dart.fn(errorMessage => {
         dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
-      }, StringTodynamic())});
+      }, StringToNull())});
   }
   static _log(msg) {
     if (dart.test(_isolate_helper._globalState.isWorker)) {
@@ -9911,7 +9915,7 @@
         dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
         completer.completeError(dart.dindex(msg, 1));
       }
-    }, dynamicToFutureOr()));
+    }, dynamicToNull()));
     let signalReply = port.sendPort;
     if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
       _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid()));
@@ -9937,7 +9941,7 @@
     _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
       let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
       _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
-    }, VoidTodynamic()), 'nonworker start');
+    }, VoidToNull()), 'nonworker start');
   }
   static get currentIsolate() {
     let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -10082,7 +10086,7 @@
       if (!dart.test(this[_receivePort][_isClosed])) {
         this[_receivePort][_add](msg);
       }
-    }, VoidTodynamic()), dart.str`receive ${message}`);
+    }, VoidToNull()), dart.str`receive ${message}`);
   }
   ['=='](other) {
     return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
@@ -10216,13 +10220,11 @@
   let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
   let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
   let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
   let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
   let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
   let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
   let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
   let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
-  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
   let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
   let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
@@ -10237,12 +10239,14 @@
   let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
   let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
   let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
   let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
   let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
   let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
   let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
+  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
   let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
   let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
   let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
@@ -10250,11 +10254,10 @@
   let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
   let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
   let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
-  let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
-  let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
+  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
   let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
-  let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
   let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
+  let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
   class Stream extends core.Object {
     new() {
     }
@@ -10268,10 +10271,10 @@
       future.then(dart.dynamic)(dart.fn(value => {
         controller[_add](value);
         controller[_closeUnchecked]();
-      }, TToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+      }, TToNull()), {onError: dart.fn((error, stackTrace) => {
           controller[_addError](error, core.StackTrace._check(stackTrace));
           controller[_closeUnchecked]();
-        }, dynamicAnddynamicTodynamic())});
+        }, dynamicAnddynamicToNull())});
       return controller.stream;
     }
     static fromFutures(futures) {
@@ -10282,13 +10285,13 @@
           controller[_add](value);
           if (--count == 0) controller[_closeUnchecked]();
         }
-      }, TTodynamic$());
+      }, TToNull());
       let onError = dart.fn((error, stack) => {
         if (!dart.test(controller.isClosed)) {
           controller[_addError](error, core.StackTrace._check(stack));
           if (--count == 0) controller[_closeUnchecked]();
         }
-      }, dynamicAnddynamicTodynamic());
+      }, dynamicAnddynamicToNull());
       for (let future of futures) {
         count++;
         future.then(dart.dynamic)(onValue, {onError: onError});
@@ -10325,17 +10328,17 @@
         dart.assert(timer == null);
         timer = async.Timer.periodic(period, dart.fn(timer => {
           sendEvent();
-        }, TimerTovoid()));
+        }, TimerToNull()));
       }
       dart.fn(startPeriodicTimer, VoidTovoid());
       controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
           watch.start();
           startPeriodicTimer();
-        }, VoidTovoid()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           timer.cancel();
           timer = null;
           watch.stop();
-        }, VoidTovoid()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           dart.assert(timer == null);
           let elapsed = watch.elapsed;
           watch.start();
@@ -10343,11 +10346,11 @@
             timer = null;
             startPeriodicTimer();
             sendEvent();
-          }, VoidTovoid()));
-        }, VoidTovoid()), onCancel: dart.fn(() => {
+          }, VoidToNull()));
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (timer != null) timer.cancel();
           timer = null;
-        }, VoidTodynamic())});
+        }, VoidToNull())});
       return controller.stream;
     }
     static eventTransformed(source, mapSink) {
@@ -10394,21 +10397,21 @@
             } else {
               controller.add(E.as(newValue));
             }
-          }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
+          }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
         }).bind(this);
         dart.fn(onListen, VoidTovoid());
         if (dart.test(this.isBroadcast)) {
           controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
               subscription.cancel();
-            }, VoidTovoid()), sync: true});
+            }, VoidToNull()), sync: true});
         } else {
           controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
               subscription.pause();
-            }, VoidTovoid()), onResume: dart.fn(() => {
+            }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidTovoid()), onCancel: dart.fn(() => {
+            }, VoidToNull()), onCancel: dart.fn(() => {
               subscription.cancel();
-            }, VoidTodynamic()), sync: true});
+            }, VoidToNull()), sync: true});
         }
         return controller.stream;
       };
@@ -10434,21 +10437,21 @@
               subscription.pause();
               controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
             }
-          }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
+          }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
         }).bind(this);
         dart.fn(onListen, VoidTovoid());
         if (dart.test(this.isBroadcast)) {
           controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
               subscription.cancel();
-            }, VoidTovoid()), sync: true});
+            }, VoidToNull()), sync: true});
         } else {
           controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
               subscription.pause();
-            }, VoidTovoid()), onResume: dart.fn(() => {
+            }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidTovoid()), onCancel: dart.fn(() => {
+            }, VoidToNull()), onCancel: dart.fn(() => {
               subscription.cancel();
-            }, VoidTodynamic()), sync: true});
+            }, VoidToNull()), sync: true});
         }
         return controller.stream;
       };
@@ -10482,12 +10485,12 @@
         if (seenFirst) {
           async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
             value = newValue;
-          }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
+          }, TToNull()), async._cancelAndErrorClosure(subscription, result));
         } else {
           value = element;
           seenFirst = true;
         }
-      }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
           if (!seenFirst) {
             try {
               dart.throw(_internal.IterableElementError.noElement());
@@ -10499,7 +10502,7 @@
           } else {
             result[_complete](value);
           }
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return result;
     }
     fold(S) {
@@ -10510,12 +10513,12 @@
         subscription = this.listen(dart.fn(element => {
           async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
             value = newValue;
-          }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
-        }, TTovoid$()), {onError: dart.fn((e, st) => {
+          }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
+        }, TToNull()), {onError: dart.fn((e, st) => {
             result[_completeError](e, core.StackTrace._check(st));
-          }, dynamicAnddynamicTodynamic()), onDone: dart.fn(() => {
+          }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
             result[_complete](value);
-          }, VoidTovoid()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       };
     }
@@ -10537,11 +10540,11 @@
           async._cancelAndErrorWithReplacement(subscription, result, e, s);
         }
 
-      }, TTovoid$()), {onError: dart.fn(e => {
+      }, TToNull()), {onError: dart.fn(e => {
           result[_completeError](e);
-        }, dynamicTodynamic()), onDone: dart.fn(() => {
+        }, dynamicToNull()), onDone: dart.fn(() => {
           result[_complete](buffer.toString());
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return result;
     }
     contains(needle) {
@@ -10552,10 +10555,10 @@
           if (dart.test(isMatch)) {
             async._cancelAndValue(subscription, future, true);
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](false);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     forEach(action) {
@@ -10563,10 +10566,10 @@
       let subscription = null;
       subscription = this.listen(dart.fn(element => {
         async._runUserCode(dart.fn(() => action(element), VoidTovoid()), dart.fn(_ => {
-        }, dynamicTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, dynamicToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](null);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     every(test) {
@@ -10577,10 +10580,10 @@
           if (!dart.test(isMatch)) {
             async._cancelAndValue(subscription, future, false);
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](true);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     any(test) {
@@ -10591,10 +10594,10 @@
           if (dart.test(isMatch)) {
             async._cancelAndValue(subscription, future, true);
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](false);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     get length() {
@@ -10602,9 +10605,9 @@
       let count = 0;
       this.listen(dart.fn(_ => {
         count++;
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](count);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     get isEmpty() {
@@ -10612,9 +10615,9 @@
       let subscription = null;
       subscription = this.listen(dart.fn(_ => {
         async._cancelAndValue(subscription, future, false);
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](true);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     toList() {
@@ -10622,9 +10625,9 @@
       let future = new (_FutureOfListOfT())();
       this.listen(dart.fn(data => {
         result[dartx.add](data);
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](result);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     toSet() {
@@ -10632,9 +10635,9 @@
       let future = new (_FutureOfSetOfT())();
       this.listen(dart.fn(data => {
         result.add(data);
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](result);
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     drain(E) {
@@ -10664,7 +10667,7 @@
       let subscription = null;
       subscription = this.listen(dart.fn(value => {
         async._cancelAndValue(subscription, future, value);
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           try {
             dart.throw(_internal.IterableElementError.noElement());
           } catch (e) {
@@ -10672,7 +10675,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     get last() {
@@ -10682,7 +10685,7 @@
       this.listen(dart.fn(value => {
         foundResult = true;
         result = value;
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           if (foundResult) {
             future[_complete](result);
             return;
@@ -10694,7 +10697,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     get single() {
@@ -10715,7 +10718,7 @@
         }
         foundResult = true;
         result = value;
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           if (foundResult) {
             future[_complete](result);
             return;
@@ -10727,7 +10730,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     firstWhere(test, opts) {
@@ -10739,8 +10742,8 @@
           if (dart.test(isMatch)) {
             async._cancelAndValue(subscription, future, value);
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           if (defaultValue != null) {
             async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
             return;
@@ -10752,7 +10755,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     lastWhere(test, opts) {
@@ -10767,8 +10770,8 @@
             foundResult = true;
             result = value;
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           if (foundResult) {
             future[_complete](result);
             return;
@@ -10784,7 +10787,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     singleWhere(test) {
@@ -10808,8 +10811,8 @@
             foundResult = true;
             result = value;
           }
-        }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           if (foundResult) {
             future[_complete](result);
             return;
@@ -10821,7 +10824,7 @@
             async._completeWithErrorCallback(future, e, s);
           }
 
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     elementAt(index) {
@@ -10835,9 +10838,9 @@
           return;
         }
         elementIndex = elementIndex + 1;
-      }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
-        }, VoidTovoid()), cancelOnError: true});
+        }, VoidToNull()), cancelOnError: true});
       return future;
     }
     timeout(timeLimit, opts) {
@@ -10871,7 +10874,7 @@
         if (onTimeout == null) {
           timeout = dart.fn(() => {
             controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
-          }, VoidTovoid());
+          }, VoidToNull());
         } else {
           let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
           let wrapper = new async._ControllerEventSinkWrapper(null);
@@ -10879,7 +10882,7 @@
             wrapper[_sink] = controller;
             zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
             wrapper[_sink] = null;
-          }, VoidTovoid());
+          }, VoidToNull());
         }
         subscription = this.listen(onData, {onError: onError, onDone: onDone});
         timer = zone.createTimer(timeLimit, timeout);
@@ -10895,10 +10898,10 @@
       controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
         timer.cancel();
         subscription.pause();
-      }, VoidTovoid()), dart.fn(() => {
+      }, VoidToNull()), dart.fn(() => {
         subscription.resume();
         timer = zone.createTimer(timeLimit, timeout);
-      }, VoidTovoid()), onCancel);
+      }, VoidToNull()), onCancel);
       return controller.stream;
     }
   }
@@ -11045,7 +11048,7 @@
       _isolate_helper.enterJsAsync();
       this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
         callback(this);
-      }, VoidTodynamic()), milliseconds);
+      }, VoidToNull()), milliseconds);
     } else {
       dart.throw(new core.UnsupportedError("Periodic timer."));
     }
@@ -12476,14 +12479,14 @@
   let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
   let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
   let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
   let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
   let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-  let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   class JsLinkedHashMap extends core.Object {
     new() {
       this[_length] = 0;
@@ -12538,7 +12541,7 @@
       MapOfK$V()._check(other);
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, KAndVTovoid$()));
+      }, KAndVToNull()));
     }
     _get(key) {
       if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
@@ -13808,7 +13811,7 @@
   let obj = {};
   map[dartx.forEach](dart.fn((key, value) => {
     obj[_js_mirrors.getName(key)] = value;
-  }, SymbolAnddynamicTovoid()));
+  }, SymbolAnddynamicToNull()));
   return obj;
 };
 dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
@@ -14023,7 +14026,7 @@
       constructors[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       if (dart.test(constructors[dartx.isEmpty])) {
         let name = 'new';
         let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
@@ -14038,23 +14041,23 @@
           t = dart.dindex(t, 0);
         }
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let methods = _js_mirrors._getMethods(unwrapped);
       methods[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let getters = _js_mirrors._getGetters(unwrapped);
       getters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let setters = _js_mirrors._getSetters(unwrapped);
       setters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
         symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let staticFields = _js_mirrors._getStaticFields(unwrapped);
       staticFields[dartx.forEach](dart.fn((symbol, t) => {
         let name = _js_mirrors.getName(symbol);
@@ -14064,22 +14067,22 @@
           t = dart.dindex(t, 0);
         }
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let statics = _js_mirrors._getStatics(unwrapped);
       statics[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
       staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
       staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = _js_mirrors.getName(symbol);
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
     }
     return this[_declarations];
@@ -17929,11 +17932,11 @@
         let result = new (async._Future$(E))();
         this[_onDone] = dart.fn(() => {
           result[_complete](futureValue);
-        }, VoidTovoid());
+        }, VoidToNull());
         this[_onError] = dart.fn((error, stackTrace) => {
           this.cancel();
           result[_completeError](error, core.StackTrace._check(stackTrace));
-        }, dynamicAnddynamicTodynamic());
+        }, dynamicAnddynamicToNull());
         return result;
       };
     }
@@ -18609,7 +18612,7 @@
 async._SyncBroadcastStreamController$ = dart.generic(T => {
   let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
   let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-  let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
+  let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
   class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
     new(onListen, onCancel) {
       super.new(onListen, onCancel);
@@ -18638,19 +18641,19 @@
       }
       this[_forEachListener](dart.fn(subscription => {
         subscription[_add](data);
-      }, _BufferingStreamSubscriptionOfTTovoid()));
+      }, _BufferingStreamSubscriptionOfTToNull()));
     }
     [_sendError](error, stackTrace) {
       if (dart.test(this[_isEmpty])) return;
       this[_forEachListener](dart.fn(subscription => {
         subscription[_addError](error, stackTrace);
-      }, _BufferingStreamSubscriptionOfTTovoid()));
+      }, _BufferingStreamSubscriptionOfTToNull()));
     }
     [_sendDone]() {
       if (!dart.test(this[_isEmpty])) {
         this[_forEachListener](dart.fn(subscription => {
           subscription[_close]();
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       } else {
         dart.assert(this[_doneFuture] != null);
         dart.assert(this[_doneFuture][_mayComplete]);
@@ -18901,7 +18904,7 @@
           async._completeWithErrorCallback(result, e, s);
         }
 
-      }, VoidTovoid()));
+      }, VoidToNull()));
       return result;
     }
     static microtask(computation) {
@@ -18914,7 +18917,7 @@
           async._completeWithErrorCallback(result, e, s);
         }
 
-      }, VoidTovoid()));
+      }, VoidToNull()));
       return result;
     }
     static sync(computation) {
@@ -18954,7 +18957,7 @@
           async._completeWithErrorCallback(result, e, s);
         }
 
-      }, VoidTovoid()));
+      }, VoidToNull()));
       return result;
     }
     static wait(T) {
@@ -18974,7 +18977,7 @@
                 if (value != null) {
                   async.Future.sync(dart.fn(() => {
                     cleanUp(value);
-                  }, VoidTodynamic()));
+                  }, VoidToNull()));
                 }
               }
             }
@@ -19004,13 +19007,13 @@
                 if (cleanUp != null && value != null) {
                   async.Future.sync(dart.fn(() => {
                     cleanUp(value);
-                  }, VoidTodynamic()));
+                  }, VoidToNull()));
                 }
                 if (remaining == 0 && !dart.test(eagerError)) {
                   result[_completeError](error, stackTrace);
                 }
               }
-            }, dart.definiteFunctionType(async.FutureOr, [T])), {onError: handleError});
+            }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
             remaining++;
           }
           if (remaining == 0) {
@@ -19035,10 +19038,10 @@
         let completer = async.Completer$(T).sync();
         let onValue = dart.fn(value => {
           if (!dart.test(completer.isCompleted)) completer.complete(value);
-        }, dart.definiteFunctionType(dart.dynamic, [T]));
+        }, dart.definiteFunctionType(core.Null, [T]));
         let onError = dart.fn((error, stack) => {
           if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
-        }, dynamicAnddynamicTodynamic());
+        }, dynamicAnddynamicToNull());
         for (let future of futures) {
           future.then(dart.dynamic)(onValue, {onError: onError});
         }
@@ -19061,7 +19064,7 @@
         } else {
           doneSignal[_complete](null);
         }
-      }, boolTodynamic()), {runGuarded: true});
+      }, boolToNull()), {runGuarded: true});
       dart.dcall(nextIteration, true);
       return doneSignal;
     }
@@ -19414,7 +19417,7 @@
   let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
   let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
   let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-  let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
+  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
   class _Future extends core.Object {
     new() {
       this[_zone] = async.Zone.current;
@@ -19552,7 +19555,7 @@
         dart.assert(this[_isComplete]);
         this[_zone].scheduleMicrotask(dart.fn(() => {
           async._Future._propagateToListeners(this, listener);
-        }, VoidTovoid()));
+        }, VoidToNull()));
       }
     }
     [_prependListeners](listeners) {
@@ -19580,7 +19583,7 @@
         listeners = this[_reverseListeners](listeners);
         this[_zone].scheduleMicrotask(dart.fn(() => {
           async._Future._propagateToListeners(this, listeners);
-        }, VoidTovoid()));
+        }, VoidToNull()));
       }
     }
     [_removeListeners]() {
@@ -19609,16 +19612,16 @@
           dart.assert(target[_isPendingComplete]);
           target[_clearPendingComplete]();
           target[_complete](value);
-        }, dynamicToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
             if (stackTrace === void 0) stackTrace = null;
             dart.assert(target[_isPendingComplete]);
             target[_completeError](error, core.StackTrace._check(stackTrace));
-          }, dynamic__Todynamic())});
+          }, dynamic__ToNull())});
       } catch (e) {
         let s = dart.stackTrace(e);
         async.scheduleMicrotask(dart.fn(() => {
           target[_completeError](e, s);
-        }, VoidTovoid()));
+        }, VoidToNull()));
       }
 
     }
@@ -19676,7 +19679,7 @@
             this[_setPendingComplete]();
             this[_zone].scheduleMicrotask(dart.fn(() => {
               async._Future._chainCoreFuture(coreFuture, this);
-            }, VoidTovoid()));
+            }, VoidToNull()));
           } else {
             async._Future._chainCoreFuture(coreFuture, this);
           }
@@ -19689,14 +19692,14 @@
       this[_setPendingComplete]();
       this[_zone].scheduleMicrotask(dart.fn(() => {
         this[_completeWithValue](typedValue);
-      }, VoidTovoid()));
+      }, VoidToNull()));
     }
     [_asyncCompleteError](error, stackTrace) {
       dart.assert(!dart.test(this[_isComplete]));
       this[_setPendingComplete]();
       this[_zone].scheduleMicrotask(dart.fn(() => {
         this[_completeError](error, stackTrace);
-      }, VoidTovoid()));
+      }, VoidToNull()));
     }
     static _propagateToListeners(source, listeners) {
       while (true) {
@@ -19840,7 +19843,7 @@
       if (onTimeout == null) {
         timer = async.Timer.new(timeLimit, dart.fn(() => {
           result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
-        }, VoidTovoid()));
+        }, VoidToNull()));
       } else {
         let zone = async.Zone.current;
         onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
@@ -19852,19 +19855,19 @@
             result[_completeError](e, s);
           }
 
-        }, VoidTovoid()));
+        }, VoidToNull()));
       }
       this.then(dart.dynamic)(dart.fn(v => {
         if (dart.test(timer.isActive)) {
           timer.cancel();
           result[_completeWithValue](v);
         }
-      }, TToFutureOr()), {onError: dart.fn((e, s) => {
+      }, TToNull()), {onError: dart.fn((e, s) => {
           if (dart.test(timer.isActive)) {
             timer.cancel();
             result[_completeError](e, core.StackTrace._check(s));
           }
-        }, dynamicAnddynamicTodynamic())});
+        }, dynamicAnddynamicToNull())});
       return result;
     }
   }
@@ -20046,7 +20049,7 @@
         storedCallback = null;
         f();
       }
-      dart.fn(internalCallback, dynamicTodynamic());
+      dart.fn(internalCallback, dynamicToNull());
       ;
       let observer = new _isolate_helper.global.MutationObserver(internalCallback);
       observer.observe(div, {childList: true});
@@ -20055,7 +20058,7 @@
         _isolate_helper.enterJsAsync();
         storedCallback = callback;
         div.firstChild ? div.removeChild(span) : div.appendChild(span);
-      }, _AsyncCallbackTovoid());
+      }, FnToNull());
     } else if (_isolate_helper.global.setImmediate != null) {
       return async._AsyncRun._scheduleImmediateWithSetImmediate;
     }
@@ -20066,7 +20069,7 @@
       _isolate_helper.leaveJsAsync();
       callback();
     }
-    dart.fn(internalCallback, VoidTodynamic());
+    dart.fn(internalCallback, VoidToNull());
     ;
     _isolate_helper.enterJsAsync();
     _isolate_helper.global.scheduleImmediate(internalCallback);
@@ -20076,7 +20079,7 @@
       _isolate_helper.leaveJsAsync();
       callback();
     }
-    dart.fn(internalCallback, VoidTodynamic());
+    dart.fn(internalCallback, VoidToNull());
     ;
     _isolate_helper.enterJsAsync();
     _isolate_helper.global.setImmediate(internalCallback);
@@ -20490,7 +20493,7 @@
       subscription[_setPendingEvents](pendingEvents);
       subscription[_guardCallback](dart.fn(() => {
         async._runGuarded(this.onListen);
-      }, VoidTovoid()));
+      }, VoidToNull()));
       return subscription;
     }
     [_recordCancel](subscription) {
@@ -20750,7 +20753,7 @@
       return dart.fn((e, s) => {
         controller[_addError](e, s);
         controller[_close]();
-      }, dynamicAndStackTraceTodynamic());
+      }, dynamicAndStackTraceToNull());
     }
     pause() {
       this.addSubscription.pause();
@@ -20766,7 +20769,7 @@
       }
       return cancel.whenComplete(dart.fn(() => {
         this.addStreamFuture[_asyncComplete](null);
-      }, VoidTodynamic()));
+      }, VoidToNull()));
     }
     complete() {
       this.addStreamFuture[_asyncComplete](null);
@@ -20883,7 +20886,7 @@
         this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
         if (oldState == async._PendingEvents._STATE_CANCELED) return;
         this.handleNext(dispatch);
-      }, VoidTovoid()));
+      }, VoidToNull()));
       this[_state] = async._PendingEvents._STATE_SCHEDULED;
     }
     cancelSchedule() {
@@ -21190,7 +21193,7 @@
         let result = new (async._Future$(E))();
         this[_onDone] = dart.fn(() => {
           result[_completeWithValue](null);
-        }, VoidTovoid());
+        }, VoidToNull());
         return result;
       };
     }
@@ -21609,7 +21612,7 @@
 async._cancelAndErrorClosure = function(subscription, future) {
   return dart.fn((error, stackTrace) => {
     async._cancelAndError(subscription, future, error, stackTrace);
-  }, dynamicAndStackTraceTovoid());
+  }, dynamicAndStackTraceToNull());
 };
 dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
 async._cancelAndValue = function(subscription, future, value) {
@@ -23191,7 +23194,7 @@
       if (error == null) error = new core.NullThrownError();
       if (stackTrace == null) dart.throw(error);
       async._rethrow(error, stackTrace);
-    }, VoidTovoid()));
+    }, VoidToNull()));
   };
 };
 dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
@@ -23627,13 +23630,13 @@
   let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
   let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
   let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
   let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-  let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   class _HashMap extends core.Object {
     new() {
       this[_length] = 0;
@@ -23681,7 +23684,7 @@
       MapOfK$V()._check(other);
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, KAndVTovoid$()));
+      }, KAndVToNull()));
     }
     _get(key) {
       if (dart.test(collection._HashMap._isStringKey(key))) {
@@ -24174,11 +24177,11 @@
 collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
   let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-  let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
   class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
     new() {
@@ -24211,7 +24214,7 @@
       MapOfK$V()._check(other);
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, KAndVTovoid$()));
+      }, KAndVToNull()));
     }
     _get(key) {
       return this[_map].get(key);
@@ -25811,7 +25814,7 @@
       let result = HashMapOfK$V().new();
       other[dartx.forEach](dart.fn((k, v) => {
         result._set(K.as(k), V.as(v));
-      }, dynamicAnddynamicTovoid()));
+      }, dynamicAnddynamicToNull()));
       return result;
     }
     static fromIterable(iterable, opts) {
@@ -26363,7 +26366,7 @@
       let result = LinkedHashMapOfK$V().new();
       other[dartx.forEach](dart.fn((k, v) => {
         result._set(K.as(k), V.as(v));
-      }, dynamicAnddynamicTovoid()));
+      }, dynamicAnddynamicToNull()));
       return result;
     }
     static fromIterable(iterable, opts) {
@@ -27118,7 +27121,7 @@
         result.write(k);
         result.write(': ');
         result.write(v);
-      }, dynamicAnddynamicTovoid()));
+      }, dynamicAnddynamicToNull()));
       result.write('}');
     } finally {
       dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
@@ -28245,16 +28248,16 @@
   let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
   let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
   let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
   let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
   let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
   let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
   let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-  let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
     new(compare, isValidKey) {
       if (compare === void 0) compare = null;
@@ -28277,7 +28280,7 @@
       let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
       other[dartx.forEach](dart.fn((k, v) => {
         result._set(K.as(k), V.as(v));
-      }, dynamicAnddynamicTovoid()));
+      }, dynamicAnddynamicToNull()));
       return result;
     }
     static fromIterable(iterable, opts) {
@@ -28363,7 +28366,7 @@
       MapOfK$V()._check(other);
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, KAndVTovoid$()));
+      }, KAndVToNull()));
     }
     get isEmpty() {
       return this[_root] == null;
@@ -29036,7 +29039,7 @@
   addAll(other) {
     other[dartx.forEach](dart.fn((key, value) => {
       this._set(key, value);
-    }, dynamicAnddynamicTovoid()));
+    }, dynamicAnddynamicToNull()));
   }
   containsValue(value) {
     if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
@@ -31493,7 +31496,7 @@
       }
       keyValueList[dartx._set](i++, key);
       keyValueList[dartx._set](i++, value);
-    }, dynamicAnddynamicTovoid()));
+    }, dynamicAnddynamicToNull()));
     if (!allStringKeys) return false;
     this.writeString('{');
     let separator = '"';
@@ -31594,7 +31597,7 @@
       }
       keyValueList[dartx._set](i++, key);
       keyValueList[dartx._set](i++, value);
-    }, dynamicAnddynamicTovoid()));
+    }, dynamicAnddynamicToNull()));
     if (!allStringKeys) return false;
     this.writeString('{\n');
     this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
@@ -33840,7 +33843,7 @@
         sb.write(": ");
         sb.write(core.Error.safeToString(value));
         i++;
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
     }
     if (this[_existingArgumentNames] == null) {
       return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver])}\n` + dart.str`Arguments: [${sb}]`;
@@ -34166,7 +34169,7 @@
     let result = dart.map({}, core.String, dart.dynamic);
     namedArguments[dartx.forEach](dart.fn((symbol, value) => {
       result[dartx._set](core._symbolToString(symbol), value);
-    }, SymbolAnddynamicTovoid()));
+    }, SymbolAnddynamicToNull()));
     return result;
   }
 };
@@ -35161,7 +35164,7 @@
           dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
         }
       }
-    }, StringTovoid()));
+    }, StringToNull()));
   }
   static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
     if (firstSegment === void 0) firstSegment = 0;
@@ -35518,7 +35521,7 @@
           writeParameter(key, value);
         }
       }
-    }, StringAnddynamicTovoid()));
+    }, StringAnddynamicToNull()));
     return result.toString();
   }
   static _makeFragment(fragment, start, end) {
@@ -36506,7 +36509,7 @@
       if (indices != null) indices[dartx.add](buffer.length);
       buffer.write('=');
       buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
-    }, StringAndStringTovoid())));
+    }, StringAndStringToNull())));
   }
   static _validateMimeType(mimeType) {
     let slashIndex = -1;
@@ -39155,7 +39158,7 @@
         this.error(response);
         this.close();
       }
-    }, dynamicToFutureOr()));
+    }, dynamicToNull()));
   }
   onResume() {
     if (!dart.test(this.nextRunning)) {
@@ -39220,7 +39223,7 @@
       } else {
         this.controller.addError(new io.FileSystemException("Internal error"));
       }
-    }, dynamicToFutureOr()));
+    }, dynamicToNull()));
   }
   [_cleanup]() {
     this.controller.close();
@@ -39530,13 +39533,13 @@
       if (dart.test(this[_atEnd])) {
         this[_closeFile]();
       }
-    }, ListOfintToFutureOr())).catchError(dart.fn((e, s) => {
+    }, ListOfintToNull())).catchError(dart.fn((e, s) => {
       if (!dart.test(this[_unsubscribed])) {
         this[_controller].addError(e, core.StackTrace._check(s));
         this[_closeFile]();
         this[_unsubscribed] = true;
       }
-    }, dynamicAnddynamicTodynamic()));
+    }, dynamicAnddynamicToNull()));
   }
   [_start]() {
     if (dart.notNull(this[_position]) < 0) {
@@ -39557,7 +39560,7 @@
             this[_controller].addError(e, core.StackTrace._check(s));
             this[_readInProgress] = false;
             this[_closeFile]();
-          }, dynamicAnddynamicTodynamic())});
+          }, dynamicAnddynamicToNull())});
       } else {
         onReady(file);
       }
@@ -39643,10 +39646,10 @@
           error(e, stackTrace);
         }
 
-      }, ListOfintTovoid()), {onDone: dart.fn(() => {
+      }, ListOfintToNull()), {onDone: dart.fn(() => {
           completer.complete(this[_file]);
-        }, VoidTovoid()), onError: error, cancelOnError: true});
-    }, RandomAccessFileToFutureOr())).catchError(dart.bind(completer, 'completeError'));
+        }, VoidToNull()), onError: error, cancelOnError: true});
+    }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
     return completer.future;
   }
   close() {
@@ -39884,7 +39887,7 @@
           } else {
             completer.complete(builder.takeBytes());
           }
-        }, dynamicTodynamic()), {onError: dart.bind(completer, 'completeError')});
+        }, dynamicToNull()), {onError: dart.bind(completer, 'completeError')});
       }
       dart.fn(read, VoidTovoid());
       read();
@@ -40435,7 +40438,7 @@
     data[dartx._set](0, this[_pointer]());
     return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
       this[_asyncDispatched] = false;
-    }, VoidTodynamic()));
+    }, VoidToNull()));
   }
   [_checkAvailable]() {
     if (dart.test(this[_asyncDispatched])) {
@@ -42072,7 +42075,7 @@
         sb.write(values[dartx._get](i));
       }
       sb.write("\n");
-    }, StringAndListOfStringTovoid()));
+    }, StringAndListOfStringToNull()));
     return sb.toString();
   }
   [_parseCookies]() {
@@ -42284,7 +42287,7 @@
         sb.write(name);
         sb.write("=");
         sb.write(value);
-      }, StringAndStringTovoid()));
+      }, StringAndStringToNull()));
     }
     return sb.toString();
   }
@@ -42432,7 +42435,7 @@
           value = value[dartx.toLowerCase]();
         }
         this[_parameters][dartx._set](lowerCaseKey, value);
-      }, StringAndStringTovoid()));
+      }, StringAndStringToNull()));
     }
     if (charset != null) {
       this[_ensureParameters]();
@@ -42697,7 +42700,7 @@
     this.hasSubscriber = true;
     return this[_stream].handleError(dart.fn(error => {
       dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-    }, dynamicTodynamic())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }, dynamicToNull())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get dataDone() {
     return this[_dataCompleter].future;
@@ -42920,7 +42923,7 @@
     if (values != null) {
       values[dartx.forEach](dart.fn(value => {
         this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
-      }, StringTovoid()));
+      }, StringToNull()));
     }
     return this[_cookies];
   }
@@ -43144,7 +43147,7 @@
       const targetAddStream = (function() {
         return this[_target].addStream(stream).whenComplete(dart.fn(() => {
           this[_isBound] = false;
-        }, VoidTodynamic()));
+        }, VoidToNull()));
       }).bind(this);
       dart.fn(targetAddStream, VoidToFuture());
       if (this[_controllerInstance] == null) return targetAddStream();
@@ -43162,7 +43165,7 @@
       this[_controllerInstance].close();
       return future.whenComplete(dart.fn(() => {
         this[_isBound] = false;
-      }, VoidTodynamic()));
+      }, VoidToNull()));
     }
     close() {
       if (dart.test(this[_isBound])) {
@@ -43213,7 +43216,7 @@
           } else {
             this[_closeTarget]();
           }
-        }, dynamicToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
             if (dart.test(this[_isBound])) {
               this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
               this[_controllerCompleter] = null;
@@ -43221,7 +43224,7 @@
             } else {
               this[_completeDoneError](error, core.StackTrace._check(stackTrace));
             }
-          }, dynamicAnddynamicTodynamic())});
+          }, dynamicAnddynamicToNull())});
       }
       return this[_controllerInstance];
     }
@@ -43466,7 +43469,7 @@
     }
     this.close();
     this.done.catchError(dart.fn(_ => {
-    }, dynamicTodynamic()));
+    }, dynamicToNull()));
     return future;
   }
   get connectionInfo() {
@@ -43481,7 +43484,7 @@
     if (this[_deadline] == null) return;
     this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
       this[_httpRequest][_httpConnection].destroy();
-    }, VoidTovoid()));
+    }, VoidToNull()));
   }
   [_writeHeader]() {
     let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
@@ -43546,7 +43549,7 @@
     if (this[_cookies] != null) {
       this[_cookies][dartx.forEach](dart.fn(cookie => {
         this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
-      }, CookieTovoid()));
+      }, CookieToNull()));
     }
     this.headers[_finalize]();
     offset = this.headers[_write](buffer, offset);
@@ -44050,7 +44053,7 @@
       }
       if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
         drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicTodynamic()));
+        }, dynamicToNull()));
       }
     } else {
       drainRequest = false;
@@ -44079,7 +44082,7 @@
     }
     if (dart.test(this.ignoreBody)) {
       stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-      }, dynamicTodynamic()));
+      }, dynamicToNull()));
       let future = this.writeHeaders();
       if (future != null) {
         return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
@@ -44206,7 +44209,7 @@
         this[_addChunk](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
         this[_pendingChunkedFooter] = 2;
         this[_addChunk](data, ListOfintTovoid()._check(this[_gzipAdd]));
-      }, dynamicTodynamic())));
+      }, dynamicToNull())));
     }
   }
   [_ignoreError](error) {
@@ -44362,28 +44365,28 @@
       if (incoming.statusCode == 100) {
         incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
           this[_subscription].resume();
-        }, dynamicToFutureOr())).catchError(dart.fn((error, stackTrace) => {
+        }, dynamicToNull())).catchError(dart.fn((error, stackTrace) => {
           if (stackTrace === void 0) stackTrace = null;
           this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
           this[_nextResponseCompleter] = null;
-        }, dynamic__Todynamic()));
+        }, dynamic__ToNull()));
       } else {
         this[_nextResponseCompleter].complete(incoming);
         this[_nextResponseCompleter] = null;
       }
-    }, _HttpIncomingTovoid()), {onError: dart.fn((error, stackTrace) => {
+    }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
         if (stackTrace === void 0) stackTrace = null;
         if (this[_nextResponseCompleter] != null) {
           this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
           this[_nextResponseCompleter] = null;
         }
-      }, dynamic__Todynamic()), onDone: dart.fn(() => {
+      }, dynamic__ToNull()), onDone: dart.fn(() => {
         if (this[_nextResponseCompleter] != null) {
           this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
           this[_nextResponseCompleter] = null;
         }
         this.close();
-      }, VoidTovoid())});
+      }, VoidToNull())});
   }
   send(uri, port, method, proxy) {
     if (dart.test(this.closed)) {
@@ -44439,7 +44442,7 @@
           } else {
             this.destroy();
           }
-        }, dynamicToFutureOr()));
+        }, dynamicToNull()));
         if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
           let authInfo = incoming.headers._get("proxy-authentication-info");
           if (authInfo != null && authInfo[dartx.length] == 1) {
@@ -44457,17 +44460,17 @@
           }
         }
         request[_onIncoming](incoming);
-      }, _HttpIncomingToFutureOr())).catchError(dart.fn(error => {
+      }, _HttpIncomingToNull())).catchError(dart.fn(error => {
         dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-      }, dynamicTodynamic()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+      }, dynamicToNull()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
         this.destroy();
         request[_onError](error, core.StackTrace._check(stackTrace));
-      }, dynamicAnddynamicTodynamic()));
+      }, dynamicAnddynamicToNull()));
       this[_subscription].resume();
       return s;
     }, dynamicTodynamic()), {onError: dart.fn(e => {
         this.destroy();
-      }, dynamicTodynamic())});
+      }, dynamicToNull())});
     return request;
   }
   detachSocket() {
@@ -44517,7 +44520,7 @@
     this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
       this[_idleTimer] = null;
       this.close();
-    }, VoidTovoid()));
+    }, VoidToNull()));
   }
 };
 dart.setSignature(io._HttpClientConnection, {
@@ -44641,7 +44644,7 @@
       let completer = async.Completer.new();
       this[_pending].add(dart.fn(() => {
         this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
-      }, VoidTodynamic()));
+      }, VoidToNull()));
       return FutureOf_ConnectionInfo()._check(completer.future);
     }
     let currentBadCertificateCallback = client[_badCertificateCallback];
@@ -44670,7 +44673,7 @@
         this[_connecting] = dart.notNull(this[_connecting]) - 1;
         this[_checkPending]();
         dart.throw(error);
-      }, dynamicTodynamic())});
+      }, dynamicToNull())});
   }
 };
 dart.setSignature(io._ConnectionTarget, {
@@ -45149,7 +45152,7 @@
       this[_httpServer][_markActive](this);
       incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
         if (dart.test(closing)) this.destroy();
-      }, dynamicToFutureOr()));
+      }, dynamicToNull()));
       this[_subscription].pause();
       this[_state] = io._HttpConnection._ACTIVE;
       let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
@@ -45166,17 +45169,17 @@
         } else {
           this.destroy();
         }
-      }, dynamicToFutureOr()), {onError: dart.fn(_ => {
+      }, dynamicToNull()), {onError: dart.fn(_ => {
           this.destroy();
-        }, dynamicTodynamic())});
+        }, dynamicToNull())});
       outgoing.ignoreBody = request.method == "HEAD";
       response[_httpRequest] = request;
       this[_httpServer][_handleRequest](request);
-    }, _HttpIncomingTovoid()), {onDone: dart.fn(() => {
+    }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
         this.destroy();
-      }, VoidTovoid()), onError: dart.fn(error => {
+      }, VoidToNull()), onError: dart.fn(error => {
         this.destroy();
-      }, dynamicTodynamic())});
+      }, dynamicToNull())});
   }
   markIdle() {
     this[_idleMark] = true;
@@ -45392,7 +45395,7 @@
             idle.markIdle();
           }
         }
-      }, TimerTovoid()));
+      }, TimerToNull()));
     }
   }
   listen(onData, opts) {
@@ -45403,11 +45406,11 @@
       socket.setOption(io.SocketOption.TCP_NODELAY, true);
       let connection = new io._HttpConnection(socket, this);
       this[_idleConnections].add(connection);
-    }, SocketTodynamic()), {onError: dart.fn((error, stackTrace) => {
+    }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
         if (!io.HandshakeException.is(error)) {
           this[_controller].addError(error, core.StackTrace._check(stackTrace));
         }
-      }, dynamicAnddynamicTodynamic()), onDone: dart.bind(this[_controller], 'close')});
+      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller], 'close')});
     return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   close(opts) {
@@ -45485,11 +45488,11 @@
         dart.assert(conn[_isClosing]);
         result.closing = dart.notNull(result.closing) + 1;
       }
-    }, _HttpConnectionTovoid()));
+    }, _HttpConnectionToNull()));
     this[_idleConnections].forEach(dart.fn(conn => {
       result.idle = dart.notNull(result.idle) + 1;
       dart.assert(conn[_isIdle]);
-    }, _HttpConnectionTovoid()));
+    }, _HttpConnectionToNull()));
     return result;
   }
   get [_serviceTypePath]() {
@@ -45664,7 +45667,7 @@
           dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
         }
       }
-    }, StringTovoid()));
+    }, StringToNull()));
   }
   direct() {
     this.proxies = const || (const = dart.constList([const || (const = dart.const(new io._Proxy.direct()))], io._Proxy));
@@ -46312,7 +46315,7 @@
       if (this[_userOnData] != null) {
         dart.dcall(this[_userOnData], data);
       }
-    }, VoidTovoid()));
+    }, VoidToNull()));
   }
 };
 io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
@@ -46445,17 +46448,17 @@
     super.new();
     this[_controller] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
         this[_paused] = false;
-      }, VoidTovoid()), onPause: dart.fn(() => {
+      }, VoidToNull()), onPause: dart.fn(() => {
         this[_paused] = true;
         this[_pauseStateChanged]();
-      }, VoidTovoid()), onResume: dart.fn(() => {
+      }, VoidToNull()), onResume: dart.fn(() => {
         this[_paused] = false;
         this[_pauseStateChanged]();
-      }, VoidTovoid()), onCancel: dart.fn(() => {
+      }, VoidToNull()), onCancel: dart.fn(() => {
         if (this[_socketSubscription] != null) {
           this[_socketSubscription].cancel();
         }
-      }, VoidTodynamic())});
+      }, VoidToNull())});
     this[_reset]();
   }
   listen(onData, opts) {
@@ -47075,24 +47078,24 @@
         dart.assert(this[_bodyPaused]);
         this[_bodyPaused] = false;
         this[_pauseStateChanged]();
-      }, VoidTovoid()), onPause: dart.fn(() => {
+      }, VoidToNull()), onPause: dart.fn(() => {
         if (!dart.equals(incoming, this[_incoming])) return;
         dart.assert(!dart.test(this[_bodyPaused]));
         this[_bodyPaused] = true;
         this[_pauseStateChanged]();
-      }, VoidTovoid()), onResume: dart.fn(() => {
+      }, VoidToNull()), onResume: dart.fn(() => {
         if (!dart.equals(incoming, this[_incoming])) return;
         dart.assert(this[_bodyPaused]);
         this[_bodyPaused] = false;
         this[_pauseStateChanged]();
-      }, VoidTovoid()), onCancel: dart.fn(() => {
+      }, VoidToNull()), onCancel: dart.fn(() => {
         if (!dart.equals(incoming, this[_incoming])) return;
         if (this[_socketSubscription] != null) {
           this[_socketSubscription].cancel();
         }
         this[_closeIncoming](true);
         this[_controller].close();
-      }, VoidTodynamic())});
+      }, VoidToNull())});
     incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
     this[_bodyPaused] = true;
     this[_pauseStateChanged]();
@@ -48716,7 +48719,7 @@
     let completer = async.Completer.new();
     dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
       completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicTodynamic()));
+    }, dynamicToNull()));
     return FutureOfSecureSocket()._check(completer.future);
   }
   static secureServer(socket, context, opts) {
@@ -48727,7 +48730,7 @@
     let completer = async.Completer.new();
     dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
       completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicTodynamic()));
+    }, dynamicToNull()));
     return FutureOfSecureSocket()._check(completer.future);
   }
 };
@@ -48883,11 +48886,11 @@
       } else {
         this[_controller].add(secureConnection);
       }
-    }, RawSecureSocketToFutureOr())).catchError(dart.fn((e, s) => {
+    }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
       if (!dart.test(this[_closed])) {
         this[_controller].addError(e, core.StackTrace._check(s));
       }
-    }, dynamicAnddynamicTodynamic()));
+    }, dynamicAnddynamicToNull()));
   }
   [_onPauseStateChange]() {
     if (dart.test(this[_controller].isPaused)) {
@@ -49467,7 +49470,7 @@
           }
         }
         this[_tryFilter]();
-      }, _FilterStatusToFutureOr())).catchError(dart.bind(this, _reportError));
+      }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
     }
   }
   [_readSocketOrBufferedData](bytes) {
@@ -50552,7 +50555,7 @@
         completer.completeError(e, s);
       }
 
-    }, ListOfintTovoid()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
+    }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
     return completer.future;
   }
   close() {
@@ -51544,9 +51547,9 @@
   bind(stream) {
     stream.listen(dart.fn(request => {
       io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller], 'addError'));
-    }, HttpRequestTovoid()), {onDone: dart.fn(() => {
+    }, HttpRequestToNull()), {onDone: dart.fn(() => {
         this[_controller].close();
-      }, VoidTovoid())});
+      }, VoidToNull())});
     return this[_controller].stream;
   }
   static _upgrade(request, _protocolSelector, compression) {
@@ -51585,7 +51588,7 @@
         response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
         response.close();
         dart.throw(error);
-      }, dynamicTodynamic())).then(io.WebSocket)(upgrade);
+      }, dynamicToNull())).then(io.WebSocket)(upgrade);
     } else {
       return FutureOfWebSocket()._check(upgrade(null));
     }
@@ -51615,7 +51618,7 @@
     let isUpgrade = false;
     request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
       if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
-    }, StringTovoid()));
+    }, StringToNull()));
     if (!isUpgrade) return false;
     let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
     if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
@@ -51810,7 +51813,7 @@
   addFrame(opcode, data) {
     return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
       this[_eventSink].add(e);
-    }, ListOfintTovoid()));
+    }, ListOfintToNull()));
   }
   static createFrame(opcode, data, serverSide, compressed) {
     let mask = !dart.test(serverSide);
@@ -51956,7 +51959,7 @@
     this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
       this[_done]();
       this[_closeCompleter].complete(this.webSocket);
-    }, dynamicToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
         this[_closed] = true;
         this[_cancel]();
         if (core.ArgumentError.is(error)) {
@@ -51967,7 +51970,7 @@
           this[_done]();
           this[_closeCompleter].complete(this.webSocket);
         }
-      }, dynamicAndStackTraceTodynamic())});
+      }, dynamicAndStackTraceToNull())});
   }
   [_done](error, stackTrace) {
     if (error === void 0) error = null;
@@ -51990,7 +51993,7 @@
     this[_completer] = async.Completer.new();
     this[_subscription] = stream.listen(dart.fn(data => {
       this[_controller].add(data);
-    }, dynamicTovoid()), {onDone: dart.bind(this, _done), onError: dart.bind(this, _done), cancelOnError: true});
+    }, dynamicToNull()), {onDone: dart.bind(this, _done), onError: dart.bind(this, _done), cancelOnError: true});
     if (dart.test(this[_issuedPause])) {
       this[_subscription].pause();
       this[_issuedPause] = false;
@@ -52001,7 +52004,7 @@
     this[_ensureController]();
     const closeSocket = (function() {
       return this.socket.close().catchError(dart.fn(_ => {
-      }, dynamicTodynamic())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+      }, dynamicToNull())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
     }).bind(this);
     dart.fn(closeSocket, VoidToFuture());
     this[_controller].close();
@@ -52092,7 +52095,7 @@
       function error(message) {
         response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
           socket.destroy();
-        }, SocketToFutureOr()));
+        }, SocketToNull()));
         dart.throw(new io.WebSocketException(message));
       }
       dart.fn(error, StringTovoid());
@@ -52175,7 +52178,7 @@
       } else {
         this[_controller].add(data);
       }
-    }, dynamicTodynamic()), {onError: dart.fn((error, stackTrace) => {
+    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
         if (this[_closeTimer] != null) this[_closeTimer].cancel();
         if (core.FormatException.is(error)) {
           this[_close](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
@@ -52185,7 +52188,7 @@
         this[_closeCode] = this[_outCloseCode];
         this[_closeReason] = this[_outCloseReason];
         this[_controller].close();
-      }, dynamicAnddynamicTodynamic()), onDone: dart.fn(() => {
+      }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
         if (this[_closeTimer] != null) this[_closeTimer].cancel();
         if (this[_readyState] == io.WebSocket.OPEN) {
           this[_readyState] = io.WebSocket.CLOSING;
@@ -52199,12 +52202,12 @@
         this[_closeCode] = transformer.closeCode;
         this[_closeReason] = transformer.closeReason;
         this[_controller].close();
-      }, VoidTodynamic()), cancelOnError: true}));
+      }, VoidToNull()), cancelOnError: true}));
     this[_subscription].pause();
     this[_controller] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription], 'resume'), onCancel: dart.fn(() => {
         this[_subscription].cancel();
         this[_subscription] = null;
-      }, VoidTodynamic()), onPause: dart.bind(this[_subscription], 'pause'), onResume: dart.bind(this[_subscription], 'resume')});
+      }, VoidToNull()), onPause: dart.bind(this[_subscription], 'pause'), onResume: dart.bind(this[_subscription], 'resume')});
     io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
     try {
       dart.dput(this[_socket], _owner, this);
@@ -52231,8 +52234,8 @@
       this[_consumer].add(new io._WebSocketPing());
       this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
         this[_close](io.WebSocketStatus.GOING_AWAY);
-      }, VoidTovoid()));
-    }, VoidTovoid()));
+      }, VoidToNull()));
+    }, VoidToNull()));
   }
   get readyState() {
     return this[_readyState];
@@ -52280,7 +52283,7 @@
           if (this[_subscription] != null) this[_subscription].cancel();
           this[_controller].close();
           io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
-        }, VoidTovoid()));
+        }, VoidToNull()));
       }
     }
     return this[_sink].close();
@@ -52520,11 +52523,11 @@
     controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
         port = isolate.RawReceivePort.new(handleError);
         this.addErrorListener(port.sendPort);
-      }, VoidTovoid()), onCancel: dart.fn(() => {
+      }, VoidToNull()), onCancel: dart.fn(() => {
         this.removeErrorListener(port.sendPort);
         port.close();
         port = null;
-      }, VoidTovoid())});
+      }, VoidToNull())});
     return controller.stream;
   }
 };
@@ -54789,7 +54792,7 @@
       let completer = CompleterOfIdbFactory().sync();
       request[dartx.onSuccess].listen(dart.fn(e => {
         completer.complete(this);
-      }, EventTovoid()));
+      }, EventToNull()));
       request[dartx.onError].listen(dart.bind(completer, 'completeError'));
       return completer.future;
     } catch (e) {
@@ -54848,7 +54851,7 @@
     request[dartx.onSuccess].listen(dart.fn(e => {
       let result = indexed_db._cast(T)(request[dartx.result]);
       completer.complete(result);
-    }, EventTovoid()));
+    }, EventToNull()));
     request[dartx.onError].listen(dart.bind(completer, 'completeError'));
     return completer.future;
   };
@@ -55320,7 +55323,7 @@
             cursor[dartx.next]();
           }
         }
-      }, EventTovoid()));
+      }, EventToNull()));
       return controller.stream;
     };
   }
@@ -55493,15 +55496,15 @@
     let completer = CompleterOfDatabase().new();
     this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
       completer.complete(this[dartx.db]);
-    }, EventToFutureOr()));
+    }, EventToNull()));
     this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
       completer.completeError(e);
-    }, EventToFutureOr()));
+    }, EventToNull()));
     this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
       if (!dart.test(completer.isCompleted)) {
         completer.completeError(e);
       }
-    }, EventToFutureOr()));
+    }, EventToNull()));
     return completer.future;
   }
   static _() {
@@ -61638,9 +61641,9 @@
     let completer = CompleterOfFileSystem().new();
     this[_webkitRequestFileSystem](type, size, dart.fn(value => {
       completer.complete(value);
-    }, FileSystemTovoid()), dart.fn(error => {
+    }, FileSystemToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [dartx.requestFileSystemSync](...args) {
@@ -61656,9 +61659,9 @@
     let completer = CompleterOfEntry().new();
     this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
       completer.complete(value);
-    }, EntryTovoid()), dart.fn(error => {
+    }, EntryToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [dartx.atob](...args) {
@@ -69298,7 +69301,7 @@
     let completer = CompleterOfString().new();
     this[_getAsString](dart.fn(value => {
       completer.complete(value);
-    }, StringTovoid()));
+    }, StringToNull()));
     return completer.future;
   }
   [dartx.getAsEntry](...args) {
@@ -69840,9 +69843,9 @@
     let completer = CompleterOfEntry().new();
     this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), errorCallback: dart.fn(error => {
+      }, EntryToNull()), errorCallback: dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid())});
+      }, FileErrorToNull())});
     return completer.future;
   }
   [_getMetadata](...args) {
@@ -69852,9 +69855,9 @@
     let completer = CompleterOfMetadata().new();
     this[_getMetadata](dart.fn(value => {
       completer.complete(value);
-    }, MetadataTovoid()), dart.fn(error => {
+    }, MetadataToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [_getParent](...args) {
@@ -69864,9 +69867,9 @@
     let completer = CompleterOfEntry().new();
     this[_getParent](dart.fn(value => {
       completer.complete(value);
-    }, EntryTovoid()), dart.fn(error => {
+    }, EntryToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [_moveTo](...args) {
@@ -69877,9 +69880,9 @@
     let completer = CompleterOfEntry().new();
     this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), errorCallback: dart.fn(error => {
+      }, EntryToNull()), errorCallback: dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid())});
+      }, FileErrorToNull())});
     return completer.future;
   }
   [_remove](...args) {
@@ -69889,9 +69892,9 @@
     let completer = async.Completer.new();
     this[_remove](dart.fn(() => {
       completer.complete();
-    }, VoidTovoid()), dart.fn(error => {
+    }, VoidToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [dartx.toUrl](...args) {
@@ -69990,9 +69993,9 @@
     let completer = CompleterOfEntry().new();
     this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), errorCallback: dart.fn(error => {
+      }, EntryToNull()), errorCallback: dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid())});
+      }, FileErrorToNull())});
     return completer.future;
   }
   [__getFile](path, opts) {
@@ -70034,9 +70037,9 @@
     let completer = CompleterOfEntry().new();
     this[__getFile](path, {options: options, successCallback: dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), errorCallback: dart.fn(error => {
+      }, EntryToNull()), errorCallback: dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid())});
+      }, FileErrorToNull())});
     return completer.future;
   }
   [_removeRecursively](...args) {
@@ -70046,9 +70049,9 @@
     let completer = async.Completer.new();
     this[_removeRecursively](dart.fn(() => {
       completer.complete();
-    }, VoidTovoid()), dart.fn(error => {
+    }, VoidToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
 };
@@ -70092,9 +70095,9 @@
     let completer = CompleterOfListOfEntry().new();
     this[_readEntries](dart.fn(value => {
       completer.complete(value);
-    }, ListOfEntryTovoid()), dart.fn(error => {
+    }, ListOfEntryToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
 };
@@ -73476,9 +73479,9 @@
     let completer = CompleterOfFileWriter().new();
     this[_createWriter](dart.fn(value => {
       completer.complete(value);
-    }, FileWriterTovoid()), dart.fn(error => {
+    }, FileWriterToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [_file](...args) {
@@ -73488,9 +73491,9 @@
     let completer = CompleterOfFile().new();
     this[_file](dart.fn(value => {
       completer.complete(value);
-    }, FileTovoid()), dart.fn(error => {
+    }, FileToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
 };
@@ -74554,9 +74557,9 @@
     try {
       this[_getCurrentPosition](dart.fn(position => {
         completer.complete(this[_ensurePosition](position));
-      }, GeopositionTovoid()), dart.fn(error => {
+      }, GeopositionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, PositionErrorTovoid()), options);
+      }, PositionErrorToNull()), options);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       completer.completeError(e, stacktrace);
@@ -74584,13 +74587,13 @@
         dart.assert(watchId == null);
         watchId = this[_watchPosition](dart.fn(position => {
           controller.add(this[_ensurePosition](position));
-        }, GeopositionTovoid()), dart.fn(error => {
+        }, GeopositionToNull()), dart.fn(error => {
           controller.addError(error);
-        }, PositionErrorTovoid()), options);
-      }, VoidTovoid()), onCancel: dart.fn(() => {
+        }, PositionErrorToNull()), options);
+      }, VoidToNull()), onCancel: dart.fn(() => {
         dart.assert(watchId != null);
         this[_clearWatch](watchId);
-      }, VoidTodynamic())});
+      }, VoidToNull())});
     return controller.stream;
   }
   [_ensurePosition](domPosition) {
@@ -75994,7 +75997,7 @@
     let parts = [];
     data[dartx.forEach](dart.fn((key, value) => {
       parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
     let formData = parts[dartx.join]('&');
     if (requestHeaders == null) {
       requestHeaders = dart.map({}, core.String, core.String);
@@ -76028,7 +76031,7 @@
     if (requestHeaders != null) {
       requestHeaders[dartx.forEach](dart.fn((header, value) => {
         xhr[dartx.setRequestHeader](header, value);
-      }, StringAndStringTovoid()));
+      }, StringAndStringToNull()));
     }
     if (onProgress != null) {
       xhr[dartx.onProgress].listen(onProgress);
@@ -76043,7 +76046,7 @@
       } else {
         completer.completeError(e);
       }
-    }, ProgressEventTovoid()));
+    }, ProgressEventToNull()));
     xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
     if (sendData != null) {
       xhr[dartx.send](sendData);
@@ -76080,13 +76083,13 @@
     }
     let xhr = new XDomainRequest();
     xhr.open(method, url);
-    xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+    xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
       let response = xhr.responseText;
       completer.complete(response);
-    }, dynamicTodynamic()), 1);
-    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+    }, dynamicToNull()), 1);
+    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
       completer.completeError(e);
-    }, dynamicTodynamic()), 1);
+    }, dynamicToNull()), 1);
     xhr.onprogress = {};
     xhr.ontimeout = {};
     xhr.timeout = Number.MAX_VALUE;
@@ -79963,7 +79966,7 @@
     let completer = CompleterOfListOfSourceInfo().new();
     html.MediaStreamTrack._getSources(dart.fn(value => {
       completer.complete(value);
-    }, ListOfSourceInfoTovoid()));
+    }, ListOfSourceInfoToNull()));
     return completer.future;
   }
   [dartx.stop](...args) {
@@ -81184,7 +81187,7 @@
     function override(key, value) {
       if (value != null) html.MutationObserver._add(parsedOptions, core.String._check(key), value);
     }
-    dart.fn(override, dynamicAnddynamicTodynamic());
+    dart.fn(override, dynamicAnddynamicToNull());
     override('childList', childList);
     override('attributes', attributes);
     override('characterData', characterData);
@@ -81350,9 +81353,9 @@
     this[_ensureGetUserMedia]();
     this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
       completer.complete(stream);
-    }, MediaStreamTovoid()), dart.fn(error => {
+    }, MediaStreamToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, NavigatorUserMediaErrorTovoid()));
+    }, NavigatorUserMediaErrorToNull()));
     return completer.future;
   }
   [_ensureGetUserMedia]() {
@@ -82224,7 +82227,7 @@
     let completer = CompleterOfString().new();
     html.Notification._requestPermission(dart.fn(value => {
       completer.complete(value);
-    }, StringTovoid()));
+    }, StringToNull()));
     return completer.future;
   }
   get [dartx.onClick]() {
@@ -85239,9 +85242,9 @@
     let completer = CompleterOfRtcSessionDescription().new();
     this[_createOffer](dart.fn(value => {
       completer.complete(value);
-    }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+    }, RtcSessionDescriptionToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, StringTovoid()), mediaConstraints);
+    }, StringToNull()), mediaConstraints);
     return completer.future;
   }
   [dartx.createAnswer](mediaConstraints) {
@@ -85249,16 +85252,16 @@
     let completer = CompleterOfRtcSessionDescription().new();
     this[_createAnswer](dart.fn(value => {
       completer.complete(value);
-    }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+    }, RtcSessionDescriptionToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, StringTovoid()), mediaConstraints);
+    }, StringToNull()), mediaConstraints);
     return completer.future;
   }
   [dartx.getStats](selector) {
     let completer = CompleterOfRtcStatsResponse().new();
     this[_getStats](dart.fn(value => {
       completer.complete(value);
-    }, RtcStatsResponseTovoid()), selector);
+    }, RtcStatsResponseToNull()), selector);
     return completer.future;
   }
   static _() {
@@ -85374,9 +85377,9 @@
     let completer = async.Completer.new();
     this[_setLocalDescription](description, dart.fn(() => {
       completer.complete();
-    }, VoidTovoid()), dart.fn(error => {
+    }, VoidToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, StringTovoid()));
+    }, StringToNull()));
     return completer.future;
   }
   [_setRemoteDescription](...args) {
@@ -85386,9 +85389,9 @@
     let completer = async.Completer.new();
     this[_setRemoteDescription](description, dart.fn(() => {
       completer.complete();
-    }, VoidTovoid()), dart.fn(error => {
+    }, VoidToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, StringTovoid()));
+    }, StringToNull()));
     return completer.future;
   }
   [dartx.updateIce](configuration, mediaConstraints) {
@@ -88206,7 +88209,7 @@
   [dartx.addAll](other) {
     other[dartx.forEach](dart.fn((k, v) => {
       this[dartx._set](k, v);
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
   }
   [dartx.containsValue](value) {
     return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool()));
@@ -92042,7 +92045,7 @@
     let completer = CompleterOfnum().sync();
     this[dartx.requestAnimationFrame](dart.fn(time => {
       completer.complete(time);
-    }, numTovoid()));
+    }, numToNull()));
     return completer.future;
   }
   get [dartx.document]() {
@@ -92497,9 +92500,9 @@
     let completer = CompleterOfFileSystem().new();
     this[__requestFileSystem](type, size, dart.fn(value => {
       completer.complete(value);
-    }, FileSystemTovoid()), dart.fn(error => {
+    }, FileSystemToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [_resolveLocalFileSystemUrl](...args) {
@@ -92509,9 +92512,9 @@
     let completer = CompleterOfEntry().new();
     this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
       completer.complete(value);
-    }, EntryTovoid()), dart.fn(error => {
+    }, EntryToNull()), dart.fn(error => {
       completer.completeError(error);
-    }, FileErrorTovoid()));
+    }, FileErrorToNull()));
     return completer.future;
   }
   [dartx.atob](...args) {
@@ -93201,7 +93204,7 @@
     stream.listen(dart.fn(event => {
       let wrapped = new html._BeforeUnloadEvent(event);
       controller.add(wrapped);
-    }, BeforeUnloadEventTovoid()));
+    }, BeforeUnloadEventToNull()));
     return controller.stream;
   }
   getEventType(target) {
@@ -94907,7 +94910,7 @@
   addAll(other) {
     other[dartx.forEach](dart.fn((k, v) => {
       this._set(k, v);
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
   }
   containsValue(value) {
     for (let v of this.values) {
@@ -95094,7 +95097,7 @@
   addAll(other) {
     other[dartx.forEach](dart.fn((k, v) => {
       this._set(k, v);
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
   }
   containsValue(value) {
     return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool()));
@@ -95125,7 +95128,7 @@
       if (dart.test(this[_matches](key))) {
         f(this[_strip](key), value);
       }
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
   }
   get keys() {
     let keys = JSArrayOfString().of([]);
@@ -95133,7 +95136,7 @@
       if (dart.test(this[_matches](key))) {
         keys[dartx.add](this[_strip](key));
       }
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
     return keys;
   }
   get values() {
@@ -95142,7 +95145,7 @@
       if (dart.test(this[_matches](key))) {
         values[dartx.add](value);
       }
-    }, StringAndStringTovoid()));
+    }, StringAndStringToNull()));
     return values;
   }
   get length() {
@@ -98399,7 +98402,7 @@
       if (request[dartx.readyState] == html.HttpRequest.DONE) {
         onComplete(request);
       }
-    }, ProgressEventTovoid()));
+    }, ProgressEventToNull()));
     request[dartx.send]();
     return request;
   }
@@ -99145,7 +99148,7 @@
       this.writeSlot(slot, copy);
       e[dartx.forEach](dart.fn((key, value) => {
         this.putIntoMap(copy, key, this.walk(value));
-      }, dynamicAnddynamicTovoid()));
+      }, dynamicAnddynamicToNull()));
       return copy;
     }
     if (core.List.is(e)) {
@@ -99354,7 +99357,7 @@
   }
   dict[dartx.forEach](dart.fn((key, value) => {
     object[key] = value;
-  }, StringAnddynamicTovoid()));
+  }, StringAnddynamicToNull()));
   return object;
 };
 dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
@@ -107350,13 +107353,13 @@
     let completer = CompleterOfAudioBuffer().new();
     this[_decodeAudioData](audioData, dart.fn(value => {
       completer.complete(value);
-    }, AudioBufferTovoid()), dart.fn(error => {
+    }, AudioBufferToNull()), dart.fn(error => {
       if (error == null) {
         completer.completeError('');
       } else {
         completer.completeError(error);
       }
-    }, AudioBufferTovoid()));
+    }, AudioBufferToNull()));
     return completer.future;
   }
 };
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index ababd63..b313c6a 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -550,6 +550,7 @@
   let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
   let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
   let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
+  let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
   let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
   let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
   let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
@@ -655,13 +656,12 @@
   let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
   let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
   let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
-  let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
+  let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
   let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
   let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
   let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
-  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+  let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
+  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
   let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
   let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
   let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -675,19 +675,22 @@
   let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
   let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
   let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
+  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
   let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
   let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
   let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
   let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
   let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
+  let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
+  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
   let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-  let ListToFutureOr = () => (ListToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [core.List])))();
-  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
-  let dynamicToFutureOr$ = () => (dynamicToFutureOr$ = dart.constFn(dart.definiteFunctionType(async.FutureOr, [dart.dynamic])))();
-  let TimerTovoid$ = () => (TimerTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
+  let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
+  let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
+  let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+  let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
   let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
-  let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
+  let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
   let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
   let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
@@ -730,7 +733,7 @@
   let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
   let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
   let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
-  let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
+  let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
   let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
   let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
   let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -743,11 +746,12 @@
   let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
   let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
   let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
+  let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
   let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
   let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
+  let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
   let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
-  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
+  let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
   let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
   let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
   let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
@@ -788,10 +792,11 @@
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
+  let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
   let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
   let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+  let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
   let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
   let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
   let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -816,10 +821,10 @@
   let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
   let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
   let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
-  let ListOfintToFutureOr = () => (ListOfintToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [ListOfint()])))();
+  let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
   let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
-  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
   let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
   let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
@@ -836,7 +841,8 @@
   let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
   let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
   let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let StringAndListOfStringTovoid$ = () => (StringAndListOfStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, ListOfString()])))();
+  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+  let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
   let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
   let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
   let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
@@ -847,15 +853,14 @@
   let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
   let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
   let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
-  let CookieTovoid = () => (CookieTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Cookie])))();
+  let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
   let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
   let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
   let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
   let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
   let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.StackTrace])))();
-  let _HttpIncomingTovoid$ = () => (_HttpIncomingTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpIncoming])))();
-  let _HttpIncomingToFutureOr = () => (_HttpIncomingToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._HttpIncoming])))();
+  let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+  let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
   let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
   let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
   let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
@@ -872,8 +877,8 @@
   let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
   let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
   let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketTodynamic = () => (SocketTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [io.Socket])))();
-  let _HttpConnectionTovoid = () => (_HttpConnectionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._HttpConnection])))();
+  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+  let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
   let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
   let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
   let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
@@ -887,22 +892,22 @@
   let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
   let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
   let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
-  let RawSecureSocketToFutureOr = () => (RawSecureSocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RawSecureSocket])))();
+  let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
   let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
-  let _FilterStatusToFutureOr = () => (_FilterStatusToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io._FilterStatus])))();
+  let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
   let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
   let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
   let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
   let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
   let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
   let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
-  let HttpRequestTovoid$ = () => (HttpRequestTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpRequest])))();
+  let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
   let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
   let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
   let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
   let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
-  let SocketToFutureOr = () => (SocketToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.Socket])))();
   let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
+  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
   let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
@@ -921,36 +926,35 @@
   let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
   let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
   let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-  let EventTovoid$ = () => (EventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Event])))();
+  let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
   let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
   let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-  let EventToFutureOr = () => (EventToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [html$.Event])))();
   let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
   let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
   let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
   let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-  let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileSystem])))();
-  let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileError])))();
-  let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Entry])))();
+  let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
+  let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
+  let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
   let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
   let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
-  let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Metadata])))();
-  let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
+  let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
+  let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
   let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
-  let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileWriter])))();
-  let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.File])))();
-  let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Geoposition])))();
-  let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.PositionError])))();
+  let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
+  let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
+  let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
+  let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
   let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
-  let ProgressEventTovoid$ = () => (ProgressEventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.ProgressEvent])))();
-  let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
-  let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.MediaStream])))();
-  let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.NavigatorUserMediaError])))();
-  let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription])))();
-  let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcStatsResponse])))();
+  let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
+  let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
+  let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
+  let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
+  let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
+  let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
   let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
-  let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
-  let BeforeUnloadEventTovoid = () => (BeforeUnloadEventTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.BeforeUnloadEvent])))();
+  let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
+  let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
   let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
   let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
   let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
@@ -977,9 +981,9 @@
   let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
   let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
   let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
-  let dynamic__Todynamic$0 = () => (dynamic__Todynamic$0 = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
+  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
   let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
-  let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
+  let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
   dart.mixin = function(base, ...mixins) {
     class Mixin extends base {}
     for (let m of mixins) {
@@ -1706,10 +1710,7 @@
         return null;
       }
     }
-    if (ret2 === dart.void) return true;
-    if (ret1 === dart.void) {
-      return ret2 === dart.dynamic || ret2 === async.FutureOr;
-    }
+    if (ret1 === dart.void) return dart._isTop(ret2);
     if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
     return true;
   };
@@ -1730,13 +1731,13 @@
     };
   };
   dart._isBottom = function(type) {
-    return type == dart.bottom;
+    return type == dart.bottom || type == core.Null;
   };
   dart._isTop = function(type) {
     if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
       return dart._isTop(dart.getGenericArgs(type)[0]);
     }
-    return type == core.Object || type == dart.dynamic;
+    return type == core.Object || type == dart.dynamic || type == dart.void;
   };
   dart._isSubtype = function(t1, t2, isCovariant) {
     if (t1 === t2) return true;
@@ -2183,6 +2184,9 @@
     return false;
   };
   dart.is = function(obj, type) {
+    if (obj == null) {
+      return type == core.Null || dart._isTop(type);
+    }
     let result = dart.strongInstanceOf(obj, type);
     if (result !== null) return result;
     let actual = dart.getReifiedType(obj);
@@ -3293,7 +3297,7 @@
       if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
         this.asMap()[dartx.forEach](dart.fn((i, element) => {
           children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
-        }, intAnddynamicTovoid()));
+        }, intAnddynamicToNull()));
       } else {
         for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
           let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
@@ -3694,14 +3698,14 @@
         } else {
           nonGenericProperties._set(core.String._check(name), value);
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
       nonGenericProperties.forEach(dart.fn((name, value) => {
         if (core.Type.is(value)) {
           children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
         } else {
           children.add(new _debugger.NameValuePair({name: name, value: value}));
         }
-      }, StringAndObjectTovoid()));
+      }, StringAndObjectToNull()));
       return children.toList();
     }
     recordGenericParameters(name, genericTypeConstructor) {
@@ -3770,7 +3774,7 @@
       map[dartx.forEach](dart.fn((key, value) => {
         let entryWrapper = new _debugger.MapEntry({key: key, value: value});
         entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       _debugger.addMetadataChildren(object, entries);
       return entries.toList();
     }
@@ -9206,11 +9210,11 @@
     if (_isolate_helper._MainFunctionArgs.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
       rootContext.eval(dart.fn(() => {
         dart.dcall(entry, args, null);
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     } else {
       rootContext.eval(core.Function._check(entry));
     }
@@ -9652,7 +9656,7 @@
           if (!dart.test(this.runIteration())) return;
           async.Timer.run(next);
         }).bind(this);
-        dart.fn(next, VoidTodynamic$());
+        dart.fn(next, VoidToNull());
         next();
       } else {
         while (dart.test(this.runIteration())) {
@@ -9805,7 +9809,7 @@
           let context = new _isolate_helper._IsolateContext();
           _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
             _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
-          }, VoidTodynamic$()), 'worker-start');
+          }, VoidToNull()), 'worker-start');
           _isolate_helper._globalState.currentContext = context;
           _isolate_helper._globalState.topEventLoop.run();
           break;
@@ -9855,9 +9859,9 @@
       let replyPort = dart.dindex(msg, 'replyPort');
       _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
         dart.dsend(replyPort, 'send', msg);
-      }, ListToFutureOr()), {onError: dart.fn(errorMessage => {
+      }, ListToNull()), {onError: dart.fn(errorMessage => {
           dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
-        }, StringTodynamic())});
+        }, StringToNull())});
     }
     static _log(msg) {
       if (dart.test(_isolate_helper._globalState.isWorker)) {
@@ -9914,7 +9918,7 @@
           dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
           completer.completeError(dart.dindex(msg, 1));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
       let signalReply = port.sendPort;
       if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
         _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
@@ -9940,7 +9944,7 @@
       _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
         let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
         _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
-      }, VoidTodynamic$()), 'nonworker start');
+      }, VoidToNull()), 'nonworker start');
     }
     static get currentIsolate() {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -10085,7 +10089,7 @@
         if (!dart.test(this[_receivePort][_isClosed])) {
           this[_receivePort][_add](msg);
         }
-      }, VoidTodynamic$()), dart.str`receive ${message}`);
+      }, VoidToNull()), dart.str`receive ${message}`);
     }
     ['=='](other) {
       return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
@@ -10219,13 +10223,11 @@
     let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
     let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
     let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
     let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
     let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
     let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
     let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
     let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
     let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
@@ -10240,12 +10242,14 @@
     let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
     let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
     let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
+    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
     let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
     let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
     let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
     let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
     let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
     let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
+    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
     let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
     let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
@@ -10253,11 +10257,10 @@
     let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
     let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
     let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
-    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
-    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
+    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
     class Stream extends core.Object {
       new() {
       }
@@ -10271,10 +10274,10 @@
         future.then(dart.dynamic)(dart.fn(value => {
           controller[_add$](value);
           controller[_closeUnchecked]();
-        }, TToFutureOr()), {onError: dart.fn((error, stackTrace) => {
+        }, TToNull()), {onError: dart.fn((error, stackTrace) => {
             controller[_addError](error, core.StackTrace._check(stackTrace));
             controller[_closeUnchecked]();
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return controller.stream;
       }
       static fromFutures(futures) {
@@ -10285,13 +10288,13 @@
             controller[_add$](value);
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, TTodynamic$());
+        }, TToNull());
         let onError = dart.fn((error, stack) => {
           if (!dart.test(controller.isClosed)) {
             controller[_addError](error, core.StackTrace._check(stack));
             if (--count == 0) controller[_closeUnchecked]();
           }
-        }, dynamicAnddynamicTodynamic$());
+        }, dynamicAnddynamicToNull());
         for (let future of futures) {
           count++;
           future.then(dart.dynamic)(onValue, {onError: onError});
@@ -10328,17 +10331,17 @@
           dart.assert(timer == null);
           timer = async.Timer.periodic(period, dart.fn(timer => {
             sendEvent();
-          }, TimerTovoid$()));
+          }, TimerToNull()));
         }
         dart.fn(startPeriodicTimer, VoidTovoid$());
         controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
             watch.start();
             startPeriodicTimer();
-          }, VoidTovoid$()), onPause: dart.fn(() => {
+          }, VoidToNull()), onPause: dart.fn(() => {
             timer.cancel();
             timer = null;
             watch.stop();
-          }, VoidTovoid$()), onResume: dart.fn(() => {
+          }, VoidToNull()), onResume: dart.fn(() => {
             dart.assert(timer == null);
             let elapsed = watch.elapsed;
             watch.start();
@@ -10346,11 +10349,11 @@
               timer = null;
               startPeriodicTimer();
               sendEvent();
-            }, VoidTovoid$()));
-          }, VoidTovoid$()), onCancel: dart.fn(() => {
+            }, VoidToNull()));
+          }, VoidToNull()), onCancel: dart.fn(() => {
             if (timer != null) timer.cancel();
             timer = null;
-          }, VoidTodynamic$())});
+          }, VoidToNull())});
         return controller.stream;
       }
       static eventTransformed(source, mapSink) {
@@ -10397,21 +10400,21 @@
               } else {
                 controller.add(E.as(newValue));
               }
-            }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10437,21 +10440,21 @@
                 subscription.pause();
                 controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
               }
-            }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
+            }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
           }).bind(this);
           dart.fn(onListen, VoidTovoid$());
           if (dart.test(this.isBroadcast)) {
             controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTovoid$()), sync: true});
+              }, VoidToNull()), sync: true});
           } else {
             controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                 subscription.pause();
-              }, VoidTovoid$()), onResume: dart.fn(() => {
+              }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidTovoid$()), onCancel: dart.fn(() => {
+              }, VoidToNull()), onCancel: dart.fn(() => {
                 subscription.cancel();
-              }, VoidTodynamic$()), sync: true});
+              }, VoidToNull()), sync: true});
           }
           return controller.stream;
         };
@@ -10485,12 +10488,12 @@
           if (seenFirst) {
             async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
               value = newValue;
-            }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
+            }, TToNull()), async._cancelAndErrorClosure(subscription, result));
           } else {
             value = element;
             seenFirst = true;
           }
-        }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
             if (!seenFirst) {
               try {
                 dart.throw(_internal.IterableElementError.noElement());
@@ -10502,7 +10505,7 @@
             } else {
               result[_complete](value);
             }
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       fold(S) {
@@ -10513,12 +10516,12 @@
           subscription = this.listen(dart.fn(element => {
             async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
               value = newValue;
-            }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
-          }, TTovoid$()), {onError: dart.fn((e, st) => {
+            }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
+          }, TToNull()), {onError: dart.fn((e, st) => {
               result[_completeError](e, core.StackTrace._check(st));
-            }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+            }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
               result[_complete](value);
-            }, VoidTovoid$()), cancelOnError: true});
+            }, VoidToNull()), cancelOnError: true});
           return result;
         };
       }
@@ -10540,11 +10543,11 @@
             async._cancelAndErrorWithReplacement(subscription, result, e, s);
           }
 
-        }, TTovoid$()), {onError: dart.fn(e => {
+        }, TToNull()), {onError: dart.fn(e => {
             result[_completeError](e);
-          }, dynamicTodynamic$()), onDone: dart.fn(() => {
+          }, dynamicToNull$()), onDone: dart.fn(() => {
             result[_complete](buffer.toString());
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return result;
       }
       contains(needle) {
@@ -10555,10 +10558,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       forEach(action) {
@@ -10566,10 +10569,10 @@
         let subscription = null;
         subscription = this.listen(dart.fn(element => {
           async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
-          }, dynamicTodynamic$()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](null);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       every(test) {
@@ -10580,10 +10583,10 @@
             if (!dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, false);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       any(test) {
@@ -10594,10 +10597,10 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, true);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](false);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get length() {
@@ -10605,9 +10608,9 @@
         let count = 0;
         this.listen(dart.fn(_ => {
           count++;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](count);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get isEmpty() {
@@ -10615,9 +10618,9 @@
         let subscription = null;
         subscription = this.listen(dart.fn(_ => {
           async._cancelAndValue(subscription, future, false);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](true);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toList() {
@@ -10625,9 +10628,9 @@
         let future = new (_FutureOfListOfT())();
         this.listen(dart.fn(data => {
           result[dartx.add](data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       toSet() {
@@ -10635,9 +10638,9 @@
         let future = new (_FutureOfSetOfT())();
         this.listen(dart.fn(data => {
           result.add(data);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_complete](result);
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       drain(E) {
@@ -10667,7 +10670,7 @@
         let subscription = null;
         subscription = this.listen(dart.fn(value => {
           async._cancelAndValue(subscription, future, value);
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             try {
               dart.throw(_internal.IterableElementError.noElement());
             } catch (e) {
@@ -10675,7 +10678,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get last() {
@@ -10685,7 +10688,7 @@
         this.listen(dart.fn(value => {
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10697,7 +10700,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       get single() {
@@ -10718,7 +10721,7 @@
           }
           foundResult = true;
           result = value;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10730,7 +10733,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       firstWhere(test, opts) {
@@ -10742,8 +10745,8 @@
             if (dart.test(isMatch)) {
               async._cancelAndValue(subscription, future, value);
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (defaultValue != null) {
               async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
               return;
@@ -10755,7 +10758,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       lastWhere(test, opts) {
@@ -10770,8 +10773,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10787,7 +10790,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       singleWhere(test) {
@@ -10811,8 +10814,8 @@
               foundResult = true;
               result = value;
             }
-          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             if (foundResult) {
               future[_complete](result);
               return;
@@ -10824,7 +10827,7 @@
               async._completeWithErrorCallback(future, e, s);
             }
 
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       elementAt(index) {
@@ -10838,9 +10841,9 @@
             return;
           }
           elementIndex = elementIndex + 1;
-        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
             future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
-          }, VoidTovoid$()), cancelOnError: true});
+          }, VoidToNull()), cancelOnError: true});
         return future;
       }
       timeout(timeLimit, opts) {
@@ -10874,7 +10877,7 @@
           if (onTimeout == null) {
             timeout = dart.fn(() => {
               controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
-            }, VoidTovoid$());
+            }, VoidToNull());
           } else {
             let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
             let wrapper = new async._ControllerEventSinkWrapper(null);
@@ -10882,7 +10885,7 @@
               wrapper[_sink] = controller;
               zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
               wrapper[_sink] = null;
-            }, VoidTovoid$());
+            }, VoidToNull());
           }
           subscription = this.listen(onData, {onError: onError, onDone: onDone});
           timer = zone.createTimer(timeLimit, timeout);
@@ -10898,10 +10901,10 @@
         controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
           timer.cancel();
           subscription.pause();
-        }, VoidTovoid$()), dart.fn(() => {
+        }, VoidToNull()), dart.fn(() => {
           subscription.resume();
           timer = zone.createTimer(timeLimit, timeout);
-        }, VoidTovoid$()), onCancel);
+        }, VoidToNull()), onCancel);
         return controller.stream;
       }
     }
@@ -11048,7 +11051,7 @@
         _isolate_helper.enterJsAsync();
         this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
           callback(this);
-        }, VoidTodynamic$()), milliseconds);
+        }, VoidToNull()), milliseconds);
       } else {
         dart.throw(new core.UnsupportedError("Periodic timer."));
       }
@@ -12479,14 +12482,14 @@
     let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
     let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class JsLinkedHashMap extends core.Object {
       new() {
         this[_length$0] = 0;
@@ -12541,7 +12544,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
@@ -13811,7 +13814,7 @@
     let obj = {};
     map[dartx.forEach](dart.fn((key, value) => {
       obj[_js_mirrors.getName(key)] = value;
-    }, SymbolAnddynamicTovoid()));
+    }, SymbolAnddynamicToNull()));
     return obj;
   };
   dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
@@ -14026,7 +14029,7 @@
         constructors[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         if (dart.test(constructors[dartx.isEmpty])) {
           let name = 'new';
           let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
@@ -14041,23 +14044,23 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let methods = _js_mirrors._getMethods(unwrapped);
         methods[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let getters = _js_mirrors._getGetters(unwrapped);
         getters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let setters = _js_mirrors._getSetters(unwrapped);
         setters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
           symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
         staticFields[dartx.forEach](dart.fn((symbol, t) => {
           let name = _js_mirrors.getName(symbol);
@@ -14067,22 +14070,22 @@
             t = dart.dindex(t, 0);
           }
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let statics = _js_mirrors._getStatics(unwrapped);
         statics[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
         staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
         staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = _js_mirrors.getName(symbol);
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
         this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
       }
       return this[_declarations];
@@ -17932,11 +17935,11 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_complete](futureValue);
-          }, VoidTovoid$());
+          }, VoidToNull());
           this[_onError] = dart.fn((error, stackTrace) => {
             this.cancel();
             result[_completeError](error, core.StackTrace._check(stackTrace));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           return result;
         };
       }
@@ -18612,7 +18615,7 @@
   async._SyncBroadcastStreamController$ = dart.generic(T => {
     let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
     let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
+    let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
     class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
       new(onListen, onCancel) {
         super.new(onListen, onCancel);
@@ -18641,19 +18644,19 @@
         }
         this[_forEachListener](dart.fn(subscription => {
           subscription[_add$](data);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendError](error, stackTrace) {
         if (dart.test(this[_isEmpty])) return;
         this[_forEachListener](dart.fn(subscription => {
           subscription[_addError](error, stackTrace);
-        }, _BufferingStreamSubscriptionOfTTovoid()));
+        }, _BufferingStreamSubscriptionOfTToNull()));
       }
       [_sendDone]() {
         if (!dart.test(this[_isEmpty])) {
           this[_forEachListener](dart.fn(subscription => {
             subscription[_close$]();
-          }, _BufferingStreamSubscriptionOfTTovoid()));
+          }, _BufferingStreamSubscriptionOfTToNull()));
         } else {
           dart.assert(this[_doneFuture] != null);
           dart.assert(this[_doneFuture][_mayComplete]);
@@ -18904,7 +18907,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static microtask(computation) {
@@ -18917,7 +18920,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static sync(computation) {
@@ -18957,7 +18960,7 @@
             async._completeWithErrorCallback(result, e, s);
           }
 
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return result;
       }
       static wait(T) {
@@ -18977,7 +18980,7 @@
                   if (value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                 }
               }
@@ -19007,13 +19010,13 @@
                   if (cleanUp != null && value != null) {
                     async.Future.sync(dart.fn(() => {
                       cleanUp(value);
-                    }, VoidTodynamic$()));
+                    }, VoidToNull()));
                   }
                   if (remaining == 0 && !dart.test(eagerError)) {
                     result[_completeError](error, stackTrace);
                   }
                 }
-              }, dart.definiteFunctionType(async.FutureOr, [T])), {onError: handleError});
+              }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
               remaining++;
             }
             if (remaining == 0) {
@@ -19038,10 +19041,10 @@
           let completer = async.Completer$(T).sync();
           let onValue = dart.fn(value => {
             if (!dart.test(completer.isCompleted)) completer.complete(value);
-          }, dart.definiteFunctionType(dart.dynamic, [T]));
+          }, dart.definiteFunctionType(core.Null, [T]));
           let onError = dart.fn((error, stack) => {
             if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
-          }, dynamicAnddynamicTodynamic$());
+          }, dynamicAnddynamicToNull());
           for (let future of futures) {
             future.then(dart.dynamic)(onValue, {onError: onError});
           }
@@ -19064,7 +19067,7 @@
           } else {
             doneSignal[_complete](null);
           }
-        }, boolTodynamic()), {runGuarded: true});
+        }, boolToNull()), {runGuarded: true});
         dart.dcall(nextIteration, true);
         return doneSignal;
       }
@@ -19417,7 +19420,7 @@
     let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
     let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
     let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-    let TToFutureOr = () => (TToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [T])))();
+    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
     class _Future extends core.Object {
       new() {
         this[_zone] = async.Zone.current;
@@ -19555,7 +19558,7 @@
           dart.assert(this[_isComplete]);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listener);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_prependListeners](listeners) {
@@ -19583,7 +19586,7 @@
           listeners = this[_reverseListeners](listeners);
           this[_zone].scheduleMicrotask(dart.fn(() => {
             async._Future._propagateToListeners(this, listeners);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       [_removeListeners]() {
@@ -19612,16 +19615,16 @@
             dart.assert(target[_isPendingComplete]);
             target[_clearPendingComplete]();
             target[_complete](value);
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (stackTrace === void 0) stackTrace = null;
               dart.assert(target[_isPendingComplete]);
               target[_completeError](error, core.StackTrace._check(stackTrace));
-            }, dynamic__Todynamic())});
+            }, dynamic__ToNull())});
         } catch (e) {
           let s = dart.stackTrace(e);
           async.scheduleMicrotask(dart.fn(() => {
             target[_completeError](e, s);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
 
       }
@@ -19679,7 +19682,7 @@
               this[_setPendingComplete]();
               this[_zone].scheduleMicrotask(dart.fn(() => {
                 async._Future._chainCoreFuture(coreFuture, this);
-              }, VoidTovoid$()));
+              }, VoidToNull()));
             } else {
               async._Future._chainCoreFuture(coreFuture, this);
             }
@@ -19692,14 +19695,14 @@
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeWithValue](typedValue);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       [_asyncCompleteError](error, stackTrace) {
         dart.assert(!dart.test(this[_isComplete]));
         this[_setPendingComplete]();
         this[_zone].scheduleMicrotask(dart.fn(() => {
           this[_completeError](error, stackTrace);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
       }
       static _propagateToListeners(source, listeners) {
         while (true) {
@@ -19843,7 +19846,7 @@
         if (onTimeout == null) {
           timer = async.Timer.new(timeLimit, dart.fn(() => {
             result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         } else {
           let zone = async.Zone.current;
           onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
@@ -19855,19 +19858,19 @@
               result[_completeError](e, s);
             }
 
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
         this.then(dart.dynamic)(dart.fn(v => {
           if (dart.test(timer.isActive)) {
             timer.cancel();
             result[_completeWithValue](v);
           }
-        }, TToFutureOr()), {onError: dart.fn((e, s) => {
+        }, TToNull()), {onError: dart.fn((e, s) => {
             if (dart.test(timer.isActive)) {
               timer.cancel();
               result[_completeError](e, core.StackTrace._check(s));
             }
-          }, dynamicAnddynamicTodynamic$())});
+          }, dynamicAnddynamicToNull())});
         return result;
       }
     }
@@ -20049,7 +20052,7 @@
           storedCallback = null;
           f();
         }
-        dart.fn(internalCallback, dynamicTodynamic$());
+        dart.fn(internalCallback, dynamicToNull$());
         ;
         let observer = new _isolate_helper.global.MutationObserver(internalCallback);
         observer.observe(div, {childList: true});
@@ -20058,7 +20061,7 @@
           _isolate_helper.enterJsAsync();
           storedCallback = callback;
           div.firstChild ? div.removeChild(span) : div.appendChild(span);
-        }, _AsyncCallbackTovoid());
+        }, FnToNull());
       } else if (_isolate_helper.global.setImmediate != null) {
         return async._AsyncRun._scheduleImmediateWithSetImmediate;
       }
@@ -20069,7 +20072,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.scheduleImmediate(internalCallback);
@@ -20079,7 +20082,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }
-      dart.fn(internalCallback, VoidTodynamic$());
+      dart.fn(internalCallback, VoidToNull());
       ;
       _isolate_helper.enterJsAsync();
       _isolate_helper.global.setImmediate(internalCallback);
@@ -20493,7 +20496,7 @@
         subscription[_setPendingEvents](pendingEvents);
         subscription[_guardCallback](dart.fn(() => {
           async._runGuarded(this.onListen);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         return subscription;
       }
       [_recordCancel](subscription) {
@@ -20753,7 +20756,7 @@
         return dart.fn((e, s) => {
           controller[_addError](e, s);
           controller[_close$]();
-        }, dynamicAndStackTraceTodynamic());
+        }, dynamicAndStackTraceToNull());
       }
       pause() {
         this.addSubscription.pause();
@@ -20769,7 +20772,7 @@
         }
         return cancel.whenComplete(dart.fn(() => {
           this.addStreamFuture[_asyncComplete](null);
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       complete() {
         this.addStreamFuture[_asyncComplete](null);
@@ -20886,7 +20889,7 @@
           this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
           if (oldState == async._PendingEvents._STATE_CANCELED) return;
           this.handleNext(dispatch);
-        }, VoidTovoid$()));
+        }, VoidToNull()));
         this[_state] = async._PendingEvents._STATE_SCHEDULED;
       }
       cancelSchedule() {
@@ -21193,7 +21196,7 @@
           let result = new (async._Future$(E))();
           this[_onDone] = dart.fn(() => {
             result[_completeWithValue](null);
-          }, VoidTovoid$());
+          }, VoidToNull());
           return result;
         };
       }
@@ -21612,7 +21615,7 @@
   async._cancelAndErrorClosure = function(subscription, future) {
     return dart.fn((error, stackTrace) => {
       async._cancelAndError(subscription, future, error, stackTrace);
-    }, dynamicAndStackTraceTovoid());
+    }, dynamicAndStackTraceToNull());
   };
   dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
   async._cancelAndValue = function(subscription, future, value) {
@@ -23194,7 +23197,7 @@
         if (error == null) error = new core.NullThrownError();
         if (stackTrace == null) dart.throw(error);
         async._rethrow(error, stackTrace);
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     };
   };
   dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
@@ -23630,13 +23633,13 @@
     let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
     let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
     let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
     let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class _HashMap extends core.Object {
       new() {
         this[_length$1] = 0;
@@ -23684,7 +23687,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         if (dart.test(collection._HashMap._isStringKey(key))) {
@@ -24177,11 +24180,11 @@
   collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
     let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
     class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
       new() {
@@ -24214,7 +24217,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       _get(key) {
         return this[_map$0].get(key);
@@ -25814,7 +25817,7 @@
         let result = HashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -26366,7 +26369,7 @@
         let result = LinkedHashMapOfK$V().new();
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -27121,7 +27124,7 @@
           result.write(k);
           result.write(': ');
           result.write(v);
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         result.write('}');
       } finally {
         dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
@@ -28248,16 +28251,16 @@
     let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
     let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
     let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
     let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
+    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
     let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
     let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
     let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
+    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
     class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
       new(compare, isValidKey) {
         if (compare === void 0) compare = null;
@@ -28280,7 +28283,7 @@
         let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
         other[dartx.forEach](dart.fn((k, v) => {
           result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return result;
       }
       static fromIterable(iterable, opts) {
@@ -28366,7 +28369,7 @@
         MapOfK$V()._check(other);
         other[dartx.forEach](dart.fn((key, value) => {
           this._set(key, value);
-        }, KAndVTovoid$()));
+        }, KAndVToNull()));
       }
       get isEmpty() {
         return this[_root] == null;
@@ -29039,7 +29042,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((key, value) => {
         this._set(key, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
     }
     containsValue(value) {
       if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
@@ -31496,7 +31499,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{');
       let separator = '"';
@@ -31597,7 +31600,7 @@
         }
         keyValueList[dartx._set](i++, key);
         keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicTovoid$()));
+      }, dynamicAnddynamicToNull()));
       if (!allStringKeys) return false;
       this.writeString('{\n');
       this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
@@ -33843,7 +33846,7 @@
           sb.write(": ");
           sb.write(core.Error.safeToString(value));
           i++;
-        }, SymbolAnddynamicTovoid()));
+        }, SymbolAnddynamicToNull()));
       }
       if (this[_existingArgumentNames] == null) {
         return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
@@ -34169,7 +34172,7 @@
       let result = dart.map({}, core.String, dart.dynamic);
       namedArguments[dartx.forEach](dart.fn((symbol, value) => {
         result[dartx._set](core._symbolToString(symbol), value);
-      }, SymbolAnddynamicTovoid()));
+      }, SymbolAnddynamicToNull()));
       return result;
     }
   };
@@ -35164,7 +35167,7 @@
             dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
       if (firstSegment === void 0) firstSegment = 0;
@@ -35521,7 +35524,7 @@
             writeParameter(key, value);
           }
         }
-      }, StringAnddynamicTovoid()));
+      }, StringAnddynamicToNull()));
       return result.toString();
     }
     static _makeFragment(fragment, start, end) {
@@ -36509,7 +36512,7 @@
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write('=');
         buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
-      }, StringAndStringTovoid$())));
+      }, StringAndStringToNull())));
     }
     static _validateMimeType(mimeType) {
       let slashIndex = -1;
@@ -39158,7 +39161,7 @@
           this.error(response);
           this.close();
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     onResume() {
       if (!dart.test(this.nextRunning)) {
@@ -39223,7 +39226,7 @@
         } else {
           this.controller.addError(new io.FileSystemException("Internal error"));
         }
-      }, dynamicToFutureOr$()));
+      }, dynamicToNull$()));
     }
     [_cleanup]() {
       this.controller.close();
@@ -39533,13 +39536,13 @@
         if (dart.test(this[_atEnd])) {
           this[_closeFile]();
         }
-      }, ListOfintToFutureOr())).catchError(dart.fn((e, s) => {
+      }, ListOfintToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_unsubscribed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_start$2]() {
       if (dart.notNull(this[_position$0]) < 0) {
@@ -39560,7 +39563,7 @@
               this[_controller$0].addError(e, core.StackTrace._check(s));
               this[_readInProgress] = false;
               this[_closeFile]();
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         } else {
           onReady(file);
         }
@@ -39646,10 +39649,10 @@
             error(e, stackTrace);
           }
 
-        }, ListOfintTovoid$()), {onDone: dart.fn(() => {
+        }, ListOfintToNull()), {onDone: dart.fn(() => {
             completer.complete(this[_file]);
-          }, VoidTovoid$()), onError: error, cancelOnError: true});
-      }, RandomAccessFileToFutureOr())).catchError(dart.bind(completer, 'completeError'));
+          }, VoidToNull()), onError: error, cancelOnError: true});
+      }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
       return completer.future;
     }
     close() {
@@ -39887,7 +39890,7 @@
             } else {
               completer.complete(builder.takeBytes());
             }
-          }, dynamicTodynamic$()), {onError: dart.bind(completer, 'completeError')});
+          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
         }
         dart.fn(read, VoidTovoid$());
         read();
@@ -40438,7 +40441,7 @@
       data[dartx._set](0, this[_pointer]());
       return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
         this[_asyncDispatched] = false;
-      }, VoidTodynamic$()));
+      }, VoidToNull()));
     }
     [_checkAvailable]() {
       if (dart.test(this[_asyncDispatched])) {
@@ -42075,7 +42078,7 @@
           sb.write(values[dartx._get](i));
         }
         sb.write("\n");
-      }, StringAndListOfStringTovoid$()));
+      }, StringAndListOfStringToNull()));
       return sb.toString();
     }
     [_parseCookies]() {
@@ -42287,7 +42290,7 @@
           sb.write(name);
           sb.write("=");
           sb.write(value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       return sb.toString();
     }
@@ -42435,7 +42438,7 @@
             value = value[dartx.toLowerCase]();
           }
           this[_parameters][dartx._set](lowerCaseKey, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (charset != null) {
         this[_ensureParameters]();
@@ -42700,7 +42703,7 @@
       this.hasSubscriber = true;
       return this[_stream$].handleError(dart.fn(error => {
         dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-      }, dynamicTodynamic$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     get dataDone() {
       return this[_dataCompleter].future;
@@ -42923,7 +42926,7 @@
       if (values != null) {
         values[dartx.forEach](dart.fn(value => {
           this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
-        }, StringTovoid$()));
+        }, StringToNull()));
       }
       return this[_cookies];
     }
@@ -43147,7 +43150,7 @@
         const targetAddStream = (function() {
           return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
             this[_isBound] = false;
-          }, VoidTodynamic$()));
+          }, VoidToNull()));
         }).bind(this);
         dart.fn(targetAddStream, VoidToFuture());
         if (this[_controllerInstance] == null) return targetAddStream();
@@ -43165,7 +43168,7 @@
         this[_controllerInstance].close();
         return future.whenComplete(dart.fn(() => {
           this[_isBound] = false;
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
       }
       close() {
         if (dart.test(this[_isBound])) {
@@ -43216,7 +43219,7 @@
             } else {
               this[_closeTarget]();
             }
-          }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
               if (dart.test(this[_isBound])) {
                 this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
                 this[_controllerCompleter] = null;
@@ -43224,7 +43227,7 @@
               } else {
                 this[_completeDoneError](error, core.StackTrace._check(stackTrace));
               }
-            }, dynamicAnddynamicTodynamic$())});
+            }, dynamicAnddynamicToNull())});
         }
         return this[_controllerInstance];
       }
@@ -43469,7 +43472,7 @@
       }
       this.close();
       this.done.catchError(dart.fn(_ => {
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return future;
     }
     get connectionInfo() {
@@ -43484,7 +43487,7 @@
       if (this[_deadline] == null) return;
       this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
         this[_httpRequest][_httpConnection].destroy();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
     [_writeHeader]() {
       let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
@@ -43549,7 +43552,7 @@
       if (this[_cookies] != null) {
         this[_cookies][dartx.forEach](dart.fn(cookie => {
           this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
-        }, CookieTovoid()));
+        }, CookieToNull()));
       }
       this.headers[_finalize]();
       offset = this.headers[_write](buffer, offset);
@@ -44053,7 +44056,7 @@
         }
         if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
           drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-          }, dynamicTodynamic$()));
+          }, dynamicToNull$()));
         }
       } else {
         drainRequest = false;
@@ -44082,7 +44085,7 @@
       }
       if (dart.test(this.ignoreBody)) {
         stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$()));
+        }, dynamicToNull$()));
         let future = this.writeHeaders();
         if (future != null) {
           return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
@@ -44209,7 +44212,7 @@
           this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
           this[_pendingChunkedFooter] = 2;
           this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
-        }, dynamicTodynamic$())));
+        }, dynamicToNull$())));
       }
     }
     [_ignoreError](error) {
@@ -44365,28 +44368,28 @@
         if (incoming.statusCode == 100) {
           incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
             this[_subscription$].resume();
-          }, dynamicToFutureOr$())).catchError(dart.fn((error, stackTrace) => {
+          }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
             if (stackTrace === void 0) stackTrace = null;
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
-          }, dynamic__Todynamic$()));
+          }, dynamic__ToNull$()));
         } else {
           this[_nextResponseCompleter].complete(incoming);
           this[_nextResponseCompleter] = null;
         }
-      }, _HttpIncomingTovoid$()), {onError: dart.fn((error, stackTrace) => {
+      }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
           if (stackTrace === void 0) stackTrace = null;
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
             this[_nextResponseCompleter] = null;
           }
-        }, dynamic__Todynamic$()), onDone: dart.fn(() => {
+        }, dynamic__ToNull$()), onDone: dart.fn(() => {
           if (this[_nextResponseCompleter] != null) {
             this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
             this[_nextResponseCompleter] = null;
           }
           this.close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
     }
     send(uri, port, method, proxy) {
       if (dart.test(this.closed)) {
@@ -44442,7 +44445,7 @@
             } else {
               this.destroy();
             }
-          }, dynamicToFutureOr$()));
+          }, dynamicToNull$()));
           if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
             let authInfo = incoming.headers._get("proxy-authentication-info");
             if (authInfo != null && authInfo[dartx.length] == 1) {
@@ -44460,17 +44463,17 @@
             }
           }
           request[_onIncoming](incoming);
-        }, _HttpIncomingToFutureOr())).catchError(dart.fn(error => {
+        }, _HttpIncomingToNull())).catchError(dart.fn(error => {
           dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-        }, dynamicTodynamic$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+        }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
           this.destroy();
           request[_onError$](error, core.StackTrace._check(stackTrace));
-        }, dynamicAnddynamicTodynamic$()));
+        }, dynamicAnddynamicToNull()));
         this[_subscription$].resume();
         return s;
       }, dynamicTodynamic$()), {onError: dart.fn(e => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
       return request;
     }
     detachSocket() {
@@ -44520,7 +44523,7 @@
       this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
         this[_idleTimer] = null;
         this.close();
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   dart.setSignature(io._HttpClientConnection, {
@@ -44644,7 +44647,7 @@
         let completer = async.Completer.new();
         this[_pending$].add(dart.fn(() => {
           this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
-        }, VoidTodynamic$()));
+        }, VoidToNull()));
         return FutureOf_ConnectionInfo()._check(completer.future);
       }
       let currentBadCertificateCallback = client[_badCertificateCallback];
@@ -44673,7 +44676,7 @@
           this[_connecting] = dart.notNull(this[_connecting]) - 1;
           this[_checkPending]();
           dart.throw(error);
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
   };
   dart.setSignature(io._ConnectionTarget, {
@@ -45152,7 +45155,7 @@
         this[_httpServer][_markActive](this);
         incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
           if (dart.test(closing)) this.destroy();
-        }, dynamicToFutureOr$()));
+        }, dynamicToNull$()));
         this[_subscription$].pause();
         this[_state$1] = io._HttpConnection._ACTIVE;
         let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
@@ -45169,17 +45172,17 @@
           } else {
             this.destroy();
           }
-        }, dynamicToFutureOr$()), {onError: dart.fn(_ => {
+        }, dynamicToNull$()), {onError: dart.fn(_ => {
             this.destroy();
-          }, dynamicTodynamic$())});
+          }, dynamicToNull$())});
         outgoing.ignoreBody = request.method == "HEAD";
         response[_httpRequest] = request;
         this[_httpServer][_handleRequest](request);
-      }, _HttpIncomingTovoid$()), {onDone: dart.fn(() => {
+      }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
           this.destroy();
-        }, VoidTovoid$()), onError: dart.fn(error => {
+        }, VoidToNull()), onError: dart.fn(error => {
           this.destroy();
-        }, dynamicTodynamic$())});
+        }, dynamicToNull$())});
     }
     markIdle() {
       this[_idleMark] = true;
@@ -45395,7 +45398,7 @@
               idle.markIdle();
             }
           }
-        }, TimerTovoid$()));
+        }, TimerToNull()));
       }
     }
     listen(onData, opts) {
@@ -45406,11 +45409,11 @@
         socket.setOption(io.SocketOption.TCP_NODELAY, true);
         let connection = new io._HttpConnection(socket, this);
         this[_idleConnections].add(connection);
-      }, SocketTodynamic()), {onError: dart.fn((error, stackTrace) => {
+      }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
           if (!io.HandshakeException.is(error)) {
             this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
           }
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.bind(this[_controller$0], 'close')});
+        }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
       return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     close(opts) {
@@ -45488,11 +45491,11 @@
           dart.assert(conn[_isClosing]);
           result.closing = dart.notNull(result.closing) + 1;
         }
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       this[_idleConnections].forEach(dart.fn(conn => {
         result.idle = dart.notNull(result.idle) + 1;
         dart.assert(conn[_isIdle]);
-      }, _HttpConnectionTovoid()));
+      }, _HttpConnectionToNull()));
       return result;
     }
     get [_serviceTypePath]() {
@@ -45667,7 +45670,7 @@
             dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
           }
         }
-      }, StringTovoid$()));
+      }, StringToNull()));
     }
     direct() {
       this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
@@ -46315,7 +46318,7 @@
         if (this[_userOnData] != null) {
           dart.dcall(this[_userOnData], data);
         }
-      }, VoidTovoid$()));
+      }, VoidToNull()));
     }
   };
   io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
@@ -46448,17 +46451,17 @@
       super.new();
       this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
           this[_paused] = false;
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           this[_paused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           this[_paused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       this[_reset]();
     }
     listen(onData, opts) {
@@ -47078,24 +47081,24 @@
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onPause: dart.fn(() => {
+        }, VoidToNull()), onPause: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(!dart.test(this[_bodyPaused]));
           this[_bodyPaused] = true;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onResume: dart.fn(() => {
+        }, VoidToNull()), onResume: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           dart.assert(this[_bodyPaused]);
           this[_bodyPaused] = false;
           this[_pauseStateChanged]();
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           if (!dart.equals(incoming, this[_incoming])) return;
           if (this[_socketSubscription] != null) {
             this[_socketSubscription].cancel();
           }
           this[_closeIncoming](true);
           this[_controller$0].close();
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
       this[_bodyPaused] = true;
       this[_pauseStateChanged]();
@@ -48719,7 +48722,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
     static secureServer(socket, context, opts) {
@@ -48730,7 +48733,7 @@
       let completer = async.Completer.new();
       dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
         completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicTodynamic$()));
+      }, dynamicToNull$()));
       return FutureOfSecureSocket()._check(completer.future);
     }
   };
@@ -48886,11 +48889,11 @@
         } else {
           this[_controller$0].add(secureConnection);
         }
-      }, RawSecureSocketToFutureOr())).catchError(dart.fn((e, s) => {
+      }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
         if (!dart.test(this[_closed])) {
           this[_controller$0].addError(e, core.StackTrace._check(s));
         }
-      }, dynamicAnddynamicTodynamic$()));
+      }, dynamicAnddynamicToNull()));
     }
     [_onPauseStateChange]() {
       if (dart.test(this[_controller$0].isPaused)) {
@@ -49470,7 +49473,7 @@
             }
           }
           this[_tryFilter]();
-        }, _FilterStatusToFutureOr())).catchError(dart.bind(this, _reportError));
+        }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
       }
     }
     [_readSocketOrBufferedData](bytes) {
@@ -50555,7 +50558,7 @@
           completer.completeError(e, s);
         }
 
-      }, ListOfintTovoid$()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
+      }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
       return completer.future;
     }
     close() {
@@ -51547,9 +51550,9 @@
     bind(stream) {
       stream.listen(dart.fn(request => {
         io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
-      }, HttpRequestTovoid$()), {onDone: dart.fn(() => {
+      }, HttpRequestToNull()), {onDone: dart.fn(() => {
           this[_controller$0].close();
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return this[_controller$0].stream;
     }
     static _upgrade(request, _protocolSelector, compression) {
@@ -51588,7 +51591,7 @@
           response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
           response.close();
           dart.throw(error);
-        }, dynamicTodynamic$())).then(io.WebSocket)(upgrade);
+        }, dynamicToNull$())).then(io.WebSocket)(upgrade);
       } else {
         return FutureOfWebSocket()._check(upgrade(null));
       }
@@ -51618,7 +51621,7 @@
       let isUpgrade = false;
       request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
         if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
-      }, StringTovoid$()));
+      }, StringToNull()));
       if (!isUpgrade) return false;
       let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
       if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
@@ -51813,7 +51816,7 @@
     addFrame(opcode, data) {
       return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
         this[_eventSink$].add(e);
-      }, ListOfintTovoid$()));
+      }, ListOfintToNull()));
     }
     static createFrame(opcode, data, serverSide, compressed) {
       let mask = !dart.test(serverSide);
@@ -51959,7 +51962,7 @@
       this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
         this[_done$]();
         this[_closeCompleter].complete(this.webSocket);
-      }, dynamicToFutureOr$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           this[_closed] = true;
           this[_cancel$]();
           if (core.ArgumentError.is(error)) {
@@ -51970,7 +51973,7 @@
             this[_done$]();
             this[_closeCompleter].complete(this.webSocket);
           }
-        }, dynamicAndStackTraceTodynamic())});
+        }, dynamicAndStackTraceToNull())});
     }
     [_done$](error, stackTrace) {
       if (error === void 0) error = null;
@@ -51993,7 +51996,7 @@
       this[_completer] = async.Completer.new();
       this[_subscription$] = stream.listen(dart.fn(data => {
         this[_controller$0].add(data);
-      }, dynamicTovoid$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
+      }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
       if (dart.test(this[_issuedPause])) {
         this[_subscription$].pause();
         this[_issuedPause] = false;
@@ -52004,7 +52007,7 @@
       this[_ensureController]();
       const closeSocket = (function() {
         return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicTodynamic$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
       }).bind(this);
       dart.fn(closeSocket, VoidToFuture());
       this[_controller$0].close();
@@ -52095,7 +52098,7 @@
         function error(message) {
           response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
             socket.destroy();
-          }, SocketToFutureOr()));
+          }, SocketToNull()));
           dart.throw(new io.WebSocketException(message));
         }
         dart.fn(error, StringTovoid$());
@@ -52178,7 +52181,7 @@
         } else {
           this[_controller$0].add(data);
         }
-      }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (core.FormatException.is(error)) {
             this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
@@ -52188,7 +52191,7 @@
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
           this[_controller$0].close();
-        }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
+        }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
           if (this[_closeTimer] != null) this[_closeTimer].cancel();
           if (this[_readyState] == io.WebSocket.OPEN) {
             this[_readyState] = io.WebSocket.CLOSING;
@@ -52202,12 +52205,12 @@
           this[_closeCode] = transformer.closeCode;
           this[_closeReason] = transformer.closeReason;
           this[_controller$0].close();
-        }, VoidTodynamic$()), cancelOnError: true}));
+        }, VoidToNull()), cancelOnError: true}));
       this[_subscription$].pause();
       this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
           this[_subscription$].cancel();
           this[_subscription$] = null;
-        }, VoidTodynamic$()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
+        }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
       io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
       try {
         dart.dput(this[_socket], _owner, this);
@@ -52234,8 +52237,8 @@
         this[_consumer].add(new io._WebSocketPing());
         this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
           this[_close$0](io.WebSocketStatus.GOING_AWAY);
-        }, VoidTovoid$()));
-      }, VoidTovoid$()));
+        }, VoidToNull()));
+      }, VoidToNull()));
     }
     get readyState() {
       return this[_readyState];
@@ -52283,7 +52286,7 @@
             if (this[_subscription$] != null) this[_subscription$].cancel();
             this[_controller$0].close();
             io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
-          }, VoidTovoid$()));
+          }, VoidToNull()));
         }
       }
       return this[_sink$0].close();
@@ -52523,11 +52526,11 @@
       controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
           port = isolate.RawReceivePort.new(handleError);
           this.addErrorListener(port.sendPort);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+        }, VoidToNull()), onCancel: dart.fn(() => {
           this.removeErrorListener(port.sendPort);
           port.close();
           port = null;
-        }, VoidTovoid$())});
+        }, VoidToNull())});
       return controller.stream;
     }
   };
@@ -54792,7 +54795,7 @@
         let completer = CompleterOfIdbFactory().sync();
         request[dartx.onSuccess].listen(dart.fn(e => {
           completer.complete(this);
-        }, EventTovoid$()));
+        }, EventToNull()));
         request[dartx.onError].listen(dart.bind(completer, 'completeError'));
         return completer.future;
       } catch (e) {
@@ -54851,7 +54854,7 @@
       request[dartx.onSuccess].listen(dart.fn(e => {
         let result = indexed_db._cast(T)(request[dartx.result]);
         completer.complete(result);
-      }, EventTovoid$()));
+      }, EventToNull()));
       request[dartx.onError].listen(dart.bind(completer, 'completeError'));
       return completer.future;
     };
@@ -55323,7 +55326,7 @@
               cursor[dartx.next]();
             }
           }
-        }, EventTovoid$()));
+        }, EventToNull()));
         return controller.stream;
       };
     }
@@ -55496,15 +55499,15 @@
       let completer = CompleterOfDatabase().new();
       this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
         completer.complete(this[dartx.db]);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
         completer.completeError(e);
-      }, EventToFutureOr()));
+      }, EventToNull()));
       this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
         if (!dart.test(completer.isCompleted)) {
           completer.completeError(e);
         }
-      }, EventToFutureOr()));
+      }, EventToNull()));
       return completer.future;
     }
     static _() {
@@ -61641,9 +61644,9 @@
       let completer = CompleterOfFileSystem().new();
       this[_webkitRequestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.requestFileSystemSync](...args) {
@@ -61659,9 +61662,9 @@
       let completer = CompleterOfEntry().new();
       this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -69301,7 +69304,7 @@
       let completer = CompleterOfString().new();
       this[_getAsString](dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.getAsEntry](...args) {
@@ -69843,9 +69846,9 @@
       let completer = CompleterOfEntry().new();
       this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_getMetadata](...args) {
@@ -69855,9 +69858,9 @@
       let completer = CompleterOfMetadata().new();
       this[_getMetadata](dart.fn(value => {
         completer.complete(value);
-      }, MetadataTovoid()), dart.fn(error => {
+      }, MetadataToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_getParent](...args) {
@@ -69867,9 +69870,9 @@
       let completer = CompleterOfEntry().new();
       this[_getParent](dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_moveTo](...args) {
@@ -69880,9 +69883,9 @@
       let completer = CompleterOfEntry().new();
       this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_remove$](...args) {
@@ -69892,9 +69895,9 @@
       let completer = async.Completer.new();
       this[_remove$](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.toUrl](...args) {
@@ -69993,9 +69996,9 @@
       let completer = CompleterOfEntry().new();
       this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [__getFile](path, opts) {
@@ -70037,9 +70040,9 @@
       let completer = CompleterOfEntry().new();
       this[__getFile](path, {options: options, successCallback: dart.fn(value => {
           completer.complete(value);
-        }, EntryTovoid()), errorCallback: dart.fn(error => {
+        }, EntryToNull()), errorCallback: dart.fn(error => {
           completer.completeError(error);
-        }, FileErrorTovoid())});
+        }, FileErrorToNull())});
       return completer.future;
     }
     [_removeRecursively](...args) {
@@ -70049,9 +70052,9 @@
       let completer = async.Completer.new();
       this[_removeRecursively](dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -70095,9 +70098,9 @@
       let completer = CompleterOfListOfEntry().new();
       this[_readEntries](dart.fn(value => {
         completer.complete(value);
-      }, ListOfEntryTovoid()), dart.fn(error => {
+      }, ListOfEntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -73479,9 +73482,9 @@
       let completer = CompleterOfFileWriter().new();
       this[_createWriter](dart.fn(value => {
         completer.complete(value);
-      }, FileWriterTovoid()), dart.fn(error => {
+      }, FileWriterToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_file$](...args) {
@@ -73491,9 +73494,9 @@
       let completer = CompleterOfFile$().new();
       this[_file$](dart.fn(value => {
         completer.complete(value);
-      }, FileTovoid()), dart.fn(error => {
+      }, FileToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
   };
@@ -74557,9 +74560,9 @@
       try {
         this[_getCurrentPosition](dart.fn(position => {
           completer.complete(this[_ensurePosition](position));
-        }, GeopositionTovoid()), dart.fn(error => {
+        }, GeopositionToNull()), dart.fn(error => {
           completer.completeError(error);
-        }, PositionErrorTovoid()), options);
+        }, PositionErrorToNull()), options);
       } catch (e) {
         let stacktrace = dart.stackTrace(e);
         completer.completeError(e, stacktrace);
@@ -74587,13 +74590,13 @@
           dart.assert(watchId == null);
           watchId = this[_watchPosition](dart.fn(position => {
             controller.add(this[_ensurePosition](position));
-          }, GeopositionTovoid()), dart.fn(error => {
+          }, GeopositionToNull()), dart.fn(error => {
             controller.addError(error);
-          }, PositionErrorTovoid()), options);
-        }, VoidTovoid$()), onCancel: dart.fn(() => {
+          }, PositionErrorToNull()), options);
+        }, VoidToNull()), onCancel: dart.fn(() => {
           dart.assert(watchId != null);
           this[_clearWatch](watchId);
-        }, VoidTodynamic$())});
+        }, VoidToNull())});
       return controller.stream;
     }
     [_ensurePosition](domPosition) {
@@ -75997,7 +76000,7 @@
       let parts = [];
       data[dartx.forEach](dart.fn((key, value) => {
         parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       let formData = parts[dartx.join]('&');
       if (requestHeaders == null) {
         requestHeaders = dart.map({}, core.String, core.String);
@@ -76031,7 +76034,7 @@
       if (requestHeaders != null) {
         requestHeaders[dartx.forEach](dart.fn((header, value) => {
           xhr[dartx.setRequestHeader](header, value);
-        }, StringAndStringTovoid$()));
+        }, StringAndStringToNull()));
       }
       if (onProgress != null) {
         xhr[dartx.onProgress].listen(onProgress);
@@ -76046,7 +76049,7 @@
         } else {
           completer.completeError(e);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
       if (sendData != null) {
         xhr[dartx.send](sendData);
@@ -76083,13 +76086,13 @@
       }
       let xhr = new XDomainRequest();
       xhr.open(method, url);
-      xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         let response = xhr.responseText;
         completer.complete(response);
-      }, dynamicTodynamic$()), 1);
-      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
+      }, dynamicToNull$()), 1);
+      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
         completer.completeError(e);
-      }, dynamicTodynamic$()), 1);
+      }, dynamicToNull$()), 1);
       xhr.onprogress = {};
       xhr.ontimeout = {};
       xhr.timeout = Number.MAX_VALUE;
@@ -79966,7 +79969,7 @@
       let completer = CompleterOfListOfSourceInfo().new();
       html$.MediaStreamTrack._getSources(dart.fn(value => {
         completer.complete(value);
-      }, ListOfSourceInfoTovoid()));
+      }, ListOfSourceInfoToNull()));
       return completer.future;
     }
     [dartx.stop](...args) {
@@ -81187,7 +81190,7 @@
       function override(key, value) {
         if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
       }
-      dart.fn(override, dynamicAnddynamicTodynamic$());
+      dart.fn(override, dynamicAnddynamicToNull());
       override('childList', childList);
       override('attributes', attributes);
       override('characterData', characterData);
@@ -81353,9 +81356,9 @@
       this[_ensureGetUserMedia]();
       this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
         completer.complete(stream);
-      }, MediaStreamTovoid()), dart.fn(error => {
+      }, MediaStreamToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, NavigatorUserMediaErrorTovoid()));
+      }, NavigatorUserMediaErrorToNull()));
       return completer.future;
     }
     [_ensureGetUserMedia]() {
@@ -82227,7 +82230,7 @@
       let completer = CompleterOfString().new();
       html$.Notification._requestPermission(dart.fn(value => {
         completer.complete(value);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     get [dartx.onClick]() {
@@ -85242,9 +85245,9 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createOffer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.createAnswer](mediaConstraints) {
@@ -85252,16 +85255,16 @@
       let completer = CompleterOfRtcSessionDescription().new();
       this[_createAnswer](dart.fn(value => {
         completer.complete(value);
-      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
+      }, RtcSessionDescriptionToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()), mediaConstraints);
+      }, StringToNull()), mediaConstraints);
       return completer.future;
     }
     [dartx.getStats](selector) {
       let completer = CompleterOfRtcStatsResponse().new();
       this[_getStats](dart.fn(value => {
         completer.complete(value);
-      }, RtcStatsResponseTovoid()), selector);
+      }, RtcStatsResponseToNull()), selector);
       return completer.future;
     }
     static _() {
@@ -85377,9 +85380,9 @@
       let completer = async.Completer.new();
       this[_setLocalDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [_setRemoteDescription](...args) {
@@ -85389,9 +85392,9 @@
       let completer = async.Completer.new();
       this[_setRemoteDescription](description, dart.fn(() => {
         completer.complete();
-      }, VoidTovoid$()), dart.fn(error => {
+      }, VoidToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, StringTovoid$()));
+      }, StringToNull()));
       return completer.future;
     }
     [dartx.updateIce](configuration, mediaConstraints) {
@@ -88209,7 +88212,7 @@
     [dartx.addAll](other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this[dartx._set](k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     [dartx.containsValue](value) {
       return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
@@ -92045,7 +92048,7 @@
       let completer = CompleterOfnum().sync();
       this[dartx.requestAnimationFrame](dart.fn(time => {
         completer.complete(time);
-      }, numTovoid()));
+      }, numToNull()));
       return completer.future;
     }
     get [dartx.document]() {
@@ -92500,9 +92503,9 @@
       let completer = CompleterOfFileSystem().new();
       this[__requestFileSystem](type, size, dart.fn(value => {
         completer.complete(value);
-      }, FileSystemTovoid()), dart.fn(error => {
+      }, FileSystemToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [_resolveLocalFileSystemUrl](...args) {
@@ -92512,9 +92515,9 @@
       let completer = CompleterOfEntry().new();
       this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
         completer.complete(value);
-      }, EntryTovoid()), dart.fn(error => {
+      }, EntryToNull()), dart.fn(error => {
         completer.completeError(error);
-      }, FileErrorTovoid()));
+      }, FileErrorToNull()));
       return completer.future;
     }
     [dartx.atob](...args) {
@@ -93204,7 +93207,7 @@
       stream.listen(dart.fn(event => {
         let wrapped = new html$._BeforeUnloadEvent(event);
         controller.add(wrapped);
-      }, BeforeUnloadEventTovoid()));
+      }, BeforeUnloadEventToNull()));
       return controller.stream;
     }
     getEventType(target) {
@@ -94910,7 +94913,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       for (let v of this.values) {
@@ -95097,7 +95100,7 @@
     addAll(other) {
       other[dartx.forEach](dart.fn((k, v) => {
         this._set(k, v);
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     containsValue(value) {
       return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
@@ -95128,7 +95131,7 @@
         if (dart.test(this[_matches](key))) {
           f(this[_strip](key), value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
     }
     get keys() {
       let keys = JSArrayOfString().of([]);
@@ -95136,7 +95139,7 @@
         if (dart.test(this[_matches](key))) {
           keys[dartx.add](this[_strip](key));
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return keys;
     }
     get values() {
@@ -95145,7 +95148,7 @@
         if (dart.test(this[_matches](key))) {
           values[dartx.add](value);
         }
-      }, StringAndStringTovoid$()));
+      }, StringAndStringToNull()));
       return values;
     }
     get length() {
@@ -98402,7 +98405,7 @@
         if (request[dartx.readyState] == html$.HttpRequest.DONE) {
           onComplete(request);
         }
-      }, ProgressEventTovoid$()));
+      }, ProgressEventToNull()));
       request[dartx.send]();
       return request;
     }
@@ -99148,7 +99151,7 @@
         this.writeSlot(slot, copy);
         e[dartx.forEach](dart.fn((key, value) => {
           this.putIntoMap(copy, key, this.walk(value));
-        }, dynamicAnddynamicTovoid$()));
+        }, dynamicAnddynamicToNull()));
         return copy;
       }
       if (core.List.is(e)) {
@@ -99357,7 +99360,7 @@
     }
     dict[dartx.forEach](dart.fn((key, value) => {
       object[key] = value;
-    }, StringAnddynamicTovoid()));
+    }, StringAnddynamicToNull()));
     return object;
   };
   dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
@@ -99382,7 +99385,7 @@
     let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
     return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
   };
-  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic$0());
+  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
   html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
     new() {
       super.new();
@@ -107353,13 +107356,13 @@
       let completer = CompleterOfAudioBuffer().new();
       this[_decodeAudioData](audioData, dart.fn(value => {
         completer.complete(value);
-      }, AudioBufferTovoid()), dart.fn(error => {
+      }, AudioBufferToNull()), dart.fn(error => {
         if (error == null) {
           completer.completeError('');
         } else {
           completer.completeError(error);
         }
-      }, AudioBufferTovoid()));
+      }, AudioBufferToNull()));
       return completer.future;
     }
   };
diff --git a/pkg/dev_compiler/test/browser/runtime_tests.js b/pkg/dev_compiler/test/browser/runtime_tests.js
index 39d9a53..3cb562a 100644
--- a/pkg/dev_compiler/test/browser/runtime_tests.js
+++ b/pkg/dev_compiler/test/browser/runtime_tests.js
@@ -4,6 +4,7 @@
 
 define(['dart_sdk'], function(dart_sdk) {
   const assert = chai.assert;
+  const async = dart_sdk.async;
   const core = dart_sdk.core;
   const collection = dart_sdk.collection;
   const dart = dart_sdk.dart;
@@ -211,10 +212,13 @@
 
     function checkType(x, type, expectedTrue, strongOnly) {
       if (expectedTrue === undefined) expectedTrue = true;
-      if (strongOnly == undefined) strongOnly = false;
+      if (strongOnly === undefined) strongOnly = false;
       if (!strongOnly) {
         assert.doesNotThrow(() => instanceOf(x, type));
-        expect(instanceOf(x, type), expectedTrue);
+        expect(instanceOf(x, type), expectedTrue,
+          '"' + x + '" ' +
+          (expectedTrue ? 'should' : 'should not') +
+          ' be an instance of "' + dart.typeName(type) + '"');
       } else {
         assert.throws(() => instanceOf(x, type), dart.StrongModeError);
         expect(expectedTrue, false);
@@ -801,25 +805,34 @@
     let dyn = dart.dynamic;
 
     function always(t1, t2) {
-      assert.equal(isSubtype(t1, t2), true);
+      assert.equal(isSubtype(t1, t2), true,
+          dart.toString(t1) +
+          " should always be a subtype of " +
+          dart.toString(t2));
     }
     function never(t1, t2) {
-      assert.equal(isSubtype(t1, t2), false);
+      assert.equal(isSubtype(t1, t2), false,
+          dart.toString(t1) +
+          " should never be a subtype of " +
+          dart.toString(t2));
     }
     function maybe(t1, t2) {
-      assert.equal(isSubtype(t1, t2), null);
+      assert.equal(isSubtype(t1, t2), null,
+          dart.toString(t1) +
+          " should maybe be a subtype of " +
+          dart.toString(t2));
     }
 
     function always2(t1, t2) {
-      assert.equal(isSubtype(t1, t2), true);
+      always(t1, t2);
       always(functionType(t1, [t2]), functionType(t2, [t1]));
     }
     function never2(t1, t2) {
-      assert.equal(isSubtype(t1, t2), false);
+      never(t1, t2);
       maybe(functionType(t1, [t2]), functionType(t2, [t1]));
     }
     function maybe2(t1, t2) {
-      assert.equal(isSubtype(t1, t2), null);
+      maybe(t1, t2);
       maybe(functionType(t1, [t2]), functionType(t2, [t1]));
     }
 
@@ -919,6 +932,44 @@
       run_test(func1, func2, func2opt, func1extra, func2extra);
     });
 
+    test('top and bottom types', () => {
+      let FutureOr = async.FutureOr$;
+      let tops = [
+        dart.dynamic,
+        core.Object,
+        dart.void,
+        FutureOr(dart.dynamic),
+        FutureOr(core.Object),
+        FutureOr(dart.void),
+        FutureOr(FutureOr(core.Object)),
+        // ... skip the (infinite) rest of the top types :D
+      ];
+      let bottoms = [dart.bottom, core.Null];
+
+      for (let top of tops) {
+        for (let bottom of bottoms) {
+          always(bottom, top);
+          always(
+              definiteFunctionType(bottom, [top]),
+              definiteFunctionType(top, [bottom]));
+        }
+      }
+
+      for (let equalTypes of [tops, bottoms]) {
+        for (let t1 of equalTypes) {
+          for (let t2 of equalTypes) {
+            always(t1, t2);
+            always(t2, t1);
+
+            let t11 = definiteFunctionType(t1, [t1]);
+            let t22 = definiteFunctionType(t2, [t2]);
+            always(t11, t22);
+            always(t22, t11);
+          }
+        }
+      }
+    });
+
     test('basic typedefs', () => {
       function func1(S) {
         return dart.typedef('Func1', () => functionType(S, []))
@@ -975,7 +1026,6 @@
       always(functionType(dyn, [], [dyn]), functionType(dyn, [dyn]));
       always(functionType(dyn, [], [dyn]), functionType(dyn, []));
       always(functionType(dyn, [dyn], {extra: dyn}), functionType(dyn, [dyn]));
-
     });
 
     test('void function types', () => {
@@ -1020,7 +1070,6 @@
       never(functionType(dart.void, [], [int]), functionType(int, [int]));
       never(functionType(dart.void, [], [int]), functionType(int, []));
       never(functionType(dart.void, [int], {extra: int}), functionType(int, [int]));
-
     });
 
     test('higher-order typedef', () => {
@@ -1060,10 +1109,7 @@
       maybe(AA$(functionType(dyn, [dyn])), AA$(functionType(int, [int])));
       maybe(AA$(functionType(core.Object, [core.Object])),
             AA$(functionType(int, [int])));
-
-
     });
-
   });
 
   suite('canonicalization', function() {
diff --git a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js b/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
index 48a5eb6..d303d7d 100644
--- a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
+++ b/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
@@ -4,7 +4,7 @@
   const dart = dart_sdk.dart;
   const dartx = dart_sdk.dartx;
   const BenchmarkBase$ = Object.create(null);
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+  let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
   BenchmarkBase$.Expect = class Expect extends core.Object {
     static equals(expected, actual) {
       if (!dart.equals(expected, actual)) {
@@ -63,10 +63,10 @@
       this.setup();
       BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
         this.warmup();
-      }, VoidTodynamic()), 100);
+      }, VoidToNull()), 100);
       let result = BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
         this.exercise();
-      }, VoidTodynamic()), 2000);
+      }, VoidToNull()), 2000);
       this.teardown();
       return result;
     }
diff --git a/pkg/dev_compiler/test/codegen_expected/closure.js b/pkg/dev_compiler/test/codegen_expected/closure.js
index 698b90f..3db08c0 100644
--- a/pkg/dev_compiler/test/codegen_expected/closure.js
+++ b/pkg/dev_compiler/test/codegen_expected/closure.js
@@ -10,7 +10,7 @@
 let Foo = () => (Foo = dart.constFn(closure.Foo$()))();
 let ListOfTAndTToListOfT = () => (ListOfTAndTToListOfT = dart.constFn(dart.definiteFunctionType(T => [core.List$(T), [core.List$(T), T]])))();
 let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
-let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
 closure.generic_function = function(T) {
   return (items: core.List<T>, seed: T): core.List<T> => {
     let strings = items[dartx.map](core.String)(dart.fn((i: T): string => dart.str`${i}`, dart.definiteFunctionType(core.String, [T])))[dartx.toList]();
@@ -119,9 +119,9 @@
 dart.fn(closure.main, dynamicTovoid());
 dart.defineLazy(closure, {
   get closure() {
-    return dart.fn(() => {
+    return dart.fn((): core.Null => {
       return;
-    }, VoidTodynamic());
+    }, VoidToNull());
   },
   set closure(_) {}
 });
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index 5975ddc..69b01a5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -456,6 +456,9 @@
 instanceOf(obj, type) => JS(
     '',
     '''(() => {
+  if ($obj == null) {
+    return $type == $Null || $_isTop($type);
+  }
   let result = $strongInstanceOf($obj, $type);
   if (result !== null) return result;
   let actual = $getReifiedType($obj);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index abc476d..e64daf7 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -656,15 +656,9 @@
   // Check return type last, so that arity mismatched functions can be
   // definitively rejected.
 
-  // We allow any type to subtype a void return type, but not vice versa
-  if (ret2 === $_void) return true;
-  // Dart allows void functions to subtype dynamic functions, but not
-  // other functions.
-  // TODO(jmesserly): this check does not match our compile time subtype
-  // implementation. Reconcile.
-  if (ret1 === $_void) {
-    return ret2 === $dynamic || ret2 === $FutureOr;
-  }
+  // For `void` we will give the same answer as the VM, so don't return null.
+  if (ret1 === $_void) return $_isTop(ret2);
+
   if (!$_isSubtype(ret1, ret2, $isCovariant)) return null;
   return true;
 })()''');
@@ -698,13 +692,14 @@
 final isSubtype = JS(
     '', '$_subtypeMemo((t1, t2) => (t1 === t2) || $_isSubtype(t1, t2, true))');
 
-_isBottom(type) => JS('bool', '# == #', type, bottom);
+_isBottom(type) => JS('bool', '# == # || # == #', type, bottom, type, Null);
 
 _isTop(type) {
   if (JS('bool', '# === #', getGenericClass(type), getGenericClass(FutureOr))) {
     return _isTop(JS('', '#[0]', getGenericArgs(type)));
   }
-  return JS('bool', '# == # || # == #', type, Object, type, dynamic);
+  return JS('bool', '# == # || # == # || # == #',
+      type, Object, type, dynamic, type, _void);
 }
 
 _isSubtype(t1, t2, isCovariant) => JS(
diff --git a/pkg/dev_compiler/tool/sdk_expected_errors.txt b/pkg/dev_compiler/tool/sdk_expected_errors.txt
index b60c5bd..381ac61 100644
--- a/pkg/dev_compiler/tool/sdk_expected_errors.txt
+++ b/pkg/dev_compiler/tool/sdk_expected_errors.txt
@@ -13,7 +13,6 @@
 [error] Couldn't infer type parameter 'S'; 'RandomAccessFile' must be of type 'File'. (dart:io/file_impl.dart, line 216, col 19)
 [error] The argument type '(RandomAccessFile) → Future<RandomAccessFile>' can't be assigned to the parameter type '(RandomAccessFile) → FutureOr<File>'. (dart:io/file_impl.dart, line 216, col 24)
 [error] The return type 'Future' isn't a 'FutureOr<File>', as defined by the method ''. (dart:io/file_impl.dart, line 545, col 14)
-[error] The argument type '([dynamic]) → void' can't be assigned to the parameter type '(_ConnectionInfo) → FutureOr<void>'. (dart:io/http_impl.dart, line 1633, col 19)
 [error] The return type 'StreamSubscription<int>' isn't a 'StreamSubscription<List<int>>', as defined by the method 'listen'. (dart:io/http_parser.dart, line 208, col 14)
 [error] The argument type '(List<int>) → void' can't be assigned to the parameter type '(int) → void'. (dart:io/http_parser.dart, line 209, col 19)
 [error] Couldn't infer type parameter 'V'; 'Object' must be of type 'String'. (dart:io/io_resource_info.dart, line 27, col 7)
@@ -29,7 +28,6 @@
 [error] Couldn't infer type parameter 'V'; 'Object' must be of type 'String'. (dart:io/io_resource_info.dart, line 159, col 5)
 [error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 161, col 13)
 [error] The element type 'double' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 164, col 20)
-[error] The argument type '([dynamic]) → void' can't be assigned to the parameter type '(RawSocket) → FutureOr<void>'. (dart:io/secure_socket.dart, line 591, col 28)
 [error] The argument type 'List' can't be assigned to the parameter type 'Iterable<int>'. (dart:io/secure_socket.dart, line 1129, col 23)
 [error] Undefined name 'lineMode'. (dart:io/stdio.dart, line 64, col 10)
 [error] The name 'echoMode=' is already defined. (dart:io/stdio.dart, line 126, col 12)
@@ -77,18 +75,13 @@
 [warning] Unsafe implicit cast from '(T) → void' to '(Event) → dynamic'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:html, line 40126, col 45)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/data_transformer.dart, line 492, col 23)
 [warning] Unsafe implicit cast from 'Stream<dynamic>' to 'Stream<FileSystemEntity>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/directory_impl.dart, line 239, col 12)
-[warning] Missing return value after 'return'. (dart:io/directory_impl.dart, line 394, col 15)
-[warning] Missing return value after 'return'. (dart:io/file_impl.dart, line 101, col 11)
 [warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/file_impl.dart, line 484, col 14)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/file_impl.dart, line 831, col 33)
 [warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 269, col 14)
 [warning] Unsafe implicit cast from 'Stream<dynamic>' to 'Stream<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1056, col 29)
 [warning] Unsafe implicit cast from 'Function' to '(List<int>) → void'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1173, col 54)
 [warning] Unsafe implicit cast from 'Function' to '(List<int>) → void'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1175, col 33)
-[warning] Missing return value after 'return'. (dart:io/http_impl.dart, line 1401, col 21)
-[warning] Missing return value after 'return'. (dart:io/http_impl.dart, line 1403, col 31)
 [warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<_ConnectionInfo>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1635, col 14)
-[warning] Missing return value after 'return'. (dart:io/http_impl.dart, line 2111, col 42)
 [warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_parser.dart, line 201, col 16)
 [warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_parser.dart, line 203, col 50)
 [warning] Unsafe implicit cast from 'Map<dynamic, dynamic>' to 'Map<String, String>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/platform_impl.dart, line 100, col 69)
@@ -96,9 +89,6 @@
 [warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<SecureSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 138, col 12)
 [warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<RawSocketEvent>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 446, col 33)
 [warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<RawSecureSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 580, col 12)
-[warning] Missing return value after 'return'. (dart:io/secure_socket.dart, line 861, col 11)
-[warning] Missing return value after 'return'. (dart:io/secure_socket.dart, line 868, col 13)
-[warning] Missing return value after 'return'. (dart:io/secure_socket.dart, line 882, col 11)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 1176, col 32)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/stdio.dart, line 109, col 28)
 [warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<WebSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/websocket_impl.dart, line 471, col 14)
diff --git a/tests/lib_strong/collection/hash_map_test.dart b/tests/lib_strong/collection/hash_map_test.dart
index f0f1d54..5a6b52e9 100644
--- a/tests/lib_strong/collection/hash_map_test.dart
+++ b/tests/lib_strong/collection/hash_map_test.dart
@@ -9,8 +9,8 @@
   // Test customized maps.
   // Regression test for issue http://dartbug.com/18109
 
-  hash(s) => s.toLowerCase().hashCode;
-  equals(a, b) => a.toLowerCase() == b.toLowerCase();
+  int hash(s) => s.toLowerCase().hashCode;
+  bool equals(a, b) => a.toLowerCase() == b.toLowerCase();
 
   for (var m in [
     new HashMap<String,int>(equals: equals, hashCode: hash),
@@ -25,8 +25,8 @@
     }
   }
 
-  abshash(n) => n.abs();
-  abseq(a, b) => a.abs() == b.abs();
+  int abshash(n) => n.abs();
+  bool abseq(a, b) => a.abs() == b.abs();
   for (var m in [
     new HashMap<int,int>(equals: abseq, hashCode: abshash),
     new LinkedHashMap<int,int>(equals: abseq, hashCode: abshash),
diff --git a/tests/lib_strong/collection/hash_set_test.dart b/tests/lib_strong/collection/hash_set_test.dart
index ab03284..c8ede1f 100644
--- a/tests/lib_strong/collection/hash_set_test.dart
+++ b/tests/lib_strong/collection/hash_set_test.dart
@@ -9,8 +9,8 @@
   // Test customized sets.
   // Regression test for issue http://dartbug.com/18109
 
-  hash(s) => s.toLowerCase().hashCode;
-  equals(a, b) => a.toLowerCase() == b.toLowerCase();
+  int hash(s) => s.toLowerCase().hashCode;
+  bool equals(a, b) => a.toLowerCase() == b.toLowerCase();
 
   for (var m in [
     new HashSet<String>(equals: equals, hashCode: hash),
@@ -27,8 +27,8 @@
     }
   }
 
-  abshash(n) => n.abs();
-  abseq(a, b) => a.abs() == b.abs();
+  int abshash(n) => n.abs();
+  bool abseq(a, b) => a.abs() == b.abs();
   for (var m in [
     new HashSet<int>(equals: abseq, hashCode: abshash),
     new LinkedHashSet<int>(equals: abseq, hashCode: abshash),
diff --git a/tools/VERSION b/tools/VERSION
index 130540a..790d464 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 22
 PATCH 0
 PRERELEASE 10
-PRERELEASE_PATCH 4
+PRERELEASE_PATCH 5
