Version 2.17.0-105.0.dev

Merge commit '3dbb3595c8f879b666d8bfdf45106e573fa89eb3' into 'dev'
diff --git a/sdk/lib/_internal/vm/lib/collection_patch.dart b/sdk/lib/_internal/vm/lib/collection_patch.dart
index 4755514..942dc83 100644
--- a/sdk/lib/_internal/vm/lib/collection_patch.dart
+++ b/sdk/lib/_internal/vm/lib/collection_patch.dart
@@ -849,72 +849,3 @@
 
   E get current => _current as E;
 }
-
-/**
- * A hash-based map that iterates keys and values in key insertion order.
- * This is never actually instantiated any more - the constructor always
- * returns an instance of _CompactLinkedHashMap or _InternalLinkedHashMap,
- * which despite the names do not use links (but are insertion-ordered as if
- * they did).
- */
-@patch
-class LinkedHashMap<K, V> {
-  @patch
-  factory LinkedHashMap(
-      {bool equals(K key1, K key2)?,
-      int hashCode(K key)?,
-      bool isValidKey(potentialKey)?}) {
-    if (isValidKey == null) {
-      if (hashCode == null) {
-        if (equals == null) {
-          return new _InternalLinkedHashMap<K, V>();
-        }
-        hashCode = _defaultHashCode;
-      } else {
-        if (identical(identityHashCode, hashCode) &&
-            identical(identical, equals)) {
-          return new _CompactLinkedIdentityHashMap<K, V>();
-        }
-        equals ??= _defaultEquals;
-      }
-    } else {
-      hashCode ??= _defaultHashCode;
-      equals ??= _defaultEquals;
-    }
-    return new _CompactLinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
-  }
-
-  @patch
-  factory LinkedHashMap.identity() => new _CompactLinkedIdentityHashMap<K, V>();
-}
-
-@patch
-class LinkedHashSet<E> {
-  @patch
-  factory LinkedHashSet(
-      {bool equals(E e1, E e2)?,
-      int hashCode(E e)?,
-      bool isValidKey(potentialKey)?}) {
-    if (isValidKey == null) {
-      if (hashCode == null) {
-        if (equals == null) {
-          return new _CompactLinkedHashSet<E>();
-        }
-        hashCode = _defaultHashCode;
-      } else {
-        if (identical(identityHashCode, hashCode) &&
-            identical(identical, equals)) {
-          return new _CompactLinkedIdentityHashSet<E>();
-        }
-        equals ??= _defaultEquals;
-      }
-    } else {
-      hashCode ??= _defaultHashCode;
-      equals ??= _defaultEquals;
-    }
-    return new _CompactLinkedCustomHashSet<E>(equals, hashCode, isValidKey);
-  }
-
-  @patch
-  factory LinkedHashSet.identity() => new _CompactLinkedIdentityHashSet<E>();
-}
diff --git a/sdk/lib/_internal/vm/lib/hash_factories.dart b/sdk/lib/_internal/vm/lib/hash_factories.dart
index 9e45e8d..01558af 100644
--- a/sdk/lib/_internal/vm/lib/hash_factories.dart
+++ b/sdk/lib/_internal/vm/lib/hash_factories.dart
@@ -2,6 +2,67 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// This is a placeholder file which will shortly contain the LinkedhashMap and
-// LinkedHashSet patches from collection_patch.dart. The change is done in two
-// steps to ease rolling it into Flutter.
+// The [LinkedHashMap] and [LinkedHashSet] factory constructors return different
+// internal implementations depending on the supplied callback functions.
+
+@patch
+class LinkedHashMap<K, V> {
+  @patch
+  factory LinkedHashMap(
+      {bool equals(K key1, K key2)?,
+      int hashCode(K key)?,
+      bool isValidKey(potentialKey)?}) {
+    if (isValidKey == null) {
+      if (hashCode == null) {
+        if (equals == null) {
+          return new _InternalLinkedHashMap<K, V>();
+        }
+        hashCode = _defaultHashCode;
+      } else {
+        if (identical(identityHashCode, hashCode) &&
+            identical(identical, equals)) {
+          return new _CompactLinkedIdentityHashMap<K, V>();
+        }
+        equals ??= _defaultEquals;
+      }
+    } else {
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
+    }
+    return new _CompactLinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
+  }
+
+  @patch
+  factory LinkedHashMap.identity() => new _CompactLinkedIdentityHashMap<K, V>();
+}
+
+@patch
+class LinkedHashSet<E> {
+  @patch
+  factory LinkedHashSet(
+      {bool equals(E e1, E e2)?,
+      int hashCode(E e)?,
+      bool isValidKey(potentialKey)?}) {
+    if (isValidKey == null) {
+      if (hashCode == null) {
+        if (equals == null) {
+          return new _CompactLinkedHashSet<E>();
+        }
+        hashCode = _defaultHashCode;
+      } else {
+        if (identical(identityHashCode, hashCode) &&
+            identical(identical, equals)) {
+          return new _CompactLinkedIdentityHashSet<E>();
+        }
+        equals ??= _defaultEquals;
+      }
+    } else {
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
+    }
+    return new _CompactLinkedCustomHashSet<E>(equals, hashCode, isValidKey);
+  }
+
+  @patch
+  factory LinkedHashSet.identity() => new _CompactLinkedIdentityHashSet<E>();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 5c8d4b8..a6e48bd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 104
+PRERELEASE 105
 PRERELEASE_PATCH 0
\ No newline at end of file